HDFS-11267. Avoid redefinition of storageDirs in NNStorage and cleanup its accessors in Storage. (Manoj Govindassamy via lei)

(cherry picked from commit a4f66655ec)

Conflicts:
	hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NNStorage.java
This commit is contained in:
Lei Xu 2016-12-29 16:57:40 +08:00
parent f349c7692d
commit db81cc3add
6 changed files with 21 additions and 19 deletions

View File

@ -124,7 +124,7 @@ public abstract class Storage extends StorageInfo {
} }
protected List<StorageDirectory> storageDirs = protected List<StorageDirectory> storageDirs =
new CopyOnWriteArrayList<StorageDirectory>(); new CopyOnWriteArrayList<>();
private class DirIterator implements Iterator<StorageDirectory> { private class DirIterator implements Iterator<StorageDirectory> {
final StorageDirType dirType; final StorageDirType dirType;
@ -879,7 +879,11 @@ public abstract class Storage extends StorageInfo {
public int getNumStorageDirs() { public int getNumStorageDirs() {
return storageDirs.size(); return storageDirs.size();
} }
public List<StorageDirectory> getStorageDirs() {
return storageDirs;
}
public StorageDirectory getStorageDir(int idx) { public StorageDirectory getStorageDir(int idx) {
return storageDirs.get(idx); return storageDirs.get(idx);
} }

View File

@ -292,7 +292,7 @@ public class BlockPoolSliceStorage extends Storage {
void remove(File absPathToRemove) { void remove(File absPathToRemove) {
Preconditions.checkArgument(absPathToRemove.isAbsolute()); Preconditions.checkArgument(absPathToRemove.isAbsolute());
LOG.info("Removing block level storage: " + absPathToRemove); LOG.info("Removing block level storage: " + absPathToRemove);
for (Iterator<StorageDirectory> it = this.storageDirs.iterator(); for (Iterator<StorageDirectory> it = getStorageDirs().iterator();
it.hasNext(); ) { it.hasNext(); ) {
StorageDirectory sd = it.next(); StorageDirectory sd = it.next();
if (sd.getRoot().getAbsoluteFile().equals(absPathToRemove)) { if (sd.getRoot().getAbsoluteFile().equals(absPathToRemove)) {
@ -772,7 +772,7 @@ public class BlockPoolSliceStorage extends Storage {
*/ */
public void clearTrash() { public void clearTrash() {
final List<File> trashRoots = new ArrayList<>(); final List<File> trashRoots = new ArrayList<>();
for (StorageDirectory sd : storageDirs) { for (StorageDirectory sd : getStorageDirs()) {
File trashRoot = getTrashRootDir(sd); File trashRoot = getTrashRootDir(sd);
if (trashRoot.exists() && sd.getPreviousDir().exists()) { if (trashRoot.exists() && sd.getPreviousDir().exists()) {
LOG.error("Trash and PreviousDir shouldn't both exist for storage " LOG.error("Trash and PreviousDir shouldn't both exist for storage "
@ -810,7 +810,7 @@ public class BlockPoolSliceStorage extends Storage {
/** trash is enabled if at least one storage directory contains trash root */ /** trash is enabled if at least one storage directory contains trash root */
@VisibleForTesting @VisibleForTesting
public boolean trashEnabled() { public boolean trashEnabled() {
for (StorageDirectory sd : storageDirs) { for (StorageDirectory sd : getStorageDirs()) {
if (getTrashRootDir(sd).exists()) { if (getTrashRootDir(sd).exists()) {
return true; return true;
} }

View File

@ -188,11 +188,11 @@ public class DataStorage extends Storage {
} }
public void setRollingUpgradeMarker(String bpid) throws IOException { public void setRollingUpgradeMarker(String bpid) throws IOException {
getBPStorage(bpid).setRollingUpgradeMarkers(storageDirs); getBPStorage(bpid).setRollingUpgradeMarkers(getStorageDirs());
} }
public void clearRollingUpgradeMarker(String bpid) throws IOException { public void clearRollingUpgradeMarker(String bpid) throws IOException {
getBPStorage(bpid).clearRollingUpgradeMarkers(storageDirs); getBPStorage(bpid).clearRollingUpgradeMarkers(getStorageDirs());
} }
/** /**
@ -505,7 +505,7 @@ public class DataStorage extends Storage {
} }
StringBuilder errorMsgBuilder = new StringBuilder(); StringBuilder errorMsgBuilder = new StringBuilder();
for (Iterator<StorageDirectory> it = this.storageDirs.iterator(); for (Iterator<StorageDirectory> it = getStorageDirs().iterator();
it.hasNext(); ) { it.hasNext(); ) {
StorageDirectory sd = it.next(); StorageDirectory sd = it.next();
if (dirsToRemove.contains(sd.getRoot())) { if (dirsToRemove.contains(sd.getRoot())) {
@ -1027,7 +1027,7 @@ public class DataStorage extends Storage {
// To handle finalizing a snapshot taken at datanode level while // To handle finalizing a snapshot taken at datanode level while
// upgrading to federation, if datanode level snapshot previous exists, // upgrading to federation, if datanode level snapshot previous exists,
// then finalize it. Else finalize the corresponding BP. // then finalize it. Else finalize the corresponding BP.
for (StorageDirectory sd : storageDirs) { for (StorageDirectory sd : getStorageDirs()) {
File prevDir = sd.getPreviousDir(); File prevDir = sd.getPreviousDir();
if (prevDir.exists()) { if (prevDir.exists()) {
// data node level storage finalize // data node level storage finalize

View File

@ -167,8 +167,6 @@ public class NNStorage extends Storage implements Closeable,
throws IOException { throws IOException {
super(NodeType.NAME_NODE); super(NodeType.NAME_NODE);
storageDirs = new CopyOnWriteArrayList<StorageDirectory>();
// this may modify the editsDirs, so copy before passing in // this may modify the editsDirs, so copy before passing in
setStorageDirectories(imageDirs, setStorageDirectories(imageDirs,
Lists.newArrayList(editsDirs), Lists.newArrayList(editsDirs),
@ -206,7 +204,7 @@ public class NNStorage extends Storage implements Closeable,
@Override // Closeable @Override // Closeable
public void close() throws IOException { public void close() throws IOException {
unlockAll(); unlockAll();
storageDirs.clear(); getStorageDirs().clear();
} }
/** /**
@ -291,7 +289,7 @@ public class NNStorage extends Storage implements Closeable,
Collection<URI> fsEditsDirs, Collection<URI> fsEditsDirs,
Collection<URI> sharedEditsDirs) Collection<URI> sharedEditsDirs)
throws IOException { throws IOException {
this.storageDirs.clear(); getStorageDirs().clear();
this.removedStorageDirs.clear(); this.removedStorageDirs.clear();
// Add all name dirs with appropriate NameNodeDirType // Add all name dirs with appropriate NameNodeDirType
@ -863,7 +861,7 @@ public class NNStorage extends Storage implements Closeable,
+ sd.getRoot().getPath(), e); + sd.getRoot().getPath(), e);
} }
if (this.storageDirs.remove(sd)) { if (getStorageDirs().remove(sd)) {
this.removedStorageDirs.add(sd); this.removedStorageDirs.add(sd);
} }
@ -917,7 +915,7 @@ public class NNStorage extends Storage implements Closeable,
// getCanonicalPath may need to call stat() or readlink() and it's likely // getCanonicalPath may need to call stat() or readlink() and it's likely
// those calls would fail due to the same underlying IO problem. // those calls would fail due to the same underlying IO problem.
String absPath = f.getAbsolutePath(); String absPath = f.getAbsolutePath();
for (StorageDirectory sd : storageDirs) { for (StorageDirectory sd : getStorageDirs()) {
String dirPath = sd.getRoot().getAbsolutePath(); String dirPath = sd.getRoot().getAbsolutePath();
if (!dirPath.endsWith(File.separator)) { if (!dirPath.endsWith(File.separator)) {
dirPath += File.separator; dirPath += File.separator;
@ -1125,14 +1123,14 @@ public class NNStorage extends Storage implements Closeable,
@Override @Override
public void writeAll() throws IOException { public void writeAll() throws IOException {
this.layoutVersion = getServiceLayoutVersion(); this.layoutVersion = getServiceLayoutVersion();
for (StorageDirectory sd : storageDirs) { for (StorageDirectory sd : getStorageDirs()) {
try { try {
writeProperties(sd); writeProperties(sd);
} catch (Exception e) { } catch (Exception e) {
LOG.warn("Error during write properties to the VERSION file to " + LOG.warn("Error during write properties to the VERSION file to " +
sd.toString(), e); sd.toString(), e);
reportErrorsOnDirectory(sd); reportErrorsOnDirectory(sd);
if (storageDirs.isEmpty()) { if (getStorageDirs().isEmpty()) {
throw new IOException("All the storage failed while writing " + throw new IOException("All the storage failed while writing " +
"properties to VERSION file"); "properties to VERSION file");
} }

View File

@ -33,7 +33,7 @@ public abstract class StorageAdapter {
Storage s, int idx) { Storage s, int idx) {
StorageDirectory dir = Mockito.spy(s.getStorageDir(idx)); StorageDirectory dir = Mockito.spy(s.getStorageDir(idx));
s.storageDirs.set(idx, dir); s.getStorageDirs().set(idx, dir);
return dir; return dir;
} }
} }

View File

@ -49,7 +49,7 @@ public class TestBlockPoolSliceStorage {
String clusterId) { String clusterId) {
super(namespaceID, bpID, cTime, clusterId); super(namespaceID, bpID, cTime, clusterId);
addStorageDir(new StorageDirectory(new File("/tmp/dontcare/" + bpID))); addStorageDir(new StorageDirectory(new File("/tmp/dontcare/" + bpID)));
assertThat(storageDirs.size(), is(1)); assertThat(getStorageDirs().size(), is(1));
} }
} }