From 4e8677a911282543a5c77b9740f5563ccdf9d10a Mon Sep 17 00:00:00 2001 From: Gusted Date: Tue, 3 Dec 2024 05:00:50 +0100 Subject: [PATCH] fix: clean up log files that no longer exist - If for some reason a action log file does not longer exist in the database or on the file system, then mark it as being cleaned up. - Unit test added. --- services/actions/cleanup.go | 4 +++- services/actions/cleanup_test.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 services/actions/cleanup_test.go diff --git a/services/actions/cleanup.go b/services/actions/cleanup.go index 1223ebcab6..34fa2688e7 100644 --- a/services/actions/cleanup.go +++ b/services/actions/cleanup.go @@ -5,7 +5,9 @@ package actions import ( "context" + "errors" "fmt" + "os" "time" actions_model "code.gitea.io/gitea/models/actions" @@ -101,7 +103,7 @@ func CleanupLogs(ctx context.Context) error { return fmt.Errorf("find old tasks: %w", err) } for _, task := range tasks { - if err := actions_module.RemoveLogs(ctx, task.LogInStorage, task.LogFilename); err != nil { + if err := actions_module.RemoveLogs(ctx, task.LogInStorage, task.LogFilename); err != nil && !errors.Is(err, os.ErrNotExist) { log.Error("Failed to remove log %s (in storage %v) of task %v: %v", task.LogFilename, task.LogInStorage, task.ID, err) // do not return error here, continue to next task continue diff --git a/services/actions/cleanup_test.go b/services/actions/cleanup_test.go new file mode 100644 index 0000000000..65fae840c1 --- /dev/null +++ b/services/actions/cleanup_test.go @@ -0,0 +1,31 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package actions + +import ( + "testing" + + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/timeutil" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestCleanup(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + t.Run("Deletes no longer existing logs", func(t *testing.T) { + unittest.AssertSuccessfulInsert(t, &actions_model.ActionTask{ID: 1001, LogExpired: false, LogIndexes: []int64{1, 2, 3, 4}, LogFilename: "does-not-exist", Stopped: timeutil.TimeStamp(1)}) + + require.NoError(t, CleanupLogs(db.DefaultContext)) + + task := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionTask{ID: 1001}) + assert.EqualValues(t, "does-not-exist", task.LogFilename) + assert.True(t, task.LogExpired) + assert.Nil(t, task.LogIndexes) + }) +}