From d90c5a40d17fe78eb51bd8c7ef885cc8332afc85 Mon Sep 17 00:00:00 2001 From: Dmitry Kropachev Date: Sun, 6 Apr 2025 23:51:22 -0400 Subject: [PATCH] Fix BasicLoadBalancingPolicy.getReplica empty partitioner Queries getting paritioner set either from user, or when statement is being built against cdc tablet. In other cases statement does not get any partitioner. For proper tablet routing driver needs to calculate token from the key, which needs partitioner, if partitioner is not present driver returns empty replica list. This fix is rather quick-fix. Implementing proper solution that will help with CDC+tablets case, is scheduled at https://github.com/scylladb/java-driver/issues/502 --- .../com/datastax/oss/driver/api/core/metadata/TokenMap.java | 4 ++++ .../core/loadbalancing/BasicLoadBalancingPolicy.java | 3 +++ .../internal/core/metadata/token/DefaultTokenMap.java | 6 ++++++ 3 files changed, 13 insertions(+) diff --git a/core/src/main/java/com/datastax/oss/driver/api/core/metadata/TokenMap.java b/core/src/main/java/com/datastax/oss/driver/api/core/metadata/TokenMap.java index 9f41b9319e8..dcc73961098 100644 --- a/core/src/main/java/com/datastax/oss/driver/api/core/metadata/TokenMap.java +++ b/core/src/main/java/com/datastax/oss/driver/api/core/metadata/TokenMap.java @@ -189,4 +189,8 @@ default Set getReplicas(@NonNull String keyspaceName, @NonNull TokenRange /** The name of the partitioner class in use, as reported by the Cassandra nodes. */ @NonNull String getPartitionerName(); + + /** The partitioner class in use, as reported by the Cassandra nodes. */ + @NonNull + Partitioner getPartitioner(); } diff --git a/core/src/main/java/com/datastax/oss/driver/internal/core/loadbalancing/BasicLoadBalancingPolicy.java b/core/src/main/java/com/datastax/oss/driver/internal/core/loadbalancing/BasicLoadBalancingPolicy.java index d097425026b..e5547db8770 100644 --- a/core/src/main/java/com/datastax/oss/driver/internal/core/loadbalancing/BasicLoadBalancingPolicy.java +++ b/core/src/main/java/com/datastax/oss/driver/internal/core/loadbalancing/BasicLoadBalancingPolicy.java @@ -333,6 +333,9 @@ protected Set getReplicas(@Nullable Request request, @Nullable Session ses } partitioner = request.getPartitioner(); + if (partitioner == null && maybeTokenMap.isPresent()) { + partitioner = maybeTokenMap.get().getPartitioner(); + } } catch (Exception e) { // Protect against poorly-implemented Request instances LOG.error("Unexpected error while trying to compute query plan", e); diff --git a/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/token/DefaultTokenMap.java b/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/token/DefaultTokenMap.java index 26c223b182a..b9f752a7bca 100644 --- a/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/token/DefaultTokenMap.java +++ b/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/token/DefaultTokenMap.java @@ -207,6 +207,12 @@ public String getPartitionerName() { return tokenFactory.getPartitionerName(); } + @NonNull + @Override + public Partitioner getPartitioner() { + return tokenFactory; + } + private KeyspaceTokenMap getKeyspaceMap(CqlIdentifier keyspace) { Map config = replicationConfigs.get(keyspace); return (config == null) ? null : keyspaceMaps.get(config);