Github user belliottsmith commented on a diff in the pull request:

    https://github.com/apache/cassandra/pull/267#discussion_r219138039
  
    --- Diff: src/java/org/apache/cassandra/locator/ReplicaPlans.java ---
    @@ -61,26 +73,62 @@
             return forSingleReplicaWrite(keyspace, token, replica);
         }
     
    +    public static ReplicaPlan.ForTokenWrite forLocalBatchlogWrite()
    +    {
    +        Token token = 
DatabaseDescriptor.getPartitioner().getMinimumToken();
    +        Keyspace systemKeypsace = 
Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME);
    +        Replica localSystemReplica = 
SystemReplicas.getSystemReplica(FBUtilities.getBroadcastAddressAndPort());
    +
    +        ReplicaLayout.ForTokenWrite liveAndDown = 
ReplicaLayout.forTokenWrite(
    +        EndpointsForToken.of(token, localSystemReplica),
    +        EndpointsForToken.empty(token)
    +        );
    +
    +        return forWrite(systemKeypsace, ConsistencyLevel.ONE, liveAndDown, 
liveAndDown, writeAll);
    +    }
    +
         /**
          * Requires that the provided endpoints are alive.  Converts them to 
their relevant system replicas.
          * Note that the liveAndDown collection and live are equal to the 
provided endpoints.
    -     *
    -     * The semantics are a bit weird, in that CL=ONE iff we have one node 
provided, and otherwise is equal to TWO.
    -     * How these CL were chosen, and why we drop the CL if only one live 
node is available, are both unclear.
          */
    -    public static ReplicaPlan.ForTokenWrite forBatchlogWrite(Keyspace 
keyspace, Collection<InetAddressAndPort> endpoints) throws UnavailableException
    +    public static ReplicaPlan.ForTokenWrite forBatchlogWrite(String 
localDataCenter, ConsistencyLevel consistencyLevel) throws UnavailableException
         {
             // A single case we write not for range or token, but multiple 
mutations to many tokens
             Token token = 
DatabaseDescriptor.getPartitioner().getMinimumToken();
     
    +        TokenMetadata.Topology topology = 
StorageService.instance.getTokenMetadata().cachedOnlyTokenMap().getTopology();
    +        Multimap<String, InetAddressAndPort> localEndpoints = 
HashMultimap.create(topology.getDatacenterRacks().get(localDataCenter));
    +        String localRack = 
DatabaseDescriptor.getEndpointSnitch().getRack(FBUtilities.getBroadcastAddressAndPort());
    +
    +        // Replicas are picked manually:
    +        //  - replicas should be alive according to the failure detector
    +        //  - replicas should be in the local datacenter
    +        //  - choose min(2, number of qualifying candiates above)
    +        //  - allow the local node to be the only replica only if it's a 
single-node DC
    +        Collection<InetAddressAndPort> chosenEndpoints = new 
BatchlogManager.EndpointFilter(localRack, localEndpoints).filter();
    --- End diff --
    
    I don't love it either, but it should live together.  Perhaps we can clean 
it up, and we can certainly at least make it a static method instead of a class.


---

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

Reply via email to