Skip to content

Commit 542c8c4

Browse files
committed
FIX: Handling abnormal swithover from zk.
1 parent 99a2dda commit 542c8c4

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

src/main/java/net/spy/memcached/MemcachedConnection.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,13 +485,34 @@ private void updateReplConnections(List<InetSocketAddress> addrs) throws IOExcep
485485
// move operation slave -> master.
486486
taskList.add(new MoveOperationTask(
487487
oldSlaveNode, oldMasterNode, false));
488+
// clear the masterCandidate if the removed slave is the masterCandidate.
489+
if (oldGroup.getMasterCandidate() == oldSlaveNode) {
490+
oldGroup.clearMasterCandidate();
491+
}
488492
}
489493
}
490494
} else if (oldSlaveAddrs.contains(newMasterAddr)) {
491495
if (newSlaveAddrs.contains(oldMasterAddr)) {
492496
// Switchover
493-
if (oldGroup.getMasterCandidate() != null) {
497+
MemcachedNode oldMasterCandidate = oldGroup.getMasterCandidate();
498+
if (oldMasterCandidate != null) {
499+
ArcusReplNodeAddress masterFromZk = (ArcusReplNodeAddress) oldGroup
500+
.getSlaveNodeBy(newMasterAddr.getIPPort()).getSocketAddress();
494501
changeRoleGroups.add(oldGroup);
502+
if (!masterFromZk.isSameAddress(
503+
((ArcusReplNodeAddress) oldMasterCandidate.getSocketAddress()))) {
504+
/**
505+
* Moves ops from oldMasterCandidate set by cache server to newMasterCandidate.
506+
* Handling the below case.
507+
* old group : [oldMaster, oldSlave1, oldSlave2]
508+
* old group after switchover response :
509+
* [oldMaster, oldSlave1-masterCandidate, oldSlave2]
510+
* new group from zk cache list: [slave1, X, newMaster]
511+
*/
512+
oldGroup.setMasterCandidateByAddr(newMasterAddr.getIPPort());
513+
taskList.add(new MoveOperationTask(
514+
oldMasterCandidate, oldGroup.getMasterCandidate(), false));
515+
}
495516
} else {
496517
// ZK event occurs before cache server response.
497518
oldGroup.setMasterCandidateByAddr(newMasterAddr.getIPPort());

src/main/java/net/spy/memcached/MemcachedReplicaGroup.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ public void setMasterCandidate() {
8686
}
8787
}
8888

89+
public void clearMasterCandidate() {
90+
this.masterCandidate = null;
91+
}
92+
8993
public void setMasterCandidateByAddr(String address) {
9094
for (MemcachedNode node : this.getSlaveNodes()) {
9195
if (address.equals(((ArcusReplNodeAddress) node.getSocketAddress()).getIPPort())) {
@@ -181,5 +185,14 @@ private MemcachedNode getNextActiveSlaveNodeNoRotate() {
181185
public static String getGroupNameFromNode(final MemcachedNode node) {
182186
return ((ArcusReplNodeAddress) node.getSocketAddress()).getGroupName();
183187
}
188+
189+
public MemcachedNode getSlaveNodeBy(String address) {
190+
for (MemcachedNode node : this.getSlaveNodes()) {
191+
if (address.equals(((ArcusReplNodeAddress) node.getSocketAddress()).getIPPort())) {
192+
return node;
193+
}
194+
}
195+
return null;
196+
}
184197
}
185198
/* ENABLE_REPLICATION end */

0 commit comments

Comments
 (0)