Search in sources :

Example 1 with IdentityQueryFilter

use of org.apache.cassandra.db.columniterator.IdentityQueryFilter in project eiger by wlloyd.

the class CleanupTest method testCleanupWithIndexes.

@Test
public void testCleanupWithIndexes() throws IOException, ExecutionException, InterruptedException {
    Table table = Table.open(TABLE1);
    ColumnFamilyStore cfs = table.getColumnFamilyStore(CF1);
    assertEquals(cfs.indexManager.getIndexedColumns().iterator().next(), COLUMN);
    List<Row> rows;
    // insert data and verify we get it back w/ range query
    fillCF(cfs, LOOPS);
    rows = Util.getRangeSlice(cfs);
    assertEquals(LOOPS, rows.size());
    SecondaryIndex index = cfs.indexManager.getIndexForColumn(COLUMN);
    long start = System.currentTimeMillis();
    while (!index.isIndexBuilt(COLUMN) && System.currentTimeMillis() < start + 10000) Thread.sleep(10);
    // verify we get it back w/ index query too
    IndexExpression expr = new IndexExpression(COLUMN, IndexOperator.EQ, VALUE);
    List<IndexExpression> clause = Arrays.asList(expr);
    IFilter filter = new IdentityQueryFilter();
    IPartitioner p = StorageService.getPartitioner();
    Range<RowPosition> range = Util.range("", "");
    rows = table.getColumnFamilyStore(CF1).search(clause, range, Integer.MAX_VALUE, filter);
    assertEquals(LOOPS, rows.size());
    // we don't allow cleanup when the local host has no range to avoid wipping up all data when a node has not join the ring.
    // So to make sure cleanup erase everything here, we give the localhost the tiniest possible range.
    TokenMetadata tmd = StorageService.instance.getTokenMetadata();
    byte[] tk1 = new byte[1], tk2 = new byte[1];
    tk1[0] = 2;
    tk2[0] = 1;
    tmd.updateNormalToken(new BytesToken(tk1), InetAddress.getByName("127.0.0.1"));
    tmd.updateNormalToken(new BytesToken(tk2), InetAddress.getByName("127.0.0.2"));
    CompactionManager.instance.performCleanup(cfs, new NodeId.OneShotRenewer());
    // row data should be gone
    rows = Util.getRangeSlice(cfs);
    assertEquals(0, rows.size());
    // not only should it be gone but there should be no data on disk, not even tombstones
    assert cfs.getSSTables().isEmpty();
    // 2ary indexes should result in no results, too (although tombstones won't be gone until compacted)
    rows = cfs.search(clause, range, Integer.MAX_VALUE, filter);
    assertEquals(0, rows.size());
}
Also used : IndexExpression(org.apache.cassandra.thrift.IndexExpression) TokenMetadata(org.apache.cassandra.locator.TokenMetadata) IdentityQueryFilter(org.apache.cassandra.db.columniterator.IdentityQueryFilter) SecondaryIndex(org.apache.cassandra.db.index.SecondaryIndex) IFilter(org.apache.cassandra.db.filter.IFilter) BytesToken(org.apache.cassandra.dht.BytesToken) NodeId(org.apache.cassandra.utils.NodeId) IPartitioner(org.apache.cassandra.dht.IPartitioner) Test(org.junit.Test)

Example 2 with IdentityQueryFilter

use of org.apache.cassandra.db.columniterator.IdentityQueryFilter in project eiger by wlloyd.

the class ColumnFamilyStoreTest method testIndexScan.

@Test
public void testIndexScan() throws IOException {
    RowMutation rm;
    rm = new RowMutation("Keyspace1", ByteBufferUtil.bytes("k1"));
    rm.add(new QueryPath("Indexed1", null, ByteBufferUtil.bytes("notbirthdate")), ByteBufferUtil.bytes(1L), 0);
    rm.add(new QueryPath("Indexed1", null, ByteBufferUtil.bytes("birthdate")), ByteBufferUtil.bytes(1L), 0);
    rm.apply();
    rm = new RowMutation("Keyspace1", ByteBufferUtil.bytes("k2"));
    rm.add(new QueryPath("Indexed1", null, ByteBufferUtil.bytes("notbirthdate")), ByteBufferUtil.bytes(2L), 0);
    rm.add(new QueryPath("Indexed1", null, ByteBufferUtil.bytes("birthdate")), ByteBufferUtil.bytes(2L), 0);
    rm.apply();
    rm = new RowMutation("Keyspace1", ByteBufferUtil.bytes("k3"));
    rm.add(new QueryPath("Indexed1", null, ByteBufferUtil.bytes("notbirthdate")), ByteBufferUtil.bytes(2L), 0);
    rm.add(new QueryPath("Indexed1", null, ByteBufferUtil.bytes("birthdate")), ByteBufferUtil.bytes(1L), 0);
    rm.apply();
    rm = new RowMutation("Keyspace1", ByteBufferUtil.bytes("k4aaaa"));
    rm.add(new QueryPath("Indexed1", null, ByteBufferUtil.bytes("notbirthdate")), ByteBufferUtil.bytes(2L), 0);
    rm.add(new QueryPath("Indexed1", null, ByteBufferUtil.bytes("birthdate")), ByteBufferUtil.bytes(3L), 0);
    rm.apply();
    // basic single-expression query
    IndexExpression expr = new IndexExpression(ByteBufferUtil.bytes("birthdate"), IndexOperator.EQ, ByteBufferUtil.bytes(1L));
    List<IndexExpression> clause = Arrays.asList(expr);
    IFilter filter = new IdentityQueryFilter();
    IPartitioner p = StorageService.getPartitioner();
    Range<RowPosition> range = Util.range("", "");
    List<Row> rows = Table.open("Keyspace1").getColumnFamilyStore("Indexed1").search(clause, range, 100, filter);
    assert rows != null;
    assert rows.size() == 2 : StringUtils.join(rows, ",");
    String key = new String(rows.get(0).key.key.array(), rows.get(0).key.key.position(), rows.get(0).key.key.remaining());
    assert "k1".equals(key) : key;
    key = new String(rows.get(1).key.key.array(), rows.get(1).key.key.position(), rows.get(1).key.key.remaining());
    assert "k3".equals(key) : key;
    assert ByteBufferUtil.bytes(1L).equals(rows.get(0).cf.getColumn(ByteBufferUtil.bytes("birthdate")).value());
    assert ByteBufferUtil.bytes(1L).equals(rows.get(1).cf.getColumn(ByteBufferUtil.bytes("birthdate")).value());
    // add a second expression
    IndexExpression expr2 = new IndexExpression(ByteBufferUtil.bytes("notbirthdate"), IndexOperator.GTE, ByteBufferUtil.bytes(2L));
    clause = Arrays.asList(expr, expr2);
    rows = Table.open("Keyspace1").getColumnFamilyStore("Indexed1").search(clause, range, 100, filter);
    assert rows.size() == 1 : StringUtils.join(rows, ",");
    key = new String(rows.get(0).key.key.array(), rows.get(0).key.key.position(), rows.get(0).key.key.remaining());
    assert "k3".equals(key);
    // same query again, but with resultset not including the subordinate expression
    rows = Table.open("Keyspace1").getColumnFamilyStore("Indexed1").search(clause, range, 100, new NamesQueryFilter(ByteBufferUtil.bytes("birthdate")));
    assert rows.size() == 1 : StringUtils.join(rows, ",");
    key = new String(rows.get(0).key.key.array(), rows.get(0).key.key.position(), rows.get(0).key.key.remaining());
    assert "k3".equals(key);
    assert rows.get(0).cf.getColumnCount() == 1 : rows.get(0).cf;
    // once more, this time with a slice rowset that needs to be expanded
    SliceQueryFilter emptyFilter = new SliceQueryFilter(ByteBufferUtil.EMPTY_BYTE_BUFFER, ByteBufferUtil.EMPTY_BYTE_BUFFER, false, 0);
    rows = Table.open("Keyspace1").getColumnFamilyStore("Indexed1").search(clause, range, 100, emptyFilter);
    assert rows.size() == 1 : StringUtils.join(rows, ",");
    key = new String(rows.get(0).key.key.array(), rows.get(0).key.key.position(), rows.get(0).key.key.remaining());
    assert "k3".equals(key);
    assert rows.get(0).cf.getColumnCount() == 0;
    // query with index hit but rejected by secondary clause, with a small enough count that just checking count
    // doesn't tell the scan loop that it's done
    IndexExpression expr3 = new IndexExpression(ByteBufferUtil.bytes("notbirthdate"), IndexOperator.EQ, ByteBufferUtil.bytes(-1L));
    clause = Arrays.asList(expr, expr3);
    rows = Table.open("Keyspace1").getColumnFamilyStore("Indexed1").search(clause, range, 100, filter);
    assert rows.isEmpty();
}
Also used : IdentityQueryFilter(org.apache.cassandra.db.columniterator.IdentityQueryFilter) IPartitioner(org.apache.cassandra.dht.IPartitioner) Test(org.junit.Test)

Example 3 with IdentityQueryFilter

use of org.apache.cassandra.db.columniterator.IdentityQueryFilter in project eiger by wlloyd.

the class KeyCollisionTest method testGetSliceWithCollision.

@Test
public void testGetSliceWithCollision() throws Exception {
    Table table = Table.open(KEYSPACE);
    ColumnFamilyStore cfs = table.getColumnFamilyStore(CF);
    cfs.clearUnsafe();
    // token = 2
    insert("k1", "k2", "k3");
    // token = 4
    insert("key1", "key2", "key3");
    // token = 8
    insert("longKey1", "longKey2");
    List<Row> rows = cfs.getRangeSlice(null, new Bounds<RowPosition>(dk("k2"), dk("key2")), 10000, new IdentityQueryFilter(), null);
    assert rows.size() == 4 : "Expecting 4 keys, got " + rows.size();
    assert rows.get(0).key.key.equals(ByteBufferUtil.bytes("k2"));
    assert rows.get(1).key.key.equals(ByteBufferUtil.bytes("k3"));
    assert rows.get(2).key.key.equals(ByteBufferUtil.bytes("key1"));
    assert rows.get(3).key.key.equals(ByteBufferUtil.bytes("key2"));
}
Also used : IdentityQueryFilter(org.apache.cassandra.db.columniterator.IdentityQueryFilter) Test(org.junit.Test)

Example 4 with IdentityQueryFilter

use of org.apache.cassandra.db.columniterator.IdentityQueryFilter in project eiger by wlloyd.

the class ColumnFamilyStoreTest method testLargeScan.

@Test
public void testLargeScan() throws IOException {
    RowMutation rm;
    for (int i = 0; i < 100; i++) {
        rm = new RowMutation("Keyspace1", ByteBufferUtil.bytes("key" + i));
        rm.add(new QueryPath("Indexed1", null, ByteBufferUtil.bytes("birthdate")), ByteBufferUtil.bytes(34L), 0);
        rm.add(new QueryPath("Indexed1", null, ByteBufferUtil.bytes("notbirthdate")), ByteBufferUtil.bytes((long) (i % 2)), 0);
        rm.applyUnsafe();
    }
    IndexExpression expr = new IndexExpression(ByteBufferUtil.bytes("birthdate"), IndexOperator.EQ, ByteBufferUtil.bytes(34L));
    IndexExpression expr2 = new IndexExpression(ByteBufferUtil.bytes("notbirthdate"), IndexOperator.EQ, ByteBufferUtil.bytes(1L));
    List<IndexExpression> clause = Arrays.asList(expr, expr2);
    IFilter filter = new IdentityQueryFilter();
    IPartitioner p = StorageService.getPartitioner();
    Range<RowPosition> range = Util.range("", "");
    List<Row> rows = Table.open("Keyspace1").getColumnFamilyStore("Indexed1").search(clause, range, 100, filter);
    assert rows != null;
    assert rows.size() == 50 : rows.size();
    Set<DecoratedKey> keys = new HashSet<DecoratedKey>();
    // extra check that there are no duplicate results -- see https://issues.apache.org/jira/browse/CASSANDRA-2406
    for (Row row : rows) keys.add(row.key);
    assert rows.size() == keys.size();
}
Also used : IdentityQueryFilter(org.apache.cassandra.db.columniterator.IdentityQueryFilter) IPartitioner(org.apache.cassandra.dht.IPartitioner) Test(org.junit.Test)

Example 5 with IdentityQueryFilter

use of org.apache.cassandra.db.columniterator.IdentityQueryFilter in project eiger by wlloyd.

the class SSTableReaderTest method assertIndexQueryWorks.

private void assertIndexQueryWorks(ColumnFamilyStore indexedCFS) {
    assert "Indexed1".equals(indexedCFS.getColumnFamilyName());
    // make sure all sstables including 2ary indexes load from disk
    indexedCFS.clearUnsafe();
    for (ColumnFamilyStore indexCfs : indexedCFS.indexManager.getIndexesBackedByCfs()) {
        indexCfs.clearUnsafe();
        // v1.0.4 would fail here (see CASSANDRA-3540)
        indexCfs.loadNewSSTables();
    }
    indexedCFS.loadNewSSTables();
    // query using index to see if sstable for secondary index opens
    IndexExpression expr = new IndexExpression(ByteBufferUtil.bytes("birthdate"), IndexOperator.EQ, ByteBufferUtil.bytes(1L));
    List<IndexExpression> clause = Arrays.asList(expr);
    IPartitioner p = StorageService.getPartitioner();
    Range<RowPosition> range = Util.range("", "");
    List<Row> rows = indexedCFS.search(clause, range, 100, new IdentityQueryFilter());
    assert rows.size() == 1;
}
Also used : IdentityQueryFilter(org.apache.cassandra.db.columniterator.IdentityQueryFilter) IndexExpression(org.apache.cassandra.thrift.IndexExpression) IPartitioner(org.apache.cassandra.dht.IPartitioner)

Aggregations

IdentityQueryFilter (org.apache.cassandra.db.columniterator.IdentityQueryFilter)11 IPartitioner (org.apache.cassandra.dht.IPartitioner)9 Test (org.junit.Test)8 IndexExpression (org.apache.cassandra.thrift.IndexExpression)3 IFilter (org.apache.cassandra.db.filter.IFilter)2 ByteBuffer (java.nio.ByteBuffer)1 ArrayList (java.util.ArrayList)1 QueryFilter (org.apache.cassandra.db.filter.QueryFilter)1 QueryPath (org.apache.cassandra.db.filter.QueryPath)1 SecondaryIndex (org.apache.cassandra.db.index.SecondaryIndex)1 BytesToken (org.apache.cassandra.dht.BytesToken)1 SSTable (org.apache.cassandra.io.sstable.SSTable)1 TokenMetadata (org.apache.cassandra.locator.TokenMetadata)1 CloseableIterator (org.apache.cassandra.utils.CloseableIterator)1 NodeId (org.apache.cassandra.utils.NodeId)1