[ 
https://issues.apache.org/jira/browse/CASSANDRA-11038?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15295807#comment-15295807
 ] 

Stefania commented on CASSANDRA-11038:
--------------------------------------

See this dtest [pull 
request|https://github.com/riptano/cassandra-dtest/pull/983] for fixing the 
behavior of the restart node tests in pushed_notifications_test.py. You may 
also want to add a new dtest to check that NEW_NODE and REMOVED_NODE are sent 
when a node joins or leaves respectively, I don't think we have a test specific 
for this at the moment.

> Is node being restarted treated as node joining?
> ------------------------------------------------
>
>                 Key: CASSANDRA-11038
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-11038
>             Project: Cassandra
>          Issue Type: Bug
>          Components: Distributed Metadata
>            Reporter: cheng ren
>            Assignee: Sam Tunnicliffe
>            Priority: Minor
>             Fix For: 2.2.x, 3.0.x, 3.x
>
>
> Hi, 
> What we found recently is that every time we restart a node, all other nodes 
> in the cluster treat the restarted node as a new node joining and issue node 
> joining notification to clients. We have traced the code path being hit when 
> a peer node detected a restarted node:
> src/java/org/apache/cassandra/gms/Gossiper.java
> {code}
>     private void handleMajorStateChange(InetAddress ep, EndpointState epState)
>     {
>         if (!isDeadState(epState))
>         {
>             if (endpointStateMap.get(ep) != null)
>                 logger.info("Node {} has restarted, now UP", ep);
>             else
>                 logger.info("Node {} is now part of the cluster", ep);
>         }
>         if (logger.isTraceEnabled())
>             logger.trace("Adding endpoint state for " + ep);
>         endpointStateMap.put(ep, epState);
>         // the node restarted: it is up to the subscriber to take whatever 
> action is necessary
>         for (IEndpointStateChangeSubscriber subscriber : subscribers)
>             subscriber.onRestart(ep, epState);
>         if (!isDeadState(epState))
>             markAlive(ep, epState);
>         else
>         {
>             logger.debug("Not marking " + ep + " alive due to dead state");
>             markDead(ep, epState);
>         }
>         for (IEndpointStateChangeSubscriber subscriber : subscribers)
>             subscriber.onJoin(ep, epState);
>     }
> {code}
> subscriber.onJoin(ep, epState) ends up with calling onJoinCluster in 
> Server.java
> {code}
> src/java/org/apache/cassandra/transport/Server.java
>         public void onJoinCluster(InetAddress endpoint)
>         {
> server.connectionTracker.send(Event.TopologyChange.newNode(getRpcAddress(endpoint),
>  server.socket.getPort()));
>         }
> {code}
> We have a full trace of code path and skip some intermedia function calls 
> here for being brief. 
> Upon receiving the node joining notification, clients would go and scan 
> system peer table to fetch the latest topology information. Since we have 
> tens of thousands of client connections, scans from all of them put an 
> enormous load to our cluster. 
> Although in the newer version of driver, client skips fetching peer table if 
> the new node has already existed in local metadata, we are still curious why 
> node being restarted is handled as node joining on server side? Did we hit a 
> bug or this is the way supposed to be? Our old java driver version is 1.0.4 
> and cassandra version is 2.0.12.
> Thanks!



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to