@@ -2206,7 +2206,7 @@ int tryReadBulkPayloadMetadata(connection *conn, char *buf, char *eofmark, char
22062206 /* At this stage just a newline works as a PING in order to take
22072207 * the connection live. So we refresh our last interaction
22082208 * timestamp. */
2209- atomic_store_explicit ( & server .repl_transfer_lastio , atomic_load_explicit ( & server .unixtime , memory_order_relaxed ), memory_order_relaxed ) ;
2209+ server .repl_transfer_lastio = server .unixtime ;
22102210 return C_RETRY ;
22112211 } else if (ret == INSPECT_BULK_PAYLOAD_PRIMARY_BAD_PROTO ) {
22122212 serverLog (LL_WARNING ,
@@ -2641,7 +2641,7 @@ void replicaReceiveRDBFromPrimaryToDisk(connection *conn, int is_dual_channel) {
26412641
26422642 /* Update the last I/O time for the replication transfer (used in
26432643 * order to detect timeouts during replication). */
2644- atomic_store_explicit ( & server .repl_transfer_lastio , atomic_load_explicit ( & server .unixtime , memory_order_relaxed ), memory_order_relaxed ) ;
2644+ server .repl_transfer_lastio = server .unixtime ;
26452645
26462646 /* Write what we got from the socket to the dump file on disk */
26472647 if ((nwritten = write (server .repl_transfer_fd , buf , nread )) != nread ) {
@@ -2700,7 +2700,6 @@ void replicaReceiveRDBFromPrimaryToDisk(connection *conn, int is_dual_channel) {
27002700 atomic_store_explicit (& server .replica_bio_disk_save_state , REPL_BIO_DISK_SAVE_STATE_FAIL , memory_order_release );
27012701 } else {
27022702 replicaBioSaveServerLog (LL_NOTICE , "Done downloading RDB" );
2703- server .replica_bio_disk_save_conn = conn ;
27042703 atomic_store_explicit (& server .replica_bio_disk_save_state , REPL_BIO_DISK_SAVE_STATE_FINISHED , memory_order_release );
27052704 }
27062705}
@@ -3000,7 +2999,7 @@ static int dualChannelReplHandleEndOffsetResponse(connection *conn, sds *err) {
30002999 server .bio_repl_transfer_read = 0 ;
30013000 if (!useDisklessLoad ()) {
30023001 /* Only create the Bio thread once the first piece of data is sent by the primary */
3003- connSetReadHandler (server .repl_rdb_transfer_s , receiveRDBinBioThreadDualChannel );
3002+ serverAssert ( connSetReadHandler (server .repl_rdb_transfer_s , receiveRDBinBioThreadDualChannel ) != C_ERR );
30043003 } else {
30053004 serverAssert (connSetReadHandler (server .repl_rdb_transfer_s , replicaReceiveRDBFromPrimaryToMemory ) != C_ERR );
30063005 }
@@ -4137,7 +4136,13 @@ void syncWithPrimary(connection *conn) {
41374136
41384137 if (!useDisklessLoad ()) {
41394138 /* Only create the Bio thread once the first piece of data is sent by the primary */
4140- connSetReadHandler (conn , receiveRDBinBioThreadSingleChannel );
4139+ if (connSetReadHandler (conn , receiveRDBinBioThreadSingleChannel ) == C_ERR ) {
4140+ char conninfo [CONN_INFO_LEN ];
4141+ serverLog (LL_WARNING , "Can't create readable event for Bio SYNC: %s (%s)" , strerror (errno ),
4142+ connGetInfo (conn , conninfo , sizeof (conninfo )));
4143+ syncWithPrimaryHandleError (& conn );
4144+ return ;
4145+ }
41414146 } else {
41424147 /* Setup the non blocking download of the bulk file. */
41434148 if (connSetReadHandler (conn , replicaReceiveRDBFromPrimaryToMemory ) == C_ERR ) {
@@ -4995,7 +5000,6 @@ long long replicationGetReplicaOffset(void) {
49955000void resetBioRDBSaveState (void ) {
49965001 server .bio_repl_transfer_size = 0 ;
49975002 server .bio_repl_transfer_read = 0 ;
4998- server .replica_bio_disk_save_conn = NULL ;
49995003 server .replica_bio_disk_save_state = REPL_BIO_DISK_SAVE_STATE_NONE ;
50005004}
50015005
@@ -5021,14 +5025,20 @@ void handleBioThreadFinishedRDBDownload(void) {
50215025 /* Handle Bio sync success */
50225026 serverLog (LL_NOTICE , "Loading the RDB and finalizing primary-replica sync..." );
50235027 rdbSaveInfo rsi = RDB_SAVE_INFO_INIT ;
5024- replicaBeforeLoadPrimaryRDB (server .replica_bio_disk_save_conn , 0 );
5028+ connection * conn ;
5029+ if (server .repl_rdb_channel_state != REPL_DUAL_CHANNEL_STATE_NONE ) {
5030+ conn = server .repl_rdb_transfer_s ;
5031+ } else {
5032+ conn = server .repl_transfer_s ;
5033+ }
5034+ replicaBeforeLoadPrimaryRDB (conn , 0 );
50255035 if (replicaLoadPrimaryRDBFromDisk (& rsi ) == C_ERR ) {
50265036 serverLog (LL_WARNING , "Failed to load RDB" );
50275037 resetBioRDBSaveState ();
50285038 cancelReplicationHandshake (1 );
50295039 return ;
50305040 }
5031- replicaAfterLoadPrimaryRDB (server . replica_bio_disk_save_conn , & rsi );
5041+ replicaAfterLoadPrimaryRDB (conn , & rsi );
50325042 server .repl_transfer_size = server .bio_repl_transfer_size ;
50335043 server .repl_transfer_read = server .bio_repl_transfer_read ;
50345044 resetBioRDBSaveState ();
0 commit comments