2015-08-10 2 views
0

У меня есть единичный тест, в котором я пишу и читаю из cassandra несколько раз.Cassandra показывает резкое поведение

future = function(Cassandra update with value x) - async //write and read updated value 
value = future.get(); //reading 
print value; 
assert value == x; 

//doing the above operation multiple times with different values of x; 

Выполнение одного и того же кода несколько раз показывает разные результаты. I.e печать другого результата для атрибута «значение».

Я использую Кассандру на локальном хосте с

replication = { 
'class': 'SimpleStrategy', 
    'replication_factor': '1' 
}; 

Стоит отметить, что я пишу и читать в той же строке в таблице (во всех чтения и записи, первичный ключ такой же). И хотя я изменяю один и тот же объект несколько раз, но они должны запускаться последовательно, поскольку я выполняю функцию блокировки future.get() после каждого оператора обновления.

Я использую Cassandra 2.0.14 с водителем datastax и jdk 1.8.

Любые идеи, почему я должен сталкиваться с таким поведением?

+0

Это может быть проблема «Test Run War», поскольку я использую тот же объект/инструмент в нескольких утверждениях assert. – Amit

+0

Есть ли способ увидеть, какие все запросы были применены в ключевом пространстве, а где-то они где-то зарегистрированы? – Amit

ответ

0

Выяснил причину. В моем коде (а не в тестовом коде) я не писал и не писал последовательно. Чтение не ожидало завершения записи.

Что я делал:

`CompletionStage<Void> Function() { 
    someOperation 
    .thenAccept(variable -> AsyncWriteInDb(variable)); 
} 
// AsyncWriteInDb returns CompletionStage<Void> when write is completed. 
// I was reading just after execution of this function. 
` 

Что я должен делать:

` CompletionStage<Void> Function() { 
    someOperation 
    .thenCompose(variable -> AsyncWriteInDb(variable)); 
} 
//AsyncWriteInDb returns CompletionStage<Void> when write is completed. 
` 

Это легче понять, если я пишу ранее (неправильно) часть кода, как показано ниже:

`CompletionStage<Void> Function() { 
    someOperation 
    .thenAccept(variable -> { 
     AsyncWriteInDb(variable); 
     return; 
    }); 
} 
// thenAccept's lamda was returning after initiating an asyncDbWrite. 
// Reading just after this doesnt ensure sequential reading after writing. 
` 
Смежные вопросы