@@ -146,16 +146,20 @@ func (fh *FileHandle) WriteFile(offset int64, data []byte, copyData bool) (err e
146
146
}
147
147
148
148
// Try to reserve space without the inode lock
149
- err = fh .inode .fs .bufferPool .Use (int64 (len (data )), false )
150
- if err != nil {
151
- return err
149
+ if fh .inode .fs .flags .UseEnomem {
150
+ err = fh .inode .fs .bufferPool .Use (int64 (len (data )), false )
151
+ if err != nil {
152
+ return err
153
+ }
152
154
}
153
155
154
156
fh .inode .mu .Lock ()
155
157
156
158
if fh .inode .CacheState == ST_DELETED || fh .inode .CacheState == ST_DEAD {
157
159
// Oops, it's a deleted file. We don't support changing invisible files
158
- fh .inode .fs .bufferPool .Use (- int64 (len (data )), false )
160
+ if fh .inode .fs .flags .UseEnomem {
161
+ fh .inode .fs .bufferPool .Use (- int64 (len (data )), false )
162
+ }
159
163
fh .inode .mu .Unlock ()
160
164
return syscall .ENOENT
161
165
}
@@ -187,7 +191,9 @@ func (fh *FileHandle) WriteFile(offset int64, data []byte, copyData bool) (err e
187
191
fh .inode .mu .Unlock ()
188
192
189
193
// Correct memory usage
190
- if allocated != int64 (len (data )) {
194
+ if ! fh .inode .fs .flags .UseEnomem {
195
+ fh .inode .fs .bufferPool .Use (allocated , true )
196
+ } else if allocated != int64 (len (data )) {
191
197
err = fh .inode .fs .bufferPool .Use (allocated - int64 (len (data )), true )
192
198
}
193
199
@@ -330,15 +336,17 @@ func (inode *Inode) LoadRange(offset, size uint64, readAheadSize uint64, ignoreM
330
336
331
337
func (inode * Inode ) retryRead (cloud StorageBackend , key string , offset , size uint64 , ignoreMemoryLimit bool ) {
332
338
// Maybe free some buffers first
333
- err := inode .fs .bufferPool .Use (int64 (size ), ignoreMemoryLimit )
334
- if err != nil {
335
- log .Errorf ("Error reading %v +%v of %v: %v" , offset , size , key , err )
336
- inode .mu .Lock ()
337
- inode .readError = err
338
- inode .buffers .RemoveLoading (offset , size )
339
- inode .mu .Unlock ()
340
- inode .readCond .Broadcast ()
341
- return
339
+ if inode .fs .flags .UseEnomem {
340
+ err := inode .fs .bufferPool .Use (int64 (size ), ignoreMemoryLimit )
341
+ if err != nil {
342
+ log .Errorf ("Error reading %v +%v of %v: %v" , offset , size , key , err )
343
+ inode .mu .Lock ()
344
+ inode .readError = err
345
+ inode .buffers .RemoveLoading (offset , size )
346
+ inode .mu .Unlock ()
347
+ inode .readCond .Broadcast ()
348
+ return
349
+ }
342
350
}
343
351
inode .mu .Lock ()
344
352
inode .LockRange (offset , size , false )
@@ -348,7 +356,7 @@ func (inode *Inode) retryRead(cloud StorageBackend, key string, offset, size uin
348
356
// is temporarily unavailable (err would be io.EOF in that case)
349
357
allocated := int64 (0 )
350
358
curOffset , curSize := offset , size
351
- err = ReadBackoff (inode .fs .flags , func (attempt int ) error {
359
+ err : = ReadBackoff (inode .fs .flags , func (attempt int ) error {
352
360
alloc , done , err := inode .sendRead (cloud , key , curOffset , curSize )
353
361
if err != nil && shouldRetry (err ) {
354
362
s3Log .Warnf ("Error reading %v +%v of %v (attempt %v): %v" , curOffset , curSize , key , attempt , err )
@@ -358,7 +366,9 @@ func (inode *Inode) retryRead(cloud StorageBackend, key string, offset, size uin
358
366
allocated += alloc
359
367
return err
360
368
})
361
- if allocated != int64 (size ) {
369
+ if ! inode .fs .flags .UseEnomem {
370
+ inode .fs .bufferPool .Use (int64 (allocated ), true )
371
+ } else if allocated != int64 (size ) {
362
372
inode .fs .bufferPool .Use (int64 (allocated )- int64 (size ), true )
363
373
}
364
374
inode .mu .Lock ()
0 commit comments