L'insertion dans Cassandra par-client Thrift ne fonctionne pas après avoir enlevé une rangée par cassandra-cli

StackOverflow https://stackoverflow.com/questions/4007645

  •  25-09-2019
  •  | 
  •  

Question

J'ai écrit un test de simpe pour valider ma propre compréhension de l'interface Thrift pour Cassandra. Il insère juste une ligne dans la base de données (en utilisant la keyspace et familty colonne qui viennent préconfiguré avec l'installation cassandra), il lit ensuite la base de données et compare les résultats.

public class CassandraAPITest {
    @Test
    public void testCassandraAPI() throws Exception {
        TTransport tr = new TSocket("localhost", 9160);
        tr.open();
        Client client = new Cassandra.Client(new TBinaryProtocol(tr));
        String key = "123";
        byte[] value = { 52, 53, 54 };
        ColumnPath columnPath = new ColumnPath("Standard1");
        columnPath.setColumn("abc".getBytes("UTF8"));
        long timestamp = System.currentTimeMillis();

       client.insert("Keyspace1", key, columnPath, value, timestamp, ConsistencyLevel.ONE);

        SlicePredicate predicate = new SlicePredicate();
        SliceRange sliceRange = new SliceRange();
        sliceRange.setStart(new byte[0]);
        sliceRange.setFinish(new byte[0]);
        predicate.setSlice_range(sliceRange);

        List<ColumnOrSuperColumn> result = client.get_slice("Keyspace1", key, new ColumnParent("Standard1"), predicate, ConsistencyLevel.ONE);

        assertEquals(1, result.size());
        byte[] actual = result.get(0).column.value;
        assertArrayEquals(value, actual);

        // client.remove("Keyspace1", key, columnPath, System.currentTimeMillis(), ConsistencyLevel.ONE);

        tr.close();
    }
}

Ce test fonctionne très bien. Bien sûr, il laisse une rangée derrière dans la base de données. Je pouvais supprimer la ligne à la fin de l'épreuve par décommentant l'instruction client.remove ci-dessus (cela fonctionne aussi bien). Mais ce que j'ai essayé à la place supprimait la ligne via l'interface de ligne de commande:

cassandra> connect localhost/9160                   
Connected to: "Test Cluster" on localhost/9160
cassandra> get Keyspace1.Standard1['123']
=> (column=616263, value=456, timestamp=1287909211506)
Returned 1 results.
cassandra> del Keyspace1.Standard1['123']   
row removed.
cassandra> get Keyspace1.Standard1['123']
Returned 0 results.

Le test échoue par la suite. Insertion de la ligne dans la base de données semble avoir plus d'effet, de sorte que les assertEquals de ligne (1, result.size ()) échoue:

java.lang.AssertionError: expected:<1> but was:<0>
    at org.junit.Assert.fail(Assert.java:91)
    at org.junit.Assert.failNotEquals(Assert.java:618)
    at org.junit.Assert.assertEquals(Assert.java:126)
    at org.junit.Assert.assertEquals(Assert.java:443)
    at org.junit.Assert.assertEquals(Assert.java:427)
    at test.package.CassandraAPITest.testCassandraAPI(CassandraAPITest.java:48)

Je ne reçois aucun message d'erreur (ni le client ni sur le serveur) et je ne sais pas quelle est la cause du problème est peut-être.

Était-ce utile?

La solution

Vous insérez avec une résolution de milliseconde mais le CLI (et d'autres clients de haut niveau) utilise microsecondes. Donc, votre deuxième insert est dans le passé, par rapport à la suppression, de sorte que Cassandra ne tient pas compte correctement il.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top