diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/StoreFileListFile.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/StoreFileListFile.java index b6287b076b3e..e107688b3d71 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/StoreFileListFile.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/StoreFileListFile.java @@ -84,7 +84,7 @@ class StoreFileListFile { static final char TRACK_FILE_SEPARATOR = '.'; - static final Pattern TRACK_FILE_PATTERN = Pattern.compile("^f(1|2)\\.\\d+$"); + static final Pattern TRACK_FILE_PATTERN = Pattern.compile("^f(1|2)(\\.\\d+)?$"); // 16 MB, which is big enough for a tracker file private static final int MAX_FILE_SIZE = 16 * 1024 * 1024; @@ -179,7 +179,9 @@ private NavigableMap> listFiles() throws IOException { continue; } List parts = Splitter.on(TRACK_FILE_SEPARATOR).splitToList(file.getName()); - map.computeIfAbsent(Long.parseLong(parts.get(1)), k -> new ArrayList<>()).add(file); + // For compatibility, set the timestamp to 0 if it is missing in the file name. + long timestamp = parts.size() > 1 ? Long.parseLong(parts.get(1)) : 0L; + map.computeIfAbsent(timestamp, k -> new ArrayList<>()).add(file); } return map; } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/storefiletracker/TestStoreFileListFile.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/storefiletracker/TestStoreFileListFile.java index f1fcb924f899..82278a9e3500 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/storefiletracker/TestStoreFileListFile.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/storefiletracker/TestStoreFileListFile.java @@ -239,4 +239,21 @@ public void testLoadHigherVersion() throws IOException { assertEquals("Higher store file list version detected, expected " + StoreFileListFile.VERSION + ", got " + (StoreFileListFile.VERSION + 1), error.getMessage()); } + + @Test + public void testLoadOldPatternTrackFiles() throws IOException { + FileSystem fs = FileSystem.get(UTIL.getConfiguration()); + StoreFileList storeFileList = + StoreFileList.newBuilder().setTimestamp(EnvironmentEdgeManager.currentTime()) + .addStoreFile(StoreFileEntry.newBuilder().setName("hehe").setSize(10).build()).build(); + Path trackFileDir = new Path(testDir, StoreFileListFile.TRACK_FILE_DIR); + StoreFileListFile.write(fs, new Path(trackFileDir, StoreFileListFile.TRACK_FILE_PREFIX), + storeFileList); + + FileStatus trackerFileStatus = getOnlyTrackerFile(fs); + assertEquals(StoreFileListFile.TRACK_FILE_PREFIX, trackerFileStatus.getPath().getName()); + + StoreFileList list = storeFileListFile.load(true); + assertEquals(1, list.getStoreFileCount()); + } }