Skip to content

Commit

Permalink
[Enhancement] support show catalog recycle bin
Browse files Browse the repository at this point in the history
Signed-off-by: Rohit Satardekar <[email protected]>
  • Loading branch information
rohitrs1983 committed Sep 12, 2024
1 parent ca925d2 commit 6b403ee
Show file tree
Hide file tree
Showing 2 changed files with 193 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -2535,7 +2535,6 @@ public Void visitShowCatalogRecycleBinStatement(ShowCatalogRecycleBinStmt statem
}
}
return null;

}

private String getTableNameByRoutineLoadLabel(ConnectContext context,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,21 @@
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;

public class CatalogRecycleBinTest {

private static String rowsToString(List<List<String>> rows) {
List<String> lines = rows.stream().map(
row -> {
row.remove(1);
return java.lang.String.join("|",
row.toArray(new String[0])).replaceAll("id=\\d+(,\\s+)?", "");
}
).collect(Collectors.toList());
return java.lang.String.join("\n", lines.toArray(new String[0]));
}

@Test
public void testGetDb() {
CatalogRecycleBin bin = new CatalogRecycleBin();
Expand Down Expand Up @@ -605,4 +617,185 @@ public void testRecyclePartition(@Mocked GlobalStateMgr globalStateMgr, @Mocked
Assert.assertEquals(0, recycleBin.idToRecycleTime.size());
Assert.assertEquals(0, recycleBin.enableEraseLater.size());
}

@Test
public void testShowCatalogRecycleBinDatabase(@Mocked GlobalStateMgr globalStateMgr, @Mocked EditLog editLog) {
Database db1 = new Database(111, "uno");
Database db2SameName = new Database(22, "dos"); // samename
Database db2 = new Database(222, "dos");

// 1. recycle 2 dbs
CatalogRecycleBin recycleBin = new CatalogRecycleBin();
recycleBin.recycleDatabase(db1, new HashSet<>());
recycleBin.recycleDatabase(db2SameName, new HashSet<>()); // will remove same name
recycleBin.recycleDatabase(db2, new HashSet<>());

Assert.assertEquals(recycleBin.getDatabase(db1.getId()), db1);
Assert.assertEquals(recycleBin.getDatabase(db2.getId()), db2);
Assert.assertEquals(recycleBin.getDatabase(999), null);
Assert.assertEquals(2, recycleBin.idToRecycleTime.size());
Assert.assertEquals(0, recycleBin.enableEraseLater.size());

// 2. manually set db expire time & recycle db1
Config.catalog_trash_expire_second = 3600;
long now = System.currentTimeMillis();
long expireFromNow = now - 3600 * 1000L;
recycleBin.idToRecycleTime.put(db1.getId(), expireFromNow - 1000);

new Expectations() {
{
GlobalStateMgr.getCurrentState();
minTimes = 0;
result = globalStateMgr;
}
};
new Expectations() {
{
globalStateMgr.getLocalMetastore().onEraseDatabase(anyLong);
minTimes = 0;
globalStateMgr.getEditLog();
minTimes = 0;
result = editLog;
}
};
new Expectations() {
{
editLog.logEraseDb(anyLong);
minTimes = 0;
}
};

recycleBin.eraseDatabase(now);

Assert.assertEquals(recycleBin.getDatabase(db1.getId()), null);
Assert.assertEquals(recycleBin.getDatabase(db2.getId()), db2);
Assert.assertEquals(1, recycleBin.idToRecycleTime.size());
Assert.assertEquals(0, recycleBin.enableEraseLater.size());

List<List<String>> recyclebininfo = recycleBin.getCatalogRecycleBinInfo();
Assert.assertEquals(recyclebininfo.size(), 1);
String actual = rowsToString(recyclebininfo);
Assert.assertTrue(actual.contains("222"));
}

@Test
public void testShowCatalogRecycleBinTable(@Mocked GlobalStateMgr globalStateMgr, @Mocked EditLog editLog) {
Table table1 = new Table(111, "uno", Table.TableType.VIEW, null);
Table table2SameName = new Table(22, "dos", Table.TableType.VIEW, null);
Table table2 = new Table(222, "dos", Table.TableType.VIEW, null);

new Expectations() {
{
GlobalStateMgr.getCurrentState();
minTimes = 0;
result = globalStateMgr;
}
};
new Expectations() {
{
globalStateMgr.getEditLog();
minTimes = 0;
result = editLog;
}
};
new Expectations() {
{
editLog.logEraseMultiTables((List<Long>) any);
minTimes = 0;
result = null;
}
};

// 1. add 2 tables
long dbId = 1;
CatalogRecycleBin recycleBin = new CatalogRecycleBin();
recycleBin.recycleTable(dbId, table1, true);
recycleBin.recycleTable(dbId, table2SameName, true);
recycleBin.recycleTable(dbId, table2, true);

Assert.assertEquals(recycleBin.getTables(dbId), Arrays.asList(table1, table2SameName, table2));
Assert.assertSame(recycleBin.getTable(dbId, table1.getId()), table1);
Assert.assertSame(recycleBin.getTable(dbId, table2.getId()), table2);
Assert.assertTrue(recycleBin.idToRecycleTime.containsKey(table1.getId()));
Assert.assertTrue(recycleBin.idToRecycleTime.containsKey(table2.getId()));

// 2. manually set table expire time & recycle table1
Config.catalog_trash_expire_second = 3600;
long now = System.currentTimeMillis();
long expireFromNow = now - 3600 * 1000L;
recycleBin.idToRecycleTime.put(table1.getId(), expireFromNow - 1000);
recycleBin.eraseTable(now);

Assert.assertEquals(recycleBin.getTables(dbId), List.of(table2));
Assert.assertNull(recycleBin.getTable(dbId, table1.getId()));
Assert.assertSame(recycleBin.getTable(dbId, table2.getId()), table2);

List<List<String>> recyclebininfo = recycleBin.getCatalogRecycleBinInfo();
Assert.assertEquals(recyclebininfo.size(), 1);
String actual = rowsToString(recyclebininfo);
Assert.assertTrue(actual.contains("222"));
}

@Test
public void testShowCatalogRecycleBinPartition(@Mocked GlobalStateMgr globalStateMgr, @Mocked EditLog editLog) {
Partition p1 = new Partition(111, "uno", null, null);
Partition p2SameName = new Partition(22, "dos", null, null);
Partition p2 = new Partition(222, "dos", null, null);

new Expectations() {
{
GlobalStateMgr.getCurrentState();
minTimes = 0;
result = globalStateMgr;
}
};
new Expectations() {
{
globalStateMgr.getLocalMetastore().onErasePartition((Partition) any);
minTimes = 0;

globalStateMgr.getEditLog();
minTimes = 0;
result = editLog;
}
};
new Expectations() {
{
editLog.logErasePartition(anyLong);
minTimes = 0;
}
};

// 1. add 2 partitions
long dbId = 1;
long tableId = 2;
DataProperty dataProperty = new DataProperty(TStorageMedium.HDD);
CatalogRecycleBin recycleBin = new CatalogRecycleBin();

recycleBin.recyclePartition(new RecycleRangePartitionInfo(dbId, tableId, p1, null, dataProperty, (short) 2, false, null));
recycleBin.recyclePartition(
new RecycleRangePartitionInfo(dbId, tableId, p2SameName, null, dataProperty, (short) 2, false, null));
recycleBin.recyclePartition(new RecycleRangePartitionInfo(dbId, tableId, p2, null, dataProperty, (short) 2, false, null));

Assert.assertEquals(recycleBin.getPartition(p1.getId()), p1);
Assert.assertEquals(recycleBin.getPartition(p2.getId()), p2);
Assert.assertTrue(recycleBin.idToRecycleTime.containsKey(p1.getId()));
Assert.assertTrue(recycleBin.idToRecycleTime.containsKey(p2.getId()));

// 2. manually set table expire time & recycle table1
Config.catalog_trash_expire_second = 3600;
long now = System.currentTimeMillis();
long expireFromNow = now - 3600 * 1000L;
recycleBin.idToRecycleTime.put(p1.getId(), expireFromNow - 1000);
recycleBin.erasePartition(now);

Assert.assertNull(recycleBin.getPartition(p1.getId()));
Assert.assertEquals(recycleBin.getPartition(p2.getId()), p2);

List<List<String>> recyclebininfo = recycleBin.getCatalogRecycleBinInfo();
Assert.assertEquals(recyclebininfo.size(), 1);
String actual = rowsToString(recyclebininfo);
Assert.assertTrue(actual.contains("222"));
}

}

0 comments on commit 6b403ee

Please sign in to comment.