handleDirtyTables method

void handleDirtyTables(
  1. List<String> dirtyTables
)

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));
  }
}