Skip to content

Commit d0a1e44

Browse files
chibenwaabsurdfarce
authored andcommitted
Limit calls to Conversions.resolveExecutionProfile
Those repeated calls account for a non-negligible portion of my application CPU (0.6%) and can definitly be a final field so that it gets resolved only once per CqlRequestHandler. patch by Benoit Tellier; reviewed by Andy Tolbert, and Bret McGuire reference: #1623
1 parent 85bb406 commit d0a1e44

File tree

5 files changed

+75
-58
lines changed

5 files changed

+75
-58
lines changed

core/src/main/java/com/datastax/dse/driver/internal/core/cql/continuous/ContinuousRequestHandlerBase.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -648,12 +648,13 @@ public void operationComplete(@NonNull Future<java.lang.Void> future) {
648648
}
649649
} else {
650650
LOG.trace("[{}] Request sent on {}", logPrefix, channel);
651-
if (scheduleSpeculativeExecution && Conversions.resolveIdempotence(statement, context)) {
651+
if (scheduleSpeculativeExecution
652+
&& Conversions.resolveIdempotence(statement, executionProfile)) {
652653
int nextExecution = executionIndex + 1;
653654
// Note that `node` is the first node of the execution, it might not be the "slow" one
654655
// if there were retries, but in practice retries are rare.
655656
long nextDelay =
656-
Conversions.resolveSpeculativeExecutionPolicy(statement, context)
657+
Conversions.resolveSpeculativeExecutionPolicy(context, executionProfile)
657658
.nextExecution(node, keyspace, statement, nextExecution);
658659
if (nextDelay >= 0) {
659660
scheduleSpeculativeExecution(nextExecution, nextDelay);
@@ -787,12 +788,12 @@ public void onFailure(@NonNull Throwable error) {
787788
cancelTimeout(pageTimeout);
788789
LOG.trace(String.format("[%s] Request failure", logPrefix), error);
789790
RetryVerdict verdict;
790-
if (!Conversions.resolveIdempotence(statement, context)
791+
if (!Conversions.resolveIdempotence(statement, executionProfile)
791792
|| error instanceof FrameTooLongException) {
792793
verdict = RetryVerdict.RETHROW;
793794
} else {
794795
try {
795-
RetryPolicy retryPolicy = Conversions.resolveRetryPolicy(statement, context);
796+
RetryPolicy retryPolicy = Conversions.resolveRetryPolicy(context, executionProfile);
796797
verdict = retryPolicy.onRequestAbortedVerdict(statement, error, retryCount);
797798
} catch (Throwable cause) {
798799
abort(
@@ -945,7 +946,7 @@ private void processRecoverableError(@NonNull CoordinatorException error) {
945946
assert lock.isHeldByCurrentThread();
946947
NodeMetricUpdater metricUpdater = ((DefaultNode) node).getMetricUpdater();
947948
RetryVerdict verdict;
948-
RetryPolicy retryPolicy = Conversions.resolveRetryPolicy(statement, context);
949+
RetryPolicy retryPolicy = Conversions.resolveRetryPolicy(context, executionProfile);
949950
if (error instanceof ReadTimeoutException) {
950951
ReadTimeoutException readTimeout = (ReadTimeoutException) error;
951952
verdict =
@@ -964,7 +965,7 @@ private void processRecoverableError(@NonNull CoordinatorException error) {
964965
DefaultNodeMetric.IGNORES_ON_READ_TIMEOUT);
965966
} else if (error instanceof WriteTimeoutException) {
966967
WriteTimeoutException writeTimeout = (WriteTimeoutException) error;
967-
if (Conversions.resolveIdempotence(statement, context)) {
968+
if (Conversions.resolveIdempotence(statement, executionProfile)) {
968969
verdict =
969970
retryPolicy.onWriteTimeoutVerdict(
970971
statement,
@@ -999,7 +1000,7 @@ private void processRecoverableError(@NonNull CoordinatorException error) {
9991000
DefaultNodeMetric.IGNORES_ON_UNAVAILABLE);
10001001
} else {
10011002
verdict =
1002-
Conversions.resolveIdempotence(statement, context)
1003+
Conversions.resolveIdempotence(statement, executionProfile)
10031004
? retryPolicy.onErrorResponseVerdict(statement, error, retryCount)
10041005
: RetryVerdict.RETHROW;
10051006
updateErrorMetrics(

core/src/main/java/com/datastax/dse/driver/internal/core/graph/GraphRequestHandler.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -557,12 +557,13 @@ public void operationComplete(Future<java.lang.Void> future) {
557557
cancel();
558558
} else {
559559
inFlightCallbacks.add(this);
560-
if (scheduleNextExecution && Conversions.resolveIdempotence(statement, context)) {
560+
if (scheduleNextExecution
561+
&& Conversions.resolveIdempotence(statement, executionProfile)) {
561562
int nextExecution = execution + 1;
562563
long nextDelay;
563564
try {
564565
nextDelay =
565-
Conversions.resolveSpeculativeExecutionPolicy(statement, context)
566+
Conversions.resolveSpeculativeExecutionPolicy(context, executionProfile)
566567
.nextExecution(node, null, statement, nextExecution);
567568
} catch (Throwable cause) {
568569
// This is a bug in the policy, but not fatal since we have at least one other
@@ -678,7 +679,7 @@ private void processErrorResponse(Error errorMessage) {
678679
trackNodeError(node, error, NANOTIME_NOT_MEASURED_YET);
679680
setFinalError(statement, error, node, execution);
680681
} else {
681-
RetryPolicy retryPolicy = Conversions.resolveRetryPolicy(statement, context);
682+
RetryPolicy retryPolicy = Conversions.resolveRetryPolicy(context, executionProfile);
682683
RetryVerdict verdict;
683684
if (error instanceof ReadTimeoutException) {
684685
ReadTimeoutException readTimeout = (ReadTimeoutException) error;
@@ -699,7 +700,7 @@ private void processErrorResponse(Error errorMessage) {
699700
} else if (error instanceof WriteTimeoutException) {
700701
WriteTimeoutException writeTimeout = (WriteTimeoutException) error;
701702
verdict =
702-
Conversions.resolveIdempotence(statement, context)
703+
Conversions.resolveIdempotence(statement, executionProfile)
703704
? retryPolicy.onWriteTimeoutVerdict(
704705
statement,
705706
writeTimeout.getConsistencyLevel(),
@@ -731,7 +732,7 @@ private void processErrorResponse(Error errorMessage) {
731732
DefaultNodeMetric.IGNORES_ON_UNAVAILABLE);
732733
} else {
733734
verdict =
734-
Conversions.resolveIdempotence(statement, context)
735+
Conversions.resolveIdempotence(statement, executionProfile)
735736
? retryPolicy.onErrorResponseVerdict(statement, error, retryCount)
736737
: RetryVerdict.RETHROW;
737738
updateErrorMetrics(
@@ -810,12 +811,12 @@ public void onFailure(Throwable error) {
810811
}
811812
LOG.trace("[{}] Request failure, processing: {}", logPrefix, error);
812813
RetryVerdict verdict;
813-
if (!Conversions.resolveIdempotence(statement, context)
814+
if (!Conversions.resolveIdempotence(statement, executionProfile)
814815
|| error instanceof FrameTooLongException) {
815816
verdict = RetryVerdict.RETHROW;
816817
} else {
817818
try {
818-
RetryPolicy retryPolicy = Conversions.resolveRetryPolicy(statement, context);
819+
RetryPolicy retryPolicy = Conversions.resolveRetryPolicy(context, executionProfile);
819820
verdict = retryPolicy.onRequestAbortedVerdict(statement, error, retryCount);
820821
} catch (Throwable cause) {
821822
setFinalError(

core/src/main/java/com/datastax/oss/driver/internal/core/cql/Conversions.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -535,29 +535,59 @@ public static CoordinatorException toThrowable(
535535
}
536536
}
537537

538+
/** Use {@link #resolveIdempotence(Request, DriverExecutionProfile)} instead. */
539+
@Deprecated
538540
public static boolean resolveIdempotence(Request request, InternalDriverContext context) {
541+
return resolveIdempotence(request, resolveExecutionProfile(request, context));
542+
}
543+
544+
public static boolean resolveIdempotence(
545+
Request request, DriverExecutionProfile executionProfile) {
539546
Boolean requestIsIdempotent = request.isIdempotent();
540-
DriverExecutionProfile executionProfile = resolveExecutionProfile(request, context);
541547
return (requestIsIdempotent == null)
542548
? executionProfile.getBoolean(DefaultDriverOption.REQUEST_DEFAULT_IDEMPOTENCE)
543549
: requestIsIdempotent;
544550
}
545551

552+
/** Use {@link #resolveRequestTimeout(Request, DriverExecutionProfile)} instead. */
553+
@Deprecated
546554
public static Duration resolveRequestTimeout(Request request, InternalDriverContext context) {
547-
DriverExecutionProfile executionProfile = resolveExecutionProfile(request, context);
548-
return request.getTimeout() != null
549-
? request.getTimeout()
555+
return resolveRequestTimeout(request, resolveExecutionProfile(request, context));
556+
}
557+
558+
public static Duration resolveRequestTimeout(
559+
Request request, DriverExecutionProfile executionProfile) {
560+
Duration timeout = request.getTimeout();
561+
return timeout != null
562+
? timeout
550563
: executionProfile.getDuration(DefaultDriverOption.REQUEST_TIMEOUT);
551564
}
552565

566+
/** Use {@link #resolveRetryPolicy(InternalDriverContext, DriverExecutionProfile)} instead. */
567+
@Deprecated
553568
public static RetryPolicy resolveRetryPolicy(Request request, InternalDriverContext context) {
554569
DriverExecutionProfile executionProfile = resolveExecutionProfile(request, context);
555570
return context.getRetryPolicy(executionProfile.getName());
556571
}
557572

573+
public static RetryPolicy resolveRetryPolicy(
574+
InternalDriverContext context, DriverExecutionProfile executionProfile) {
575+
return context.getRetryPolicy(executionProfile.getName());
576+
}
577+
578+
/**
579+
* Use {@link #resolveSpeculativeExecutionPolicy(InternalDriverContext, DriverExecutionProfile)}
580+
* instead.
581+
*/
582+
@Deprecated
558583
public static SpeculativeExecutionPolicy resolveSpeculativeExecutionPolicy(
559584
Request request, InternalDriverContext context) {
560585
DriverExecutionProfile executionProfile = resolveExecutionProfile(request, context);
561586
return context.getSpeculativeExecutionPolicy(executionProfile.getName());
562587
}
588+
589+
public static SpeculativeExecutionPolicy resolveSpeculativeExecutionPolicy(
590+
InternalDriverContext context, DriverExecutionProfile executionProfile) {
591+
return context.getSpeculativeExecutionPolicy(executionProfile.getName());
592+
}
563593
}

core/src/main/java/com/datastax/oss/driver/internal/core/cql/CqlPrepareHandler.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ public class CqlPrepareHandler implements Throttled {
9292
private final Timeout scheduledTimeout;
9393
private final RequestThrottler throttler;
9494
private final Boolean prepareOnAllNodes;
95+
private final DriverExecutionProfile executionProfile;
9596
private volatile InitialPrepareCallback initialCallback;
9697

9798
// The errors on the nodes that were already tried (lazily initialized on the first error).
@@ -111,7 +112,7 @@ protected CqlPrepareHandler(
111112
this.initialRequest = request;
112113
this.session = session;
113114
this.context = context;
114-
DriverExecutionProfile executionProfile = Conversions.resolveExecutionProfile(request, context);
115+
executionProfile = Conversions.resolveExecutionProfile(request, context);
115116
this.queryPlan =
116117
context
117118
.getLoadBalancingPolicyWrapper()
@@ -131,7 +132,7 @@ protected CqlPrepareHandler(
131132
});
132133
this.timer = context.getNettyOptions().getTimer();
133134

134-
Duration timeout = Conversions.resolveRequestTimeout(request, context);
135+
Duration timeout = Conversions.resolveRequestTimeout(request, executionProfile);
135136
this.scheduledTimeout = scheduleTimeout(timeout);
136137
this.prepareOnAllNodes = executionProfile.getBoolean(DefaultDriverOption.PREPARE_ON_ALL_NODES);
137138

@@ -292,7 +293,7 @@ private CompletionStage<Void> prepareOnOtherNode(PrepareRequest request, Node no
292293
false,
293294
toPrepareMessage(request),
294295
request.getCustomPayload(),
295-
Conversions.resolveRequestTimeout(request, context),
296+
Conversions.resolveRequestTimeout(request, executionProfile),
296297
throttler,
297298
session.getMetricUpdater(),
298299
logPrefix);
@@ -419,7 +420,7 @@ private void processErrorResponse(Error errorMessage) {
419420
} else {
420421
// Because prepare requests are known to always be idempotent, we call the retry policy
421422
// directly, without checking the flag.
422-
RetryPolicy retryPolicy = Conversions.resolveRetryPolicy(request, context);
423+
RetryPolicy retryPolicy = Conversions.resolveRetryPolicy(context, executionProfile);
423424
RetryVerdict verdict = retryPolicy.onErrorResponseVerdict(request, error, retryCount);
424425
processRetryVerdict(verdict, error);
425426
}
@@ -457,7 +458,7 @@ public void onFailure(Throwable error) {
457458
LOG.trace("[{}] Request failure, processing: {}", logPrefix, error.toString());
458459
RetryVerdict verdict;
459460
try {
460-
RetryPolicy retryPolicy = Conversions.resolveRetryPolicy(request, context);
461+
RetryPolicy retryPolicy = Conversions.resolveRetryPolicy(context, executionProfile);
461462
verdict = retryPolicy.onRequestAbortedVerdict(request, error, retryCount);
462463
} catch (Throwable cause) {
463464
setFinalError(

0 commit comments

Comments
 (0)