Удаление связанных записей не приводит к перерасчёту Datastream
Описание
После перевода расчёта DataStream
на механизм change
возникла проблема с расчётом при изменении связанных записей. При работе через шедулер все изменения обсчитывались в порядке поступления, а список изменённых записей формировался в момент сохранения через метод iter_changed_datastream
. После переноса расчёта изменений в механизм change
через отправку задачу на worker
выявились следующие сложности:
- Ключ партиционирования при отправке изменений считается от идентификатора записи. Поэтому для основной и связанной записи они будут отличаться, и возникает ситуация когда расчёт по одной и той же записи будет происходить в разных воркерах, что черевато накладками:
==> /var/log/noc/worker-00.log <==
[<generator object DNSZoneDataStream.iter_soa at 0x7f33957daac0>, [<RR rai11 A 10.20.1.1>, <RR ss A 10.21.1.1>]]
2022-05-08 11:58:33,053 [noc.dns.models.dnszone] Zone mgmt2 serial change: 2022050801 -> 2022050802
==> /var/log/noc/worker-02.log <==
[<generator object DNSZoneDataStream.iter_soa at 0x7f9464ca5970>, [<RR rai11 A 10.20.1.1>, <RR ss A 10.21.1.1>]]
2022-05-08 11:58:33,056 [noc.dns.models.dnszone] Zone mgmt2 serial change: 2022050802 -> 2022050803
- Поскольку
iter_changed_datastream
выполняется уже в воркере, то к моменту его выполнения связанная запись из базы уже удалена, что приводит к невозможности отследить её связи.
Пример проблемной ситуации #1826 (closed). При удалении DNS Record
перерасчёт датастрима не происходит.
Предложение
По пункту 2 можно дополнить модель методом iter_related_records
по аналогии с iter_changed_datastream
и при удалении отправлять дополнительное сообщение на перерасчёт основной модели.
По пункту 1 необходимо каким-то образом формировать ключ шардирования, чтобы связанные записи обсчитывались вместе с основными (в одном воркере).