Per-graph read caches handed to a resolved Snapshot so its table opens reuse
one shared Session (LanceDB’s one-session-per-connection pattern) and the
held-handle cache. Manual Debug because lance::session::Session is not
Debug; this lets Snapshot keep its #[derive(Debug)].
Held open-Dataset handles keyed by (table_path, branch, version, e_tag) — the
version-keyed analogue of LanceDB’s DatasetConsistencyWrapper
(rust/lancedb/src/table/dataset.rs). A warm read reuses a held handle with
zero open IO (a cheap Dataset clone); a miss opens once at the location with
the shared Session. Version plus e_tag are in the key, so a write (or a
delete/recreate that reuses a version number on object stores with e_tags) is
simply a new key. A same-branch manifest refresh clears this cache as the
fallback for e_tag-less table locations. Only read-path Data opens use this —
writes open HEAD directly and never receive a pinned handle.