Подтвердить что ты не робот

Apache Cassandra удалить из счета

Я разрабатываю небольшое веб-приложение для изучения Apache Cassandra и Java EE 6. Версия Cassandra - 1.1.6.

У меня проблема, которая сводит меня с ума... Я создал таблицу со счетчиком (используя cqlsh v. 3.0.0)

CREATE TABLE test (
  author varchar PRIMARY KEY,
  tot counter
)

и поместите некоторые значения таким образом:

update test set tot = tot +1 where author = 'myAuthor';

семейство столбцов отлично обновлено

author   | tot
----------+-----
myAuthor |   1

НО, если вы попытаетесь удалить эту строку, а затем снова обновить (с тем же ключом), тогда ничего не произойдет! Таблица больше не обновляется, и я не могу понять, почему: мне кажется, что, как только вы использовали ключ, вы больше не сможете его использовать. Я искал подсказки в документации по документам (http://www.datastax.com/docs/1.1/references/cql/cql_lexicon), но не смог найти решение.

Может кто-нибудь мне помочь? Спасибо заранее

4b9b3361

Ответ 1

Кассандра имеет некоторые строгие ограничения на удаление счетчиков. Вы не можете удалить счетчик, а затем использовать его за любой короткий промежуток времени. Из Cassandra wiki:

Удаление счетчика по существу ограничено. Например, если вы очень быстро выполняете последовательность "increment, remove, increment", возможно, что удаление будет потеряно (если по какой-то причине удаление является последним принятым сообщением). Следовательно, удаление счетчиков предоставляется только для окончательного удаления, то есть когда удаленный счетчик не увеличивается после этого. Это также относится к удалению строк: если вы удаляете строку счетчиков, приращение любого счетчика в этой строке (существовавшей до удаления) приведет к неопределенному поведению. Обратите внимание, что если вам нужно reset счетчик, один из вариантов (к сожалению, не одновременно безопасный) может состоять в том, чтобы прочитать его значение и добавить -value.

Ответ 2

Решение по повторному добавлению удаленного счетчика - очистить всю запись из таблицы:

nodetool repair $table
cqlsh -c "ALTER TABLE $table WITH gc_grace_seconds=1;"
sleep 1
nodetool compact $table

Как вы можете себе представить, это не практично в реальной системе и, вероятно, должно быть зарезервировано для чрезвычайных ситуаций, если важный счетчик каким-то образом случайно удален.

Лучше убедиться, что этого никогда не произойдет.