Уровень согласованности ВСЕ используется, когда для оператора определен уровень согласованности ДВА

Мы используем драйвер java datastax cassandra 2.1.2, Кассандра версия, которую мы используем 2.0.9,

У нас есть заявление, которое мы строим с QueryBuilder и мы устанавливаем уровень согласованности для заявления о TWO в явном виде.

Select selectStatement =  QueryBuilder.select().from(ARTICLES);
selectStatement.where(eq(ORGANIZATION_ID, organizationId));
selectStatement.setConsistencyLevel(ConsistencyLevel.TWO);

final ResultSet rs = session.execute(selectStatement);
//call to all() will be removed since it is enough to iterate over result set 
//and then you get pagination for free instead of loading everything in 
//memory
List<Row> rows = rs.all();  
for (final Row row : rows) {
   //do something with Row, convert to POJO
}

Мы получаем исключение как это:

com.datastax.driver.core.exceptions.ReadTimeoutException: Cassandra timeout during read query at consistency ALL (3 responses were required but only 2 replica responded)
com.datastax.driver.core.exceptions.ReadTimeoutException.copy (ReadTimeoutException.java:69)
com.datastax.driver.core.DefaultResultSetFuture.extractCauseFromExecutionException (DefaultResultSetFuture.java:259)
com.datastax.driver.core.ArrayBackedResultSet$MultiPage.prepareNextRow (ArrayBackedResultSet.java:279)
com.datastax.driver.core.ArrayBackedResultSet$MultiPage.isExhausted (ArrayBackedResultSet.java:239)
com.datastax.driver.core.ArrayBackedResultSet$1.hasNext (ArrayBackedResultSet.java:122)
com.datastax.driver.core.ArrayBackedResultSet.all (ArrayBackedResultSet.java:111)

Я знаю это призвание all() на ResultSet заставляет загружать все статьи для организации в память и работать с ней и создает нагрузку на кассандру. Это будет удалено, как отмечено в комментариях. Это может вызвать тайм-аут чтения, но я все еще озадачен, почему в сообщении об исключении есть ALL,

Вопрос в том, почему исключение говорит о том уровне согласованности ALL используется, когда мы устанавливаем его TWO за оригинальное утверждение. Является all() внутренне делать что-то с запросом и использовать CL ALL по умолчанию?

1 ответ

Решение

Ваша проблема почти наверняка https://issues.apache.org/jira/browse/CASSANDRA-7947. Вы видите сообщение об ошибке из-за невозможности восстановления чтения. Это не связано с вашим первоначальным уровнем согласованности. Это исправлено в 2.1.3+.

Другие вопросы по тегам