@@ -60,6 +60,12 @@ func (s *ContentStore) Put(pointer Pointer, r io.Reader) error {
60
60
return err
61
61
}
62
62
63
+ // check again whether there is any error during the Save operation
64
+ // because some errors might be ignored by the Reader's caller
65
+ if wrappedRd .lastError != nil {
66
+ return wrappedRd .lastError
67
+ }
68
+
63
69
// This shouldn't happen but it is sensible to test
64
70
if written != pointer .Size {
65
71
if err := s .Delete (p ); err != nil {
@@ -109,6 +115,17 @@ type hashingReader struct {
109
115
expectedSize int64
110
116
hash hash.Hash
111
117
expectedHash string
118
+ lastError error
119
+ }
120
+
121
+ // recordError records the last error during the Save operation
122
+ // Some callers of the Reader doesn't respect the returned "err"
123
+ // For example, MinIO's Put will ignore errors if the written size could equal to expected size
124
+ // So we must remember the error by ourselves,
125
+ // and later check again whether ErrSizeMismatch or ErrHashMismatch occurs during the Save operation
126
+ func (r * hashingReader ) recordError (n int , err error ) (int , error ) {
127
+ r .lastError = err
128
+ return n , err
112
129
}
113
130
114
131
func (r * hashingReader ) Read (b []byte ) (int , error ) {
@@ -118,22 +135,22 @@ func (r *hashingReader) Read(b []byte) (int, error) {
118
135
r .currentSize += int64 (n )
119
136
wn , werr := r .hash .Write (b [:n ])
120
137
if wn != n || werr != nil {
121
- return n , werr
138
+ return r . recordError ( n , werr )
122
139
}
123
140
}
124
141
125
- if err != nil && err == io . EOF {
142
+ if errors . Is ( err , io . EOF ) || r . currentSize >= r . expectedSize {
126
143
if r .currentSize != r .expectedSize {
127
- return n , ErrSizeMismatch
144
+ return r . recordError ( n , ErrSizeMismatch )
128
145
}
129
146
130
147
shaStr := hex .EncodeToString (r .hash .Sum (nil ))
131
148
if shaStr != r .expectedHash {
132
- return n , ErrHashMismatch
149
+ return r . recordError ( n , ErrHashMismatch )
133
150
}
134
151
}
135
152
136
- return n , err
153
+ return r . recordError ( n , err )
137
154
}
138
155
139
156
func newHashingReader (expectedSize int64 , expectedHash string , reader io.Reader ) * hashingReader {
0 commit comments