2012-11-30 7 views
11

Sto sviluppando una piccola applicazione web per studiare Apache Cassandra e Java EE 6. La versione di Cassandra è la 1.1.6.Apache Cassandra cancella dal contatore

ha un problema di guida mi fa impazzire ... Ho creato una tabella con un contatore

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

e mettere un po 'i valori in questo modo (usando cqlsh v 3.0.0.):

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

la famiglia colonna è perfettamente aggiornato

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

MA, se si tenta di eliminare questa riga e t hen aggiorna di nuovo (con la stessa chiave), quindi non succede nulla! La tabella non è più aggiornata e non riesco a capire perché: mi sembra che una volta che hai usato una chiave non puoi più usarla. Ho cercato degli indizi nella documentazione datasax (http://www.datastax.com/docs/1.1/references/cql/cql_lexicon) ma non sono riuscito a trovare una soluzione.

Qualcuno può aiutarmi? Grazie in anticipo

+0

Se voglio cambiare il valore del contatore, devo aggiornare l'aggiornamento del contatore _table_ impostato _counter_ = -1 _counter_ ma la mia domanda è: perché non posso usare un tasto di cancellazione non di più? – besil

risposta

15

Cassandra ha alcuni limiti rigorosi sull'eliminazione dei contatori. Non è possibile eliminare un contatore e quindi utilizzarlo nuovamente in un breve periodo di tempo. Da Cassandra wiki:

La rimozione del contatore è intrinsecamente limitata. Ad esempio, se si emette molto rapidamente la sequenza "incremento, rimozione, incremento" è possibile che la rimozione venga persa (se per qualche motivo la rimozione sembra essere l'ultimo messaggio ricevuto). Quindi, la rimozione dei contatori viene fornita solo per la rimozione definitiva, ovvero quando il contatore eliminato non viene incrementato in seguito. Ciò vale anche per l'eliminazione delle righe: se elimini una riga di contatori, l'incremento di qualsiasi contatore in quella riga (esistente prima dell'eliminazione) determinerà un comportamento indeterminato. Nota che se hai bisogno di resettare un contatore, un'opzione (sfortunatamente non concorrente) potrebbe essere quella di leggere il suo valore e aggiungere il valore.

+0

Come lo risolvi se hai cancellato la riga prima di leggerla? – OrangeDog

1

La soluzione a ri-aggiungendo una chiave contatore cancellato è quello di eliminare tutti i record dalla tabella:

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

Come potete immaginare, questo non è pratico in un sistema reale e dovrebbe probabilmente essere riservato per le emergenze se un contatore importante viene in qualche modo cancellato accidentalmente.

È meglio garantire che non possa mai accadere.