jam2in / arcus-java-client

Arcus Java client
Apache License 2.0
0 stars 0 forks source link

updateConnection()에서의 cancel 처리 질문 #26

Closed jhpark816 closed 4 years ago

jhpark816 commented 8 years ago

replication 기능이 없는 경우의 updateConnection() 코드입니다.

Remove할 node에 있던 operations들에 대해 모두 cancel 처리를 해 줘야 할 것 같은데, reading state에 있는 operations에 대해서는 cancel 처리 하지 않고 있습니다..

응용에서 operation timeout으로 cancel하는 것이 대부분이겠지만, 응용에서 무한히 대기하는 경우도 있을 수 있으므로, 이 부분에서 cancel 처리하는 것이 맞지 않나요 ??

        for (MemcachedNode node : locator.getAll()) {
            if (addrs.contains((InetSocketAddress) node.getSocketAddress())) {
                addrs.remove((InetSocketAddress) node.getSocketAddress());
            } else {
                removeNodes.add(node);
            }
        }

        // Make connections to the newly added nodes.
        for (SocketAddress sa : addrs) {
            attachNodes.add(attachMemcachedNode(sa));
        }

        // Update the hash.
        locator.update(attachNodes, removeNodes);

        // Remove unavailable nodes in the reconnect queue.
        for (MemcachedNode node : removeNodes) {
            getLogger().info("old memcached node removed %s", node);
            for (Entry<Long, MemcachedNode> each : reconnectQueue.entrySet()) {
                if (node.equals(each.getValue())) {
                    reconnectQueue.remove(each.getKey());
                    break;
                }
            }
            String cause = "node removed.";
            if (failureMode == FailureMode.Cancel) {
                cancelOperations(node.destroyWriteQueue(false), cause);
                cancelOperations(node.destroyInputQueue(), cause);
            } else if (failureMode == FailureMode.Redistribute || failureMode == FailureMode.Retry) {
                redistributeOperations(node.destroyWriteQueue(true), cause);
                redistributeOperations(node.destroyInputQueue(), cause);
            }
        }
whchoi83 commented 8 years ago

https://github.com/jam2in/arcus-task/issues/37

이 이슈를 통해서 처리했던 문제이네요. 코드의 이해 부족 혹은 특정 이유로 reading state 의 oepration 은 처리하지 않은 것 같습니다.

히스토리도 제법 되고, 이슈 처리한 시간이 꽤 되어서 기억이 잘 나지 않습니다. 천천히 다시 읽어보고 처리하도록 하겠습니다.

더불어서 이런 경우를 대비하여, 앞으로는 이슈와 commit 은 반드시 연결했으면 좋겠습니다. blame 로 처리된 내용 찾은 후 이슈를 한참 뒤져보고서야 찾아냈네요.