@@ -1012,7 +1012,7 @@ func (cm *cacheManager) Prune(ctx context.Context, ch chan client.UsageInfo, opt
1012
1012
cm .muPrune .Lock ()
1013
1013
1014
1014
for _ , opt := range opts {
1015
- if err := cm .pruneOnce (ctx , ch , opt ); err != nil {
1015
+ if err := cm .prune (ctx , ch , opt ); err != nil {
1016
1016
cm .muPrune .Unlock ()
1017
1017
return err
1018
1018
}
@@ -1029,7 +1029,7 @@ func (cm *cacheManager) Prune(ctx context.Context, ch chan client.UsageInfo, opt
1029
1029
return nil
1030
1030
}
1031
1031
1032
- func (cm * cacheManager ) pruneOnce (ctx context.Context , ch chan client.UsageInfo , opt client.PruneInfo ) error {
1032
+ func (cm * cacheManager ) prune (ctx context.Context , ch chan client.UsageInfo , opt client.PruneInfo ) error {
1033
1033
filter , err := filters .ParseAll (opt .Filter ... )
1034
1034
if err != nil {
1035
1035
return errors .Wrapf (err , "failed to parse prune filters %v" , opt .Filter )
@@ -1066,14 +1066,21 @@ func (cm *cacheManager) pruneOnce(ctx context.Context, ch chan client.UsageInfo,
1066
1066
}
1067
1067
}
1068
1068
1069
- return cm . prune ( ctx , ch , pruneOpt {
1069
+ popt := pruneOpt {
1070
1070
filter : filter ,
1071
1071
all : opt .All ,
1072
1072
checkShared : check ,
1073
1073
keepDuration : opt .KeepDuration ,
1074
1074
keepBytes : calculateKeepBytes (totalSize , dstat , opt ),
1075
1075
totalSize : totalSize ,
1076
- })
1076
+ }
1077
+ for {
1078
+ releasedSize , releasedCount , err := cm .pruneOnce (ctx , ch , popt )
1079
+ if err != nil || releasedCount == 0 {
1080
+ return err
1081
+ }
1082
+ popt .totalSize -= releasedSize
1083
+ }
1077
1084
}
1078
1085
1079
1086
func calculateKeepBytes (totalSize int64 , dstat disk.DiskStat , opt client.PruneInfo ) int64 {
@@ -1100,9 +1107,9 @@ func calculateKeepBytes(totalSize int64, dstat disk.DiskStat, opt client.PruneIn
1100
1107
return keepBytes
1101
1108
}
1102
1109
1103
- func (cm * cacheManager ) prune (ctx context.Context , ch chan client.UsageInfo , opt pruneOpt ) (err error ) {
1110
+ func (cm * cacheManager ) pruneOnce (ctx context.Context , ch chan client.UsageInfo , opt pruneOpt ) (releasedSize , releasedCount int64 , err error ) {
1104
1111
if opt .keepBytes != 0 && opt .totalSize < opt .keepBytes {
1105
- return nil
1112
+ return 0 , 0 , nil
1106
1113
}
1107
1114
1108
1115
var toDelete []* deleteRecord
@@ -1206,11 +1213,11 @@ func (cm *cacheManager) prune(ctx context.Context, ch chan client.UsageInfo, opt
1206
1213
// mark metadata as deleted in case we crash before cleanup finished
1207
1214
if err := cr .queueDeleted (); err != nil {
1208
1215
releaseLocks ()
1209
- return err
1216
+ return 0 , 0 , err
1210
1217
}
1211
1218
if err := cr .commitMetadata (); err != nil {
1212
1219
releaseLocks ()
1213
- return err
1220
+ return 0 , 0 , err
1214
1221
}
1215
1222
}
1216
1223
cr .mu .Unlock ()
@@ -1221,7 +1228,7 @@ func (cm *cacheManager) prune(ctx context.Context, ch chan client.UsageInfo, opt
1221
1228
cm .mu .Unlock ()
1222
1229
1223
1230
if len (toDelete ) == 0 {
1224
- return nil
1231
+ return 0 , 0 , nil
1225
1232
}
1226
1233
1227
1234
// calculate sizes here so that lock does not need to be held for slow process
@@ -1234,7 +1241,7 @@ func (cm *cacheManager) prune(ctx context.Context, ch chan client.UsageInfo, opt
1234
1241
if size == sizeUnknown {
1235
1242
// calling size will warm cache for next call
1236
1243
if _ , err := cr .size (ctx ); err != nil {
1237
- return err
1244
+ return 0 , 0 , err
1238
1245
}
1239
1246
}
1240
1247
}
@@ -1277,15 +1284,18 @@ func (cm *cacheManager) prune(ctx context.Context, ch chan client.UsageInfo, opt
1277
1284
c .Size = cr .equalImmutable .getSize () // benefit from DiskUsage calc
1278
1285
}
1279
1286
1280
- opt . totalSize - = c .Size
1287
+ releasedSize + = c .Size
1281
1288
1282
1289
if cr .equalImmutable != nil {
1283
1290
if err1 := cr .equalImmutable .remove (ctx , false ); err == nil {
1284
1291
err = err1
1285
1292
}
1286
1293
}
1287
- if err1 := cr .remove (ctx , true ); err == nil {
1294
+
1295
+ if err1 := cr .remove (ctx , true ); err1 != nil && err == nil {
1288
1296
err = err1
1297
+ } else if err1 == nil {
1298
+ releasedCount ++
1289
1299
}
1290
1300
1291
1301
if err == nil && ch != nil {
@@ -1294,16 +1304,17 @@ func (cm *cacheManager) prune(ctx context.Context, ch chan client.UsageInfo, opt
1294
1304
cr .mu .Unlock ()
1295
1305
}
1296
1306
cm .mu .Unlock ()
1307
+
1297
1308
if err != nil {
1298
- return err
1309
+ return releasedSize , releasedCount , err
1299
1310
}
1300
1311
1301
1312
select {
1302
1313
case <- ctx .Done ():
1303
- return context .Cause (ctx )
1314
+ err = context .Cause (ctx )
1304
1315
default :
1305
- return cm .prune (ctx , ch , opt )
1306
1316
}
1317
+ return releasedSize , releasedCount , err
1307
1318
}
1308
1319
1309
1320
func (cm * cacheManager ) markShared (m map [string ]* cacheUsageInfo ) error {
0 commit comments