@@ -177,7 +177,7 @@ public void requestPreliminaryData() {
177
177
nodeAddresses .remove (nodeAddress );
178
178
// We clone list to avoid mutable change during iterations
179
179
List <NodeAddress > remainingNodeAddresses = new ArrayList <>(nodeAddresses );
180
- UserThread .runAfter (() -> requestData (nodeAddress , remainingNodeAddresses ), (i * 200 + 1 ), TimeUnit .MILLISECONDS );
180
+ UserThread .runAfter (() -> requestData (nodeAddress , remainingNodeAddresses , Optional . empty () ), (i * 200 + 1 ), TimeUnit .MILLISECONDS );
181
181
}
182
182
183
183
isPreliminaryDataRequest = true ;
@@ -195,7 +195,7 @@ public void requestUpdateData() {
195
195
// We use the node we have already connected to to request again
196
196
nodeAddressOfPreliminaryDataRequest .ifPresent (candidate -> {
197
197
nodeAddresses .remove (candidate );
198
- requestData (candidate , nodeAddresses );
198
+ requestData (candidate , nodeAddresses , Optional . empty () );
199
199
200
200
ArrayList <NodeAddress > finalNodeAddresses = new ArrayList <>(nodeAddresses );
201
201
int numRequests = 0 ;
@@ -205,7 +205,7 @@ public void requestUpdateData() {
205
205
206
206
// It might be that we have a prelim. request open for the same seed, if so we skip to the next.
207
207
if (!handlerMap .containsKey (nodeAddress )) {
208
- UserThread .runAfter (() -> requestData (nodeAddress , nodeAddresses ), (i * 200 + 1 ), TimeUnit .MILLISECONDS );
208
+ UserThread .runAfter (() -> requestData (nodeAddress , nodeAddresses , Optional . empty () ), (i * 200 + 1 ), TimeUnit .MILLISECONDS );
209
209
numRequests ++;
210
210
}
211
211
}
@@ -333,13 +333,15 @@ public void onFault(String errorMessage, @Nullable Connection connection) {
333
333
// RequestData
334
334
///////////////////////////////////////////////////////////////////////////////////////////
335
335
336
- private void requestData (NodeAddress nodeAddress , List <NodeAddress > remainingNodeAddresses ) {
336
+ private void requestData (NodeAddress nodeAddress , List <NodeAddress > remainingNodeAddresses ,
337
+ Optional <String > responderVersion ) {
337
338
if (!stopped ) {
338
339
if (!handlerMap .containsKey (nodeAddress )) {
339
340
RequestDataHandler requestDataHandler = new RequestDataHandler (networkNode , dataStorage , peerManager ,
341
+ responderVersion ,
340
342
new RequestDataHandler .Listener () {
341
343
@ Override
342
- public void onComplete (boolean wasTruncated ) {
344
+ public void onComplete (boolean wasTruncated , String responderVersion ) {
343
345
log .trace ("RequestDataHandshake of outbound connection complete. nodeAddress={}" ,
344
346
nodeAddress );
345
347
stopRetryTimer ();
@@ -363,12 +365,20 @@ public void onComplete(boolean wasTruncated) {
363
365
}
364
366
365
367
if (wasTruncated ) {
366
- if (numRepeatedRequests < MAX_REPEATED_REQUESTS ) {
368
+ boolean isResponderOlderVersion = Version .isNewVersion (Version .VERSION , responderVersion );
369
+ if (isResponderOlderVersion ) {
370
+ log .info ("The responder's version is older than hours. " +
371
+ "We need to include the hashes from our historical store (since {}) " +
372
+ "to the next request." , responderVersion );
373
+ UserThread .runAfter (() -> requestData (nodeAddress , remainingNodeAddresses , Optional .of (responderVersion )), 2 );
374
+ }
375
+
376
+ else if (numRepeatedRequests < MAX_REPEATED_REQUESTS ) {
367
377
// If we had allDataReceived already set to true but get a response with truncated flag,
368
378
// we still repeat the request to that node for higher redundancy. Otherwise, one seed node
369
379
// providing incomplete data would stop others to fill the gaps.
370
380
log .info ("DataResponse did not contain all data, so we repeat request until we got all data" );
371
- UserThread .runAfter (() -> requestData (nodeAddress , remainingNodeAddresses ), 2 );
381
+ UserThread .runAfter (() -> requestData (nodeAddress , remainingNodeAddresses , Optional . of ( responderVersion ) ), 2 );
372
382
} else if (!allDataReceived ) {
373
383
allDataReceived = true ;
374
384
log .warn ("\n #################################################################\n " +
@@ -398,7 +408,7 @@ public void onFault(String errorMessage, @Nullable Connection connection) {
398
408
"We will try requestDataFromPeers again." );
399
409
NodeAddress nextCandidate = remainingNodeAddresses .get (0 );
400
410
remainingNodeAddresses .remove (nextCandidate );
401
- requestData (nextCandidate , remainingNodeAddresses );
411
+ requestData (nextCandidate , remainingNodeAddresses , Optional . empty () );
402
412
} else if (handlerMap .isEmpty ()) {
403
413
// If not other connection attempts are in the handlerMap we assume that no seed
404
414
// nodes are available.
@@ -455,7 +465,7 @@ private void requestFromNonSeedNodePeers() {
455
465
if (!list .isEmpty ()) {
456
466
NodeAddress nextCandidate = list .get (0 );
457
467
list .remove (nextCandidate );
458
- requestData (nextCandidate , list );
468
+ requestData (nextCandidate , list , Optional . empty () );
459
469
}
460
470
}
461
471
@@ -482,7 +492,7 @@ private void restart() {
482
492
if (!list .isEmpty ()) {
483
493
NodeAddress nextCandidate = list .get (0 );
484
494
list .remove (nextCandidate );
485
- requestData (nextCandidate , list );
495
+ requestData (nextCandidate , list , Optional . empty () );
486
496
}
487
497
},
488
498
RETRY_DELAY_SEC );
0 commit comments