Cassandra: impossibile eliminare la riga

Aug 22 2020

Vorrei eliminare una riga specifica dalla tabella Casandra ma non posso. Sono in grado di eliminare qualsiasi altro dalla tabella tranne questo. Ho messo la seguente query di cancellazione ma non succede niente:

cqlsh> delete from sales.tbl where orderid=999999 and orderdate='2019/01/01';
cqlsh>
cqlsh> select * from sales.tbl where orderid=999999 and orderdate='2019/01/01';

 orderid | orderdate  | country | itemtype | orderpriority | region        | saleschannel | shipdate   | totalcost | totalprofit | totalrevenue | unitcost | unitprice | unitssold
---------+------------+---------+----------+---------------+---------------+--------------+------------+-----------+-------------+--------------+----------+-----------+-----------
  999999 | 2019/01/01 |  Canada |    Stuff |             N | North America |      Offline | 2019/01/02 |       100 |           0 |          100 |        0 |         1 |         1

(1 rows)
cqlsh>

Ecco lo shema di questa tabella:

    CREATE TABLE sales.tbl1 (
        orderid bigint,
        orderdate text,
        country text,
        itemtype text,
        orderpriority text,
        region text,
        saleschannel text,
        shipdate text,
        totalcost float,
        totalprofit float,
        totalrevenue float,
        unitcost float,
        unitprice float,
        unitssold int,
        PRIMARY KEY (orderid, orderdate) ) WITH CLUSTERING ORDER BY (orderdate ASC)
        AND bloom_filter_fp_chance = 0.01
        AND caching = {'keys': 'ALL', 'rows_per_partition': 'ALL'}
        AND comment = ''
        AND compaction = {'class': 'SizeTieredCompactionStrategy'}
        AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
        AND crc_check_chance = 1.0
        AND dclocal_read_repair_chance = 0.1
        AND default_time_to_live = 0
        AND gc_grace_seconds = 1
        AND max_index_interval = 2048
        AND memtable_flush_period_in_ms = 0
        AND min_index_interval = 128
        AND read_repair_chance = 0.0
        AND speculative_retry = '99.0PERCENTILE';

qualche suggerimento?

Risposte

3 NadavHar'El Aug 22 2020 at 18:36

Questa situazione bizzarra può accadere se la riga è stata creata con un orario lontano nel futuro. In Cassandra e Scylla, i client possono specificare un timestamp per ogni scrittura e l'ultimo timestamp vince, indipendentemente dall'ordinamento in tempo reale degli aggiornamenti.

Ad esempio, si consideri che un client scrive una riga con timestamp 1000, e qualche tempo dopo un altro client invia un'eliminazione al timestamp 900. Quell'eliminazione non cancellerà nulla - la scrittura è considerata avvenuta dopo l'eliminazione, quindi l'eliminazione viene semplicemente ignorata.

È possibile che questo sia esattamente quello che ti è successo: un client con un orologio configurato in modo errato ha utilizzato questo orologio e ha creato una riga con un timestamp in un lontano futuro. Quando provi ora, delete from sales.tbl where orderid=999999 and orderdate='2019/01/01';l'ora corrente viene utilizzata come timestamp di questa eliminazione ed è più vecchia di quella futura, quindi l'eliminazione viene semplicemente ignorata.

Per verificare se questo è il caso, prova

select writetime(region) from sales.tbl where orderid=999999 and orderdate='2019/01/01';

Questo mostrerà il tempo di scrittura (cioè il timestamp) della colonna "regione" (ad esempio) nel tuo articolo. Questa volta è in microsecondi dall'epoca UNIX (mezzanotte GMT, 1 gennaio 1970). Se è in futuro, ho indovinato correttamente il tuo problema. Se questo è il caso, per eliminare davvero questa riga, dovrai quindi fare qualcosa di simile

delete from sales.tbl using timestamp 111111111 where orderid=999999 and orderdate='2019/01/01';

Dove il timestamp "111111111" è un numero (almeno) superiore di uno rispetto al timestamp che selectti ha mostrato.