Skip to content

Commit d1996f5

Browse files
committed
models: add table lock and translate old db usage (bug 1886854)
1 parent e047f08 commit d1996f5

File tree

4 files changed

+25
-14
lines changed

4 files changed

+25
-14
lines changed

src/lando/api/legacy/api/diff_warnings.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
from lando.api.legacy.decorators import require_phabricator_api_key
1717
from lando.main.models.revision import DiffWarning, DiffWarningStatus
18-
from lando.api.legacy.storage import db
1918

2019
logger = logging.getLogger(__name__)
2120

@@ -41,8 +40,7 @@ def post(data: dict):
4140
type="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400",
4241
)
4342
warning = DiffWarning(**data)
44-
db.session.add(warning)
45-
db.session.commit()
43+
warning.save()
4644
return warning.serialize(), 201
4745

4846

@@ -58,7 +56,7 @@ def delete(pk: str):
5856
type="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400",
5957
)
6058
warning.status = DiffWarningStatus.ARCHIVED
61-
db.session.commit()
59+
warning.save()
6260
return warning.serialize(), 200
6361

6462

src/lando/api/legacy/api/landing_jobs.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
from lando.api import auth
1010
from lando.main.models.landing_job import LandingJob, LandingJobAction, LandingJobStatus
11-
from lando.api.legacy.storage import db
1211

1312
logger = logging.getLogger(__name__)
1413

@@ -61,7 +60,7 @@ def put(landing_job_id: str, data: dict):
6160

6261
if landing_job.status in (LandingJobStatus.SUBMITTED, LandingJobStatus.DEFERRED):
6362
landing_job.transition_status(LandingJobAction.CANCEL)
64-
db.session.commit()
63+
landing_job.save()
6564
return {"id": landing_job.id}, 200
6665
else:
6766
raise ProblemException(

src/lando/api/legacy/api/transplants.py

+4-8
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@
5555
get_landable_repos_for_revision_data,
5656
request_extended_revision_data,
5757
)
58-
from lando.api.legacy.storage import db
5958
from lando.api.legacy.tasks import admin_remove_phab_project
6059
from lando.api.legacy.transplants import (
6160
TransplantAssessment,
@@ -354,10 +353,8 @@ def post(phab: PhabricatorClient, data: dict):
354353
lando_revision = Revision.get_from_revision_id(revision_id)
355354
if not lando_revision:
356355
lando_revision = Revision(revision_id=revision_id)
357-
db.session.add(lando_revision)
358-
359356
lando_revision.diff_id = diff_id
360-
db.session.commit()
357+
lando_revision.save()
361358

362359
revision_reviewers[lando_revision.id] = get_approved_by_ids(
363360
phab,
@@ -373,7 +370,7 @@ def post(phab: PhabricatorClient, data: dict):
373370

374371
raw_diff = phab.call_conduit("differential.getrawdiff", diffID=diff["id"])
375372
lando_revision.set_patch(raw_diff, patch_data)
376-
db.session.commit()
373+
lando_revision.save()
377374
lando_revisions.append(lando_revision)
378375

379376
ldap_username = g.auth0_user.email
@@ -384,8 +381,7 @@ def post(phab: PhabricatorClient, data: dict):
384381
)
385382
)
386383
stack_ids = [revision.revision_id for revision in lando_revisions]
387-
with db.session.begin_nested():
388-
LandingJob.lock_table()
384+
with LandingJob.lock_table():
389385
if (
390386
LandingJob.revisions_query(stack_ids)
391387
.filter(
@@ -412,7 +408,7 @@ def post(phab: PhabricatorClient, data: dict):
412408
# Submit landing job.
413409
job.status = LandingJobStatus.SUBMITTED
414410
job.set_landed_revision_diffs()
415-
db.session.commit()
411+
job.save()
416412

417413
logger.info(f"New landing job {job.id} created for {landing_repo.tree} repo.")
418414

src/lando/main/models/base.py

+18
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
from __future__ import annotations
22

3+
from contextlib import ContextDecorator
34
import logging
45
import os
56
import subprocess
67
import tempfile
78
from pathlib import Path
89

910
from django.db import models
11+
from django.db import connection
1012

1113
from lando import settings
1214
from lando.utils import GitPatchHelper
@@ -23,6 +25,22 @@ class BaseModel(models.Model):
2325
class Meta:
2426
abstract = True
2527

28+
class lock_table(ContextDecorator):
29+
"""Decorator to lock table for current model."""
30+
31+
def __init__(self, model, lock):
32+
self.lock = lock
33+
34+
if lock not in ("SHARE ROW EXCLUSIVE", ):
35+
raise ValueError(f"{lock} not valid.")
36+
37+
def __enter__(self):
38+
cursor = connection.cursor()
39+
cursor.execute(f"LOCK TABLE {self._meta.db_table} IN {self.lock} MODE")
40+
41+
def __exit__(self, exc_type, exc_value, traceback):
42+
pass
43+
2644

2745
class Repo(BaseModel):
2846
name = models.CharField(max_length=255, unique=True)

0 commit comments

Comments
 (0)