Github user ifesdjeen commented on a diff in the pull request:
https://github.com/apache/cassandra/pull/267#discussion_r219137653
--- 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 wanted to, but it's also fairly large, so wanted to avoid polluting it.
If you think it's a good idea, i can definitely do it.
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]