Skip to content

Commit 8cd6bca

Browse files
authored
Fixed the bug that lambda function is blocked (#34)
* Fixed the bug that lambda function is blocked
1 parent 6c10ae0 commit 8cd6bca

File tree

2 files changed

+56
-24
lines changed

2 files changed

+56
-24
lines changed

src/main/java/software/amazon/cloudwatchlogs/emf/environment/EnvironmentProvider.java

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package software.amazon.cloudwatchlogs.emf.environment;
1818

19+
import java.util.ArrayList;
20+
import java.util.List;
1921
import java.util.Optional;
2022
import java.util.concurrent.CompletableFuture;
2123
import lombok.AllArgsConstructor;
@@ -49,18 +51,15 @@ public CompletableFuture<Environment> resolveEnvironment() {
4951
return CompletableFuture.completedFuture(cachedEnvironment);
5052
}
5153

52-
CompletableFuture<Optional<EnvironmentResolveResult>> resolvedEnv =
53-
discoverEnvironmentAsync();
54+
CompletableFuture<Optional<Environment>> resolvedEnv = discoverEnvironmentAsync();
5455

5556
return resolvedEnv.thenApply(
5657
optionalEnv ->
57-
optionalEnv
58-
.map(EnvironmentResolveResult::getEnvironment)
59-
.orElseGet(
60-
() -> {
61-
cachedEnvironment = defaultEnvironment;
62-
return cachedEnvironment;
63-
}));
58+
optionalEnv.orElseGet(
59+
() -> {
60+
cachedEnvironment = defaultEnvironment;
61+
return cachedEnvironment;
62+
}));
6463
}
6564

6665
public Environment getDefaultEnvironment() {
@@ -72,28 +71,30 @@ void cleanResolvedEnvironment() {
7271
cachedEnvironment = null;
7372
}
7473

75-
private CompletableFuture<Optional<EnvironmentResolveResult>> discoverEnvironmentAsync() {
74+
private CompletableFuture<Optional<Environment>> discoverEnvironmentAsync() {
7675

77-
CompletableFuture<Optional<EnvironmentResolveResult>> ans =
78-
CompletableFuture.completedFuture(Optional.empty());
76+
CompletableFuture<Optional<Environment>> ans = new CompletableFuture<>();
77+
78+
List<CompletableFuture<EnvironmentResolveResult>> futures = new ArrayList<>();
7979
for (Environment env : environments) {
8080
CompletableFuture<EnvironmentResolveResult> future =
8181
CompletableFuture.supplyAsync(
8282
() -> new EnvironmentResolveResult(env.probe(), env));
83-
ans =
84-
ans.thenCombine(
85-
future,
86-
(optionalEnv, envResult) -> {
87-
if (optionalEnv.isPresent()) {
88-
return optionalEnv;
89-
}
90-
if (envResult.isCandidate) {
91-
return Optional.of(envResult);
92-
}
93-
return Optional.empty();
94-
});
83+
futures.add(future);
9584
}
9685

86+
CompletableFuture.runAsync(
87+
() -> {
88+
for (CompletableFuture<EnvironmentResolveResult> future : futures) {
89+
EnvironmentResolveResult result = future.join();
90+
if (result.isCandidate) {
91+
ans.complete(Optional.of(result.environment));
92+
return;
93+
}
94+
}
95+
ans.complete(Optional.empty());
96+
});
97+
9798
return ans;
9899
}
99100

src/test/java/software/amazon/cloudwatchlogs/emf/environment/EnvironmentProviderTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import org.junit.Test;
2929
import org.junit.runner.RunWith;
3030
import org.mockito.internal.util.reflection.FieldSetter;
31+
import org.mockito.invocation.InvocationOnMock;
32+
import org.mockito.stubbing.Answer;
3133
import org.powermock.api.mockito.PowerMockito;
3234
import org.powermock.core.classloader.annotations.PrepareForTest;
3335
import org.powermock.modules.junit4.PowerMockRunner;
@@ -168,4 +170,33 @@ public void testResolveEnvironmentEC2AndECSEnvs() throws Exception {
168170
assertSame(expectedEnv, mockedEC2Env);
169171
environmentProvider.cleanResolvedEnvironment();
170172
}
173+
174+
@Test
175+
public void testResolveEnvironmentReturnFirstDetectedEnvironment() throws Exception {
176+
177+
long startTime = System.currentTimeMillis();
178+
LambdaEnvironment mockedLambdaEnv = mock(LambdaEnvironment.class);
179+
when(mockedLambdaEnv.probe()).thenReturn(true);
180+
EC2Environment mockedEC2Env = mock(EC2Environment.class);
181+
when(mockedEC2Env.probe()).thenReturn(true);
182+
DefaultEnvironment mockedDefaultEnv = mock(DefaultEnvironment.class);
183+
when(mockedDefaultEnv.probe())
184+
.thenAnswer(
185+
new Answer<Boolean>() {
186+
@Override
187+
public Boolean answer(InvocationOnMock invocation) throws Throwable {
188+
Thread.sleep(5_000);
189+
return true;
190+
}
191+
});
192+
Environment[] envs = new Environment[] {mockedLambdaEnv, mockedDefaultEnv, mockedEC2Env};
193+
194+
FieldSetter.setField(
195+
environmentProvider,
196+
EnvironmentProvider.class.getDeclaredField("environments"),
197+
envs);
198+
Environment env = environmentProvider.resolveEnvironment().join();
199+
assertSame(env, mockedLambdaEnv);
200+
assertTrue(System.currentTimeMillis() - startTime < 3_000);
201+
}
171202
}

0 commit comments

Comments
 (0)