Гектор querySuperColumn не соответствует countSubColumns
У меня супер семейство колонн:
Logger {
superKey : {
nameKey : {name1:val1, name2:val2, ..., name8945:val8945}
}
}
Вот код:
ThriftSuperCfTemplate<String, String, String> stringKeyTemplate =
new ThriftSuperCfTemplate<String, String, String>
(keyspace, LOGGER_COLUMN_FAMILY,
StringSerializer.get(), StringSerializer.get(),
StringSerializer.get());
int count = stringKeyTemplate.countSubColumns(NAME_KEY, SUPER_KEY); //1
SuperCfResult<String, String, String> nameRow =
stringKeyTemplate.querySuperColumn(NAME_KEY, SUPER_KEY);
Collection<String> names = nameRow.getColumnNames(); //2
Assert.assertTrue(names.size()==count); //3
То, что я пытаюсь сделать, это получить все имена столбцов из семейства столбцов nameKey, но он возвращает только первые 7 имен {name1, name2,..., name7}
(строка 2), но количество возвращается 8945
(строка 1). И утверждение не в строке 3...
2 ответа
Я не могу воспроизвести это на текущей подсказке в GH: https://github.com/rantav/hector/commit/1aa93e78257e86dfc73390cb9c4db52d8ed29a69
Я не думаю, что что-то изменилось между версией 1.0.1 и master. Если бы вы могли попробовать обновиться до последней версии от транка и посмотреть, исчезнет ли проблема, я буду исследовать дальше. Кроме того, какую версию Cassandra вы используете? Это произошло только на выходных, но это не может быть причиной: https://issues.apache.org/jira/browse/CASSANDRA-3446
Есть ли какие-либо журналы ошибок на сервере? Установите уровень ведения журнала для StorageProxy для отладки и убедитесь, что все, что происходит по сети, кажется правильным (подробности о настройке уровней ведения журнала: http://www.datastax.com/docs/1.0/configuration/logging_options).
Я обнаружил, что это воспроизводимо только на определенных данных, которые я не мог генерировать вручную. Однако я нашел обходной путь для моего случая:
int count = stringKeyTemplate.countSubColumns(NAME_KEY, SUPER_KEY); //1
SuperSliceQuery<String, String, String, String> query =
HFactory.createSuperSliceQuery(keyspace, StringSerializer.get(),
StringSerializer.get(), StringSerializer.get(),
StringSerializer.get());
query.setColumnFamily(COLUMN_FAMILY);
query.setKey(NAME_KEY);
query.setRange(SUPER_KEY, SUPER_KEY, false, 1);
QueryResult<SuperSlice<String, String, String>> result = query.execute();
Collection<String> names = null;
names = result.get().getColumnByName(SUPER_KEY).getColumns(); //2
Assert.assertTrue(names.size()==count); //3