cassandra-pr mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jasobrown <...@git.apache.org>
Subject [GitHub] cassandra pull request #191: 13993
Date Wed, 14 Feb 2018 14:14:14 GMT
Github user jasobrown commented on a diff in the pull request:

    https://github.com/apache/cassandra/pull/191#discussion_r168185310
  
    --- Diff: src/java/org/apache/cassandra/net/MessagingService.java ---
    @@ -1664,4 +1676,113 @@ public static boolean isEncryptedConnection(InetAddressAndPort
address)
             }
             return true;
         }
    +
    +    public void blockForPeers()
    +    {
    +        // TODO make these yaml props?
    +        int alivePercent = Integer.getInteger(Config.PROPERTY_PREFIX + "blockForPeers.percent",
70);
    +        if (alivePercent < 0)
    +            alivePercent = 0;
    +        else if (alivePercent > 100)
    +            alivePercent = 100;
    +
    +        int aliveTimeoutSecs = Integer.getInteger(Config.PROPERTY_PREFIX + "blockForPeers.timeout_in_secs",
10);
    +        if (aliveTimeoutSecs < 0)
    +            aliveTimeoutSecs = 1;
    +        else if (aliveTimeoutSecs > 100)
    +            aliveTimeoutSecs = 100;
    +
    +        if (alivePercent > 0)
    +            blockForPeers(alivePercent, aliveTimeoutSecs);
    +    }
    +
    +    private void blockForPeers(int targetAlivePercent, int aliveTimeoutSecs)
    +    {
    +        // grab a snapshot of the current cluster from Gossiper. this is completely prone
to race conditions, but it's
    +        // good enough for the purposes of blocking until some certain percentage of
nodes are considered 'alive'/connected.
    +        Set<Map.Entry<InetAddressAndPort, EndpointState>> peers = new HashSet<>(Gossiper.instance.getEndpointStates());
    +
    +        // remove current node from the set
    +        peers = peers.stream()
    +                     .filter(entry -> !entry.getKey().equals(FBUtilities.getBroadcastAddressAndPort()))
    +                     .collect(Collectors.toSet());
    +
    +        final int totalSize = peers.size();
    +
    +        // don't block if there's no other nodes in the cluster (or we don't know about
them)
    +        if (totalSize <= 1)
    +            return;
    +
    +        logger.info("choosing to block until {}% of peers are marked alive; max time
to wait = {} seconds", targetAlivePercent, aliveTimeoutSecs);
    +
    +        // first, send out a ping message to open up the non-gossip connections
    +        AtomicInteger connectedCount = sendPingMessages(peers);
    --- End diff --
    
    I thought about that, as well. I can force a message to go out on the large message connection,
but the `REQUEST_RESPONSE` will come back on the small message connection. Unless, of course,
I send some empty byte array that exceeds the `OutboundMessagingPool#LARGE_MESSAGE_THRESHOLD`,
[which is currently 64k](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/net/async/OutboundMessagingPool.java#L47).
Admittedly, I'm reticent to do that. I could, however, create variant of the Ping/Pong messages
(or modify those) to switch between either large or small message connection.
    
    I guess the concern i had was that many apps might not need the large message connection,
and thus it becomes unused, but consumed, resources. Every instance will need the gossip and
small message connections, but not every use case calls for the large connections. wdyt?


---

---------------------------------------------------------------------
To unsubscribe, e-mail: pr-unsubscribe@cassandra.apache.org
For additional commands, e-mail: pr-help@cassandra.apache.org


Mime
View raw message