@@ -162,6 +162,7 @@ void clusterInit(void) {
162
162
server .cluster -> election_timeout = PREZ_CLUSTER_ELECTION_TIMEOUT ;
163
163
server .cluster -> heartbeat_interval = PREZ_CLUSTER_HEARTBEAT_INTERVAL ;
164
164
server .cluster -> synced_nodes = dictCreate (& clusterNodesDictType ,NULL );
165
+ server .cluster -> start_index = 0 ;
165
166
server .cluster -> current_term = 0 ;
166
167
server .cluster -> commit_index = 0 ;
167
168
server .cluster -> votes_granted = 0 ;
@@ -286,7 +287,7 @@ void clusterAcceptHandler(aeEventLoop *el, int fd, void *privdata, int mask) {
286
287
anetEnableTcpNoDelay (NULL ,cfd );
287
288
288
289
/* Use non-blocking I/O for cluster messages. */
289
- prezLog (PREZ_VERBOSE ,"Accepted cluster node %s:%d" , cip , cport );
290
+ prezLog (PREZ_VERBOSE ,"Accepted cluster node %s:%d cfd:%d " , cip , cport , cfd );
290
291
/* Create a link object we use to handle the connection.
291
292
* It gets passed to the readable handler when data is available.
292
293
* Initiallly the link->node pointer is set to NULL as we don't know
@@ -381,6 +382,28 @@ void clusterRenameNode(clusterNode *node, char *newname) {
381
382
clusterAddNode (node );
382
383
}
383
384
385
+ void clusterProcessCommand (prezClient * c ) {
386
+ logEntry entry ;
387
+ long long commit_index ;
388
+
389
+ prezLog (PREZ_DEBUG ,"clusterProcessCommand" );
390
+ entry .index = logCurrentIndex ()+ 1 ;
391
+ entry .term = server .cluster -> current_term ;
392
+ memcpy (entry .commandName ,c -> cmd -> name ,strlen (c -> cmd -> name )+ 1 );
393
+ memcpy (entry .command ,c -> cmd -> name ,strlen (c -> cmd -> name )+ 1 );
394
+
395
+ logWriteEntry (entry );
396
+
397
+ dictAdd (server .cluster -> synced_nodes ,
398
+ sdsnewlen (myself -> name ,PREZ_CLUSTER_NAMELEN ),& node_synced );
399
+
400
+ if (dictSize (server .cluster -> nodes ) == 1 ) {
401
+ commit_index = logCurrentIndex ();
402
+ logCommitIndex (commit_index );
403
+ prezLog (PREZ_DEBUG ,"commit index: %lld" , commit_index );
404
+ }
405
+ }
406
+
384
407
int clusterProcessPacket (clusterLink * link ) {
385
408
clusterMsg * hdr = (clusterMsg * ) link -> rcvbuf ;
386
409
uint32_t totlen = ntohl (hdr -> totlen );
@@ -414,7 +437,7 @@ int clusterProcessPacket(clusterLink *link) {
414
437
uint32_t explen ;
415
438
explen = sizeof (clusterMsg )- sizeof (union clusterMsgData );
416
439
explen += (sizeof (clusterMsgDataAppendEntries ) +
417
- (hdr -> data .appendentries .entries .log_entries_count - 1 ) *
440
+ (ntohs ( hdr -> data .appendentries .entries .log_entries_count ) - 1 ) *
418
441
sizeof (logEntry ));
419
442
if (totlen != explen ) return 1 ;
420
443
@@ -442,7 +465,8 @@ int clusterProcessPacket(clusterLink *link) {
442
465
explen += sizeof (clusterMsgDataResponseAppendEntries );
443
466
if (totlen != explen ) return 1 ;
444
467
445
- prezLog (PREZ_DEBUG ,"--- Received AppendEntriesResponse term %lld, index: %lld, commit_index: %lld, ok: %d" ,
468
+ prezLog (PREZ_DEBUG ,"--- Received AppendEntriesResponse port:%d term %lld, index: %lld, commit_index: %lld, ok: %d" ,
469
+ link -> node -> port ,
446
470
hdr -> data .responseappendentries .entries .term ,
447
471
hdr -> data .responseappendentries .entries .index ,
448
472
hdr -> data .responseappendentries .entries .commit_index ,
@@ -767,6 +791,7 @@ void clusterProcessResponseAppendEntries(clusterLink *link,
767
791
clusterNode * cnode = dictGetVal (de );
768
792
log_indices [i ] = cnode -> prev_log_index ;
769
793
}
794
+ dictReleaseIterator (di );
770
795
qsort (log_indices ,dictSize (server .cluster -> nodes ),sizeof (long long ),
771
796
compareIndices );
772
797
reverseIndices (log_indices ,dictSize (server .cluster -> nodes ));
@@ -874,7 +899,7 @@ void clusterSendAppendEntries(clusterLink *link) {
874
899
memcpy (hdr -> data .appendentries .entries .leaderid , myself -> name ,
875
900
PREZ_CLUSTER_NAMELEN );
876
901
hdr -> data .appendentries .entries .prev_log_index = node -> prev_log_index ;
877
- hdr -> data .appendentries .entries .prev_log_term = 0 ;
902
+ hdr -> data .appendentries .entries .prev_log_term = node -> last_sent_term ;
878
903
hdr -> data .appendentries .entries .leader_commit_index =
879
904
server .cluster -> commit_index ;
880
905
node -> last_sent_entry = NULL ;
@@ -889,8 +914,23 @@ void clusterSendAppendEntries(clusterLink *link) {
889
914
node -> prev_log_index - server .cluster -> start_index );
890
915
while (ln && logcount <= server .cluster -> log_max_entries_per_request ) {
891
916
le_node = listNodeValue (ln );
892
- memcpy (& (hdr -> data .appendentries .entries .log_entries [logcount ]),
917
+ hdr -> data .appendentries .entries .log_entries [logcount ].term =
918
+ le_node -> log_entry .term ;
919
+ hdr -> data .appendentries .entries .log_entries [logcount ].index =
920
+ le_node -> log_entry .index ;
921
+ memcpy (hdr -> data .appendentries .entries .log_entries [logcount ].commandName ,
922
+ le_node -> log_entry .commandName , PREZ_COMMAND_NAMELEN );
923
+ memcpy (hdr -> data .appendentries .entries .log_entries [logcount ].command ,
924
+ le_node -> log_entry .command , PREZ_COMMAND_NAMELEN );
925
+ prezLog (PREZ_DEBUG ,"AE term:%lld, index:%lld, cmd:%s, cmd:%s" ,
926
+ hdr -> data .appendentries .entries .log_entries [logcount ].term ,
927
+ hdr -> data .appendentries .entries .log_entries [logcount ].index ,
928
+ hdr -> data .appendentries .entries .log_entries [logcount ].commandName ,
929
+ hdr -> data .appendentries .entries .log_entries [logcount ].command );
930
+
931
+ /*memcpy(&(hdr->data.appendentries.entries.log_entries[logcount]),
893
932
&(le_node->log_entry), sizeof(logEntry));
933
+ */
894
934
ln_next = listNextNode (ln );
895
935
logcount ++ ;
896
936
if (!ln_next ) {
@@ -901,17 +941,19 @@ void clusterSendAppendEntries(clusterLink *link) {
901
941
ln = ln_next ;
902
942
}
903
943
}
904
- hdr -> data .appendentries .entries .log_entries_count = logcount ;
944
+ hdr -> data .appendentries .entries .log_entries_count = htons ( logcount ) ;
905
945
node -> last_sent_term = server .cluster -> current_term ;
906
946
907
947
totlen = sizeof (clusterMsg )- sizeof (union clusterMsgData );
908
948
totlen += (sizeof (clusterMsgDataAppendEntries )- sizeof (logEntry ));
909
949
totlen += (sizeof (logEntry )* logcount );
910
950
hdr -> totlen = htonl (totlen );
911
951
912
- prezLog (PREZ_DEBUG , "Sending heartbeat buf:%s, sizeof(clustermsg): "
913
- "%lu, totlen: %d\n" ,
914
- buf , sizeof (clusterMsg ), ntohl (hdr -> totlen ));
952
+ prezLog (PREZ_DEBUG , "Sending heartbeat to port:%d, buf:%s, sizeof(clustermsg): "
953
+ "%lu, totlen: %d logcount: %d\n" ,
954
+ node -> port , buf , sizeof (clusterMsg ),
955
+ ntohl (hdr -> totlen ),
956
+ ntohs (hdr -> data .appendentries .entries .log_entries_count ));
915
957
916
958
clusterSendMessage (link ,buf ,ntohl (hdr -> totlen ));
917
959
}
@@ -1018,6 +1060,7 @@ void clusterCron(void) {
1018
1060
clusterSendHeartbeat (node -> link );
1019
1061
}
1020
1062
}
1063
+ dictReleaseIterator (di );
1021
1064
}
1022
1065
1023
1066
}
0 commit comments