/** * Gets initial volume failure information for all volumes that failed * immediately at startup. The method works by determining the set difference * between all configured storage locations and the actual storage locations in * use after attempting to put all of them into service. * * @return each storage location that has failed */ private static List<VolumeFailureInfo> getInitialVolumeFailureInfos( Collection<StorageLocation> dataLocations, DataStorage storage) { Set<StorageLocation> failedLocationSet = Sets.newHashSetWithExpectedSize( dataLocations.size()); for (StorageLocation sl: dataLocations) { failedLocationSet.add(sl); } for (Iterator<Storage.StorageDirectory> it = storage.dirIterator(); it.hasNext(); ) { Storage.StorageDirectory sd = it.next(); failedLocationSet.remove(sd.getStorageLocation()); } List<VolumeFailureInfo> volumeFailureInfos = Lists.newArrayListWithCapacity( failedLocationSet.size()); long failureDate = Time.now(); for (StorageLocation failedStorageLocation: failedLocationSet) { volumeFailureInfos.add(new VolumeFailureInfo(failedStorageLocation, failureDate)); } return volumeFailureInfos; }
@Override // FsDatasetSpi public VolumeFailureSummary getVolumeFailureSummary() { VolumeFailureInfo[] infos = volumes.getVolumeFailureInfos(); if (infos.length == 0) { return null; } List<String> failedStorageLocations = Lists.newArrayListWithCapacity( infos.length); long lastVolumeFailureDate = 0; long estimatedCapacityLostTotal = 0; for (VolumeFailureInfo info: infos) { failedStorageLocations.add( info.getFailedStorageLocation().getNormalizedUri().toString()); long failureDate = info.getFailureDate(); if (failureDate > lastVolumeFailureDate) { lastVolumeFailureDate = failureDate; } estimatedCapacityLostTotal += info.getEstimatedCapacityLost(); } return new VolumeFailureSummary( failedStorageLocations.toArray(new String[failedStorageLocations.size()]), lastVolumeFailureDate, estimatedCapacityLostTotal); }
void addVolumeFailureInfo(VolumeFailureInfo volumeFailureInfo) { // There could be redundant requests for adding the same failed // volume because of repeated DataNode reconfigure with same list // of volumes. Ignoring update on failed volume so as to preserve // old failed capacity details in the map. if (!volumeFailureInfos.containsKey(volumeFailureInfo .getFailedStorageLocation())) { volumeFailureInfos.put(volumeFailureInfo.getFailedStorageLocation(), volumeFailureInfo); } }
@Override // FSDatasetMBean public long getLastVolumeFailureDate() { long lastVolumeFailureDate = 0; for (VolumeFailureInfo info: volumes.getVolumeFailureInfos()) { long failureDate = info.getFailureDate(); if (failureDate > lastVolumeFailureDate) { lastVolumeFailureDate = failureDate; } } return lastVolumeFailureDate; }
@Override // FSDatasetMBean public long getEstimatedCapacityLostTotal() { long estimatedCapacityLostTotal = 0; for (VolumeFailureInfo info: volumes.getVolumeFailureInfos()) { estimatedCapacityLostTotal += info.getEstimatedCapacityLost(); } return estimatedCapacityLostTotal; }
@Override // FSDatasetMBean public String[] getFailedStorageLocations() { VolumeFailureInfo[] infos = volumes.getVolumeFailureInfos(); List<String> failedStorageLocations = Lists.newArrayListWithCapacity( infos.length); for (VolumeFailureInfo info: infos) { failedStorageLocations.add( info.getFailedStorageLocation().getNormalizedUri().toString()); } return failedStorageLocations.toArray( new String[failedStorageLocations.size()]); }
@Override // FSDatasetMBean public long getLastVolumeFailureDate() { long lastVolumeFailureDate = 0; for (VolumeFailureInfo info: volumes.getVolumeFailureInfos()) { long failureDate = info.getFailureDate(); if (failureDate > lastVolumeFailureDate) { lastVolumeFailureDate = failureDate; } } return lastVolumeFailureDate; }
@Override // FSDatasetMBean public long getEstimatedCapacityLostTotal() { long estimatedCapacityLostTotal = 0; for (VolumeFailureInfo info: volumes.getVolumeFailureInfos()) { estimatedCapacityLostTotal += info.getEstimatedCapacityLost(); } return estimatedCapacityLostTotal; }
@Override // FsDatasetSpi public VolumeFailureSummary getVolumeFailureSummary() { VolumeFailureInfo[] infos = volumes.getVolumeFailureInfos(); if (infos.length == 0) { return null; } List<String> failedStorageLocations = Lists.newArrayListWithCapacity( infos.length); long lastVolumeFailureDate = 0; long estimatedCapacityLostTotal = 0; for (VolumeFailureInfo info: infos) { failedStorageLocations.add(info.getFailedStorageLocation()); long failureDate = info.getFailureDate(); if (failureDate > lastVolumeFailureDate) { lastVolumeFailureDate = failureDate; } estimatedCapacityLostTotal += info.getEstimatedCapacityLost(); } return new VolumeFailureSummary( failedStorageLocations.toArray(new String[failedStorageLocations.size()]), lastVolumeFailureDate, estimatedCapacityLostTotal); }
FsVolumeList(List<VolumeFailureInfo> initialVolumeFailureInfos, BlockScanner blockScanner, VolumeChoosingPolicy<FsVolumeImpl> blockChooser) { this.blockChooser = blockChooser; this.blockScanner = blockScanner; this.checkDirsLock = new AutoCloseableLock(); this.checkDirsLockCondition = checkDirsLock.newCondition(); for (VolumeFailureInfo volumeFailureInfo: initialVolumeFailureInfos) { volumeFailureInfos.put(volumeFailureInfo.getFailedStorageLocation(), volumeFailureInfo); } }
private void addVolumeFailureInfo(FsVolumeImpl vol) { addVolumeFailureInfo(new VolumeFailureInfo( vol.getStorageLocation(), Time.now(), vol.getCapacity())); }
@Override // FSDatasetMBean public long getLastVolumeFailureDate() { long lastVolumeFailureDate = 0; for (VolumeFailureInfo info: volumes.getVolumeFailureInfos()) { long failureDate = info.getFailureDate(); if (failureDate > lastVolumeFailureDate) { lastVolumeFailureDate = failureDate; } } return lastVolumeFailureDate; }
@Override // FSDatasetMBean public long getEstimatedCapacityLostTotal() { long estimatedCapacityLostTotal = 0; for (VolumeFailureInfo info: volumes.getVolumeFailureInfos()) { estimatedCapacityLostTotal += info.getEstimatedCapacityLost(); } return estimatedCapacityLostTotal; }
@Override // FsDatasetSpi public VolumeFailureSummary getVolumeFailureSummary() { VolumeFailureInfo[] infos = volumes.getVolumeFailureInfos(); if (infos.length == 0) { return null; } List<String> failedStorageLocations = Lists.newArrayListWithCapacity( infos.length); long lastVolumeFailureDate = 0; long estimatedCapacityLostTotal = 0; for (VolumeFailureInfo info: infos) { failedStorageLocations.add(info.getFailedStorageLocation()); long failureDate = info.getFailureDate(); if (failureDate > lastVolumeFailureDate) { lastVolumeFailureDate = failureDate; } estimatedCapacityLostTotal += info.getEstimatedCapacityLost(); } return new VolumeFailureSummary( failedStorageLocations.toArray(new String[failedStorageLocations.size()]), lastVolumeFailureDate, estimatedCapacityLostTotal); }
FsVolumeList(List<VolumeFailureInfo> initialVolumeFailureInfos, BlockScanner blockScanner, VolumeChoosingPolicy<FsVolumeImpl> blockChooser) { this.blockChooser = blockChooser; this.blockScanner = blockScanner; for (VolumeFailureInfo volumeFailureInfo: initialVolumeFailureInfos) { volumeFailureInfos.put(volumeFailureInfo.getFailedStorageLocation(), volumeFailureInfo); } }
builder = dataStorage.prepareVolume(datanode, location, nsInfos); } catch (IOException e) { volumes.addVolumeFailureInfo(new VolumeFailureInfo(location, Time.now())); throw e;
FsVolumeList(List<VolumeFailureInfo> initialVolumeFailureInfos, BlockScanner blockScanner, VolumeChoosingPolicy<FsVolumeImpl> blockChooser) { this.blockChooser = blockChooser; this.blockScanner = blockScanner; for (VolumeFailureInfo volumeFailureInfo: initialVolumeFailureInfos) { volumeFailureInfos.put(volumeFailureInfo.getFailedStorageLocation(), volumeFailureInfo); } }
private void addVolumeFailureInfo(FsVolumeImpl vol) { addVolumeFailureInfo(new VolumeFailureInfo( new File(vol.getBasePath()).getAbsolutePath(), Time.now(), vol.getCapacity())); }
void addVolumeFailureInfo(VolumeFailureInfo volumeFailureInfo) { volumeFailureInfos.put(volumeFailureInfo.getFailedStorageLocation(), volumeFailureInfo); }
private void addVolumeFailureInfo(FsVolumeImpl vol) { addVolumeFailureInfo(new VolumeFailureInfo( new File(vol.getBasePath()).getAbsolutePath(), Time.now(), vol.getCapacity())); }