From 4974894b859a31964f0d11772e6d083f9b6795f3 Mon Sep 17 00:00:00 2001 From: Yuri van Oers Date: Tue, 9 Jul 2019 22:22:59 +0200 Subject: [PATCH] Update child jobs when parent is deleted --- dkron/store.go | 14 ++++++++++++++ dkron/store_test.go | 14 +++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/dkron/store.go b/dkron/store.go index 62105b927..c5b3a863e 100644 --- a/dkron/store.go +++ b/dkron/store.go @@ -368,6 +368,8 @@ func (s *Store) GetJob(name string, options *JobOptions) (*Job, error) { return job, err } +// DeleteJob deletes the given job from the store, along with +// all its executions and references to it. func (s *Store) DeleteJob(name string) (*Job, error) { var job *Job err := s.db.Update(func(txn *badger.Txn) error { @@ -383,6 +385,18 @@ func (s *Store) DeleteJob(name string) (*Job, error) { } } + // Remove the parent from any children + for _, djn := range j.DependentJobs { + child, err := s.GetJob(djn, nil) + if err != nil { + return err + } + child.ParentJob = "" + if err := s.SetJob(child, false); err != nil { + return err + } + } + if err := s.DeleteExecutions(name); err != nil { if err != nil { return err diff --git a/dkron/store_test.go b/dkron/store_test.go index 2cab57398..ed3568a1e 100644 --- a/dkron/store_test.go +++ b/dkron/store_test.go @@ -154,6 +154,18 @@ func TestStore_JobBecomesIndependentJob(t *testing.T) { assert.Equal(t, 0, len(parent.DependentJobs)) } +func TestStore_ChildIsUpdatedAfterDeletingParentJob(t *testing.T) { + s, dir := setupStore(t) + defer cleanupStore(dir, s) + + storeJob(t, s, "parent1") + storeChildJob(t, s, "child1", "parent1") + deleteJob(t, s, "parent1") + orphan := loadJob(t, s, "child1") + + assert.Equal(t, "", orphan.ParentJob) +} + func TestStore_GetLastExecutionGroup(t *testing.T) { // This can not use time.Now() because that will include monotonic information // that will cause the unmarshalled execution to differ from our generated version @@ -319,7 +331,7 @@ func setupStore(t *testing.T) (*Store, string) { dir, err := ioutil.TempDir("", "dkron-test") require.NoError(t, err) - a := NewAgent(nil, nil) + a := NewAgent(nil) s, err := NewStore(a, dir) require.NoError(t, err) a.Store = s