From 55729bf3ff5fa28e4c6f6099f00624b0debcbbf7 Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Tue, 2 Jul 2024 11:53:54 +0300 Subject: [PATCH] Fix "Future is already done" error in VC --- .../thingsboard/server/controller/AdminController.java | 5 +++-- .../sync/vc/DefaultGitVersionControlQueueService.java | 10 +++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/AdminController.java b/application/src/main/java/org/thingsboard/server/controller/AdminController.java index 026e730441..65903a4dec 100644 --- a/application/src/main/java/org/thingsboard/server/controller/AdminController.java +++ b/application/src/main/java/org/thingsboard/server/controller/AdminController.java @@ -301,7 +301,7 @@ public class AdminController extends BaseController { @PostMapping("/repositorySettings") public DeferredResult saveRepositorySettings(@RequestBody RepositorySettings settings) throws ThingsboardException { accessControlService.checkPermission(getCurrentUser(), Resource.VERSION_CONTROL, Operation.WRITE); - settings.setLocalOnly(false); // overriding, since local repositories are supported only for testing + settings.setLocalOnly(false); // only to be used in tests ListenableFuture future = versionControlService.saveVersionControlSettings(getTenantId(), settings); return wrapFuture(Futures.transform(future, savedSettings -> { savedSettings.setPassword(null); @@ -330,7 +330,7 @@ public class AdminController extends BaseController { @Parameter(description = "A JSON value representing the Repository Settings.") @RequestBody RepositorySettings settings) throws Exception { accessControlService.checkPermission(getCurrentUser(), Resource.VERSION_CONTROL, Operation.READ); - settings = checkNotNull(settings); + settings.setLocalOnly(false); // only to be used in tests return wrapFuture(versionControlService.checkVersionControlAccess(getTenantId(), settings), vcRequestTimeout); } @@ -483,4 +483,5 @@ public class AdminController extends BaseController { adminSettingsService.saveAdminSettings(TenantId.SYS_TENANT_ID, adminSettings); response.sendRedirect(prevUri); } + } diff --git a/application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultGitVersionControlQueueService.java b/application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultGitVersionControlQueueService.java index f08d7ddd3b..7dac07edf0 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultGitVersionControlQueueService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultGitVersionControlQueueService.java @@ -21,6 +21,7 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.exception.ExceptionUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -311,7 +312,13 @@ public class DefaultGitVersionControlQueueService implements GitVersionControlQu } return submitFuture; } else { - throw new RuntimeException("Future is already done!"); + try { + request.getFuture().get(); + throw new RuntimeException("Failed to process the request"); + } catch (Exception e) { + Throwable cause = ExceptionUtils.getRootCause(e); + throw new RuntimeException(cause.getMessage(), cause); + } } } @@ -562,5 +569,6 @@ public class DefaultGitVersionControlQueueService implements GitVersionControlQu private CommitRequestMsg.Builder buildCommitRequest(CommitGitRequest commit) { return CommitRequestMsg.newBuilder().setTxId(commit.getTxId().toString()); } + }