fix(embeddings): key_share alone is FOR NO KEY UPDATE, not FOR KEY SHARE (#3262)
CI & Build / Python lint (push) Successful in 3s
CI & Build / Plugin hooks (push) Successful in 9s
CI & Build / TypeScript typecheck (push) Successful in 10s
CI & Build / integration (push) Successful in 24s
CI & Build / Python tests (push) Successful in 1m4s
CI & Build / Build & push image (push) Successful in 24s
CI & Build / Python lint (push) Successful in 3s
CI & Build / Plugin hooks (push) Successful in 9s
CI & Build / TypeScript typecheck (push) Successful in 10s
CI & Build / integration (push) Successful in 24s
CI & Build / Python tests (push) Successful in 1m4s
CI & Build / Build & push image (push) Successful in 24s
SQLAlchemy spells Postgres's four row locks as a read/key_share pair, so `with_for_update(key_share=True)` renders FOR NO KEY UPDATE — an exclusive lock that two refreshes of the same record would fight over, and that an ordinary concurrent edit would block. The claim needs `read=True` as well to be the FOR KEY SHARE the docstring describes. Caught by the unit test that compiles the statement, which is the whole reason it asserts on the rendered lock mode rather than on behaviour that looks identical either way.
This commit is contained in:
@@ -374,7 +374,10 @@ async def _claim_parent_row(session, id_column, row_id: int, label: str) -> bool
|
|||||||
held = (await session.execute(
|
held = (await session.execute(
|
||||||
select(id_column)
|
select(id_column)
|
||||||
.where(id_column == row_id)
|
.where(id_column == row_id)
|
||||||
.with_for_update(key_share=True, nowait=True)
|
# BOTH flags: SQLAlchemy spells the four Postgres row locks as a
|
||||||
|
# read/key_share pair, and key_share alone is FOR NO KEY UPDATE —
|
||||||
|
# which would make two refreshes of one record fight each other.
|
||||||
|
.with_for_update(read=True, key_share=True, nowait=True)
|
||||||
)).scalar_one_or_none()
|
)).scalar_one_or_none()
|
||||||
except Exception:
|
except Exception:
|
||||||
# LockNotAvailable: this record is being deleted right now. Not an
|
# LockNotAvailable: this record is being deleted right now. Not an
|
||||||
|
|||||||
Reference in New Issue
Block a user