@Test
  public void testGetBuckets() {
    List<Pair<String, Long>> pairs = new ArrayList<Pair<String, Long>>();
    String[] strings = {"a", "bbbb", "cccccccc", "cccccccc", "bbbb", "a"};
    for (String st : strings) {
      Pair<String, Long> pair = new Pair<String, Long>(st, new Long(st.length()));
      pairs.add(pair);
    }

    Set<List<String>> buckets = CompactionManager.getBuckets(pairs, 2);
    assertEquals(3, buckets.size());

    for (List<String> bucket : buckets) {
      assertEquals(2, bucket.size());
      assertEquals(bucket.get(0).length(), bucket.get(1).length());
      assertEquals(bucket.get(0).charAt(0), bucket.get(1).charAt(0));
    }

    pairs.clear();
    buckets.clear();

    String[] strings2 = {"aaa", "bbbbbbbb", "aaa", "bbbbbbbb", "bbbbbbbb", "aaa"};
    for (String st : strings2) {
      Pair<String, Long> pair = new Pair<String, Long>(st, new Long(st.length()));
      pairs.add(pair);
    }

    buckets = CompactionManager.getBuckets(pairs, 2);
    assertEquals(2, buckets.size());

    for (List<String> bucket : buckets) {
      assertEquals(3, bucket.size());
      assertEquals(bucket.get(0).charAt(0), bucket.get(1).charAt(0));
      assertEquals(bucket.get(1).charAt(0), bucket.get(2).charAt(0));
    }

    // Test the "min" functionality
    pairs.clear();
    buckets.clear();

    String[] strings3 = {"aaa", "bbbbbbbb", "aaa", "bbbbbbbb", "bbbbbbbb", "aaa"};
    for (String st : strings3) {
      Pair<String, Long> pair = new Pair<String, Long>(st, new Long(st.length()));
      pairs.add(pair);
    }

    buckets = CompactionManager.getBuckets(pairs, 10); // notice the min is 10
    assertEquals(1, buckets.size());
  }
Beispiel #2
0
  @Test
  @Ignore("making ranges based on the keys, not on the tokens")
  public void testNeedsCleanup() {
    Keyspace keyspace = Keyspace.open(KEYSPACE1);
    ColumnFamilyStore store = keyspace.getColumnFamilyStore("CF_STANDARD1");
    store.clearUnsafe();

    // disable compaction while flushing
    store.disableAutoCompaction();

    // write three groups of 9 keys: 001, 002, ... 008, 009
    //                               101, 102, ... 108, 109
    //                               201, 202, ... 208, 209
    for (int i = 1; i < 10; i++) {
      insertRowWithKey(i);
      insertRowWithKey(i + 100);
      insertRowWithKey(i + 200);
    }
    store.forceBlockingFlush();

    assertEquals(1, store.getSSTables().size());
    SSTableReader sstable = store.getSSTables().iterator().next();

    // contiguous range spans all data
    assertFalse(CompactionManager.needsCleanup(sstable, makeRanges(0, 209)));
    assertFalse(CompactionManager.needsCleanup(sstable, makeRanges(0, 210)));

    // separate ranges span all data
    assertFalse(
        CompactionManager.needsCleanup(
            sstable,
            makeRanges(
                0, 9,
                100, 109,
                200, 209)));
    assertFalse(
        CompactionManager.needsCleanup(
            sstable,
            makeRanges(
                0, 109,
                200, 210)));
    assertFalse(
        CompactionManager.needsCleanup(
            sstable,
            makeRanges(
                0, 9,
                100, 210)));

    // one range is missing completely
    assertTrue(
        CompactionManager.needsCleanup(
            sstable,
            makeRanges(
                100, 109,
                200, 209)));
    assertTrue(
        CompactionManager.needsCleanup(
            sstable,
            makeRanges(
                0, 9,
                200, 209)));
    assertTrue(
        CompactionManager.needsCleanup(
            sstable,
            makeRanges(
                0, 9,
                100, 109)));

    // the beginning of one range is missing
    assertTrue(
        CompactionManager.needsCleanup(
            sstable,
            makeRanges(
                1, 9,
                100, 109,
                200, 209)));
    assertTrue(
        CompactionManager.needsCleanup(
            sstable,
            makeRanges(
                0, 9,
                101, 109,
                200, 209)));
    assertTrue(
        CompactionManager.needsCleanup(
            sstable,
            makeRanges(
                0, 9,
                100, 109,
                201, 209)));

    // the end of one range is missing
    assertTrue(
        CompactionManager.needsCleanup(
            sstable,
            makeRanges(
                0, 8,
                100, 109,
                200, 209)));
    assertTrue(
        CompactionManager.needsCleanup(
            sstable,
            makeRanges(
                0, 9,
                100, 108,
                200, 209)));
    assertTrue(
        CompactionManager.needsCleanup(
            sstable,
            makeRanges(
                0, 9,
                100, 109,
                200, 208)));

    // some ranges don't contain any data
    assertFalse(
        CompactionManager.needsCleanup(
            sstable,
            makeRanges(
                0, 0,
                0, 9,
                50, 51,
                100, 109,
                150, 199,
                200, 209,
                300, 301)));
    // same case, but with a middle range not covering some of the existing data
    assertFalse(
        CompactionManager.needsCleanup(
            sstable,
            makeRanges(
                0, 0,
                0, 9,
                50, 51,
                100, 103,
                150, 199,
                200, 209,
                300, 301)));
  }