From 8c1b7f6c86103d3d66d236b8c8e1ca5ceee602e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 3 Dec 2024 10:43:37 +0100 Subject: [PATCH] drop unneeded session locks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jörn Friedrich Dreyer --- changelog/unreleased/drop-unneeded-locks.md | 5 +++++ pkg/storage/utils/decomposedfs/upload/session.go | 14 -------------- pkg/storage/utils/decomposedfs/upload/store.go | 14 +++++--------- 3 files changed, 10 insertions(+), 23 deletions(-) create mode 100644 changelog/unreleased/drop-unneeded-locks.md diff --git a/changelog/unreleased/drop-unneeded-locks.md b/changelog/unreleased/drop-unneeded-locks.md new file mode 100644 index 0000000000..166f6c31b0 --- /dev/null +++ b/changelog/unreleased/drop-unneeded-locks.md @@ -0,0 +1,5 @@ +Bugfix: drop unneeded session locks + +We no longer lock session metadada files, as they are already written atomically. + +https://github.com/cs3org/reva/pull/4985 diff --git a/pkg/storage/utils/decomposedfs/upload/session.go b/pkg/storage/utils/decomposedfs/upload/session.go index bbcad25329..b69f9999f5 100644 --- a/pkg/storage/utils/decomposedfs/upload/session.go +++ b/pkg/storage/utils/decomposedfs/upload/session.go @@ -27,7 +27,6 @@ import ( "time" "github.com/google/renameio/v2" - "github.com/rogpeppe/go-internal/lockedfile" tusd "github.com/tus/tusd/v2/pkg/handler" userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" @@ -84,14 +83,6 @@ func (s *OcisSession) Purge(ctx context.Context) error { _, span := tracer.Start(ctx, "Purge") defer span.End() sessionPath := sessionPath(s.store.root, s.info.ID) - f, err := lockedfile.OpenFile(sessionPath+".lock", os.O_RDWR|os.O_TRUNC|os.O_CREATE, 0600) - if err != nil { - return err - } - defer func() { - f.Close() - os.Remove(sessionPath + ".lock") - }() if err := os.Remove(sessionPath); err != nil { return err } @@ -127,11 +118,6 @@ func (s *OcisSession) Persist(ctx context.Context) error { if err != nil { return err } - f, err := lockedfile.OpenFile(sessionPath+".lock", os.O_RDWR|os.O_TRUNC|os.O_CREATE, 0600) - if err != nil { - return err - } - defer f.Close() return renameio.WriteFile(sessionPath, d, 0600) } diff --git a/pkg/storage/utils/decomposedfs/upload/store.go b/pkg/storage/utils/decomposedfs/upload/store.go index df1e4df7a5..52049061c6 100644 --- a/pkg/storage/utils/decomposedfs/upload/store.go +++ b/pkg/storage/utils/decomposedfs/upload/store.go @@ -28,6 +28,7 @@ import ( "regexp" "strconv" "strings" + "syscall" "time" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" @@ -129,24 +130,19 @@ func (store OcisStore) Get(ctx context.Context, id string) (*OcisSession, error) store: store, info: tusd.FileInfo{}, } - lock, err := lockedfile.Open(sessionPath + ".lock") + data, err := os.ReadFile(sessionPath) if err != nil { - if errors.Is(err, iofs.ErrNotExist) { - // Interpret os.ErrNotExist as 404 Not Found + // handle stale NFS file handles that can occur when the file is deleted betwenn the ATTR and FOPEN call of os.ReadFile + if pathErr, ok := err.(*os.PathError); ok && pathErr.Err == syscall.ESTALE { + appctx.GetLogger(ctx).Info().Str("session", id).Err(err).Msg("treating stale file handle as not found") err = tusd.ErrNotFound } - return nil, err - } - defer lock.Close() - data, err := os.ReadFile(sessionPath) - if err != nil { if errors.Is(err, iofs.ErrNotExist) { // Interpret os.ErrNotExist as 404 Not Found err = tusd.ErrNotFound } return nil, err } - lock.Close() // release lock asap if err := json.Unmarshal(data, &session.info); err != nil { return nil, err