diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconDBProvider.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconDBProvider.java index 16a303aa6fe2..44efb4f4b1f3 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconDBProvider.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconDBProvider.java @@ -32,7 +32,6 @@ import org.apache.hadoop.hdds.utils.db.DBStore; import org.apache.hadoop.hdds.utils.db.DBStoreBuilder; import org.apache.hadoop.hdds.utils.db.Table; -import org.apache.hadoop.hdds.utils.db.Table.KeyValue; import org.apache.hadoop.hdds.utils.db.TableIterator; import org.apache.hadoop.ozone.recon.ReconUtils; import org.slf4j.Logger; @@ -111,16 +110,22 @@ public DBStore getDbStore() { return dbStore; } - static void truncateTable(Table table) throws IOException { + static void truncateTable(Table table) throws IOException { if (table == null) { return; } - try (TableIterator> tableIterator = table.iterator()) { - while (tableIterator.hasNext()) { - KeyValue entry = tableIterator.next(); - table.delete(entry.getKey()); + final K firstKey; + final K lastKey; + try (TableIterator keyIterator = table.keyIterator()) { + if (!keyIterator.hasNext()) { + return; } + firstKey = keyIterator.next(); + keyIterator.seekToLast(); + lastKey = keyIterator.next(); } + table.deleteRange(firstKey, lastKey); + table.delete(lastKey); } private static DBStore initializeDBStore(OzoneConfiguration configuration, diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconDBProvider.java b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconDBProvider.java index 49b0b763e649..b8a954e0f1ae 100644 --- a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconDBProvider.java +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/spi/impl/TestReconDBProvider.java @@ -18,6 +18,8 @@ package org.apache.hadoop.ozone.recon.spi.impl; import static org.apache.hadoop.ozone.recon.ReconServerConfigKeys.OZONE_RECON_DB_DIR; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import com.google.inject.AbstractModule; @@ -28,6 +30,8 @@ import java.io.IOException; import java.nio.file.Path; import org.apache.hadoop.hdds.conf.OzoneConfiguration; +import org.apache.hadoop.hdds.utils.db.Table; +import org.apache.hadoop.hdds.utils.db.TableIterator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -64,4 +68,36 @@ public void testGet() throws Exception { assertNotNull(reconDBProvider.getDbStore()); } + @Test + public void testTruncateTable() throws Exception { + ReconDBProvider.truncateTable(null); + + ReconDBProvider reconDBProvider = injector.getInstance( + ReconDBProvider.class); + Table table = ReconDBDefinition.CONTAINER_KEY_COUNT.getTable( + reconDBProvider.getDbStore()); + + ReconDBProvider.truncateTable(table); + assertTableIsEmpty(table); + + table.put(1L, 10L); + ReconDBProvider.truncateTable(table); + assertTableIsEmpty(table); + + for (long i = 0; i < 100; i++) { + table.put(i, i); + } + ReconDBProvider.truncateTable(table); + assertTableIsEmpty(table); + + table.put(7L, 70L); + assertEquals(70L, table.get(7L)); + } + + private static void assertTableIsEmpty(Table table) throws Exception { + try (TableIterator keyIterator = table.keyIterator()) { + assertThat(keyIterator).isExhausted(); + } + } + }