@@ -331,6 +331,7 @@ impl DownloaderState {
331
331
}
332
332
}
333
333
state. ranges = ranges;
334
+ state. size = state. size . min ( size) ;
334
335
self . check_completion ( hash, None , evs) ?;
335
336
} else {
336
337
// We got an entirely new peer, mark all affected downloads for rebalancing
@@ -340,21 +341,23 @@ impl DownloaderState {
340
341
}
341
342
}
342
343
state. ranges = ranges;
344
+ state. size = state. size . min ( size) ;
343
345
}
344
346
// we have to call start_downloads even if the local bitfield set, since we don't know in which order local and remote bitfields arrive
345
347
self . start_downloads ( hash, None , evs) ?;
346
348
}
347
349
Command :: BitfieldInfo {
348
350
peer,
349
351
hash,
350
- event : BitfieldEvent :: Update { added, removed } ,
352
+ event : BitfieldEvent :: Update { added, removed, size } ,
351
353
} => {
352
354
let state = self . bitfields . get_mut ( & ( peer, hash) ) . context ( format ! (
353
355
"bitfield update for unknown peer {peer:?} and hash {hash}"
354
356
) ) ?;
355
357
if peer == BitfieldPeer :: Local {
356
358
// we got a local bitfield update, notify local observers
357
359
// for updates we can just notify the observers that have a non-empty intersection with the update
360
+ state. size = state. size . min ( size) ;
358
361
if let Some ( observers) = self . observers . get_by_hash ( & hash) {
359
362
for ( id, request) in observers {
360
363
let added = & added & & request. ranges ;
@@ -365,6 +368,7 @@ impl DownloaderState {
365
368
event : BitfieldEvent :: Update {
366
369
added : & added & & request. ranges ,
367
370
removed : & removed & & request. ranges ,
371
+ size : state. size ,
368
372
}
369
373
} ) ;
370
374
}
@@ -383,6 +387,7 @@ impl DownloaderState {
383
387
}
384
388
state. ranges |= added;
385
389
state. ranges &= !removed;
390
+ state. size = state. size . min ( size) ;
386
391
// a local bitfield update does not make more data available, so we don't need to start downloads
387
392
self . start_downloads ( hash, None , evs) ?;
388
393
}
@@ -874,6 +879,8 @@ struct PeerBlobState {
874
879
subscription_count : usize ,
875
880
/// chunk ranges this peer reports to have
876
881
ranges : ChunkRanges ,
882
+ /// The minimum reported size of the blob
883
+ size : u64 ,
877
884
}
878
885
879
886
impl PeerBlobState {
@@ -882,6 +889,7 @@ impl PeerBlobState {
882
889
subscription_id,
883
890
subscription_count : 1 ,
884
891
ranges : ChunkRanges :: empty ( ) ,
892
+ size : u64:: MAX ,
885
893
}
886
894
}
887
895
}
@@ -977,6 +985,7 @@ mod tests {
977
985
event : BitfieldEvent :: Update {
978
986
added : chunk_ranges ( [ 16 ..32 ] ) ,
979
987
removed : ChunkRanges :: empty ( ) ,
988
+ size : u64:: MAX ,
980
989
} ,
981
990
} ) ;
982
991
assert ! ( evs. is_empty( ) ) ;
@@ -1036,6 +1045,7 @@ mod tests {
1036
1045
event : BitfieldEvent :: Update {
1037
1046
added : chunk_ranges ( [ 32 ..48 ] ) ,
1038
1047
removed : ChunkRanges :: empty ( ) ,
1048
+ size : u64:: MAX ,
1039
1049
} ,
1040
1050
} ) ;
1041
1051
assert ! ( evs. is_empty( ) ) ;
@@ -1054,6 +1064,7 @@ mod tests {
1054
1064
event : BitfieldEvent :: Update {
1055
1065
added : chunk_ranges ( [ 48 ..64 ] ) ,
1056
1066
removed : ChunkRanges :: empty ( ) ,
1067
+ size : u64:: MAX ,
1057
1068
} ,
1058
1069
} ) ;
1059
1070
assert ! (
@@ -1129,6 +1140,7 @@ mod tests {
1129
1140
event : BitfieldEvent :: Update {
1130
1141
added : chunk_ranges ( [ 0 ..16 ] ) ,
1131
1142
removed : ChunkRanges :: empty ( ) ,
1143
+ size : u64:: MAX ,
1132
1144
} ,
1133
1145
} ) ;
1134
1146
// The peer now has more data
@@ -1154,6 +1166,7 @@ mod tests {
1154
1166
event : BitfieldEvent :: Update {
1155
1167
added : chunk_ranges ( [ 16 ..32 ] ) ,
1156
1168
removed : ChunkRanges :: empty ( ) ,
1169
+ size : u64:: MAX ,
1157
1170
} ,
1158
1171
} ) ;
1159
1172
// This triggers cancellation of the first peer download and starting a new one for the remaining data
@@ -1187,6 +1200,7 @@ mod tests {
1187
1200
event : BitfieldEvent :: Update {
1188
1201
added : chunk_ranges ( [ 32 ..64 ] ) ,
1189
1202
removed : ChunkRanges :: empty ( ) ,
1203
+ size : u64:: MAX ,
1190
1204
} ,
1191
1205
} ) ;
1192
1206
assert ! (
0 commit comments