mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-11-14 06:46:56 +00:00
The metric engine derives the columns to add from the cached physical schema, and `DataRegion::assemble_alter_request` assigned every given column `max(non-reserved column id) + 1` without checking the existing names. That cache can lag behind: Mito reads its in-memory metadata without going through the region worker, and a caller future dropped on a client timeout does not withdraw the request that is already queued. A retry then treats an installed column as new and Mito rejects it, because the name exists with a different id. Recheck the real metadata in `assemble_alter_request`, validate an existing column with `validate_shared_column` and drop it from the payload, assign ids only to genuinely new columns, and skip the alter when nothing is new. Serialize the existence check, the id allocation and the physical alter per physical data region: the mutex lives in `PhysicalRegionState` and is held by the metric engine orchestration, so concurrent requests on logical regions sharing the region cannot allocate one id to different columns. `DataRegion` stays a stateless adapter. Build the logical mapping and the cached physical columns from the metadata read after the alter, and report a missing column as an error instead of panicking. Signed-off-by: Wenyu Xu <wenymedia@gmail.com>