Skip to content

Commit 4f22bd6

Browse files
committed
CancellationIT use strong values cache without cache removal callback
1 parent c0d2f74 commit 4f22bd6

File tree

2 files changed

+77
-1
lines changed

2 files changed

+77
-1
lines changed

integration-tests/src/test/java/com/datastax/oss/driver/core/cql/PreparedStatementCachingIT.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ private static RemovalListener<Object, Object> buildCacheRemoveCallback(
136136
public TestCqlPrepareAsyncProcessor(@NonNull Optional<DefaultDriverContext> context) {
137137
// Default CqlPrepareAsyncProcessor uses weak values here as well. We avoid doing so
138138
// to prevent cache entries from unexpectedly disappearing mid-test.
139-
// TODO: it was still weak value cuz it's only a decorator.
140139
super(context, CacheBuilder.newBuilder().removalListener(buildCacheRemoveCallback(context)));
141140
}
142141
}

integration-tests/src/test/java/com/datastax/oss/driver/core/cql/PreparedStatementCancellationIT.java

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,34 @@
2121
import static org.junit.Assert.fail;
2222

2323
import com.datastax.oss.driver.api.core.CqlSession;
24+
import com.datastax.oss.driver.api.core.config.DriverConfigLoader;
25+
import com.datastax.oss.driver.api.core.context.DriverContext;
2426
import com.datastax.oss.driver.api.core.cql.PrepareRequest;
2527
import com.datastax.oss.driver.api.core.cql.PreparedStatement;
28+
import com.datastax.oss.driver.api.core.session.ProgrammaticArguments;
29+
import com.datastax.oss.driver.api.core.session.SessionBuilder;
2630
import com.datastax.oss.driver.api.testinfra.ccm.CustomCcmRule;
2731
import com.datastax.oss.driver.api.testinfra.session.SessionRule;
2832
import com.datastax.oss.driver.api.testinfra.session.SessionUtils;
2933
import com.datastax.oss.driver.categories.IsolatedTests;
3034
import com.datastax.oss.driver.internal.core.context.DefaultDriverContext;
3135
import com.datastax.oss.driver.internal.core.cql.CqlPrepareAsyncProcessor;
36+
import com.datastax.oss.driver.internal.core.cql.CqlPrepareSyncProcessor;
37+
import com.datastax.oss.driver.internal.core.session.BuiltInRequestProcessors;
38+
import com.datastax.oss.driver.internal.core.session.RequestProcessor;
39+
import com.datastax.oss.driver.internal.core.session.RequestProcessorRegistry;
3240
import com.datastax.oss.driver.shaded.guava.common.base.Predicates;
3341
import com.datastax.oss.driver.shaded.guava.common.cache.Cache;
42+
import com.datastax.oss.driver.shaded.guava.common.cache.CacheBuilder;
3443
import com.datastax.oss.driver.shaded.guava.common.collect.Iterables;
44+
import edu.umd.cs.findbugs.annotations.NonNull;
45+
import java.util.List;
46+
import java.util.Optional;
3547
import java.util.concurrent.CompletableFuture;
3648
import org.junit.After;
49+
import org.junit.AfterClass;
3750
import org.junit.Before;
51+
import org.junit.BeforeClass;
3852
import org.junit.Rule;
3953
import org.junit.Test;
4054
import org.junit.experimental.categories.Category;
@@ -50,6 +64,69 @@ public class PreparedStatementCancellationIT {
5064

5165
@Rule public TestRule chain = RuleChain.outerRule(ccmRule).around(sessionRule);
5266

67+
private static class TestCqlPrepareAsyncProcessor extends CqlPrepareAsyncProcessor {
68+
69+
public TestCqlPrepareAsyncProcessor(@NonNull Optional<DefaultDriverContext> context) {
70+
// Default CqlPrepareAsyncProcessor uses weak values here as well. We avoid doing so
71+
// to prevent cache entries from unexpectedly disappearing mid-test.
72+
super(context, CacheBuilder.newBuilder());
73+
}
74+
}
75+
76+
private static class TestDefaultDriverContext extends DefaultDriverContext {
77+
public TestDefaultDriverContext(
78+
DriverConfigLoader configLoader, ProgrammaticArguments programmaticArguments) {
79+
super(configLoader, programmaticArguments);
80+
}
81+
82+
@Override
83+
protected RequestProcessorRegistry buildRequestProcessorRegistry() {
84+
// Re-create the processor cache to insert the TestCqlPrepareAsyncProcessor with it's strong
85+
// prepared statement cache, see JAVA-3062
86+
List<RequestProcessor<?, ?>> processors =
87+
BuiltInRequestProcessors.createDefaultProcessors(this);
88+
processors.removeIf((processor) -> processor instanceof CqlPrepareAsyncProcessor);
89+
processors.removeIf((processor) -> processor instanceof CqlPrepareSyncProcessor);
90+
CqlPrepareAsyncProcessor asyncProcessor =
91+
new PreparedStatementCancellationIT.TestCqlPrepareAsyncProcessor(Optional.of(this));
92+
processors.add(2, asyncProcessor);
93+
processors.add(3, new CqlPrepareSyncProcessor(asyncProcessor));
94+
return new RequestProcessorRegistry(
95+
getSessionName(), processors.toArray(new RequestProcessor[0]));
96+
}
97+
}
98+
99+
private static class TestSessionBuilder extends SessionBuilder {
100+
101+
@Override
102+
protected Object wrap(@NonNull CqlSession defaultSession) {
103+
return defaultSession;
104+
}
105+
106+
@Override
107+
protected DriverContext buildContext(
108+
DriverConfigLoader configLoader, ProgrammaticArguments programmaticArguments) {
109+
return new PreparedStatementCancellationIT.TestDefaultDriverContext(
110+
configLoader, programmaticArguments);
111+
}
112+
}
113+
114+
@BeforeClass
115+
public static void setupBeforeClass() {
116+
System.setProperty(
117+
SessionUtils.SESSION_BUILDER_CLASS_PROPERTY,
118+
PreparedStatementCancellationIT.class.getName());
119+
}
120+
121+
@AfterClass
122+
public static void teardownAfterClass() {
123+
System.clearProperty(SessionUtils.SESSION_BUILDER_CLASS_PROPERTY);
124+
}
125+
126+
public static SessionBuilder builder() {
127+
return new PreparedStatementCancellationIT.TestSessionBuilder();
128+
}
129+
53130
@Before
54131
public void setup() {
55132

0 commit comments

Comments
 (0)