mirror of
https://github.com/minio/minio.git
synced 2025-04-06 04:40:38 -04:00
cache - fix corruption when client prematurely terminates request (#8155)
This commit is contained in:
parent
29f64355ce
commit
259a5d825b
@ -418,18 +418,19 @@ func (c *diskCache) bitrotWriteToCache(ctx context.Context, cachePath string, re
|
|||||||
bufp := c.pool.Get().(*[]byte)
|
bufp := c.pool.Get().(*[]byte)
|
||||||
defer c.pool.Put(bufp)
|
defer c.pool.Put(bufp)
|
||||||
|
|
||||||
|
var n int
|
||||||
for {
|
for {
|
||||||
n, err := io.ReadFull(reader, *bufp)
|
n, err = io.ReadFull(reader, *bufp)
|
||||||
if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF && err != io.ErrClosedPipe {
|
if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
eof := err == io.EOF || err == io.ErrUnexpectedEOF || err == io.ErrClosedPipe
|
eof := err == io.EOF || err == io.ErrUnexpectedEOF
|
||||||
if n == 0 && size != 0 {
|
if n == 0 && size != 0 {
|
||||||
// Reached EOF, nothing more to be done.
|
// Reached EOF, nothing more to be done.
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
h.Reset()
|
h.Reset()
|
||||||
if _, err := h.Write((*bufp)[:n]); err != nil {
|
if _, err = h.Write((*bufp)[:n]); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
hashBytes := h.Sum(nil)
|
hashBytes := h.Sum(nil)
|
||||||
@ -522,7 +523,9 @@ func (c *diskCache) Put(ctx context.Context, bucket, object string, data io.Read
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if actualSize != uint64(n) {
|
||||||
|
return IncompleteBody{}
|
||||||
|
}
|
||||||
return c.saveMetadata(ctx, bucket, object, metadata, n)
|
return c.saveMetadata(ctx, bucket, object, metadata, n)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -240,7 +240,7 @@ func (c *cacheObjects) GetObjectNInfo(ctx context.Context, bucket, object string
|
|||||||
pipeWriter.CloseWithError(putErr)
|
pipeWriter.CloseWithError(putErr)
|
||||||
}()
|
}()
|
||||||
cleanupBackend := func() { bkReader.Close() }
|
cleanupBackend := func() { bkReader.Close() }
|
||||||
cleanupPipe := func() { pipeReader.Close() }
|
cleanupPipe := func() { pipeWriter.Close() }
|
||||||
return NewGetObjectReaderFromReader(teeReader, bkReader.ObjInfo, opts.CheckCopyPrecondFn, cleanupBackend, cleanupPipe)
|
return NewGetObjectReaderFromReader(teeReader, bkReader.ObjInfo, opts.CheckCopyPrecondFn, cleanupBackend, cleanupPipe)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user