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:
parent
f349c7692d
commit
db81cc3add
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue