Skip to content

Commit

Permalink
fix: wait for sidecar ready before health ping
Browse files Browse the repository at this point in the history
  • Loading branch information
ZakShearman committed Oct 19, 2024
1 parent 4fef623 commit 8a0d297
Showing 1 changed file with 24 additions and 0 deletions.
24 changes: 24 additions & 0 deletions src/main/java/dev/emortal/api/agonessdk/AgonesUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import dev.agones.sdk.AgonesSDKProto;
import dev.agones.sdk.SDKGrpc;
import io.grpc.StatusRuntimeException;
import io.grpc.stub.StreamObserver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -19,11 +20,34 @@ public class AgonesUtils {
private static StreamObserver<AgonesSDKProto.Empty> HEALTH_STREAM;

public static void startHealthTask(SDKGrpc.SDKStub stub, long period, TimeUnit unit) {
waitForSidecar(stub);

HEALTH_STREAM = stub.health(new EmptyStreamObserver<>());
Executors.newSingleThreadScheduledExecutor(THREAD_FACTORY)
.scheduleAtFixedRate(() -> HEALTH_STREAM.onNext(AgonesSDKProto.Empty.getDefaultInstance()), 0, period, unit);
}

private static void waitForSidecar(SDKGrpc.SDKStub stub) {
boolean sidecarAvailable = false;
int tries = 0;
while (!sidecarAvailable) {
if (++tries > 10) throw new RuntimeException("Agones sidecar not ready after 10 tries");

try {
stub.health(new EmptyStreamObserver<>());
sidecarAvailable = true;
} catch (StatusRuntimeException e) {
LOGGER.warn("Agones sidecar not ready, retrying in 500ms...");
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
throw new RuntimeException("Thread interrupted while waiting for Agones sidecar", ie);
}
}
}
}

public static void shutdownHealthTask() {
HEALTH_STREAM.onCompleted();
}
Expand Down

0 comments on commit 8a0d297

Please sign in to comment.