diff --git a/internal/manager/api_impl/dummy/shaman.go b/internal/manager/api_impl/dummy/shaman.go index cd249405..0425cfda 100644 --- a/internal/manager/api_impl/dummy/shaman.go +++ b/internal/manager/api_impl/dummy/shaman.go @@ -16,6 +16,7 @@ type DummyShaman struct{} var _ api_impl.Shaman = (*DummyShaman)(nil) +//lint:ignore ST1005 Shaman is a name that's always capitalised, so also in errors. var ErrDummyShaman = errors.New("Shaman storage component is inactive, configure Flamenco first") func (ds *DummyShaman) IsEnabled() bool { diff --git a/internal/manager/task_logs/log_rotation_test.go b/internal/manager/task_logs/log_rotation_test.go index 67ce7b67..88b9cdae 100644 --- a/internal/manager/task_logs/log_rotation_test.go +++ b/internal/manager/task_logs/log_rotation_test.go @@ -5,7 +5,6 @@ package task_logs import ( "errors" "io/fs" - "io/ioutil" "os" "path/filepath" "testing" @@ -16,7 +15,7 @@ import ( ) func setUpTest(t *testing.T) string { - temppath, err := ioutil.TempDir("", "testlogs") + temppath, err := os.MkdirTemp("", "testlogs") require.NoError(t, err) return temppath } @@ -78,12 +77,12 @@ func TestMultipleFilesWithHoles(t *testing.T) { defer tearDownTest(temppath) filepath := filepath.Join(temppath, "existing.txt") - require.NoError(t, ioutil.WriteFile(filepath, []byte("thefile"), 0666)) - require.NoError(t, ioutil.WriteFile(filepath+".1", []byte("file .1"), 0666)) - require.NoError(t, ioutil.WriteFile(filepath+".2", []byte("file .2"), 0666)) - require.NoError(t, ioutil.WriteFile(filepath+".3", []byte("file .3"), 0666)) - require.NoError(t, ioutil.WriteFile(filepath+".5", []byte("file .5"), 0666)) - require.NoError(t, ioutil.WriteFile(filepath+".7", []byte("file .7"), 0666)) + require.NoError(t, os.WriteFile(filepath, []byte("thefile"), 0666)) + require.NoError(t, os.WriteFile(filepath+".1", []byte("file .1"), 0666)) + require.NoError(t, os.WriteFile(filepath+".2", []byte("file .2"), 0666)) + require.NoError(t, os.WriteFile(filepath+".3", []byte("file .3"), 0666)) + require.NoError(t, os.WriteFile(filepath+".5", []byte("file .5"), 0666)) + require.NoError(t, os.WriteFile(filepath+".7", []byte("file .7"), 0666)) err := rotateLogFile(zerolog.Nop(), filepath) @@ -100,7 +99,7 @@ func TestMultipleFilesWithHoles(t *testing.T) { assert.False(t, fileExists(filepath+".9")) read := func(filename string) string { - content, err := ioutil.ReadFile(filename) + content, err := os.ReadFile(filename) require.NoError(t, err) return string(content) } diff --git a/internal/manager/task_logs/task_logs.go b/internal/manager/task_logs/task_logs.go index 5e65ba36..7762dd42 100644 --- a/internal/manager/task_logs/task_logs.go +++ b/internal/manager/task_logs/task_logs.go @@ -185,7 +185,7 @@ func (s *Storage) Tail(jobID, taskID string) (string, error) { return "", fmt.Errorf("unable to open log file for reading: %w", err) } - fileSize, err := file.Seek(0, os.SEEK_END) + fileSize, err := file.Seek(0, io.SeekEnd) if err != nil { return "", fmt.Errorf("unable to seek to end of log file: %w", err) } @@ -197,14 +197,14 @@ func (s *Storage) Tail(jobID, taskID string) (string, error) { ) if fileSize <= tailSize { // The file is small, just read all of it. - _, err = file.Seek(0, os.SEEK_SET) + _, err = file.Seek(0, io.SeekStart) if err != nil { return "", fmt.Errorf("unable to seek to start of log file: %w", err) } buffer, err = io.ReadAll(file) } else { // Read the last 'tailSize' number of bytes. - _, err = file.Seek(-tailSize, os.SEEK_END) + _, err = file.Seek(-tailSize, io.SeekEnd) if err != nil { return "", fmt.Errorf("unable to seek in log file: %w", err) } diff --git a/internal/manager/task_logs/task_logs_test.go b/internal/manager/task_logs/task_logs_test.go index 8fc4f512..a37a2115 100644 --- a/internal/manager/task_logs/task_logs_test.go +++ b/internal/manager/task_logs/task_logs_test.go @@ -6,7 +6,6 @@ import ( "errors" "fmt" "io/fs" - "io/ioutil" "os" "path/filepath" "strings" @@ -43,7 +42,7 @@ func TestLogWriting(t *testing.T) { require.NoError(t, err) filename := filepath.Join(jobDir, "task-20ff9d06-53ec-4019-9e2e-1774f05f170a.txt") - contents, err := ioutil.ReadFile(filename) + contents, err := os.ReadFile(filename) require.NoError(t, err, "the log file should exist") assert.Equal(t, "Ovo je priča\nIma dvije linije\n", string(contents)) } @@ -67,7 +66,7 @@ func TestLogRotation(t *testing.T) { filename := filepath.Join(jobDir, "task-20ff9d06-53ec-4019-9e2e-1774f05f170a.txt") rotatedFilename := filename + ".1" - contents, err := ioutil.ReadFile(rotatedFilename) + contents, err := os.ReadFile(rotatedFilename) require.NoError(t, err, "the rotated log file should exist") assert.Equal(t, "Ovo je priča\n", string(contents)) @@ -216,7 +215,7 @@ type TaskLogsMocks struct { func taskLogsTestFixtures(t *testing.T) (*Storage, func(), *TaskLogsMocks) { mockCtrl := gomock.NewController(t) - temppath, err := ioutil.TempDir("", "testlogs") + temppath, err := os.MkdirTemp("", "testlogs") require.NoError(t, err) mocks := &TaskLogsMocks{ diff --git a/internal/manager/task_state_machine/task_statuses.go b/internal/manager/task_state_machine/task_statuses.go index 4e14a189..66e41d34 100644 --- a/internal/manager/task_state_machine/task_statuses.go +++ b/internal/manager/task_state_machine/task_statuses.go @@ -5,14 +5,6 @@ package task_state_machine import "projects.blender.org/studio/flamenco/pkg/api" var ( - // Task statuses that always get requeued when the job is requeueing. - nonCompletedStatuses = []api.TaskStatus{ - api.TaskStatusCanceled, - api.TaskStatusFailed, - api.TaskStatusPaused, - api.TaskStatusSoftFailed, - } - // Workers are allowed to keep running tasks when they are in this status. // 'queued', 'claimed-by-manager', and 'soft-failed' aren't considered runnable, // as those statuses indicate the task wasn't assigned to a Worker by the scheduler. diff --git a/internal/stresser/stresser.go b/internal/stresser/stresser.go index 12ab4710..e299f275 100644 --- a/internal/stresser/stresser.go +++ b/internal/stresser/stresser.go @@ -79,6 +79,7 @@ func stressByRequestingTask(ctx context.Context, client worker.FlamencoClient) { } } +//lint:ignore U1000 stressBySendingTaskUpdate is currently unused, but someone may find it useful for different kinds of stess testing. func stressBySendingTaskUpdate(ctx context.Context, client worker.FlamencoClient, task *api.AssignedTask) { logLine := "This is a log-line for stress testing. It will be repeated more than once.\n" logToSend := strings.Repeat(logLine, 5) diff --git a/internal/worker/autodiscovery.go b/internal/worker/autodiscovery.go index 5145eda8..5c756ce7 100644 --- a/internal/worker/autodiscovery.go +++ b/internal/worker/autodiscovery.go @@ -46,7 +46,7 @@ func AutodiscoverManager(ctx context.Context) (string, error) { logger := log.Logger if deadline, ok := ctx.Deadline(); ok { - timeout := deadline.Sub(time.Now()).Round(1 * time.Second) + timeout := time.Until(deadline).Round(1 * time.Second) logger = logger.With().Str("timeout", timeout.String()).Logger() } logger.Info().Msg("auto-discovering Manager via UPnP/SSDP") diff --git a/internal/worker/cli_runner/cli_runner.go b/internal/worker/cli_runner/cli_runner.go index 9369c3cf..67b4d781 100644 --- a/internal/worker/cli_runner/cli_runner.go +++ b/internal/worker/cli_runner/cli_runner.go @@ -101,7 +101,6 @@ readloop: // Prepend any leftovers from the previous line to the received bytes. if len(leftovers) > 0 { lineBytes = append(leftovers, lineBytes...) - leftovers = []byte{} } // Make sure long lines are broken on character boundaries. lineBytes, leftovers = splitOnCharacterBoundary(lineBytes) diff --git a/internal/worker/command_file_mgmt.go b/internal/worker/command_file_mgmt.go index 5a4b4263..08cfae47 100644 --- a/internal/worker/command_file_mgmt.go +++ b/internal/worker/command_file_mgmt.go @@ -133,7 +133,7 @@ func (ce *CommandExecutor) cmdCopyFile(ctx context.Context, logger zerolog.Logge return err } - err, logMsg := fileCopy(src, dest) + logMsg, err := fileCopy(src, dest) return ce.errorLogProcess(ctx, logger, cmd, taskID, err, logMsg) } @@ -171,48 +171,48 @@ func (ce *CommandExecutor) moveAndLog(ctx context.Context, taskID, cmdName, src, return nil } -func fileCopy(src, dest string) (error, string) { +func fileCopy(src, dest string) (string, error) { src_file, err := os.Open(src) if err != nil { msg := fmt.Sprintf("failed to open source file %q: %v", src, err) - return err, msg + return msg, err } defer src_file.Close() src_file_stat, err := src_file.Stat() if err != nil { msg := fmt.Sprintf("failed to stat source file %q: %v", src, err) - return err, msg + return msg, err } if !src_file_stat.Mode().IsRegular() { - err := &os.PathError{Op: "stat", Path: src, Err: errors.New("Not a regular file")} + err := &os.PathError{Op: "stat", Path: src, Err: errors.New("not a regular file")} msg := fmt.Sprintf("invalid source file %q: %v", src, err) - return err, msg + return msg, err } dest_dirpath := filepath.Dir(dest) if !fileExists(dest_dirpath) { if err := os.MkdirAll(dest_dirpath, 0750); err != nil { msg := fmt.Sprintf("failed to create directories %q: %v", dest_dirpath, err) - return err, msg + return msg, err } } dest_file, err := os.Create(dest) if err != nil { msg := fmt.Sprintf("failed to create destination file %q: %v", dest, err) - return err, msg + return msg, err } defer dest_file.Close() if _, err := io.Copy(dest_file, src_file); err != nil { msg := fmt.Sprintf("failed to copy %q to %q: %v", src, dest, err) - return err, msg + return msg, err } msg := fmt.Sprintf("copied %q to %q", src, dest) - return nil, msg + return msg, nil } func fileExists(filename string) bool { diff --git a/internal/worker/command_file_mgmt_test.go b/internal/worker/command_file_mgmt_test.go index c0ae29a9..d6ab9a78 100644 --- a/internal/worker/command_file_mgmt_test.go +++ b/internal/worker/command_file_mgmt_test.go @@ -163,7 +163,7 @@ func TestTimestampedPathFile(t *testing.T) { fileCreateEmpty("somefile.txt") if err := os.Chtimes("somefile.txt", mtime, mtime); err != nil { - t.Fatalf(err.Error()) + t.Fatal(err.Error()) } newpath, err := timestampedPath("somefile.txt") @@ -365,7 +365,7 @@ func TestCmdCopyFileSourceIsDir(t *testing.T) { fmt.Sprintf("copy-file: copying %q to %q", f.absolute_src_path, f.absolute_dest_path)) f.mocks.listener.EXPECT().LogProduced(gomock.Any(), taskID, - fmt.Sprintf("copy-file: invalid source file %q: stat %s: Not a regular file", + fmt.Sprintf("copy-file: invalid source file %q: stat %s: not a regular file", f.absolute_src_path, f.absolute_src_path)) assert.Error(t, f.run()) diff --git a/internal/worker/state_awake.go b/internal/worker/state_awake.go index fad9cdcb..9d47aeb2 100644 --- a/internal/worker/state_awake.go +++ b/internal/worker/state_awake.go @@ -185,7 +185,6 @@ checkloop: break checkloop case <-time.After(mayKeepRunningPeriod): // Time to do another check. - break } mkr := w.mayIKeepRunning(taskCtx, task.Uuid) diff --git a/pkg/shaman/checkout/manager.go b/pkg/shaman/checkout/manager.go index 33128321..91904a38 100644 --- a/pkg/shaman/checkout/manager.go +++ b/pkg/shaman/checkout/manager.go @@ -73,7 +73,7 @@ func (err ErrInvalidCheckoutPath) Error() string { // Errors returned by the Checkout Manager. var ( - ErrCheckoutAlreadyExists = errors.New("A checkout with this ID already exists") + ErrCheckoutAlreadyExists = errors.New("a checkout with this ID already exists") ) // NewManager creates and returns a new Checkout Manager. diff --git a/pkg/shaman/fileserver/receivefile_test.go b/pkg/shaman/fileserver/receivefile_test.go index be51f11e..ee4787f6 100644 --- a/pkg/shaman/fileserver/receivefile_test.go +++ b/pkg/shaman/fileserver/receivefile_test.go @@ -26,7 +26,7 @@ import ( "bytes" "context" "io" - "io/ioutil" + "os" "testing" "projects.blender.org/studio/flamenco/pkg/shaman/config" @@ -86,7 +86,7 @@ func TestStoreFile(t *testing.T) { assert.Equal(t, filestore.StatusStored, status) assert.FileExists(t, path) - savedContent, err := ioutil.ReadFile(path) + savedContent, err := os.ReadFile(path) require.NoError(t, err) assert.EqualValues(t, payload, savedContent, "The file should be saved uncompressed") } diff --git a/pkg/shaman/fileserver/receivelistener.go b/pkg/shaman/fileserver/receivelistener.go index e4639043..6a9734ac 100644 --- a/pkg/shaman/fileserver/receivelistener.go +++ b/pkg/shaman/fileserver/receivelistener.go @@ -47,9 +47,7 @@ func (fs *FileServer) receiveListenerFor(checksum string, filesize int64) chan s go func() { // Wait until the channel closes. - select { - case <-channel: - } + <-channel fs.receiverMutex.Lock() defer fs.receiverMutex.Unlock() diff --git a/pkg/shaman/filestore/filestore_test.go b/pkg/shaman/filestore/filestore_test.go index d9ef274d..ea8c9a4e 100644 --- a/pkg/shaman/filestore/filestore_test.go +++ b/pkg/shaman/filestore/filestore_test.go @@ -23,7 +23,6 @@ package filestore import ( - "io/ioutil" "os" "path/filepath" "testing" @@ -115,7 +114,7 @@ func TestOpenForUpload(t *testing.T) { assert.Equal(t, file.Name(), foundPath) assert.Equal(t, StatusUploading, status) - readContents, err := ioutil.ReadFile(foundPath) + readContents, err := os.ReadFile(foundPath) require.NoError(t, err) assert.EqualValues(t, contents, readContents) } diff --git a/pkg/shaman/filestore/testing.go b/pkg/shaman/filestore/testing.go index 9caecfbe..5379ec94 100644 --- a/pkg/shaman/filestore/testing.go +++ b/pkg/shaman/filestore/testing.go @@ -25,7 +25,6 @@ package filestore import ( "fmt" "io" - "io/ioutil" "os" "path/filepath" "runtime" @@ -36,7 +35,7 @@ import ( // CreateTestStore returns a Store that can be used for unit testing. func CreateTestStore() *Store { - tempDir, err := ioutil.TempDir("", "shaman-filestore-test-") + tempDir, err := os.MkdirTemp("", "shaman-filestore-test-") if err != nil { panic(err) } diff --git a/pkg/shaman/touch/touch_test.go b/pkg/shaman/touch/touch_test.go index 75c41c59..aa6294fa 100644 --- a/pkg/shaman/touch/touch_test.go +++ b/pkg/shaman/touch/touch_test.go @@ -23,7 +23,6 @@ package touch import ( - "io/ioutil" "os" "testing" "time" @@ -36,7 +35,7 @@ func TestTouch(t *testing.T) { testPath := "_touch_test.txt" // Create a file - assert.Nil(t, ioutil.WriteFile(testPath, []byte("just a test"), 0644)) + assert.Nil(t, os.WriteFile(testPath, []byte("just a test"), 0644)) defer os.Remove(testPath) // Make it old