Skip to content

Commit e595157

Browse files
authored
chore: add flag to force-disable multiplexed sessions (#3083)
Adds an environment variable that can be used to force-disable the use of multiplexed sessions.
1 parent b2795a7 commit e595157

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed

google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPoolOptions.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,11 @@ private SessionPoolOptions(Builder builder) {
105105
this.randomizePositionQPSThreshold = builder.randomizePositionQPSThreshold;
106106
this.inactiveTransactionRemovalOptions = builder.inactiveTransactionRemovalOptions;
107107
this.poolMaintainerClock = builder.poolMaintainerClock;
108-
this.useMultiplexedSession = builder.useMultiplexedSession;
108+
// TODO: Remove when multiplexed sessions are guaranteed to be supported.
109+
this.useMultiplexedSession =
110+
builder.useMultiplexedSession
111+
&& !Boolean.parseBoolean(
112+
System.getenv("GOOGLE_CLOUD_SPANNER_FORCE_DISABLE_MULTIPLEXED_SESSIONS"));
109113
this.useRandomChannelHint = builder.useRandomChannelHint;
110114
this.multiplexedSessionMaintenanceDuration = builder.multiplexedSessionMaintenanceDuration;
111115
}

google-cloud-spanner/src/test/java/com/google/cloud/spanner/MultiplexedSessionDatabaseClientTest.java

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,21 @@
1717
package com.google.cloud.spanner;
1818

1919
import static org.junit.Assert.assertEquals;
20+
import static org.junit.Assert.assertFalse;
21+
import static org.junit.Assert.assertTrue;
22+
import static org.junit.Assume.assumeFalse;
23+
import static org.junit.Assume.assumeTrue;
2024
import static org.mockito.ArgumentMatchers.any;
2125
import static org.mockito.Mockito.doAnswer;
2226
import static org.mockito.Mockito.mock;
2327
import static org.mockito.Mockito.when;
2428

2529
import com.google.cloud.spanner.SessionClient.SessionConsumer;
30+
import java.lang.reflect.Field;
2631
import java.time.Clock;
2732
import java.time.Duration;
2833
import java.time.Instant;
29-
import org.junit.Ignore;
34+
import java.util.Map;
3035
import org.junit.Test;
3136
import org.junit.runner.RunWith;
3237
import org.junit.runners.JUnit4;
@@ -35,9 +40,11 @@
3540
@RunWith(JUnit4.class)
3641
public class MultiplexedSessionDatabaseClientTest {
3742

38-
@Ignore("Fails on native builds due to ues of reflection")
3943
@Test
4044
public void testMaintainer() {
45+
// This fails for the native builds due to the extensive use of reflection.
46+
assumeTrue(isJava8());
47+
4148
Instant now = Instant.now();
4249
Clock clock = mock(Clock.class);
4350
when(clock.instant()).thenReturn(now);
@@ -101,4 +108,42 @@ public void testMaintainer() {
101108
client.getMaintainer().maintain();
102109
assertEquals(client.getCurrentSessionReference(), session2.getSessionReference());
103110
}
111+
112+
@Test
113+
public void testForceDisableEnvVar() throws Exception {
114+
assumeTrue(isJava8());
115+
assumeFalse(
116+
System.getenv().containsKey("GOOGLE_CLOUD_SPANNER_FORCE_DISABLE_MULTIPLEXED_SESSIONS"));
117+
118+
// Assert that the mux sessions setting is respected by default.
119+
assertTrue(
120+
SessionPoolOptions.newBuilder()
121+
.setUseMultiplexedSession(true)
122+
.build()
123+
.getUseMultiplexedSession());
124+
125+
Class<?> classOfMap = System.getenv().getClass();
126+
Field field = classOfMap.getDeclaredField("m");
127+
field.setAccessible(true);
128+
Map<String, String> writeableEnvironmentVariables =
129+
(Map<String, String>) field.get(System.getenv());
130+
131+
try {
132+
writeableEnvironmentVariables.put(
133+
"GOOGLE_CLOUD_SPANNER_FORCE_DISABLE_MULTIPLEXED_SESSIONS", "true");
134+
// Assert that the env var overrides the mux sessions setting.
135+
assertFalse(
136+
SessionPoolOptions.newBuilder()
137+
.setUseMultiplexedSession(true)
138+
.build()
139+
.getUseMultiplexedSession());
140+
} finally {
141+
writeableEnvironmentVariables.remove(
142+
"GOOGLE_CLOUD_SPANNER_FORCE_DISABLE_MULTIPLEXED_SESSIONS");
143+
}
144+
}
145+
146+
private boolean isJava8() {
147+
return JavaVersionUtil.getJavaMajorVersion() == 8;
148+
}
104149
}

0 commit comments

Comments
 (0)