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
This commit is contained in:
Poorna K 2021-11-30 10:22:42 -08:00 committed by GitHub
parent 4f3290309e
commit d21466f595
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 4 deletions

View File

@ -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

View File

@ -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
}

View File

@ -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: