@@ -1062,12 +1062,13 @@ func contextMetadataFromBidiReadObject(req *storagepb.BidiReadObjectRequest) []s
1062
1062
}
1063
1063
1064
1064
type rangeSpec struct {
1065
- readID int64
1066
- writer io.Writer
1067
- offset int64
1068
- limit int64
1069
- bytesWritten int64
1070
- callback func (int64 , int64 , error )
1065
+ readID int64
1066
+ writer io.Writer
1067
+ offset int64
1068
+ limit int64
1069
+ currentBytesWritten int64
1070
+ totalBytesWritten int64
1071
+ callback func (int64 , int64 , error )
1071
1072
}
1072
1073
1073
1074
func (c * grpcStorageClient ) NewMultiRangeDownloader (ctx context.Context , params * newMultiRangeDownloaderParams , opts ... storageOption ) (mr * MultiRangeDownloader , err error ) {
@@ -1202,7 +1203,7 @@ func (c *grpcStorageClient) NewMultiRangeDownloader(ctx context.Context, params
1202
1203
rr .mu .Lock ()
1203
1204
if len (rr .mp ) != 0 {
1204
1205
for key := range rr .mp {
1205
- rr .mp [key ].callback (rr .mp [key ].offset , rr .mp [key ].limit , fmt .Errorf ("stream closed early" ))
1206
+ rr .mp [key ].callback (rr .mp [key ].offset , rr .mp [key ].totalBytesWritten , fmt .Errorf ("stream closed early" ))
1206
1207
delete (rr .mp , key )
1207
1208
}
1208
1209
}
@@ -1295,21 +1296,22 @@ func (c *grpcStorageClient) NewMultiRangeDownloader(ctx context.Context, params
1295
1296
}
1296
1297
_ , err = rr .mp [id ].writer .Write (val .GetChecksummedData ().GetContent ())
1297
1298
if err != nil {
1298
- rr .mp [id ].callback (rr .mp [id ].offset , rr .mp [id ].limit , err )
1299
+ rr .mp [id ].callback (rr .mp [id ].offset , rr .mp [id ].totalBytesWritten , err )
1299
1300
rr .activeTask --
1300
1301
delete (rr .mp , id )
1301
1302
} else {
1302
1303
rr .mp [id ] = rangeSpec {
1303
- readID : rr .mp [id ].readID ,
1304
- writer : rr .mp [id ].writer ,
1305
- offset : rr .mp [id ].offset ,
1306
- limit : rr .mp [id ].limit ,
1307
- bytesWritten : rr .mp [id ].bytesWritten + int64 (len (val .GetChecksummedData ().GetContent ())),
1308
- callback : rr .mp [id ].callback ,
1304
+ readID : rr .mp [id ].readID ,
1305
+ writer : rr .mp [id ].writer ,
1306
+ offset : rr .mp [id ].offset ,
1307
+ limit : rr .mp [id ].limit ,
1308
+ currentBytesWritten : rr .mp [id ].currentBytesWritten + int64 (len (val .GetChecksummedData ().GetContent ())),
1309
+ totalBytesWritten : rr .mp [id ].totalBytesWritten + int64 (len (val .GetChecksummedData ().GetContent ())),
1310
+ callback : rr .mp [id ].callback ,
1309
1311
}
1310
1312
}
1311
1313
if val .GetRangeEnd () {
1312
- rr .mp [id ].callback (rr .mp [id ].offset , rr .mp [id ].limit , nil )
1314
+ rr .mp [id ].callback (rr .mp [id ].offset , rr .mp [id ].totalBytesWritten , nil )
1313
1315
rr .activeTask --
1314
1316
delete (rr .mp , id )
1315
1317
}
@@ -1340,7 +1342,7 @@ func (c *grpcStorageClient) NewMultiRangeDownloader(ctx context.Context, params
1340
1342
if err != nil {
1341
1343
rr .mu .Lock ()
1342
1344
for key := range rr .mp {
1343
- rr .mp [key ].callback (rr .mp [key ].offset , rr .mp [key ].limit , err )
1345
+ rr .mp [key ].callback (rr .mp [key ].offset , rr .mp [key ].totalBytesWritten , err )
1344
1346
delete (rr .mp , key )
1345
1347
}
1346
1348
// In case we hit an permanent error, delete entries from map and remove active tasks.
@@ -1388,12 +1390,13 @@ func getActiveRange(r *gRPCBidiReader) []rangeSpec {
1388
1390
var activeRange []rangeSpec
1389
1391
for k , v := range r .mp {
1390
1392
activeRange = append (activeRange , rangeSpec {
1391
- readID : k ,
1392
- writer : v .writer ,
1393
- offset : (v .offset + v .bytesWritten ),
1394
- limit : v .limit - v .bytesWritten ,
1395
- callback : v .callback ,
1396
- bytesWritten : 0 ,
1393
+ readID : k ,
1394
+ writer : v .writer ,
1395
+ offset : (v .offset + v .currentBytesWritten ),
1396
+ limit : v .limit - v .currentBytesWritten ,
1397
+ callback : v .callback ,
1398
+ currentBytesWritten : 0 ,
1399
+ totalBytesWritten : v .totalBytesWritten ,
1397
1400
})
1398
1401
r .mp [k ] = activeRange [len (activeRange )- 1 ]
1399
1402
}
@@ -1443,22 +1446,22 @@ func (mr *gRPCBidiReader) add(output io.Writer, offset, limit int64, callback fu
1443
1446
mr .mu .Unlock ()
1444
1447
1445
1448
if offset > objectSize {
1446
- callback (offset , limit , fmt .Errorf ("offset larger than size of object: %v" , objectSize ))
1449
+ callback (offset , 0 , fmt .Errorf ("offset larger than size of object: %v" , objectSize ))
1447
1450
return
1448
1451
}
1449
1452
if limit < 0 {
1450
- callback (offset , limit , fmt .Errorf ("limit can't be negative" ))
1453
+ callback (offset , 0 , fmt .Errorf ("limit can't be negative" ))
1451
1454
return
1452
1455
}
1453
1456
mr .mu .Lock ()
1454
1457
currentID := (* mr ).readID
1455
1458
(* mr ).readID ++
1456
1459
if ! mr .done {
1457
- spec := rangeSpec {readID : currentID , writer : output , offset : offset , limit : limit , bytesWritten : 0 , callback : callback }
1460
+ spec := rangeSpec {readID : currentID , writer : output , offset : offset , limit : limit , currentBytesWritten : 0 , totalBytesWritten : 0 , callback : callback }
1458
1461
mr .activeTask ++
1459
1462
mr .data <- []rangeSpec {spec }
1460
1463
} else {
1461
- callback (offset , limit , fmt .Errorf ("stream is closed, can't add range" ))
1464
+ callback (offset , 0 , fmt .Errorf ("stream is closed, can't add range" ))
1462
1465
}
1463
1466
mr .mu .Unlock ()
1464
1467
}
0 commit comments