@@ -71,6 +71,7 @@ impl<NC: NeighborComms> StackerDBSync<NC> {
71
71
total_pushed : 0 ,
72
72
last_run_ts : 0 ,
73
73
need_resync : false ,
74
+ stale_inv : false ,
74
75
stale_neighbors : HashSet :: new ( ) ,
75
76
num_connections : 0 ,
76
77
num_attempted_connections : 0 ,
@@ -210,6 +211,7 @@ impl<NC: NeighborComms> StackerDBSync<NC> {
210
211
self . write_freq = config. write_freq ;
211
212
212
213
self . need_resync = false ;
214
+ self . stale_inv = false ;
213
215
self . last_run_ts = get_epoch_time_secs ( ) ;
214
216
215
217
self . state = StackerDBSyncState :: ConnectBegin ;
@@ -253,7 +255,7 @@ impl<NC: NeighborComms> StackerDBSync<NC> {
253
255
. get_slot_write_timestamps ( & self . smart_contract_id ) ?;
254
256
255
257
if local_slot_versions. len ( ) != local_write_timestamps. len ( ) {
256
- let msg = format ! ( "Local slot versions ({}) out of sync with DB slot versions ({}); abandoning sync and trying again" , local_slot_versions. len( ) , local_write_timestamps. len( ) ) ;
258
+ let msg = format ! ( "Local slot versions ({}) out of sync with DB slot versions ({}) for {} ; abandoning sync and trying again" , local_slot_versions. len( ) , local_write_timestamps. len( ) , & self . smart_contract_id ) ;
257
259
warn ! ( "{}" , & msg) ;
258
260
return Err ( net_error:: Transient ( msg) ) ;
259
261
}
@@ -267,12 +269,13 @@ impl<NC: NeighborComms> StackerDBSync<NC> {
267
269
let write_ts = local_write_timestamps[ i] ;
268
270
if write_ts + self . write_freq > now {
269
271
debug ! (
270
- "{:?}: Chunk {} was written too frequently ({} + {} >= {}), so will not fetch chunk" ,
272
+ "{:?}: Chunk {} was written too frequently ({} + {} >= {}) in {} , so will not fetch chunk" ,
271
273
network. get_local_peer( ) ,
272
274
i,
273
275
write_ts,
274
276
self . write_freq,
275
- now
277
+ now,
278
+ & self . smart_contract_id,
276
279
) ;
277
280
continue ;
278
281
}
@@ -340,10 +343,11 @@ impl<NC: NeighborComms> StackerDBSync<NC> {
340
343
schedule. reverse ( ) ;
341
344
342
345
debug ! (
343
- "{:?}: Will request up to {} chunks for {}" ,
346
+ "{:?}: Will request up to {} chunks for {}. Schedule: {:?} " ,
344
347
network. get_local_peer( ) ,
345
348
& schedule. len( ) ,
346
349
& self . smart_contract_id,
350
+ & schedule
347
351
) ;
348
352
Ok ( schedule)
349
353
}
@@ -507,12 +511,13 @@ impl<NC: NeighborComms> StackerDBSync<NC> {
507
511
if * old_version < new_inv. slot_versions [ old_slot_id] {
508
512
// remote peer indicated that it has a newer version of this chunk.
509
513
debug ! (
510
- "{:?}: peer {:?} has a newer version of slot {} ({} < {})" ,
514
+ "{:?}: peer {:?} has a newer version of slot {} ({} < {}) in {} " ,
511
515
_network. get_local_peer( ) ,
512
516
& naddr,
513
517
old_slot_id,
514
518
old_version,
515
- new_inv. slot_versions[ old_slot_id]
519
+ new_inv. slot_versions[ old_slot_id] ,
520
+ & self . smart_contract_id,
516
521
) ;
517
522
resync = true ;
518
523
break ;
@@ -621,9 +626,10 @@ impl<NC: NeighborComms> StackerDBSync<NC> {
621
626
self . replicas = replicas;
622
627
}
623
628
debug ! (
624
- "{:?}: connect_begin: establish StackerDB sessions to {} neighbors" ,
629
+ "{:?}: connect_begin: establish StackerDB sessions to {} neighbors (out of {} p2p peers) " ,
625
630
network. get_local_peer( ) ,
626
- self . replicas. len( )
631
+ self . replicas. len( ) ,
632
+ network. get_num_p2p_convos( )
627
633
) ;
628
634
if self . replicas . len ( ) == 0 {
629
635
// nothing to do
@@ -820,9 +826,10 @@ impl<NC: NeighborComms> StackerDBSync<NC> {
820
826
}
821
827
StacksMessageType :: Nack ( data) => {
822
828
debug ! (
823
- "{:?}: remote peer {:?} NACK'ed our StackerDBGetChunksInv us with code {}" ,
829
+ "{:?}: remote peer {:?} NACK'ed our StackerDBGetChunksInv us (on {}) with code {}" ,
824
830
& network. get_local_peer( ) ,
825
831
& naddr,
832
+ & self . smart_contract_id,
826
833
data. error_code
827
834
) ;
828
835
self . connected_replicas . remove ( & naddr) ;
@@ -838,9 +845,10 @@ impl<NC: NeighborComms> StackerDBSync<NC> {
838
845
}
839
846
} ;
840
847
debug ! (
841
- "{:?}: getchunksinv_try_finish: Received StackerDBChunkInv from {:?}" ,
848
+ "{:?}: getchunksinv_try_finish: Received StackerDBChunkInv from {:?}: {:?} " ,
842
849
network. get_local_peer( ) ,
843
- & naddr
850
+ & naddr,
851
+ & chunk_inv_opt
844
852
) ;
845
853
846
854
if let Some ( chunk_inv) = chunk_inv_opt {
@@ -956,14 +964,17 @@ impl<NC: NeighborComms> StackerDBSync<NC> {
956
964
StacksMessageType :: StackerDBChunk ( data) => data,
957
965
StacksMessageType :: Nack ( data) => {
958
966
debug ! (
959
- "{:?}: remote peer {:?} NACK'ed our StackerDBGetChunk with code {}" ,
967
+ "{:?}: remote peer {:?} NACK'ed our StackerDBGetChunk (on {}) with code {}" ,
960
968
network. get_local_peer( ) ,
961
969
& naddr,
970
+ & self . smart_contract_id,
962
971
data. error_code
963
972
) ;
964
- self . connected_replicas . remove ( & naddr) ;
965
973
if data. error_code == NackErrorCodes :: StaleView {
966
974
self . stale_neighbors . insert ( naddr) ;
975
+ } else if data. error_code == NackErrorCodes :: StaleVersion {
976
+ // try again immediately, without throttling
977
+ self . stale_inv = true ;
967
978
}
968
979
continue ;
969
980
}
@@ -1068,7 +1079,6 @@ impl<NC: NeighborComms> StackerDBSync<NC> {
1068
1079
& selected_neighbor,
1069
1080
& e
1070
1081
) ;
1071
- self . connected_replicas . remove ( & selected_neighbor) ;
1072
1082
continue ;
1073
1083
}
1074
1084
@@ -1107,7 +1117,6 @@ impl<NC: NeighborComms> StackerDBSync<NC> {
1107
1117
& naddr,
1108
1118
data. error_code
1109
1119
) ;
1110
- self . connected_replicas . remove ( & naddr) ;
1111
1120
if data. error_code == NackErrorCodes :: StaleView {
1112
1121
self . stale_neighbors . insert ( naddr) ;
1113
1122
}
@@ -1199,8 +1208,11 @@ impl<NC: NeighborComms> StackerDBSync<NC> {
1199
1208
let done = self . connect_begin ( network) ?;
1200
1209
if done {
1201
1210
self . state = StackerDBSyncState :: ConnectFinish ;
1202
- blocked = false ;
1211
+ } else {
1212
+ // no replicas; try again
1213
+ self . state = StackerDBSyncState :: Finished ;
1203
1214
}
1215
+ blocked = false ;
1204
1216
}
1205
1217
StackerDBSyncState :: ConnectFinish => {
1206
1218
let done = self . connect_try_finish ( network) ?;
@@ -1248,6 +1260,11 @@ impl<NC: NeighborComms> StackerDBSync<NC> {
1248
1260
{
1249
1261
// someone pushed newer chunk data to us, and getting chunks is
1250
1262
// enabled, so immediately go request them
1263
+ debug ! (
1264
+ "{:?}: immediately retry StackerDB GetChunks on {} due to PushChunk NACK" ,
1265
+ network. get_local_peer( ) ,
1266
+ & self . smart_contract_id
1267
+ ) ;
1251
1268
self . recalculate_chunk_request_schedule ( network) ?;
1252
1269
self . state = StackerDBSyncState :: GetChunks ;
1253
1270
} else {
@@ -1259,8 +1276,19 @@ impl<NC: NeighborComms> StackerDBSync<NC> {
1259
1276
}
1260
1277
}
1261
1278
StackerDBSyncState :: Finished => {
1279
+ let stale_inv = self . stale_inv ;
1280
+
1262
1281
let result = self . reset ( Some ( network) , config) ;
1263
1282
self . state = StackerDBSyncState :: ConnectBegin ;
1283
+
1284
+ if stale_inv {
1285
+ debug ! (
1286
+ "{:?}: immediately retry StackerDB sync on {} due to stale inventory" ,
1287
+ network. get_local_peer( ) ,
1288
+ & self . smart_contract_id
1289
+ ) ;
1290
+ self . wakeup ( ) ;
1291
+ }
1264
1292
return Ok ( Some ( result) ) ;
1265
1293
}
1266
1294
} ;
0 commit comments