Jobs: with keep_completed, success and error records outlive the rows they describe
Maintainer antworten meist innerhalb von 1 Tag
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- Ein halber Tag
- Anfängerfreundlichkeit
- 65/100
- Issue-Typ
- Bug
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- mysql, python
- Bereich
- data-engineering, databases
Rechercherichtung
Start from Job.refresh(), specifically step 3, which removes stale job records only when they are older than stale_timeout and their keys are missing from key_source. Run the reproduction in the issue to see that success rows for deleted keys survive refresh(stale_timeout=0). Done means those orphaned success and error rows are removed without waiting for the timeout, while pending rows keep the age check. The issue also offers an alternative change to the meaning of stale_timeout=0, so check with maintainers which one they want.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Summary
With config.jobs.keep_completed = True, a table's jobs table keeps a success record for every computed key. When upstream rows are deleted and the cascade removes the computed rows, their success records stay. jobs.refresh() does not remove them until they are older than stale_timeout (3600 s by default). Passing stale_timeout=0 skips the cleanup entirely instead of forcing it. For up to an hour, then, status counts read from the jobs table overstate what the table holds. Records with status='error' for keys that no longer exist behave the same way.
Reproduction
DataJoint 2.3.5.dev2 (master), MySQL 8.0:
import datajoint as dj
dj.config.jobs.keep_completed = True
schema = dj.Schema("scratch_jobs")
@schema
class Raw(dj.Manual):
definition = """
raw_id : int32
---
v : float32
"""
@schema
class Proc(dj.Computed):
definition = """
-> Raw
---
w : float32
"""
def make(self, key):
self.insert1(dict(key, w=2 * (Raw & key).fetch1("v")))
def counts():
j = Proc.jobs
return {s: len(j & f"status='{s}'") for s in ("pending", "reserved", "success", "error")}
Raw.insert([dict(raw_id=i, v=float(i)) for i in range(3)])
Proc.populate(reserve_jobs=True)
print("after populate:", "rows", len(Proc()), "jobs", counts())
(Raw & "raw_id = 0").delete(prompt=False)
print("after deleting raw_id=0:", "rows", len(Proc()), "key_source", len(Proc.key_source), "jobs", counts())
print("refresh:", Proc.jobs.refresh())
print("refresh(stale_timeout=0):", Proc.jobs.refresh(stale_timeout=0), "jobs", counts())
Output:
after populate: rows 3 jobs {'pending': 0, 'reserved': 0, 'success': 3, 'error': 0}
after deleting raw_id=0: rows 2 key_source 2 jobs {'pending': 0, 'reserved': 0, 'success': 3, 'error': 0}
refresh: {'added': 0, 'removed': 0, 'orphaned': 0, 're_pended': 0}
refresh(stale_timeout=0): {'added': 0, 'removed': 0, 'orphaned': 0, 're_pended': 0} jobs {'pending': 0, 'reserved': 0, 'success': 3, 'error': 0}
Two rows exist and three successes are recorded. After a larger delete (removing a parameter set, say), anything that reports progress from the jobs table shows completed work that no longer exists, for an hour.
Where it comes from
Job.refresh() step 3 removes only records older than stale_timeout whose keys are no longer in key_source. The age condition makes sense for pending records, which can race a key_source that is still being filled, and the setting's description says so: "Seconds before pending job is checked for staleness". It is applied to every status except ignore, though, including success and error. And stale_timeout=0 means "skip this step", so there is no way to request the cleanup now.
Proposal
In refresh(), remove success and error records whose keys are in neither key_source nor the target, regardless of age. Keep the age condition for pending, which it was written for. Neither kind of record describes anything that exists, and neither is retried. Alternatively, make stale_timeout=0 mean "no grace period" rather than "skip", and give the skip its own value (None).
- Vorherrschende Sprache
- Python
- Sterne
- 197
- Forks
- 98
- Ø Merge
- 15 Std. 31 Min.
- Gemergte PRs (30 T.)
- 9
Entwicklungsumgebung
- Enthält ein Dockerfile oder eine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus datajoint/datajoint-python
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
datajoint/datajoint-python#1581 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
datajoint/datajoint-python#1539 · 3 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
_job_start_time records the populating host's local time, with no zoneEvtl. vergeben @dimitri-yatsenko hat das heute übernommen. Offen
datajoint/datajoint-python#1584 · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 1 Tag
-
database.name should namespace schema names on MySQL, as it does on PostgreSQLEvtl. vergeben @dimitri-yatsenko hat das vor 3 Tagen übernommen. Offenfeature
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 15/100
datajoint/datajoint-python#1582 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 40/100
datajoint/datajoint-python#1580 ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in datajoint/datajoint-python
Ähnliche Issues
-
Schwierigkeit 1/5 1-3 Stunden Anfängerfreundlichkeit 88/100
gradio-app/gradio#13964 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 93/100
BSData/horus-heresy-3rd-edition#3232 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
jbacalso24/mimry#123 ·
Maintainer antworten meist innerhalb von 1 Tag
-
p:3-mid pydanty:bug pydanty:is-working
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
pydantic/pydantic-ai#10153 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
good first issue priority: medium size: S testing
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 85/100
cubrid-lab/cubrid-cookbook-python#316 ·
Maintainer antworten meist innerhalb von 1 Tag