From 54adc7ddd5918f6430c5712102176b7c6ca9f424 Mon Sep 17 00:00:00 2001 From: Avi Deitcher Date: Fri, 27 Jun 2025 10:07:42 +0300 Subject: [PATCH] ensure that new index does not break on missing lock file Signed-off-by: Avi Deitcher --- src/cmd/linuxkit/cache/open.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/cmd/linuxkit/cache/open.go b/src/cmd/linuxkit/cache/open.go index d0d20c5fd..7c2025398 100644 --- a/src/cmd/linuxkit/cache/open.go +++ b/src/cmd/linuxkit/cache/open.go @@ -2,6 +2,7 @@ package cache import ( "fmt" + "os" "path/filepath" "github.com/google/go-containerregistry/pkg/v1/empty" @@ -10,19 +11,29 @@ import ( log "github.com/sirupsen/logrus" ) +var ( + newIndexLockFile = filepath.Join(os.TempDir(), "linuxkit-new-cache-index.lock") +) + // Get get or initialize the cache func Get(cache string) (layout.Path, error) { // initialize the cache path if needed p, err := layout.FromPath(cache) if err != nil { - lock, err := util.Lock(filepath.Join(cache, indexFile)) + if err := os.WriteFile(newIndexLockFile, []byte{}, 0644); err != nil { + return "", fmt.Errorf("unable to create lock file %s for writing descriptor for new cache %s: %v", newIndexLockFile, cache, err) + } + lock, err := util.Lock(newIndexLockFile) if err != nil { - return "", fmt.Errorf("unable to lock cache index for writing descriptor for new cache: %v", err) + return "", fmt.Errorf("unable to retrieve lock for writing descriptor for new cache %s: %v", newIndexLockFile, err) } defer func() { if err := lock.Unlock(); err != nil { log.Errorf("unable to close lock for cache index after writing descriptor for new cache: %v", err) } + if err := os.RemoveAll(newIndexLockFile); err != nil { + log.Errorf("unable to remove lock file %s after writing descriptor for new cache: %v", newIndexLockFile, err) + } }() p, err = layout.Write(cache, empty.Index) if err != nil {