2012-11-30 2 views
11

Je développe une petite application web pour étudier Apache Cassandra et Java EE 6. La version de Cassandra est 1.1.6.Apache Cassandra supprimer du compteur

Demandez-moi de conduire un problème fou ... j'ai créé une table avec un compteur

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

et mettre des valeurs de cette façon (en utilisant cqlsh v 3.0.0.):

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

la famille de la colonne est parfaitement mis à jour

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

MAIS, si vous essayez de supprimer cette ligne et t quand la mise à jour est faite (avec la même touche), rien ne se passe! La table n'est plus mise à jour et je n'arrive pas à comprendre pourquoi: il me semble qu'une fois que vous avez utilisé une clé, vous ne pouvez plus l'utiliser. J'ai cherché des indices dans la documentation de datasax (http://www.datastax.com/docs/1.1/references/cql/cql_lexicon) mais je n'ai pas réussi à trouver une solution.

Quelqu'un peut-il m'aider? Merci d'avance

+0

Si je veux changer la valeur du compteur, je dois mettre à jour le compteur mise à jour _table_ mis _counter_ = _counter_ -1 mais ma question est: pourquoi je ne peux pas utiliser une clé de suppression plus? – besil

Répondre

15

Cassandra a des limites strictes sur la suppression des compteurs. Vous ne pouvez pas vraiment supprimer un compteur et l'utiliser à nouveau dans un court laps de temps. A partir du Cassandra wiki:

L'élimination du compteur est intrinsèquement limitée. Par exemple, si vous lancez très rapidement la séquence «incrémenter, supprimer, incrémenter», il est possible que la suppression soit perdue (si pour une raison quelconque, la suppression est le dernier message reçu). Par conséquent, le retrait des compteurs n'est prévu que pour le retrait définitif, c'est-à-dire lorsque le compteur supprimé n'est pas incrémenté par la suite. Cela vaut également pour la suppression de lignes: si vous supprimez une ligne de compteurs, incrémenter n'importe quel compteur de cette ligne (qui existait avant la suppression) entraînera un comportement indéterminé. Notez que si vous avez besoin de réinitialiser un compteur, une option (qui n'est malheureusement pas simultanée) peut être de lire sa valeur et d'ajouter une valeur.

+0

Comment le réparer si vous avez supprimé la ligne avant de lire ceci? – OrangeDog

1

La solution de ré-ajout d'une clé de compteur supprimé est de purger toute trace de ce à partir de la table:

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

Comme vous pouvez l'imaginer, ce n'est pas pratique dans un système réel et devrait probablement être réservé en cas d'urgence si un compteur important est en quelque sorte accidentellement supprimé.

Il est préférable de s'assurer que cela ne peut jamais arriver.