compactionConfig.setIterators(new ArrayList<>(iterators));
@Override public void compact(String tableName, Text start, Text end, List<IteratorSetting> iterators, boolean flush, boolean wait) throws AccumuloSecurityException, TableNotFoundException, AccumuloException { compact(tableName, new CompactionConfig().setStartRow(start).setEndRow(end) .setIterators(iterators).setFlush(flush).setWait(wait)); }
compactionConfig.setIterators(new ArrayList<>(iterators));
@Override public void compact(String tableName, Text start, Text end, List<IteratorSetting> iterators, boolean flush, boolean wait) throws AccumuloSecurityException, TableNotFoundException, AccumuloException { compact(tableName, new CompactionConfig().setStartRow(start).setEndRow(end) .setIterators(iterators).setFlush(flush).setWait(wait)); }
@Test public void testIterators() throws Exception { // test compaction strategy + iterators Connector c = getConnector(); String tableName = getUniqueNames(1)[0]; c.tableOperations().create(tableName); writeFlush(c, tableName, "a"); writeFlush(c, tableName, "b"); // create a file that starts with A containing rows 'a' and 'b' c.tableOperations().compact(tableName, new CompactionConfig().setWait(true)); writeFlush(c, tableName, "c"); writeFlush(c, tableName, "d"); Assert.assertEquals(3, FunctionalTestUtils.countRFiles(c, tableName)); // drop files that start with A CompactionStrategyConfig csConfig = new CompactionStrategyConfig( TestCompactionStrategy.class.getName()); csConfig.setOptions(ImmutableMap.of("inputPrefix", "F")); IteratorSetting iterConf = new IteratorSetting(21, "myregex", RegExFilter.class); RegExFilter.setRegexs(iterConf, "a|c", null, null, null, false); c.tableOperations().compact(tableName, new CompactionConfig().setWait(true) .setCompactionStrategy(csConfig).setIterators(Arrays.asList(iterConf))); // compaction strategy should only be applied to one file. If its applied to both, then row 'b' // would be dropped by filter. Assert.assertEquals(ImmutableSet.of("a", "b", "c"), getRows(c, tableName)); Assert.assertEquals(2, FunctionalTestUtils.countRFiles(c, tableName)); c.tableOperations().compact(tableName, new CompactionConfig().setWait(true)); // ensure that iterator is not applied Assert.assertEquals(ImmutableSet.of("a", "b", "c"), getRows(c, tableName)); Assert.assertEquals(1, FunctionalTestUtils.countRFiles(c, tableName)); }
@Test public void testConcurrent() throws Exception { // two compactions without iterators or strategy should be able to run concurrently Connector c = getConnector(); String tableName = getUniqueNames(1)[0]; c.tableOperations().create(tableName); // write random data because its very unlikely it will compress writeRandomValue(c, tableName, 1 << 16); writeRandomValue(c, tableName, 1 << 16); c.tableOperations().compact(tableName, new CompactionConfig().setWait(false)); c.tableOperations().compact(tableName, new CompactionConfig().setWait(true)); Assert.assertEquals(1, FunctionalTestUtils.countRFiles(c, tableName)); writeRandomValue(c, tableName, 1 << 16); IteratorSetting iterConfig = new IteratorSetting(30, SlowIterator.class); SlowIterator.setSleepTime(iterConfig, 1000); long t1 = System.currentTimeMillis(); c.tableOperations().compact(tableName, new CompactionConfig().setWait(false).setIterators(Arrays.asList(iterConfig))); try { // this compaction should fail because previous one set iterators c.tableOperations().compact(tableName, new CompactionConfig().setWait(true)); if (System.currentTimeMillis() - t1 < 2000) Assert.fail( "Expected compaction to fail because another concurrent compaction set iterators"); } catch (AccumuloException e) {} }
@Override public void compactTable(ByteBuffer login, String tableName, ByteBuffer startRow, ByteBuffer endRow, List<org.apache.accumulo.proxy.thrift.IteratorSetting> iterators, boolean flush, boolean wait, CompactionStrategyConfig compactionStrategy) throws org.apache.accumulo.proxy.thrift.AccumuloSecurityException, org.apache.accumulo.proxy.thrift.TableNotFoundException, org.apache.accumulo.proxy.thrift.AccumuloException, TException { try { CompactionConfig compactionConfig = new CompactionConfig() .setStartRow(ByteBufferUtil.toText(startRow)).setEndRow(ByteBufferUtil.toText(endRow)) .setIterators(getIteratorSettings(iterators)).setFlush(flush).setWait(wait); if (compactionStrategy != null) { // @formatter:off org.apache.accumulo.core.client.admin.CompactionStrategyConfig ccc = new org.apache.accumulo.core.client.admin.CompactionStrategyConfig( compactionStrategy.getClassName()); // @formatter:on if (compactionStrategy.options != null) ccc.setOptions(compactionStrategy.options); compactionConfig.setCompactionStrategy(ccc); } getConnector(login).tableOperations().compact(tableName, compactionConfig); } catch (Exception e) { handleExceptionTNF(e); } }