public static void main(String[] args) { ClientOnDefaultTable opts = new ClientOnDefaultTable("test_ingest"); ScannerOpts scanOpts = new ScannerOpts(); BatchWriterOpts bwOpts = new BatchWriterOpts(); opts.parseArgs(TestRandomDeletes.class.getName(), args, scanOpts, bwOpts); log.info("starting random delete test"); try { long deleted = 0; String tableName = opts.getTableName(); TreeSet<RowColumn> doomed = scanAll(opts, scanOpts, tableName); log.info("Got " + doomed.size() + " rows"); long startTime = System.currentTimeMillis(); while (true) { long half = scrambleDeleteHalfAndCheck(opts, scanOpts, bwOpts, tableName, doomed); deleted += half; if (half == 0) break; } long stopTime = System.currentTimeMillis(); long elapsed = (stopTime - startTime) / 1000; log.info("deleted " + deleted + " values in " + elapsed + " seconds"); } catch (Exception e) { throw new RuntimeException(e); } }
private static TreeSet<RowColumn> scanAll( ClientOnDefaultTable opts, ScannerOpts scanOpts, String tableName) throws Exception { TreeSet<RowColumn> result = new TreeSet<RowColumn>(); Connector conn = opts.getConnector(); Scanner scanner = conn.createScanner(tableName, auths); scanner.setBatchSize(scanOpts.scanBatchSize); for (Entry<Key, Value> entry : scanner) { Key key = entry.getKey(); Column column = new Column( TextUtil.getBytes(key.getColumnFamily()), TextUtil.getBytes(key.getColumnQualifier()), TextUtil.getBytes(key.getColumnVisibility())); result.add(new RowColumn(key.getRow(), column, key.getTimestamp())); } return result; }
private static long scrambleDeleteHalfAndCheck( ClientOnDefaultTable opts, ScannerOpts scanOpts, BatchWriterOpts bwOpts, String tableName, Set<RowColumn> rows) throws Exception { int result = 0; ArrayList<RowColumn> entries = new ArrayList<RowColumn>(rows); java.util.Collections.shuffle(entries); Connector connector = opts.getConnector(); BatchWriter mutations = connector.createBatchWriter(tableName, bwOpts.getBatchWriterConfig()); for (int i = 0; i < (entries.size() + 1) / 2; i++) { RowColumn rc = entries.get(i); Mutation m = new Mutation(rc.row); m.putDelete( new Text(rc.column.columnFamily), new Text(rc.column.columnQualifier), new ColumnVisibility(rc.column.getColumnVisibility()), rc.timestamp + 1); mutations.addMutation(m); rows.remove(rc); result++; } mutations.close(); Set<RowColumn> current = scanAll(opts, scanOpts, tableName); current.removeAll(rows); if (current.size() > 0) { throw new RuntimeException(current.size() + " records not deleted"); } return result; }