Skip to content

Commit

Permalink
Optimize/fix sqlite hid update statement
Browse files Browse the repository at this point in the history
`./run_tests.sh --skip-common-startup -api lib/galaxy_test/api -- -s -k
cache` would fail on sqlite with database locked.

Not using a separate connection means that we expire loaded attributes
in the sqlite case, but I don't think we need to be concerned about
performance if you're using sqlite.
  • Loading branch information
mvdbeek committed Nov 5, 2024
1 parent cd2f1f8 commit 310130c
Showing 1 changed file with 14 additions and 9 deletions.
23 changes: 14 additions & 9 deletions lib/galaxy/model/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3120,16 +3120,21 @@ def _next_hid(self, n=1):
table = self.__table__
history_id = cached_id(self)
update_stmt = update(table).where(table.c.id == history_id).values(hid_counter=table.c.hid_counter + n)
update_returning_stmnt = update_stmt.returning(table.c.hid_counter)

with engine.begin() as conn:
if engine.name in ["postgres", "postgresql"]:
stmt = update_stmt.returning(table.c.hid_counter)
updated_hid = conn.execute(stmt).scalar()
hid = updated_hid - n
else:
select_stmt = select(table.c.hid_counter).where(table.c.id == history_id).with_for_update()
hid = conn.execute(select_stmt).scalar()
conn.execute(update_stmt)
if engine.name != "sqlite":
with engine.begin() as conn:
hid = conn.execute(update_returning_stmnt).scalar() - n
else:
try:
hid = session.execute(update_returning_stmnt).scalar() - n
except OperationalError:
# The RETURNING clause was added to SQLite in version 3.35.0.
# Not using FOR UPDATE either, since that was added in 3.45.0,
# and anyway does a whole-table lock
select_stmt = select(table.c.hid_counter).where(table.c.id == history_id)
hid = session.execute(select_stmt).scalar()
session.execute(update_stmt)

session.expire(self, ["hid_counter"])
return hid
Expand Down

0 comments on commit 310130c

Please sign in to comment.