@@ -42,6 +42,7 @@ public class ArcusKetamaNodeLocator extends SpyObject implements NodeLocator {
42
42
43
43
private final TreeMap <Long , SortedSet <MemcachedNode >> ketamaNodes ;
44
44
private final Collection <MemcachedNode > allNodes ;
45
+ private final Collection <MemcachedNode > delayedClosingNodes = new HashSet <MemcachedNode >();
45
46
46
47
/* ENABLE_MIGRATION if */
47
48
private TreeMap <Long , SortedSet <MemcachedNode >> ketamaAlterNodes ;
@@ -226,6 +227,10 @@ public void update(Collection<MemcachedNode> toAttach,
226
227
for (MemcachedNode node : toDelete ) {
227
228
allNodes .remove (node );
228
229
removeHash (node );
230
+ if (node .hasOp ()) {
231
+ delayedClosingNodes .add (node );
232
+ continue ;
233
+ }
229
234
try {
230
235
node .closeChannel ();
231
236
} catch (IOException e ) {
@@ -244,6 +249,14 @@ public void update(Collection<MemcachedNode> toAttach,
244
249
}
245
250
}
246
251
252
+ public Collection <MemcachedNode > getDelayedClosingNodes () {
253
+ return Collections .unmodifiableCollection (delayedClosingNodes );
254
+ }
255
+
256
+ public void updateDelayedClosingNodes (Collection <MemcachedNode > closedNodes ) {
257
+ delayedClosingNodes .removeAll (closedNodes );
258
+ }
259
+
247
260
private Long getKetamaHashPoint (byte [] digest , int h ) {
248
261
return ((long ) (digest [3 + h * 4 ] & 0xFF ) << 24 )
249
262
| ((long ) (digest [2 + h * 4 ] & 0xFF ) << 16 )
@@ -440,6 +453,10 @@ public void updateAlter(Collection<MemcachedNode> toAttach,
440
453
for (MemcachedNode node : toDelete ) {
441
454
alterNodes .remove (node );
442
455
removeHashOfAlter (node );
456
+ if (node .hasOp ()) {
457
+ delayedClosingNodes .add (node );
458
+ continue ;
459
+ }
443
460
try {
444
461
node .closeChannel ();
445
462
} catch (IOException e ) {
0 commit comments