Hi,
We've two tables in:
* First one *entity *has log-like structure - whenever entity is modified
we create new version of it and put into the table with new mtime which is
part of compound key. Old one is removed.
* Second one called *entity_by_id *is manually managed index for *entity*.
By having only id you can get basic entity attributes from *entity_by_id*.
While adding entity we do two inserts - to *entity *and *entity_by_id *(in
this order)
While deleting we do the same using the same order so first we remove
record from *entity *table.
It turned out that these two tables were inconsistent. We had ~260 records
in *entity_by_id *for which there is no corresponding record in *entity. *In
*entity *table it's much worse because ~7000 records in *entity_by_id* are
missing and it was growing much faster.
We were using LOCAL_QUROUM. C* 2.1.2. Two datacenters. We didn't get any
exceptions while inserts or deletes. BatchQuery from cqlengine (0.20.0) has
been used.
If BatchQuery is not used:
with BatchQuery() as b:
- entity.batch(b).save()
- entity_by_id = EntityById.copy_fields_from(entity)
- entity_by_id.batch(b).save()
+ entity.save()
+ entity_by_id = EntityById.copy_fields_from(entity)
+ entity_by_id.save()
Everything is fine. We don't have more inconsistencies. I've check what
cqlengine generates and seems that works as expected:
('BEGIN BATCH\n UPDATE sync.entity SET "name" = %(4)s WHERE "user_id" =
%(0)s AND "data_type_id" = %(1)s AND "version" = %(2)s AND "id" = %(3)s\n
INSERT INTO sync.entity_by_id ("user_id", "id", "parent_id", "deleted",
"folder", "data_type_id", "version") VALUES (%(5)s, %(6)s, %(7)s, %(8)s,
%(9)s, %(10)s, %(11)s)\nAPPLY BATCH;',)
We suspect that it's a problem in the C* itself. Any ideas how to debug
what is going on as BATCH is needed in this case?
--
BR,
Michał Łowicki