handleDirtyTables method
Called after every write — checks dirty tables against active streams and re-queries affected ones.
Re-queries fire concurrently. The C reader pool handles contention via spin-wait — each reader-holding isolate makes independent forward progress, so there's no circular dependency and no livelock risk.
Each affected entry's reQueryGeneration is bumped so that stale results from older re-queries are discarded on arrival.
Implementation
void handleDirtyTables(List<String> dirtyTables) {
if (dirtyTables.isEmpty) return;
_writeGeneration++;
// Inline invalidation — find affected stream keys via inverted index.
final affected = <int>{};
for (final table in dirtyTables) {
final keys = _tableToKeys[table];
if (keys != null) affected.addAll(keys);
}
if (affected.isEmpty) return;
for (final key in affected) {
final entry = _entries[key];
if (entry == null) continue;
entry.reQueryGeneration++;
unawaited(_reQuery(entry, entry.reQueryGeneration));
}
}