Skip to content
Snippets Groups Projects
Commit 971bbcc7 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-4392 add timeout to command request

parent d3d1f69a
No related branches found
No related tags found
No related merge requests found
...@@ -14,6 +14,7 @@ import net.devh.boot.grpc.client.inject.GrpcClient; ...@@ -14,6 +14,7 @@ import net.devh.boot.grpc.client.inject.GrpcClient;
public class GrpcOzgCloudCommandService implements OzgCloudCommandService { public class GrpcOzgCloudCommandService implements OzgCloudCommandService {
private static final int WAIT_TIME_MS = 500; private static final int WAIT_TIME_MS = 500;
public static final int DEFAULT_COMMAND_REQUEST_THRESHOLD_MILLIS = 10000;
@GrpcClient("command-manager") @GrpcClient("command-manager")
private final CommandServiceBlockingStub commandServiceStub; private final CommandServiceBlockingStub commandServiceStub;
...@@ -22,6 +23,8 @@ public class GrpcOzgCloudCommandService implements OzgCloudCommandService { ...@@ -22,6 +23,8 @@ public class GrpcOzgCloudCommandService implements OzgCloudCommandService {
private final OzgCloudCallContextProvider contextProvider; private final OzgCloudCallContextProvider contextProvider;
private final int commandRequestThresholdMillis;
@Override @Override
public OzgCloudCommand createAndWaitUntilDone(OzgCloudCommand commandToCreate) { public OzgCloudCommand createAndWaitUntilDone(OzgCloudCommand commandToCreate) {
return waitUntilDone(create(commandToCreate)); return waitUntilDone(create(commandToCreate));
...@@ -34,8 +37,8 @@ public class GrpcOzgCloudCommandService implements OzgCloudCommandService { ...@@ -34,8 +37,8 @@ public class GrpcOzgCloudCommandService implements OzgCloudCommandService {
OzgCloudCommand waitUntilDone(OzgCloudCommand commandToWaitFor) { OzgCloudCommand waitUntilDone(OzgCloudCommand commandToWaitFor) {
var command = commandToWaitFor; var command = commandToWaitFor;
// TODO timeout var timeout = System.currentTimeMillis() + commandRequestThresholdMillis;
while (!command.getStatus().isFinalState()) { while (!command.getStatus().isFinalState() && System.currentTimeMillis() < timeout) {
synchronized (this) { synchronized (this) {
try { try {
wait(WAIT_TIME_MS); wait(WAIT_TIME_MS);
...@@ -48,7 +51,7 @@ public class GrpcOzgCloudCommandService implements OzgCloudCommandService { ...@@ -48,7 +51,7 @@ public class GrpcOzgCloudCommandService implements OzgCloudCommandService {
return command; return command;
} }
private OzgCloudCommand reloadCommand(OzgCloudCommandId commandId) { OzgCloudCommand reloadCommand(OzgCloudCommandId commandId) {
GrpcGetCommandRequest request = GrpcGetCommandRequest.newBuilder().setId(commandId.toString()).build(); GrpcGetCommandRequest request = GrpcGetCommandRequest.newBuilder().setId(commandId.toString()).build();
return mapper.fromGrpc(getCommandServiceStub().getCommand(request)); return mapper.fromGrpc(getCommandServiceStub().getCommand(request));
} }
......
...@@ -7,23 +7,29 @@ import static org.mockito.Mockito.*; ...@@ -7,23 +7,29 @@ import static org.mockito.Mockito.*;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Spy; import org.mockito.Mockito;
import de.itvsh.ozg.pluto.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub; import de.itvsh.ozg.pluto.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub;
import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider;
import de.ozgcloud.apilib.common.command.OzgCloudCommand; import de.ozgcloud.apilib.common.command.OzgCloudCommand;
import de.ozgcloud.apilib.common.command.OzgCloudCommandStatus;
class GrpcOzgCloudCommandServiceTest { class GrpcOzgCloudCommandServiceTest {
@Spy
@InjectMocks
private GrpcOzgCloudCommandService service; private GrpcOzgCloudCommandService service;
@Mock @Mock
private CommandServiceBlockingStub serviceStub; private CommandServiceBlockingStub serviceStub;
@Mock @Mock
private CommandMapper mapper; private CommandMapper mapper;
@Mock
private OzgCloudCallContextProvider contextProvider;
@BeforeEach
void init() {
service = spy(new GrpcOzgCloudCommandService(serviceStub, mapper, contextProvider, 600));
}
@Nested @Nested
class TestCreateAndWaitUntilDone { class TestCreateAndWaitUntilDone {
...@@ -94,4 +100,14 @@ class GrpcOzgCloudCommandServiceTest { ...@@ -94,4 +100,14 @@ class GrpcOzgCloudCommandServiceTest {
} }
} }
@Test
void shouldTerminateByTimeout() {
var command = OzgCloudCommandTestFactory.createBuilder().status(OzgCloudCommandStatus.PENDING).build();
doReturn(command).when(service).reloadCommand(any());
service.waitUntilDone(command);
Mockito.verify(service, Mockito.times(2)).reloadCommand(command.getId());
}
} }
...@@ -105,7 +105,8 @@ public class OzgCloudClientAutoConfiguration { ...@@ -105,7 +105,8 @@ public class OzgCloudClientAutoConfiguration {
@ConditionalOnProperty("ozgcloud.command-manager.address") @ConditionalOnProperty("ozgcloud.command-manager.address")
OzgCloudCommandService grpcCommandService(@GrpcClient("command-manager") CommandServiceBlockingStub commandServiceStub, OzgCloudCommandService grpcCommandService(@GrpcClient("command-manager") CommandServiceBlockingStub commandServiceStub,
CommandMapper commandMapper, OzgCloudCallContextProvider contextProvider) { CommandMapper commandMapper, OzgCloudCallContextProvider contextProvider) {
return new GrpcOzgCloudCommandService(commandServiceStub, commandMapper, contextProvider); return new GrpcOzgCloudCommandService(commandServiceStub, commandMapper, contextProvider,
GrpcOzgCloudCommandService.DEFAULT_COMMAND_REQUEST_THRESHOLD_MILLIS);
} }
@Bean @Bean
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment