@@ -1059,7 +1059,7 @@ class replicationBuffer {
1059
1059
while (checkClientOutputBufferLimits (replica)
1060
1060
&& (replica->flags .load (std::memory_order_relaxed) & CLIENT_CLOSE_ASAP) == 0 ) {
1061
1061
ul.unlock ();
1062
- usleep (0 );
1062
+ usleep (1000 ); // give 1ms for the I/O before we poll again
1063
1063
ul.lock ();
1064
1064
}
1065
1065
}
@@ -2521,7 +2521,7 @@ size_t parseCount(const char *rgch, size_t cch, long long *pvalue) {
2521
2521
return cchNumeral + 3 ;
2522
2522
}
2523
2523
2524
- bool readSnapshotBulkPayload (connection *conn, redisMaster *mi, rdbSaveInfo &rsi) {
2524
+ bool readFastSyncBulkPayload (connection *conn, redisMaster *mi, rdbSaveInfo &rsi) {
2525
2525
int fUpdate = g_pserver->fActiveReplica || g_pserver->enable_multimaster ;
2526
2526
serverAssert (GlobalLocksAcquired ());
2527
2527
serverAssert (mi->master == nullptr );
@@ -2546,6 +2546,10 @@ bool readSnapshotBulkPayload(connection *conn, redisMaster *mi, rdbSaveInfo &rsi
2546
2546
}
2547
2547
}
2548
2548
2549
+ if (mi->repl_state == REPL_STATE_WAIT_STORAGE_IO) {
2550
+ goto LWaitIO;
2551
+ }
2552
+
2549
2553
serverAssert (mi->parseState != nullptr );
2550
2554
for (int iter = 0 ; iter < 10 ; ++iter) {
2551
2555
if (mi->parseState ->shouldThrottle ())
@@ -2663,7 +2667,14 @@ bool readSnapshotBulkPayload(connection *conn, redisMaster *mi, rdbSaveInfo &rsi
2663
2667
if (!fFinished )
2664
2668
return false ;
2665
2669
2670
+ LWaitIO:
2671
+ if (mi->parseState ->hasIOInFlight ()) {
2672
+ mi->repl_state = REPL_STATE_WAIT_STORAGE_IO;
2673
+ return false ;
2674
+ }
2675
+
2666
2676
serverLog (LL_NOTICE, " Fast sync complete" );
2677
+ serverAssert (!mi->parseState ->hasIOInFlight ());
2667
2678
delete mi->parseState ;
2668
2679
mi->parseState = nullptr ;
2669
2680
return true ;
@@ -3040,7 +3051,7 @@ void readSyncBulkPayload(connection *conn) {
3040
3051
}
3041
3052
3042
3053
if (mi->isKeydbFastsync ) {
3043
- if (!readSnapshotBulkPayload (conn, mi, rsi))
3054
+ if (!readFastSyncBulkPayload (conn, mi, rsi))
3044
3055
return ;
3045
3056
} else {
3046
3057
if (!readSyncBulkPayloadRdb (conn, mi, rsi, usemark))
@@ -4807,6 +4818,10 @@ void replicationCron(void) {
4807
4818
{
4808
4819
redisMaster *mi = (redisMaster*)listNodeValue (lnMaster);
4809
4820
4821
+ if (mi->repl_state == REPL_STATE_WAIT_STORAGE_IO && !mi->parseState ->hasIOInFlight ()) {
4822
+ readSyncBulkPayload (mi->repl_transfer_s );
4823
+ }
4824
+
4810
4825
std::unique_lock<decltype (mi->master ->lock )> ulock;
4811
4826
if (mi->master != nullptr )
4812
4827
ulock = decltype (ulock)(mi->master ->lock );
0 commit comments