From d21466f595d8ae115780e7561780e5e14dec0d49 Mon Sep 17 00:00:00 2001 From: Poorna K Date: Tue, 30 Nov 2021 10:22:42 -0800 Subject: [PATCH] cache: in writeback mode skip etag verification (#13781) if the commit is still in pending or failed status This PR also does some minor code cleanup --- cmd/disk-cache-backend.go | 4 ---- cmd/disk-cache-utils.go | 11 +++++++++++ cmd/disk-cache.go | 10 ++++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/cmd/disk-cache-backend.go b/cmd/disk-cache-backend.go index 2a202aa51..e3730866f 100644 --- a/cmd/disk-cache-backend.go +++ b/cmd/disk-cache-backend.go @@ -808,10 +808,6 @@ func (c *diskCache) GetLockContext(ctx context.Context, bucket, object string) ( // Caches the object to disk func (c *diskCache) Put(ctx context.Context, bucket, object string, data io.Reader, size int64, rs *HTTPRangeSpec, opts ObjectOptions, incHitsOnly, writeback bool) (oi ObjectInfo, err error) { - if !c.diskSpaceAvailable(size) { - io.Copy(ioutil.Discard, data) - return oi, errDiskFull - } cLock, lkctx, err := c.GetLockContext(ctx, bucket, object) if err != nil { return oi, err diff --git a/cmd/disk-cache-utils.go b/cmd/disk-cache-utils.go index eb28b5f74..d1f1f435e 100644 --- a/cmd/disk-cache-utils.go +++ b/cmd/disk-cache-utils.go @@ -581,3 +581,14 @@ func (t *multiWriter) Write(p []byte) (n int, err error) { func cacheMultiWriter(w1 io.Writer, w2 *io.PipeWriter) io.Writer { return &multiWriter{backendWriter: w1, cacheWriter: w2} } + +// skipETagVerification returns true if writeback commit is not complete +func skipETagVerification(m map[string]string) bool { + if v, ok := m[writeBackStatusHeader]; ok { + switch cacheCommitStatus(v) { + case CommitPending, CommitFailed: + return true + } + } + return false +} diff --git a/cmd/disk-cache.go b/cmd/disk-cache.go index fa3856f8a..0064622f5 100644 --- a/cmd/disk-cache.go +++ b/cmd/disk-cache.go @@ -276,6 +276,10 @@ func (c *cacheObjects) GetObjectNInfo(ctx context.Context, bucket, object string bReader.ObjInfo.CacheStatus = CacheMiss return bReader, err } + // serve cached content without ETag verification if writeback commit is not yet complete + if skipETagVerification(cacheReader.ObjInfo.UserDefined) { + return cacheReader, nil + } } objInfo, err := c.InnerGetObjectInfoFn(ctx, bucket, object, opts) @@ -422,6 +426,10 @@ func (c *cacheObjects) GetObjectInfo(ctx context.Context, bucket, object string, c.cacheStats.incHit() return cachedObjInfo, nil } + // serve cache metadata without ETag verification if writeback commit is not yet complete + if skipETagVerification(cachedObjInfo.UserDefined) { + return cachedObjInfo, nil + } } objInfo, err := getObjectInfoFn(ctx, bucket, object, opts) @@ -811,6 +819,8 @@ func (c *cacheObjects) uploadObject(ctx context.Context, oi ObjectInfo) { func (c *cacheObjects) queueWritebackRetry(oi ObjectInfo) { select { + case <-GlobalContext.Done(): + return case c.wbRetryCh <- oi: c.uploadObject(GlobalContext, oi) default: