Skip to content

Commit d4c46a7

Browse files
authored
refactor: prevents global stats config freeze in ConfiguratorRegistry.getConfigurators() (#11991)
1 parent c8d1e6e commit d4c46a7

File tree

5 files changed

+30
-26
lines changed

5 files changed

+30
-26
lines changed

api/src/main/java/io/grpc/ConfiguratorRegistry.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ final class ConfiguratorRegistry {
3333
@GuardedBy("this")
3434
private boolean wasConfiguratorsSet;
3535
@GuardedBy("this")
36-
private boolean configFrozen;
37-
@GuardedBy("this")
3836
private List<Configurator> configurators = Collections.emptyList();
37+
@GuardedBy("this")
38+
private int configuratorsCallCountBeforeSet = 0;
3939

4040
ConfiguratorRegistry() {}
4141

@@ -56,22 +56,31 @@ public static synchronized ConfiguratorRegistry getDefaultRegistry() {
5656
* @throws IllegalStateException if this method is called more than once
5757
*/
5858
public synchronized void setConfigurators(List<? extends Configurator> configurators) {
59-
if (configFrozen) {
59+
if (wasConfiguratorsSet) {
6060
throw new IllegalStateException("Configurators are already set");
6161
}
6262
this.configurators = Collections.unmodifiableList(new ArrayList<>(configurators));
63-
configFrozen = true;
6463
wasConfiguratorsSet = true;
6564
}
6665

6766
/**
6867
* Returns a list of the configurators in this registry.
6968
*/
7069
public synchronized List<Configurator> getConfigurators() {
71-
configFrozen = true;
70+
if (!wasConfiguratorsSet) {
71+
configuratorsCallCountBeforeSet++;
72+
}
7273
return configurators;
7374
}
7475

76+
/**
77+
* Returns the number of times getConfigurators() was called before
78+
* setConfigurators() was successfully invoked.
79+
*/
80+
public synchronized int getConfiguratorsCallCountBeforeSet() {
81+
return configuratorsCallCountBeforeSet;
82+
}
83+
7584
public synchronized boolean wasSetConfiguratorsCalled() {
7685
return wasConfiguratorsSet;
7786
}

api/src/main/java/io/grpc/InternalConfiguratorRegistry.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,8 @@ public static void configureServerBuilder(ServerBuilder<?> serverBuilder) {
4848
public static boolean wasSetConfiguratorsCalled() {
4949
return ConfiguratorRegistry.getDefaultRegistry().wasSetConfiguratorsCalled();
5050
}
51+
52+
public static int getConfiguratorsCallCountBeforeSet() {
53+
return ConfiguratorRegistry.getDefaultRegistry().getConfiguratorsCallCountBeforeSet();
54+
}
5155
}

api/src/test/java/io/grpc/ConfiguratorRegistryTest.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,12 @@ public static final class StaticTestingClassLoaderGetBeforeSet implements Runnab
8585
@Override
8686
public void run() {
8787
assertThat(ConfiguratorRegistry.getDefaultRegistry().getConfigurators()).isEmpty();
88-
89-
try {
90-
ConfiguratorRegistry.getDefaultRegistry()
91-
.setConfigurators(Arrays.asList(new NoopConfigurator()));
92-
fail("should have failed for invoking set call after get is already called");
93-
} catch (IllegalStateException e) {
94-
assertThat(e).hasMessageThat().isEqualTo("Configurators are already set");
95-
}
88+
NoopConfigurator noopConfigurator = new NoopConfigurator();
89+
ConfiguratorRegistry.getDefaultRegistry()
90+
.setConfigurators(Arrays.asList(noopConfigurator));
91+
assertThat(ConfiguratorRegistry.getDefaultRegistry().getConfigurators())
92+
.containsExactly(noopConfigurator);
93+
assertThat(InternalConfiguratorRegistry.getConfiguratorsCallCountBeforeSet()).isEqualTo(1);
9694
}
9795
}
9896

core/src/test/java/io/grpc/internal/ManagedChannelImplBuilderTest.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -529,12 +529,9 @@ public void run() {
529529
List<ClientInterceptor> effectiveInterceptors =
530530
builder.getEffectiveInterceptors("unused:///");
531531
assertThat(effectiveInterceptors).hasSize(2);
532-
try {
533-
InternalConfiguratorRegistry.setConfigurators(Collections.emptyList());
534-
fail("exception expected");
535-
} catch (IllegalStateException e) {
536-
assertThat(e).hasMessageThat().contains("Configurators are already set");
537-
}
532+
InternalConfiguratorRegistry.setConfigurators(Collections.emptyList());
533+
assertThat(InternalConfiguratorRegistry.getConfigurators()).isEmpty();
534+
assertThat(InternalConfiguratorRegistry.getConfiguratorsCallCountBeforeSet()).isEqualTo(1);
538535
}
539536
}
540537

core/src/test/java/io/grpc/internal/ServerImplBuilderTest.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
import static com.google.common.truth.Truth.assertThat;
2020
import static org.junit.Assert.assertEquals;
21-
import static org.junit.Assert.fail;
2221

2322
import io.grpc.InternalConfigurator;
2423
import io.grpc.InternalConfiguratorRegistry;
@@ -145,12 +144,9 @@ public void run() {
145144
});
146145
assertThat(builder.getTracerFactories()).hasSize(2);
147146
assertThat(builder.interceptors).hasSize(0);
148-
try {
149-
InternalConfiguratorRegistry.setConfigurators(Collections.emptyList());
150-
fail("exception expected");
151-
} catch (IllegalStateException e) {
152-
assertThat(e).hasMessageThat().contains("Configurators are already set");
153-
}
147+
InternalConfiguratorRegistry.setConfigurators(Collections.emptyList());
148+
assertThat(InternalConfiguratorRegistry.getConfigurators()).isEmpty();
149+
assertThat(InternalConfiguratorRegistry.getConfiguratorsCallCountBeforeSet()).isEqualTo(1);
154150
}
155151
}
156152

0 commit comments

Comments
 (0)