HDFS-13212. RBF: Fix router location cache issue. Contributed by Weiwei Wu.
(cherry picked from commit afe1a3ccd5
)
This commit is contained in:
parent
121daaf474
commit
4b6b07690e
|
@ -238,9 +238,17 @@ public class MountTableResolver
|
||||||
Entry<String, PathLocation> entry = it.next();
|
Entry<String, PathLocation> entry = it.next();
|
||||||
PathLocation loc = entry.getValue();
|
PathLocation loc = entry.getValue();
|
||||||
String src = loc.getSourcePath();
|
String src = loc.getSourcePath();
|
||||||
if (src.startsWith(path)) {
|
if (src != null) {
|
||||||
LOG.debug("Removing {}", src);
|
if (src.startsWith(path)) {
|
||||||
it.remove();
|
LOG.debug("Removing {}", src);
|
||||||
|
it.remove();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
String dest = loc.getDefaultLocation().getDest();
|
||||||
|
if (dest.startsWith(path)) {
|
||||||
|
LOG.debug("Removing default cache {}", dest);
|
||||||
|
it.remove();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,6 +295,7 @@ public class MountTableResolver
|
||||||
if (!oldEntries.contains(srcPath)) {
|
if (!oldEntries.contains(srcPath)) {
|
||||||
// Add node, it does not exist
|
// Add node, it does not exist
|
||||||
this.tree.put(srcPath, entry);
|
this.tree.put(srcPath, entry);
|
||||||
|
invalidateLocationCache(srcPath);
|
||||||
LOG.info("Added new mount point {} to resolver", srcPath);
|
LOG.info("Added new mount point {} to resolver", srcPath);
|
||||||
} else {
|
} else {
|
||||||
// Node exists, check for updates
|
// Node exists, check for updates
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hadoop.hdfs.server.federation.resolver;
|
package org.apache.hadoop.hdfs.server.federation.resolver;
|
||||||
|
|
||||||
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_ROUTER_DEFAULT_NAMESERVICE;
|
||||||
import static org.apache.hadoop.hdfs.DFSConfigKeys.FEDERATION_MOUNT_TABLE_MAX_CACHE_SIZE;
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.FEDERATION_MOUNT_TABLE_MAX_CACHE_SIZE;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
|
@ -82,6 +83,7 @@ public class TestMountTableResolver {
|
||||||
Configuration conf = new Configuration();
|
Configuration conf = new Configuration();
|
||||||
conf.setInt(
|
conf.setInt(
|
||||||
FEDERATION_MOUNT_TABLE_MAX_CACHE_SIZE, TEST_MAX_CACHE_SIZE);
|
FEDERATION_MOUNT_TABLE_MAX_CACHE_SIZE, TEST_MAX_CACHE_SIZE);
|
||||||
|
conf.setStrings(DFS_ROUTER_DEFAULT_NAMESERVICE, "0");
|
||||||
mountTable = new MountTableResolver(conf);
|
mountTable = new MountTableResolver(conf);
|
||||||
|
|
||||||
// Root mount point
|
// Root mount point
|
||||||
|
@ -479,4 +481,48 @@ public class TestMountTableResolver {
|
||||||
long cacheSize = mountTable.getCacheSize();
|
long cacheSize = mountTable.getCacheSize();
|
||||||
assertTrue(cacheSize <= TEST_MAX_CACHE_SIZE);
|
assertTrue(cacheSize <= TEST_MAX_CACHE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLocationCache() throws Exception {
|
||||||
|
List<MountTable> entries = new ArrayList<>();
|
||||||
|
|
||||||
|
// Add entry and test location cache
|
||||||
|
Map<String, String> map1 = getMountTableEntry("1", "/testlocationcache");
|
||||||
|
MountTable entry1 = MountTable.newInstance("/testlocationcache", map1);
|
||||||
|
entries.add(entry1);
|
||||||
|
|
||||||
|
Map<String, String> map2 = getMountTableEntry("2",
|
||||||
|
"/anothertestlocationcache");
|
||||||
|
MountTable entry2 = MountTable.newInstance("/anothertestlocationcache",
|
||||||
|
map2);
|
||||||
|
entries.add(entry2);
|
||||||
|
mountTable.refreshEntries(entries);
|
||||||
|
assertEquals("1->/testlocationcache/",
|
||||||
|
mountTable.getDestinationForPath("/testlocationcache").toString());
|
||||||
|
assertEquals("2->/anothertestlocationcache/",
|
||||||
|
mountTable.getDestinationForPath("/anothertestlocationcache")
|
||||||
|
.toString());
|
||||||
|
|
||||||
|
// Remove the entry1
|
||||||
|
entries.remove(entry1);
|
||||||
|
mountTable.refreshEntries(entries);
|
||||||
|
|
||||||
|
// Add the default location and test location cache
|
||||||
|
assertEquals("0->/testlocationcache",
|
||||||
|
mountTable.getDestinationForPath("/testlocationcache").toString());
|
||||||
|
|
||||||
|
// Add the entry again but mount to another ns
|
||||||
|
Map<String, String> map3 = getMountTableEntry("3", "/testlocationcache");
|
||||||
|
MountTable entry3 = MountTable.newInstance("/testlocationcache", map3);
|
||||||
|
entries.add(entry3);
|
||||||
|
mountTable.refreshEntries(entries);
|
||||||
|
|
||||||
|
// Ensure location cache update correctly
|
||||||
|
assertEquals("3->/testlocationcache/",
|
||||||
|
mountTable.getDestinationForPath("/testlocationcache").toString());
|
||||||
|
|
||||||
|
// Cleanup before exit
|
||||||
|
mountTable.removeEntry("/testlocationcache");
|
||||||
|
mountTable.removeEntry("/anothertestlocationcache");
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue