mirror of https://github.com/minio/minio.git
				
				
				
			check for errors on bitrotWriter Close() (#20982)
This commit is contained in:
		
							parent
							
								
									7cc0c69228
								
							
						
					
					
						commit
						953a3e2bbd
					
				| 
						 | 
				
			
			@ -128,14 +128,20 @@ func closeBitrotReaders(rs []io.ReaderAt) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// Close all the writers.
 | 
			
		||||
func closeBitrotWriters(ws []io.Writer) {
 | 
			
		||||
	for _, w := range ws {
 | 
			
		||||
		if w != nil {
 | 
			
		||||
func closeBitrotWriters(ws []io.Writer) []error {
 | 
			
		||||
	errs := make([]error, len(ws))
 | 
			
		||||
	for i, w := range ws {
 | 
			
		||||
		if w == nil {
 | 
			
		||||
			errs[i] = errDiskNotFound
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if bw, ok := w.(io.Closer); ok {
 | 
			
		||||
				bw.Close()
 | 
			
		||||
			}
 | 
			
		||||
			errs[i] = bw.Close()
 | 
			
		||||
		} else {
 | 
			
		||||
			errs[i] = nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return errs
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Returns hash sum for whole-bitrot, nil for streaming-bitrot.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -608,7 +608,7 @@ func (er *erasureObjects) healObject(ctx context.Context, bucket string, object
 | 
			
		|||
			// later to the final location.
 | 
			
		||||
			err = erasure.Heal(ctx, writers, readers, partSize, prefer)
 | 
			
		||||
			closeBitrotReaders(readers)
 | 
			
		||||
			closeBitrotWriters(writers)
 | 
			
		||||
			closeErrs := closeBitrotWriters(writers)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return result, err
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -628,6 +628,13 @@ func (er *erasureObjects) healObject(ctx context.Context, bucket string, object
 | 
			
		|||
					continue
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				// A non-nil stale disk which got error on Close()
 | 
			
		||||
				if closeErrs[i] != nil {
 | 
			
		||||
					outDatedDisks[i] = nil
 | 
			
		||||
					disksToHealCount--
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				partsMetadata[i].DataDir = dstDataDir
 | 
			
		||||
				partsMetadata[i].AddObjectPart(partNumber, "", partSize, partActualSize, partModTime, partIdx, partChecksums)
 | 
			
		||||
				if len(inlineBuffers) > 0 && inlineBuffers[i] != nil {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -668,10 +668,13 @@ func (er erasureObjects) PutObjectPart(ctx context.Context, bucket, object, uplo
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	n, err := erasure.Encode(ctx, toEncode, writers, buffer, writeQuorum)
 | 
			
		||||
	closeBitrotWriters(writers)
 | 
			
		||||
	closeErrs := closeBitrotWriters(writers)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return pi, toObjectErr(err, bucket, object)
 | 
			
		||||
	}
 | 
			
		||||
	if closeErr := reduceWriteQuorumErrs(ctx, closeErrs, objectOpIgnoredErrs, writeQuorum); closeErr != nil {
 | 
			
		||||
		return pi, toObjectErr(closeErr, bucket, object)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Should return IncompleteBody{} error when reader has fewer bytes
 | 
			
		||||
	// than specified in request header.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1178,11 +1178,15 @@ func (er erasureObjects) putMetacacheObject(ctx context.Context, key string, r *
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	n, erasureErr := erasure.Encode(ctx, data, writers, buffer, writeQuorum)
 | 
			
		||||
	closeBitrotWriters(writers)
 | 
			
		||||
	closeErrs := closeBitrotWriters(writers)
 | 
			
		||||
	if erasureErr != nil {
 | 
			
		||||
		return ObjectInfo{}, toObjectErr(erasureErr, minioMetaBucket, key)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if closeErr := reduceWriteQuorumErrs(ctx, closeErrs, objectOpIgnoredErrs, writeQuorum); closeErr != nil {
 | 
			
		||||
		return ObjectInfo{}, toObjectErr(closeErr, minioMetaBucket, key)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Should return IncompleteBody{} error when reader has fewer bytes
 | 
			
		||||
	// than specified in request header.
 | 
			
		||||
	if n < data.Size() {
 | 
			
		||||
| 
						 | 
				
			
			@ -1425,11 +1429,15 @@ func (er erasureObjects) putObject(ctx context.Context, bucket string, object st
 | 
			
		|||
		bugLogIf(ctx, err)
 | 
			
		||||
	}
 | 
			
		||||
	n, erasureErr := erasure.Encode(ctx, toEncode, writers, buffer, writeQuorum)
 | 
			
		||||
	closeBitrotWriters(writers)
 | 
			
		||||
	closeErrs := closeBitrotWriters(writers)
 | 
			
		||||
	if erasureErr != nil {
 | 
			
		||||
		return ObjectInfo{}, toObjectErr(erasureErr, bucket, object)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if closeErr := reduceWriteQuorumErrs(ctx, closeErrs, objectOpIgnoredErrs, writeQuorum); closeErr != nil {
 | 
			
		||||
		return ObjectInfo{}, toObjectErr(closeErr, bucket, object)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Should return IncompleteBody{} error when reader has fewer bytes
 | 
			
		||||
	// than specified in request header.
 | 
			
		||||
	if n < data.Size() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue