2016-05-26 2 views
2

Wenn ich eine Cassandra Batch-Anweisung mit CQL verwende, dann kann jede Anweisung einen individuellen Zeitstempel haben. Zum Beispiel so etwas wie:Können Cassandra-Anweisungen innerhalb eines Stapels separate Zeitstempel mit cpp-Treiber haben?

BEGIN BATCH 
    INSERT INTO users (name, surname) VALUES ('Bob', 'Smith') USING TIMESTAMP 10000001; 
    DELETE FROM users USING TIMESTAMP 10000000 WHERE user='Bob'; 
APPLY BATCH; 

Wenn ich versuche, etwas ähnliches mit der C++ Treiber zu tun, würde ich so etwas tun:

  1. Erstellen Sie die Partie mit cass_batch_new
  2. Erstellen Sie die Anweisungen mit cass_future_get_prepared dann cass_prepared_bind
  3. den Zeitstempel mit cass_statement_set_timestamp auf jeder Anweisung gesetzt
  4. die Anweisung zu der Charge mit cass_batch_add_ hinzufügen Anweisung
  5. Führen Sie die Batch cass_session_execute_batch mit

dann würde ich dies in der gleichen Weise wie die CQL Stapelanweisung, in so viel verhalten erwarten, da jede Anweisung im Batch mit einem eigenen separaten Zeitstempel ausgeführt wird. Aber aufgrund meiner Tests konnte ich das nicht zum Laufen bringen. Es scheint, dass der gesamte Stapel mit einem einzigen Zeitstempel ausgeführt wurde.

Analog dazu, wenn ich einen monotonen Zeitstempelgenerator erzeuge, um die Zeitstempel für mich zu generieren, scheint es, nur einen Zeitstempel für den Stapel und nicht für die einzelnen Anweisungen zu verwenden.

Ich habe einen Blick auf den Quellcode für den C++ - Treiber und es sieht aus wie wenn es die Anweisungen im Stapel zum Senden an die Datenbank (in ExecuteRequest :: encode_batch) codiert, es nicht zu verschlüsseln versucht ein Zeitstempel für jede Anweisung im Stapel, nur für den Stapel insgesamt. Bei der Codierung einzelner Anweisungen, die nicht in einem Batch enthalten sind, wird der Zeitstempel für die Anweisung (in ExecuteRequest :: internal_encode) codiert.

Als Problemumgehung, anstatt den Zeitstempel für die Anweisungen mit cass_statement_set_timestamp festzulegen, kann ich "USING TIMESTAMP 10000001" direkt in die CQL-Zeichenfolge einfügen, und das funktioniert dann wie vorgesehen. Es scheint also so zu sein, dass die Datenbank bei jeder Anweisung im Stapel korrekte Zeitstempel haben kann, aber der C++ - Treiber kann sie nicht senden.

Aber den Zeitstempel direkt in den CQL mit "VERWENDUNG TIMESTAMP 10000001" setzen, dann kann ich die Anweisung nicht einfach durch das Binden neuer Werte wiederverwenden. Ich müsste die Aussage noch einmal vorbereiten.

Hat jemand anderes dies versucht und es geschafft, es zur Arbeit zu bringen? Oder ist es nur eine bekannte Einschränkung des C++ - Treibers?

Ich bin mit Cassandra C++ Treiberversion 2.2.2 und Datenbankversion 2.2.5 die soweit ich sagen kann, ist mit nativen Protokoll Version 4

Antwort

1

Ich hob auch diese auf der Cassandra C++ Treiber Mailingliste Google Gruppe und Michael Penick antwortete, dass es derzeit nicht möglich ist. Das zugrunde liegende Protokoll unterstützt keinen Zeitstempel pro Anweisung im Stapel, sodass der Treiber keinen senden kann.

Native Protocol v4 spec

Verwandte Themen