From d68ef2333ab8a1063ac027e5c5682edfa07e07bc Mon Sep 17 00:00:00 2001 From: YevhenBondarenko Date: Tue, 10 Mar 2020 14:48:12 +0200 Subject: [PATCH 1/4] updated guava and protobuf versions --- .../server/actors/ActorSystemContext.java | 5 ++- .../device/DeviceActorMessageProcessor.java | 4 +- .../server/controller/DeviceController.java | 8 ++-- .../controller/EntityViewController.java | 3 +- .../controller/TelemetryController.java | 17 +++++---- .../AbstractNashornJsInvokeService.java | 8 ++-- .../service/script/RemoteJsInvokeService.java | 10 ++--- .../script/RuleNodeJsScriptEngine.java | 7 ++-- .../state/DefaultDeviceStateService.java | 22 ++++++++--- .../DefaultTelemetryWebSocketService.java | 18 ++++----- .../transport/LocalTransportApiService.java | 16 ++------ .../server/kafka/AsyncCallbackTemplate.java | 3 +- .../thingsboard/common/util/DonAsynchron.java | 11 +++--- .../server/dao/alarm/BaseAlarmService.java | 13 +++---- .../server/dao/alarm/CassandraAlarmDao.java | 13 ++++--- .../server/dao/asset/BaseAssetService.java | 34 +++++++++-------- .../server/dao/asset/CassandraAssetDao.java | 3 +- .../dashboard/CassandraDashboardInfoDao.java | 3 +- .../dao/dashboard/DashboardServiceImpl.java | 37 +++++++++--------- .../server/dao/device/CassandraDeviceDao.java | 5 ++- .../dao/device/ClaimDevicesServiceImpl.java | 9 +++-- .../server/dao/device/DeviceServiceImpl.java | 27 ++++++------- .../server/dao/entity/BaseEntityService.java | 13 ++++++- .../entityview/CassandraEntityViewDao.java | 5 ++- .../dao/entityview/EntityViewServiceImpl.java | 9 +++-- .../dao/event/CassandraBaseEventDao.java | 11 ++++-- .../dao/nosql/CassandraAbstractModelDao.java | 7 ++-- .../dao/nosql/RateLimitedResultSetFuture.java | 7 ++-- .../dao/relation/BaseRelationService.java | 38 ++++++++++++------- .../server/dao/sql/alarm/JpaAlarmDao.java | 5 ++- .../sql/dashboard/JpaDashboardInfoDao.java | 3 +- ...stractChunkedAggregationTimeseriesDao.java | 3 +- .../dao/sqlts/AbstractSqlTimeseriesDao.java | 3 +- .../timescale/TimescaleTimeseriesDao.java | 3 +- .../CassandraBaseTimeseriesDao.java | 5 ++- .../nosql/RateLimitedResultSetFutureTest.java | 8 ++-- pom.xml | 4 +- .../action/TbAbstractRelationActionNode.java | 5 ++- .../rule/engine/action/TbClearAlarmNode.java | 7 ++-- .../rule/engine/action/TbCreateAlarmNode.java | 9 +++-- .../engine/action/TbCreateRelationNode.java | 7 ++-- .../engine/action/TbDeleteRelationNode.java | 14 ++++--- .../engine/filter/TbCheckAlarmStatusNode.java | 8 +--- .../engine/filter/TbCheckRelationNode.java | 5 ++- .../metadata/TbAbstractGetAttributesNode.java | 5 ++- .../TbAbstractGetEntityDetailsNode.java | 10 +++-- .../engine/metadata/TbEntityGetAttrNode.java | 9 +++-- .../metadata/TbGetCustomerDetailsNode.java | 9 +++-- .../metadata/TbGetOriginatorFieldsNode.java | 11 ++++-- .../metadata/TbGetTenantDetailsNode.java | 3 +- .../EntitiesAlarmOriginatorIdAsyncLoader.java | 3 +- .../util/EntitiesCustomerIdAsyncLoader.java | 10 +++-- .../util/EntitiesFieldsAsyncLoader.java | 3 +- .../EntitiesRelatedDeviceIdAsyncLoader.java | 4 +- .../EntitiesRelatedEntityIdAsyncLoader.java | 6 +-- .../util/EntitiesTenantIdAsyncLoader.java | 13 +++++-- 56 files changed, 308 insertions(+), 233 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java b/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java index bf06a3a8ac..54ac41172c 100644 --- a/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java +++ b/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java @@ -24,6 +24,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; import lombok.Getter; @@ -469,7 +470,7 @@ public class ActorSystemContext { public void onFailure(Throwable th) { log.error("Could not save debug Event for Node", th); } - }); + }, MoreExecutors.directExecutor()); } catch (IOException ex) { log.warn("Failed to persist rule node debug message", ex); } @@ -522,7 +523,7 @@ public class ActorSystemContext { public void onFailure(Throwable th) { log.error("Could not save debug Event for Rule Chain", th); } - }); + }, MoreExecutors.directExecutor()); } public static Exception toException(Throwable error) { diff --git a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java index acf1a3161c..2752b53090 100644 --- a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java +++ b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java @@ -20,9 +20,9 @@ import com.datastax.driver.core.utils.UUIDs; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import com.google.gson.Gson; import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import com.google.protobuf.InvalidProtocolBufferException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -292,7 +292,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { .build(); sendToTransport(responseMsg, sessionInfo); } - }); + }, MoreExecutors.directExecutor()); } private ListenableFuture>> getAttributesKvEntries(GetAttributeRequestMsg request) { diff --git a/application/src/main/java/org/thingsboard/server/controller/DeviceController.java b/application/src/main/java/org/thingsboard/server/controller/DeviceController.java index d147d27b40..23460506e9 100644 --- a/application/src/main/java/org/thingsboard/server/controller/DeviceController.java +++ b/application/src/main/java/org/thingsboard/server/controller/DeviceController.java @@ -18,6 +18,7 @@ package org.thingsboard.server.controller; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -30,6 +31,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.request.async.DeferredResult; +import org.thingsboard.server.common.data.ClaimRequest; import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.Device; @@ -44,7 +46,6 @@ import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.TextPageData; import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.security.DeviceCredentials; -import org.thingsboard.server.common.data.ClaimRequest; import org.thingsboard.server.dao.device.claim.ClaimResponse; import org.thingsboard.server.dao.device.claim.ClaimResult; import org.thingsboard.server.dao.exception.IncorrectParameterException; @@ -425,11 +426,12 @@ public class DeviceController extends BaseController { deferredResult.setResult(new ResponseEntity<>(HttpStatus.BAD_REQUEST)); } } + @Override public void onFailure(Throwable t) { deferredResult.setErrorResult(t); } - }); + }, MoreExecutors.directExecutor()); return deferredResult; } catch (Exception e) { throw handleException(e); @@ -466,7 +468,7 @@ public class DeviceController extends BaseController { public void onFailure(Throwable t) { deferredResult.setErrorResult(t); } - }); + }, MoreExecutors.directExecutor()); return deferredResult; } catch (Exception e) { throw handleException(e); diff --git a/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java b/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java index 2f146e5738..82053652d5 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EntityViewController.java @@ -18,6 +18,7 @@ package org.thingsboard.server.controller; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.security.access.prepost.PreAuthorize; @@ -158,7 +159,7 @@ public class EntityViewController extends BaseController { }); } return null; - }); + }, MoreExecutors.directExecutor()); } else { return Futures.immediateFuture(null); } diff --git a/application/src/main/java/org/thingsboard/server/controller/TelemetryController.java b/application/src/main/java/org/thingsboard/server/controller/TelemetryController.java index e534ebf7c4..f607d57cf6 100644 --- a/application/src/main/java/org/thingsboard/server/controller/TelemetryController.java +++ b/application/src/main/java/org/thingsboard/server/controller/TelemetryController.java @@ -22,6 +22,7 @@ import com.google.common.base.Function; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; import com.google.gson.JsonParser; @@ -174,7 +175,7 @@ public class TelemetryController extends BaseController { public DeferredResult getTimeseriesKeys( @PathVariable("entityType") String entityType, @PathVariable("entityId") String entityIdStr) throws ThingsboardException { return accessValidator.validateEntityAndCallback(getCurrentUser(), Operation.READ_TELEMETRY, entityType, entityIdStr, - (result, tenantId, entityId) -> Futures.addCallback(tsService.findAllLatest(tenantId, entityId), getTsKeysToResponseCallback(result))); + (result, tenantId, entityId) -> Futures.addCallback(tsService.findAllLatest(tenantId, entityId), getTsKeysToResponseCallback(result), MoreExecutors.directExecutor())); } @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") @@ -210,7 +211,7 @@ public class TelemetryController extends BaseController { List queries = toKeysList(keys).stream().map(key -> new BaseReadTsKvQuery(key, startTs, endTs, interval, limit, agg)) .collect(Collectors.toList()); - Futures.addCallback(tsService.findAll(tenantId, entityId, queries), getTsKvListCallback(result, useStrictDataTypes)); + Futures.addCallback(tsService.findAll(tenantId, entityId, queries), getTsKvListCallback(result, useStrictDataTypes), MoreExecutors.directExecutor()); }); } @@ -462,7 +463,7 @@ public class TelemetryController extends BaseController { } else { future = tsService.findLatest(user.getTenantId(), entityId, toKeysList(keys)); } - Futures.addCallback(future, getTsKvListCallback(result, useStrictDataTypes)); + Futures.addCallback(future, getTsKvListCallback(result, useStrictDataTypes), MoreExecutors.directExecutor()); } private void getAttributeValuesCallback(@Nullable DeferredResult result, SecurityUser user, EntityId entityId, String scope, String keys) { @@ -470,9 +471,9 @@ public class TelemetryController extends BaseController { FutureCallback> callback = getAttributeValuesToResponseCallback(result, user, scope, entityId, keyList); if (!StringUtils.isEmpty(scope)) { if (keyList != null && !keyList.isEmpty()) { - Futures.addCallback(attributesService.find(user.getTenantId(), entityId, scope, keyList), callback); + Futures.addCallback(attributesService.find(user.getTenantId(), entityId, scope, keyList), callback, MoreExecutors.directExecutor()); } else { - Futures.addCallback(attributesService.findAll(user.getTenantId(), entityId, scope), callback); + Futures.addCallback(attributesService.findAll(user.getTenantId(), entityId, scope), callback, MoreExecutors.directExecutor()); } } else { List>> futures = new ArrayList<>(); @@ -486,12 +487,12 @@ public class TelemetryController extends BaseController { ListenableFuture> future = mergeAllAttributesFutures(futures); - Futures.addCallback(future, callback); + Futures.addCallback(future, callback, MoreExecutors.directExecutor()); } } private void getAttributeKeysCallback(@Nullable DeferredResult result, TenantId tenantId, EntityId entityId, String scope) { - Futures.addCallback(attributesService.findAll(tenantId, entityId, scope), getAttributeKeysToResponseCallback(result)); + Futures.addCallback(attributesService.findAll(tenantId, entityId, scope), getAttributeKeysToResponseCallback(result), MoreExecutors.directExecutor()); } private void getAttributeKeysCallback(@Nullable DeferredResult result, TenantId tenantId, EntityId entityId) { @@ -502,7 +503,7 @@ public class TelemetryController extends BaseController { ListenableFuture> future = mergeAllAttributesFutures(futures); - Futures.addCallback(future, getAttributeKeysToResponseCallback(result)); + Futures.addCallback(future, getAttributeKeysToResponseCallback(result), MoreExecutors.directExecutor()); } private FutureCallback> getTsKeysToResponseCallback(final DeferredResult response) { diff --git a/application/src/main/java/org/thingsboard/server/service/script/AbstractNashornJsInvokeService.java b/application/src/main/java/org/thingsboard/server/service/script/AbstractNashornJsInvokeService.java index e4901785fe..49a6304ebb 100644 --- a/application/src/main/java/org/thingsboard/server/service/script/AbstractNashornJsInvokeService.java +++ b/application/src/main/java/org/thingsboard/server/service/script/AbstractNashornJsInvokeService.java @@ -18,6 +18,7 @@ package org.thingsboard.server.service.script; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import delight.nashornsandbox.NashornSandbox; import delight.nashornsandbox.NashornSandboxes; import jdk.nashorn.api.scripting.NashornScriptEngineFactory; @@ -28,20 +29,17 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.thingsboard.common.util.ThingsBoardThreadFactory; -import javax.annotation.Nullable; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptException; import java.util.UUID; -import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicInteger; @Slf4j @@ -140,7 +138,7 @@ public abstract class AbstractNashornJsInvokeService extends AbstractJsInvokeSer if (maxRequestsTimeout > 0) { result = Futures.withTimeout(result, maxRequestsTimeout, TimeUnit.MILLISECONDS, timeoutExecutorService); } - Futures.addCallback(result, evalCallback); + Futures.addCallback(result, evalCallback, MoreExecutors.directExecutor()); return result; } @@ -163,7 +161,7 @@ public abstract class AbstractNashornJsInvokeService extends AbstractJsInvokeSer if (maxRequestsTimeout > 0) { result = Futures.withTimeout(result, maxRequestsTimeout, TimeUnit.MILLISECONDS, timeoutExecutorService); } - Futures.addCallback(result, invokeCallback); + Futures.addCallback(result, invokeCallback, MoreExecutors.directExecutor()); return result; } diff --git a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java index 45d773f387..1a218b119b 100644 --- a/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java +++ b/application/src/main/java/org/thingsboard/server/service/script/RemoteJsInvokeService.java @@ -18,6 +18,7 @@ package org.thingsboard.server.service.script; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -40,7 +41,6 @@ import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; @Slf4j @ConditionalOnProperty(prefix = "js", value = "evaluator", havingValue = "remote", matchIfMissing = true) @@ -166,7 +166,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { } kafkaFailedMsgs.incrementAndGet(); } - }); + }, MoreExecutors.directExecutor()); return Futures.transform(future, response -> { JsInvokeProtos.JsCompileResponse compilationResult = response.getCompileResponse(); UUID compiledScriptId = new UUID(compilationResult.getScriptIdMSB(), compilationResult.getScriptIdLSB()); @@ -178,7 +178,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { log.debug("[{}] Failed to compile script due to [{}]: {}", compiledScriptId, compilationResult.getErrorCode().name(), compilationResult.getErrorDetails()); throw new RuntimeException(compilationResult.getErrorDetails()); } - }); + }, MoreExecutors.directExecutor()); } @Override @@ -217,7 +217,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { } kafkaFailedMsgs.incrementAndGet(); } - }); + }, MoreExecutors.directExecutor()); return Futures.transform(future, response -> { JsInvokeProtos.JsInvokeResponse invokeResult = response.getInvokeResponse(); if (invokeResult.getSuccess()) { @@ -226,7 +226,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService { log.debug("[{}] Failed to compile script due to [{}]: {}", scriptId, invokeResult.getErrorCode().name(), invokeResult.getErrorDetails()); throw new RuntimeException(invokeResult.getErrorDetails()); } - }); + }, MoreExecutors.directExecutor()); } @Override diff --git a/application/src/main/java/org/thingsboard/server/service/script/RuleNodeJsScriptEngine.java b/application/src/main/java/org/thingsboard/server/service/script/RuleNodeJsScriptEngine.java index 73bdd27b78..ef5d4716cb 100644 --- a/application/src/main/java/org/thingsboard/server/service/script/RuleNodeJsScriptEngine.java +++ b/application/src/main/java/org/thingsboard/server/service/script/RuleNodeJsScriptEngine.java @@ -21,6 +21,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Sets; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.thingsboard.server.common.data.id.EntityId; @@ -121,7 +122,7 @@ public class RuleNodeJsScriptEngine implements org.thingsboard.rule.engine.api.S } else { return Futures.immediateFuture(unbindMsg(json, msg)); } - }); + }, MoreExecutors.directExecutor()); } @Override @@ -174,7 +175,7 @@ public class RuleNodeJsScriptEngine implements org.thingsboard.rule.engine.api.S } else { return Futures.immediateFuture(json.asBoolean()); } - }); + }, MoreExecutors.directExecutor()); } @Override @@ -232,7 +233,7 @@ public class RuleNodeJsScriptEngine implements org.thingsboard.rule.engine.api.S return Futures.immediateFailedFuture(new ScriptException(e)); } } - }); + }, MoreExecutors.directExecutor()); } public void destroy() { diff --git a/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java b/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java index f40de180ab..18726e3a5a 100644 --- a/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java +++ b/application/src/main/java/org/thingsboard/server/service/state/DefaultDeviceStateService.java @@ -64,14 +64,26 @@ import org.thingsboard.server.service.telemetry.TelemetrySubscriptionService; import javax.annotation.Nullable; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Random; +import java.util.Set; +import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; -import static org.thingsboard.server.common.data.DataConstants.*; +import static org.thingsboard.server.common.data.DataConstants.ACTIVITY_EVENT; +import static org.thingsboard.server.common.data.DataConstants.CONNECT_EVENT; +import static org.thingsboard.server.common.data.DataConstants.DISCONNECT_EVENT; +import static org.thingsboard.server.common.data.DataConstants.INACTIVITY_EVENT; +import static org.thingsboard.server.common.data.DataConstants.SERVER_SCOPE; /** * Created by ashvayka on 01.05.18. @@ -401,7 +413,7 @@ public class DefaultDeviceStateService implements DeviceStateService { public void onFailure(Throwable t) { log.warn("Failed to register device to the state service", t); } - }); + }, MoreExecutors.directExecutor()); } else { sendDeviceEvent(device.getTenantId(), device.getId(), address.get(), true, false, false); } @@ -456,10 +468,10 @@ public class DefaultDeviceStateService implements DeviceStateService { private ListenableFuture fetchDeviceState(Device device) { if (persistToTelemetry) { ListenableFuture> tsData = tsService.findLatest(TenantId.SYS_TENANT_ID, device.getId(), PERSISTENT_ATTRIBUTES); - return Futures.transform(tsData, extractDeviceStateData(device)); + return Futures.transform(tsData, extractDeviceStateData(device), MoreExecutors.directExecutor()); } else { ListenableFuture> attrData = attributesService.find(TenantId.SYS_TENANT_ID, device.getId(), DataConstants.SERVER_SCOPE, PERSISTENT_ATTRIBUTES); - return Futures.transform(attrData, extractDeviceStateData(device)); + return Futures.transform(attrData, extractDeviceStateData(device), MoreExecutors.directExecutor()); } } diff --git a/application/src/main/java/org/thingsboard/server/service/telemetry/DefaultTelemetryWebSocketService.java b/application/src/main/java/org/thingsboard/server/service/telemetry/DefaultTelemetryWebSocketService.java index c4fe716ad9..741efe6f8a 100644 --- a/application/src/main/java/org/thingsboard/server/service/telemetry/DefaultTelemetryWebSocketService.java +++ b/application/src/main/java/org/thingsboard/server/service/telemetry/DefaultTelemetryWebSocketService.java @@ -21,6 +21,7 @@ import com.google.common.base.Function; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -54,9 +55,6 @@ import org.thingsboard.server.service.telemetry.cmd.SubscriptionCmd; import org.thingsboard.server.service.telemetry.cmd.TelemetryPluginCmd; import org.thingsboard.server.service.telemetry.cmd.TelemetryPluginCmdsWrapper; import org.thingsboard.server.service.telemetry.cmd.TimeseriesSubscriptionCmd; -import org.thingsboard.server.service.telemetry.exception.AccessDeniedException; -import org.thingsboard.server.service.telemetry.exception.EntityNotFoundException; -import org.thingsboard.server.service.telemetry.exception.InternalErrorException; import org.thingsboard.server.service.telemetry.exception.UnauthorizedException; import org.thingsboard.server.service.telemetry.sub.SubscriptionErrorCode; import org.thingsboard.server.service.telemetry.sub.SubscriptionState; @@ -70,12 +68,14 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; -import java.util.concurrent.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -616,7 +616,7 @@ public class DefaultTelemetryWebSocketService implements TelemetryWebSocketServi } ListenableFuture> future = mergeAllAttributesFutures(futures); - Futures.addCallback(future, callback); + Futures.addCallback(future, callback, MoreExecutors.directExecutor()); } @Override @@ -630,7 +630,7 @@ public class DefaultTelemetryWebSocketService implements TelemetryWebSocketServi return new FutureCallback() { @Override public void onSuccess(@Nullable ValidationResult result) { - Futures.addCallback(attributesService.find(tenantId, entityId, scope, keys), callback); + Futures.addCallback(attributesService.find(tenantId, entityId, scope, keys), callback, MoreExecutors.directExecutor()); } @Override @@ -650,7 +650,7 @@ public class DefaultTelemetryWebSocketService implements TelemetryWebSocketServi } ListenableFuture> future = mergeAllAttributesFutures(futures); - Futures.addCallback(future, callback); + Futures.addCallback(future, callback, MoreExecutors.directExecutor()); } @Override @@ -664,7 +664,7 @@ public class DefaultTelemetryWebSocketService implements TelemetryWebSocketServi return new FutureCallback() { @Override public void onSuccess(@Nullable ValidationResult result) { - Futures.addCallback(attributesService.findAll(tenantId, entityId, scope), callback); + Futures.addCallback(attributesService.findAll(tenantId, entityId, scope), callback, MoreExecutors.directExecutor()); } @Override diff --git a/application/src/main/java/org/thingsboard/server/service/transport/LocalTransportApiService.java b/application/src/main/java/org/thingsboard/server/service/transport/LocalTransportApiService.java index 37ff8ed93d..8e820fbffe 100644 --- a/application/src/main/java/org/thingsboard/server/service/transport/LocalTransportApiService.java +++ b/application/src/main/java/org/thingsboard/server/service/transport/LocalTransportApiService.java @@ -19,10 +19,9 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.thingsboard.server.common.data.Device; @@ -42,19 +41,10 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportApiResponse import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceCredentialsResponseMsg; import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceTokenRequestMsg; import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceX509CertRequestMsg; -import org.thingsboard.server.kafka.TBKafkaConsumerTemplate; -import org.thingsboard.server.kafka.TBKafkaProducerTemplate; -import org.thingsboard.server.kafka.TbKafkaResponseTemplate; -import org.thingsboard.server.kafka.TbKafkaSettings; -import org.thingsboard.server.service.cluster.discovery.DiscoveryService; import org.thingsboard.server.service.executors.DbCallbackExecutorService; import org.thingsboard.server.service.state.DeviceStateService; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; import java.util.UUID; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.concurrent.locks.ReentrantLock; /** @@ -145,7 +135,7 @@ public class LocalTransportApiService implements TransportApiService { try { ValidateDeviceCredentialsResponseMsg.Builder builder = ValidateDeviceCredentialsResponseMsg.newBuilder(); builder.setDeviceInfo(getDeviceInfoProto(device)); - if(!StringUtils.isEmpty(credentials.getCredentialsValue())){ + if (!StringUtils.isEmpty(credentials.getCredentialsValue())) { builder.setCredentialsBody(credentials.getCredentialsValue()); } return TransportApiResponseMsg.newBuilder() @@ -154,7 +144,7 @@ public class LocalTransportApiService implements TransportApiService { log.warn("[{}] Failed to lookup device by id", deviceId, e); return getEmptyTransportApiResponse(); } - }); + }, MoreExecutors.directExecutor()); } private DeviceInfoProto getDeviceInfoProto(Device device) throws JsonProcessingException { diff --git a/common/queue/src/main/java/org/thingsboard/server/kafka/AsyncCallbackTemplate.java b/common/queue/src/main/java/org/thingsboard/server/kafka/AsyncCallbackTemplate.java index 17599bfccb..a01411e48f 100644 --- a/common/queue/src/main/java/org/thingsboard/server/kafka/AsyncCallbackTemplate.java +++ b/common/queue/src/main/java/org/thingsboard/server/kafka/AsyncCallbackTemplate.java @@ -18,6 +18,7 @@ package org.thingsboard.server.kafka; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import java.util.concurrent.Executor; import java.util.concurrent.ScheduledExecutorService; @@ -59,7 +60,7 @@ public class AsyncCallbackTemplate { if (executor != null) { Futures.addCallback(future, callback, executor); } else { - Futures.addCallback(future, callback); + Futures.addCallback(future, callback, MoreExecutors.directExecutor()); } } diff --git a/common/util/src/main/java/org/thingsboard/common/util/DonAsynchron.java b/common/util/src/main/java/org/thingsboard/common/util/DonAsynchron.java index 3557fcb40a..0940878ab2 100644 --- a/common/util/src/main/java/org/thingsboard/common/util/DonAsynchron.java +++ b/common/util/src/main/java/org/thingsboard/common/util/DonAsynchron.java @@ -18,19 +18,20 @@ package org.thingsboard.common.util; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import java.util.concurrent.Executor; import java.util.function.Consumer; public class DonAsynchron { - public static void withCallback(ListenableFuture future, Consumer onSuccess, - Consumer onFailure) { + public static void withCallback(ListenableFuture future, Consumer onSuccess, + Consumer onFailure) { withCallback(future, onSuccess, onFailure, null); } - public static void withCallback(ListenableFuture future, Consumer onSuccess, - Consumer onFailure, Executor executor) { + public static void withCallback(ListenableFuture future, Consumer onSuccess, + Consumer onFailure, Executor executor) { FutureCallback callback = new FutureCallback() { @Override public void onSuccess(T result) { @@ -49,7 +50,7 @@ public class DonAsynchron { if (executor != null) { Futures.addCallback(future, callback, executor); } else { - Futures.addCallback(future, callback); + Futures.addCallback(future, callback, MoreExecutors.directExecutor()); } } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java index d86e7e0f1b..453f1ea0be 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.google.common.base.Function; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -53,7 +54,6 @@ import javax.annotation.Nullable; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Set; @@ -264,9 +264,8 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ entityService.fetchEntityNameAsync(tenantId, alarmInfo.getOriginator()), originatorName -> { alarmInfo.setOriginatorName(originatorName); return alarmInfo; - } - ); - }); + }, MoreExecutors.directExecutor()); + }, MoreExecutors.directExecutor()); } @Override @@ -283,11 +282,11 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ } alarmInfo.setOriginatorName(originatorName); return alarmInfo; - } + }, MoreExecutors.directExecutor() )); } return Futures.successfulAsList(alarmFutures); - }); + }, MoreExecutors.directExecutor()); } return Futures.transform(alarms, new Function, TimePageData>() { @Nullable @@ -295,7 +294,7 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ public TimePageData apply(@Nullable List alarms) { return new TimePageData<>(alarms, query.getPageLink()); } - }); + }, MoreExecutors.directExecutor()); } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/CassandraAlarmDao.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/CassandraAlarmDao.java index f76ab871a4..e124b3e172 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/CassandraAlarmDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/CassandraAlarmDao.java @@ -20,6 +20,7 @@ import com.datastax.driver.core.querybuilder.QueryBuilder; import com.datastax.driver.core.querybuilder.Select; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -82,10 +83,10 @@ public class CassandraAlarmDao extends CassandraAbstractModelDao - assetList == null ? Collections.emptyList() : assetList.stream().filter(asset -> query.getAssetTypes().contains(asset.getType())).collect(Collectors.toList()) + assetList == null ? Collections.emptyList() : assetList.stream().filter(asset -> query.getAssetTypes().contains(asset.getType())).collect(Collectors.toList()), MoreExecutors.directExecutor() ); return assets; } @@ -274,7 +276,7 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ assetTypes -> { assetTypes.sort(Comparator.comparing(EntitySubtype::getType)); return assetTypes; - }); + }, MoreExecutors.directExecutor()); } private DataValidator assetValidator = @@ -335,18 +337,18 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ }; private PaginatedRemover tenantAssetsRemover = - new PaginatedRemover() { + new PaginatedRemover() { - @Override - protected List findEntities(TenantId tenantId, TenantId id, TextPageLink pageLink) { - return assetDao.findAssetsByTenantId(id.getId(), pageLink); - } + @Override + protected List findEntities(TenantId tenantId, TenantId id, TextPageLink pageLink) { + return assetDao.findAssetsByTenantId(id.getId(), pageLink); + } - @Override - protected void removeEntity(TenantId tenantId, Asset entity) { - deleteAsset(tenantId, new AssetId(entity.getId().getId())); - } - }; + @Override + protected void removeEntity(TenantId tenantId, Asset entity) { + deleteAsset(tenantId, new AssetId(entity.getId().getId())); + } + }; private PaginatedRemover customerAssetsUnasigner = new PaginatedRemover() { diff --git a/dao/src/main/java/org/thingsboard/server/dao/asset/CassandraAssetDao.java b/dao/src/main/java/org/thingsboard/server/dao/asset/CassandraAssetDao.java index 9f3bac983e..9808e7b117 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/asset/CassandraAssetDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/asset/CassandraAssetDao.java @@ -23,6 +23,7 @@ import com.datastax.driver.mapping.Result; import com.google.common.base.Function; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.EntitySubtype; @@ -185,7 +186,7 @@ public class CassandraAssetDao extends CassandraAbstractSearchTextDao apply(@Nullable List dashboards) { return new TimePageData<>(dashboards, pageLink); } - }); + }, MoreExecutors.directExecutor()); } @Override @@ -244,24 +245,24 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb } } } - }; - + }; + private PaginatedRemover tenantDashboardsRemover = new PaginatedRemover() { - - @Override - protected List findEntities(TenantId tenantId, TenantId id, TextPageLink pageLink) { - return dashboardInfoDao.findDashboardsByTenantId(id.getId(), pageLink); - } - @Override - protected void removeEntity(TenantId tenantId, DashboardInfo entity) { - deleteDashboard(tenantId, new DashboardId(entity.getUuidId())); - } - }; - + @Override + protected List findEntities(TenantId tenantId, TenantId id, TextPageLink pageLink) { + return dashboardInfoDao.findDashboardsByTenantId(id.getId(), pageLink); + } + + @Override + protected void removeEntity(TenantId tenantId, DashboardInfo entity) { + deleteDashboard(tenantId, new DashboardId(entity.getUuidId())); + } + }; + private class CustomerDashboardsUnassigner extends TimePaginatedRemover { - + private Customer customer; CustomerDashboardsUnassigner(Customer customer) { @@ -282,7 +283,7 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb protected void removeEntity(TenantId tenantId, DashboardInfo entity) { unassignDashboardFromCustomer(customer.getTenantId(), new DashboardId(entity.getUuidId()), this.customer.getId()); } - + } private class CustomerDashboardsUpdater extends TimePaginatedRemover { diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/CassandraDeviceDao.java b/dao/src/main/java/org/thingsboard/server/dao/device/CassandraDeviceDao.java index e7becfa1ad..a01725fe52 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/CassandraDeviceDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/CassandraDeviceDao.java @@ -23,6 +23,7 @@ import com.datastax.driver.mapping.Result; import com.google.common.base.Function; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.Device; @@ -178,14 +179,14 @@ public class CassandraDeviceDao extends CassandraAbstractSearchTextDao entitySubtypes = new ArrayList<>(); result.all().forEach((entitySubtypeEntity) -> - entitySubtypes.add(entitySubtypeEntity.toEntitySubtype()) + entitySubtypes.add(entitySubtypeEntity.toEntitySubtype()) ); return entitySubtypes; } else { return Collections.emptyList(); } } - }); + }, MoreExecutors.directExecutor()); } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/ClaimDevicesServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/ClaimDevicesServiceImpl.java index abd453cc05..0bfc8885be 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/ClaimDevicesServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/ClaimDevicesServiceImpl.java @@ -18,6 +18,7 @@ package org.thingsboard.server.dao.device; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -97,9 +98,9 @@ public class ClaimDevicesServiceImpl implements ClaimDevicesService { } log.warn("Failed to find claimingAllowed attribute for device or it is already claimed![{}]", device.getName()); throw new IllegalArgumentException(); - }); + }, MoreExecutors.directExecutor()); } - }); + }, MoreExecutors.directExecutor()); } private ClaimDataInfo getClaimData(Cache cache, Device device) throws ExecutionException, InterruptedException { @@ -138,9 +139,9 @@ public class ClaimDevicesServiceImpl implements ClaimDevicesService { if (device.getCustomerId().getId().equals(ModelConstants.NULL_UUID)) { device.setCustomerId(customerId); Device savedDevice = deviceService.saveDevice(device); - return Futures.transform(removeClaimingSavedData(cache, claimData, device), result -> new ClaimResult(savedDevice, ClaimResponse.SUCCESS)); + return Futures.transform(removeClaimingSavedData(cache, claimData, device), result -> new ClaimResult(savedDevice, ClaimResponse.SUCCESS), MoreExecutors.directExecutor()); } - return Futures.transform(removeClaimingSavedData(cache, claimData, device), result -> new ClaimResult(null, ClaimResponse.CLAIMED)); + return Futures.transform(removeClaimingSavedData(cache, claimData, device), result -> new ClaimResult(null, ClaimResponse.CLAIMED), MoreExecutors.directExecutor()); } } else { log.warn("Failed to find the device's claiming message![{}]", device.getName()); diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java index dbcbac73b8..db998b7328 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceServiceImpl.java @@ -18,6 +18,7 @@ package org.thingsboard.server.dao.device; import com.google.common.base.Function; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; import org.hibernate.exception.ConstraintViolationException; @@ -291,7 +292,7 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe } } return Futures.successfulAsList(futures); - }); + }, MoreExecutors.directExecutor()); devices = Futures.transform(devices, new Function, List>() { @Nullable @@ -299,7 +300,7 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe public List apply(@Nullable List deviceList) { return deviceList == null ? Collections.emptyList() : deviceList.stream().filter(device -> query.getDeviceTypes().contains(device.getType())).collect(Collectors.toList()); } - }); + }, MoreExecutors.directExecutor()); return devices; } @@ -313,7 +314,7 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe deviceTypes -> { deviceTypes.sort(Comparator.comparing(EntitySubtype::getType)); return deviceTypes; - }); + }, MoreExecutors.directExecutor()); } private DataValidator deviceValidator = @@ -374,18 +375,18 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe }; private PaginatedRemover tenantDevicesRemover = - new PaginatedRemover() { + new PaginatedRemover() { - @Override - protected List findEntities(TenantId tenantId, TenantId id, TextPageLink pageLink) { - return deviceDao.findDevicesByTenantId(id.getId(), pageLink); - } + @Override + protected List findEntities(TenantId tenantId, TenantId id, TextPageLink pageLink) { + return deviceDao.findDevicesByTenantId(id.getId(), pageLink); + } - @Override - protected void removeEntity(TenantId tenantId, Device entity) { - deleteDevice(tenantId, new DeviceId(entity.getUuidId())); - } - }; + @Override + protected void removeEntity(TenantId tenantId, Device entity) { + deleteDevice(tenantId, new DeviceId(entity.getUuidId())); + } + }; private PaginatedRemover customerDeviceUnasigner = new PaginatedRemover() { diff --git a/dao/src/main/java/org/thingsboard/server/dao/entity/BaseEntityService.java b/dao/src/main/java/org/thingsboard/server/dao/entity/BaseEntityService.java index c49fcc3728..5867e505b6 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/entity/BaseEntityService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/entity/BaseEntityService.java @@ -18,12 +18,21 @@ package org.thingsboard.server.dao.entity; import com.google.common.base.Function; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.thingsboard.server.common.data.HasName; import org.thingsboard.server.common.data.alarm.AlarmId; -import org.thingsboard.server.common.data.id.*; +import org.thingsboard.server.common.data.id.AssetId; +import org.thingsboard.server.common.data.id.CustomerId; +import org.thingsboard.server.common.data.id.DashboardId; +import org.thingsboard.server.common.data.id.DeviceId; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.EntityViewId; +import org.thingsboard.server.common.data.id.RuleChainId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.dao.alarm.AlarmService; import org.thingsboard.server.dao.asset.AssetService; import org.thingsboard.server.dao.customer.CustomerService; @@ -109,7 +118,7 @@ public class BaseEntityService extends AbstractEntityService implements EntitySe default: throw new IllegalStateException("Not Implemented!"); } - entityName = Futures.transform(hasName, (Function) hasName1 -> hasName1 != null ? hasName1.getName() : null ); + entityName = Futures.transform(hasName, (Function) hasName1 -> hasName1 != null ? hasName1.getName() : null, MoreExecutors.directExecutor()); return entityName; } diff --git a/dao/src/main/java/org/thingsboard/server/dao/entityview/CassandraEntityViewDao.java b/dao/src/main/java/org/thingsboard/server/dao/entityview/CassandraEntityViewDao.java index aabc2c172a..05fac418d2 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/entityview/CassandraEntityViewDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/entityview/CassandraEntityViewDao.java @@ -23,6 +23,7 @@ import com.datastax.driver.mapping.Result; import com.google.common.base.Function; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.thingsboard.server.common.data.EntitySubtype; @@ -97,7 +98,7 @@ public class CassandraEntityViewDao extends CassandraAbstractSearchTextDao entityViewEntities = findPageWithTextSearch(new TenantId(tenantId), ENTITY_VIEW_BY_TENANT_AND_SEARCH_TEXT_CF, - Collections.singletonList(eq(TENANT_ID_PROPERTY, tenantId)), pageLink); + Collections.singletonList(eq(TENANT_ID_PROPERTY, tenantId)), pageLink); log.trace("Found entity views [{}] by tenantId [{}] and pageLink [{}]", entityViewEntities, tenantId, pageLink); return DaoUtil.convertDataList(entityViewEntities); @@ -181,6 +182,6 @@ public class CassandraEntityViewDao extends CassandraAbstractSearchTextDao, List>() { @Nullable @@ -207,7 +208,7 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti public List apply(@Nullable List entityViewList) { return entityViewList == null ? Collections.emptyList() : entityViewList.stream().filter(entityView -> query.getEntityViewTypes().contains(entityView.getType())).collect(Collectors.toList()); } - }); + }, MoreExecutors.directExecutor()); return entityViews; } @@ -246,7 +247,7 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti public void onFailure(Throwable t) { log.error("Error while finding entity views by tenantId and entityId", t); } - }); + }, MoreExecutors.directExecutor()); return entityViewsFuture; } } @@ -279,7 +280,7 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti entityViewTypes -> { entityViewTypes.sort(Comparator.comparing(EntitySubtype::getType)); return entityViewTypes; - }); + }, MoreExecutors.directExecutor()); } private DataValidator entityViewValidator = diff --git a/dao/src/main/java/org/thingsboard/server/dao/event/CassandraBaseEventDao.java b/dao/src/main/java/org/thingsboard/server/dao/event/CassandraBaseEventDao.java index 1c93a5df07..bdd0201aa5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/event/CassandraBaseEventDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/event/CassandraBaseEventDao.java @@ -22,6 +22,7 @@ import com.datastax.driver.core.querybuilder.Select; import com.datastax.driver.core.utils.UUIDs; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; @@ -45,10 +46,12 @@ import java.util.UUID; import java.util.concurrent.ExecutionException; import static com.datastax.driver.core.querybuilder.QueryBuilder.eq; -import static com.datastax.driver.core.querybuilder.QueryBuilder.in; import static com.datastax.driver.core.querybuilder.QueryBuilder.select; import static com.datastax.driver.core.querybuilder.QueryBuilder.ttl; -import static org.thingsboard.server.dao.model.ModelConstants.*; +import static org.thingsboard.server.dao.model.ModelConstants.EVENT_BY_ID_VIEW_NAME; +import static org.thingsboard.server.dao.model.ModelConstants.EVENT_BY_TYPE_AND_ID_VIEW_NAME; +import static org.thingsboard.server.dao.model.ModelConstants.EVENT_COLUMN_FAMILY_NAME; +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; @Component @Slf4j @@ -96,7 +99,7 @@ public class CassandraBaseEventDao extends CassandraAbstractSearchTimeDao> optionalSave = saveAsync(event.getTenantId(), new EventEntity(event), false, eventsTtl); - return Futures.transform(optionalSave, opt -> opt.orElse(null)); + return Futures.transform(optionalSave, opt -> opt.orElse(null), MoreExecutors.directExecutor()); } @Override @@ -210,6 +213,6 @@ public class CassandraBaseEventDao extends CassandraAbstractSearchTimeDao, D> exte return Collections.emptyList(); } } - }); + }, MoreExecutors.directExecutor()); } return Futures.immediateFuture(Collections.emptyList()); } @@ -120,7 +121,7 @@ public abstract class CassandraAbstractModelDao, D> exte return null; } } - }); + }, MoreExecutors.directExecutor()); } return Futures.immediateFuture(null); } @@ -191,5 +192,5 @@ public abstract class CassandraAbstractModelDao, D> exte List entities = findListByStatement(tenantId, QueryBuilder.select().all().from(getColumnFamilyName()).setConsistencyLevel(cluster.getDefaultReadConsistencyLevel())); return DaoUtil.convertDataList(entities); } - + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/nosql/RateLimitedResultSetFuture.java b/dao/src/main/java/org/thingsboard/server/dao/nosql/RateLimitedResultSetFuture.java index cb30a7f48b..ebbe451b01 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/nosql/RateLimitedResultSetFuture.java +++ b/dao/src/main/java/org/thingsboard/server/dao/nosql/RateLimitedResultSetFuture.java @@ -22,6 +22,7 @@ import com.datastax.driver.core.Statement; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.Uninterruptibles; import org.thingsboard.server.dao.exception.BufferLimitException; import org.thingsboard.server.dao.util.AsyncRateLimiter; @@ -44,9 +45,9 @@ public class RateLimitedResultSetFuture implements ResultSetFuture { rateLimiter.release(); } return Futures.immediateFailedFuture(t); - }); + }, MoreExecutors.directExecutor()); this.originalFuture = Futures.transform(rateLimitFuture, - i -> executeAsyncWithRelease(rateLimiter, session, statement)); + i -> executeAsyncWithRelease(rateLimiter, session, statement), MoreExecutors.directExecutor()); } @@ -145,7 +146,7 @@ public class RateLimitedResultSetFuture implements ResultSetFuture { public void onFailure(Throwable t) { rateLimiter.release(); } - }); + }, MoreExecutors.directExecutor()); return resultSetFuture; } catch (RuntimeException re) { rateLimiter.release(); diff --git a/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java b/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java index 68b7fce6a8..22b2543489 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/relation/BaseRelationService.java @@ -16,7 +16,10 @@ package org.thingsboard.server.dao.relation; import com.google.common.base.Function; -import com.google.common.util.concurrent.*; +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.Cache; @@ -206,17 +209,20 @@ public class BaseRelationService implements RelationService { relations -> { List> results = deleteRelationGroupsAsync(tenantId, relations, cache, true); return Futures.allAsList(results); - }); + }, MoreExecutors.directExecutor()); ListenableFuture> outboundDeletions = Futures.transformAsync(outboundRelations, relations -> { List> results = deleteRelationGroupsAsync(tenantId, relations, cache, false); return Futures.allAsList(results); - }); + }, MoreExecutors.directExecutor()); ListenableFuture>> deletionsFuture = Futures.allAsList(inboundDeletions, outboundDeletions); - return Futures.transform(Futures.transformAsync(deletionsFuture, (deletions) -> relationDao.deleteOutboundRelationsAsync(tenantId, entityId)), result -> null); + return Futures.transform(Futures.transformAsync(deletionsFuture, + (deletions) -> relationDao.deleteOutboundRelationsAsync(tenantId, entityId), + MoreExecutors.directExecutor()), + result -> null, MoreExecutors.directExecutor()); } private List> deleteRelationGroupsAsync(TenantId tenantId, List> relations, Cache cache, boolean deleteFromDb) { @@ -306,9 +312,11 @@ public class BaseRelationService implements RelationService { public void onSuccess(@Nullable List result) { cache.putIfAbsent(fromAndTypeGroup, result); } + @Override - public void onFailure(Throwable t) {} - }); + public void onFailure(Throwable t) { + } + }, MoreExecutors.directExecutor()); return relationsFuture; } } @@ -328,7 +336,7 @@ public class BaseRelationService implements RelationService { EntityRelationInfo::setToName)) ); return Futures.successfulAsList(futures); - }); + }, MoreExecutors.directExecutor()); } @Cacheable(cacheNames = RELATIONS_CACHE, key = "{#from, #relationType, #typeGroup, 'FROM'}") @@ -385,9 +393,11 @@ public class BaseRelationService implements RelationService { public void onSuccess(@Nullable List result) { cache.putIfAbsent(toAndTypeGroup, result); } + @Override - public void onFailure(Throwable t) {} - }); + public void onFailure(Throwable t) { + } + }, MoreExecutors.directExecutor()); return relationsFuture; } } @@ -407,7 +417,7 @@ public class BaseRelationService implements RelationService { EntityRelationInfo::setFromName)) ); return Futures.successfulAsList(futures); - }); + }, MoreExecutors.directExecutor()); } private ListenableFuture fetchRelationInfoAsync(TenantId tenantId, EntityRelation relation, @@ -418,7 +428,7 @@ public class BaseRelationService implements RelationService { EntityRelationInfo entityRelationInfo1 = new EntityRelationInfo(relation); entityNameSetter.accept(entityRelationInfo1, entityName1); return entityRelationInfo1; - }); + }, MoreExecutors.directExecutor()); } @Cacheable(cacheNames = RELATIONS_CACHE, key = "{#to, #relationType, #typeGroup, 'TO'}") @@ -466,7 +476,7 @@ public class BaseRelationService implements RelationService { } } return relations; - }); + }, MoreExecutors.directExecutor()); } catch (Exception e) { log.warn("Failed to query relations: [{}]", query, e); throw new RuntimeException(e); @@ -493,7 +503,7 @@ public class BaseRelationService implements RelationService { })) ); return Futures.successfulAsList(futures); - }); + }, MoreExecutors.directExecutor()); } protected void validate(EntityRelation relation) { @@ -600,7 +610,7 @@ public class BaseRelationService implements RelationService { } //TODO: try to remove this blocking operation List> relations = Futures.successfulAsList(futures).get(); - if (fetchLastLevelOnly && lvl > 0){ + if (fetchLastLevelOnly && lvl > 0) { children.clear(); } relations.forEach(r -> r.forEach(children::add)); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java index e00d73444b..356781d297 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java @@ -17,6 +17,7 @@ package org.thingsboard.server.dao.sql.alarm; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; @@ -108,9 +109,9 @@ public class JpaAlarmDao extends JpaAbstractDao implements A for (EntityRelation relation : input) { alarmFutures.add(Futures.transform( findAlarmByIdAsync(tenantId, relation.getTo().getId()), - AlarmInfo::new)); + AlarmInfo::new, MoreExecutors.directExecutor())); } return Futures.successfulAsList(alarmFutures); - }); + }, MoreExecutors.directExecutor()); } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java index 64fe4af86b..aa80e8b5e4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java @@ -17,6 +17,7 @@ package org.thingsboard.server.dao.sql.dashboard; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; @@ -91,6 +92,6 @@ public class JpaDashboardInfoDao extends JpaAbstractSearchTextDao> entitiesFutures) { diff --git a/dao/src/main/java/org/thingsboard/server/dao/sqlts/AbstractSqlTimeseriesDao.java b/dao/src/main/java/org/thingsboard/server/dao/sqlts/AbstractSqlTimeseriesDao.java index 16828ee8e2..a9277ec7e2 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sqlts/AbstractSqlTimeseriesDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sqlts/AbstractSqlTimeseriesDao.java @@ -20,6 +20,7 @@ import com.google.common.collect.Lists; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.hibernate.exception.ConstraintViolationException; import org.springframework.beans.factory.annotation.Autowired; @@ -235,7 +236,7 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx public void onFailure(Throwable t) { log.warn("[{}] Failed to process remove of the latest value", entityId, t); } - }); + }, MoreExecutors.directExecutor()); return resultFuture; } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sqlts/timescale/TimescaleTimeseriesDao.java b/dao/src/main/java/org/thingsboard/server/dao/sqlts/timescale/TimescaleTimeseriesDao.java index 176bc712e8..4ca53a337b 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sqlts/timescale/TimescaleTimeseriesDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sqlts/timescale/TimescaleTimeseriesDao.java @@ -17,6 +17,7 @@ package org.thingsboard.server.dao.sqlts.timescale; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.SettableFuture; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -143,7 +144,7 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements } else { return Collections.emptyList(); } - }); + }, MoreExecutors.directExecutor()); } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/timeseries/CassandraBaseTimeseriesDao.java b/dao/src/main/java/org/thingsboard/server/dao/timeseries/CassandraBaseTimeseriesDao.java index 8fc8b4ab8a..b96462e350 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/timeseries/CassandraBaseTimeseriesDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/timeseries/CassandraBaseTimeseriesDao.java @@ -28,6 +28,7 @@ import com.google.common.util.concurrent.AsyncFunction; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -330,7 +331,7 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem stmt.setInt(6, (int) ttl); } futures.add(getFuture(executeAsyncWrite(tenantId, stmt), rs -> null)); - return Futures.transform(Futures.allAsList(futures), result -> null); + return Futures.transform(Futures.allAsList(futures), result -> null, MoreExecutors.directExecutor()); } private void processSetNullValues(TenantId tenantId, EntityId entityId, TsKvEntry tsKvEntry, long ttl, List> futures, long partition, DataType type) { @@ -545,7 +546,7 @@ public class CassandraBaseTimeseriesDao extends CassandraAbstractAsyncDao implem public void onFailure(Throwable t) { log.warn("[{}] Failed to process remove of the latest value", entityId, t); } - }); + }, MoreExecutors.directExecutor()); return resultFuture; } diff --git a/dao/src/test/java/org/thingsboard/server/dao/nosql/RateLimitedResultSetFutureTest.java b/dao/src/test/java/org/thingsboard/server/dao/nosql/RateLimitedResultSetFutureTest.java index 76847c0e80..bb4a08a8f1 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/nosql/RateLimitedResultSetFutureTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/nosql/RateLimitedResultSetFutureTest.java @@ -119,7 +119,7 @@ public class RateLimitedResultSetFutureTest { resultSetFuture = new RateLimitedResultSetFuture(session, rateLimiter, statement); - ListenableFuture transform = Futures.transform(resultSetFuture, ResultSet::one); + ListenableFuture transform = Futures.transform(resultSetFuture, ResultSet::one, MoreExecutors.directExecutor()); Row actualRow = transform.get(); assertSame(row, actualRow); @@ -132,7 +132,7 @@ public class RateLimitedResultSetFutureTest { when(rateLimiter.acquireAsync()).thenReturn(Futures.immediateFuture(null)); when(session.executeAsync(statement)).thenThrow(new UnsupportedFeatureException(ProtocolVersion.V3, "hjg")); resultSetFuture = new RateLimitedResultSetFuture(session, rateLimiter, statement); - ListenableFuture transform = Futures.transform(resultSetFuture, ResultSet::one); + ListenableFuture transform = Futures.transform(resultSetFuture, ResultSet::one, MoreExecutors.directExecutor()); try { transform.get(); fail(); @@ -156,7 +156,7 @@ public class RateLimitedResultSetFutureTest { when(realFuture.get()).thenThrow(new ExecutionException("Fail", new TimeoutException("timeout"))); resultSetFuture = new RateLimitedResultSetFuture(session, rateLimiter, statement); - ListenableFuture transform = Futures.transform(resultSetFuture, ResultSet::one); + ListenableFuture transform = Futures.transform(resultSetFuture, ResultSet::one, MoreExecutors.directExecutor()); try { transform.get(); fail(); @@ -177,7 +177,7 @@ public class RateLimitedResultSetFutureTest { when(rateLimiter.acquireAsync()).thenReturn(future); resultSetFuture = new RateLimitedResultSetFuture(session, rateLimiter, statement); - ListenableFuture transform = Futures.transform(resultSetFuture, ResultSet::one); + ListenableFuture transform = Futures.transform(resultSetFuture, ResultSet::one, MoreExecutors.directExecutor()); // TimeUnit.MILLISECONDS.sleep(200); future.cancel(false); latch.countDown(); diff --git a/pom.xml b/pom.xml index 547c97448f..ab7e658abf 100755 --- a/pom.xml +++ b/pom.xml @@ -44,7 +44,7 @@ 3.6.0 3.5.0.1 1.2.7 - 21.0 + 28.2-jre 2.6.1 3.4 1.6 @@ -63,7 +63,7 @@ 1.4.3 4.2.0 3.5.5 - 3.6.1 + 3.11.4 1.22.1 1.16.18 1.1.0 diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractRelationActionNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractRelationActionNode.java index bcfabf1100..3d2cb5d8c8 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractRelationActionNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractRelationActionNode.java @@ -20,6 +20,7 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -54,9 +55,9 @@ import java.util.List; import java.util.Optional; import java.util.concurrent.TimeUnit; +import static org.thingsboard.common.util.DonAsynchron.withCallback; import static org.thingsboard.rule.engine.api.TbRelationTypes.FAILURE; import static org.thingsboard.rule.engine.api.TbRelationTypes.SUCCESS; -import static org.thingsboard.common.util.DonAsynchron.withCallback; @Slf4j public abstract class TbAbstractRelationActionNode implements TbNode { @@ -86,7 +87,7 @@ public abstract class TbAbstractRelationActionNode processEntityRelationAction(TbContext ctx, TbMsg msg) { - return Futures.transformAsync(getEntity(ctx, msg), entityContainer -> doProcessEntityRelationAction(ctx, msg, entityContainer)); + return Futures.transformAsync(getEntity(ctx, msg), entityContainer -> doProcessEntityRelationAction(ctx, msg, entityContainer), MoreExecutors.directExecutor()); } protected abstract boolean createEntityIfNotExists(); diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbClearAlarmNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbClearAlarmNode.java index d787d6b7ab..63fb59bed5 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbClearAlarmNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbClearAlarmNode.java @@ -18,12 +18,13 @@ package org.thingsboard.rule.engine.action; import com.fasterxml.jackson.databind.JsonNode; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; -import org.thingsboard.rule.engine.api.util.TbNodeUtils; import org.thingsboard.rule.engine.api.RuleNode; import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.rule.engine.api.TbNodeException; +import org.thingsboard.rule.engine.api.util.TbNodeUtils; import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.AlarmStatus; import org.thingsboard.server.common.data.plugin.ComponentType; @@ -80,8 +81,8 @@ public class TbClearAlarmNode extends TbAbstractAlarmNode createNewAlarm(TbContext ctx, TbMsg msg, Alarm msgAlarm) { ListenableFuture asyncAlarm; if (msgAlarm != null) { - asyncAlarm = Futures.immediateCheckedFuture(msgAlarm); + asyncAlarm = Futures.immediateFuture(msgAlarm); } else { ctx.logJsEvalRequest(); asyncAlarm = Futures.transform(buildAlarmDetails(ctx, msg, null), details -> { ctx.logJsEvalResponse(); return buildAlarm(msg, details, ctx.getTenantId()); - }); + }, MoreExecutors.directExecutor()); } ListenableFuture asyncCreated = Futures.transform(asyncAlarm, alarm -> ctx.getAlarmService().createOrUpdateAlarm(alarm), ctx.getDbCallbackExecutor()); - return Futures.transform(asyncCreated, alarm -> new AlarmResult(true, false, false, alarm)); + return Futures.transform(asyncCreated, alarm -> new AlarmResult(true, false, false, alarm), MoreExecutors.directExecutor()); } private ListenableFuture updateAlarm(TbContext ctx, TbMsg msg, Alarm existingAlarm, Alarm msgAlarm) { @@ -140,7 +141,7 @@ public class TbCreateAlarmNode extends TbAbstractAlarmNode new AlarmResult(false, true, false, a)); + return Futures.transform(asyncUpdated, a -> new AlarmResult(false, true, false, a), MoreExecutors.directExecutor()); } private Alarm buildAlarm(TbMsg msg, JsonNode details, TenantId tenantId) { diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateRelationNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateRelationNode.java index ee6966f588..de74551c22 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateRelationNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateRelationNode.java @@ -17,6 +17,7 @@ package org.thingsboard.rule.engine.action; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.thingsboard.rule.engine.api.RuleNode; import org.thingsboard.rule.engine.api.TbContext; @@ -81,7 +82,7 @@ public class TbCreateRelationNode extends TbAbstractRelationActionNode createIfAbsent(TbContext ctx, TbMsg msg, EntityContainer entityContainer) { @@ -120,7 +121,7 @@ public class TbCreateRelationNode extends TbAbstractRelationActionNode false); + return Futures.transform(Futures.allAsList(list), result -> false, MoreExecutors.directExecutor()); } return Futures.immediateFuture(false); }, ctx.getDbCallbackExecutor()); @@ -161,7 +162,7 @@ public class TbCreateRelationNode extends TbAbstractRelationActionNode processAsset(TbContext ctx, EntityContainer entityContainer, SearchDirectionIds sdId) { diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbDeleteRelationNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbDeleteRelationNode.java index 671829f63f..9af3708fcd 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbDeleteRelationNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbDeleteRelationNode.java @@ -17,6 +17,7 @@ package org.thingsboard.rule.engine.action; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.thingsboard.rule.engine.api.RuleNode; import org.thingsboard.rule.engine.api.TbContext; @@ -66,17 +67,18 @@ public class TbDeleteRelationNode extends TbAbstractRelationActionNode doProcessEntityRelationAction(TbContext ctx, TbMsg msg, EntityContainer entityContainer) { - return Futures.transform(processSingle(ctx, msg, entityContainer), result -> new RelationContainer(msg, result)); + return Futures.transform(processSingle(ctx, msg, entityContainer), result -> new RelationContainer(msg, result), MoreExecutors.directExecutor()); } private ListenableFuture getRelationContainerListenableFuture(TbContext ctx, TbMsg msg) { relationType = processPattern(msg, config.getRelationType()); if (config.isDeleteForSingleEntity()) { - return Futures.transformAsync(getEntity(ctx, msg), entityContainer -> doProcessEntityRelationAction(ctx, msg, entityContainer)); + return Futures.transformAsync(getEntity(ctx, msg), entityContainer -> doProcessEntityRelationAction(ctx, msg, entityContainer), MoreExecutors.directExecutor()); } else { - return Futures.transform(processList(ctx, msg), result -> new RelationContainer(msg, result)); + return Futures.transform(processList(ctx, msg), result -> new RelationContainer(msg, result), MoreExecutors.directExecutor()); } } + private ListenableFuture processList(TbContext ctx, TbMsg msg) { return Futures.transformAsync(processListSearchDirection(ctx, msg), entityRelations -> { if (entityRelations.isEmpty()) { @@ -93,9 +95,9 @@ public class TbDeleteRelationNode extends TbAbstractRelationActionNode processSingle(TbContext ctx, TbMsg msg, EntityContainer entityContainer) { @@ -106,7 +108,7 @@ public class TbDeleteRelationNode extends TbAbstractRelationActionNode processSingleDeleteRelation(TbContext ctx, SearchDirectionIds sdId) { diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckAlarmStatusNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckAlarmStatusNode.java index e0ec9300d4..086e3aded0 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckAlarmStatusNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckAlarmStatusNode.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.thingsboard.rule.engine.api.RuleNode; import org.thingsboard.rule.engine.api.TbContext; @@ -27,17 +28,12 @@ import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.rule.engine.api.TbNodeException; import org.thingsboard.rule.engine.api.util.TbNodeUtils; import org.thingsboard.server.common.data.alarm.Alarm; -import org.thingsboard.server.common.data.alarm.AlarmId; import org.thingsboard.server.common.data.alarm.AlarmStatus; import org.thingsboard.server.common.data.plugin.ComponentType; import org.thingsboard.server.common.msg.TbMsg; import javax.annotation.Nullable; import java.io.IOException; -import java.util.UUID; - -import static org.thingsboard.rule.engine.api.TbRelationTypes.FAILURE; -import static org.thingsboard.rule.engine.api.TbRelationTypes.SUCCESS; @Slf4j @RuleNode( @@ -91,7 +87,7 @@ public class TbCheckAlarmStatusNode implements TbNode { public void onFailure(Throwable t) { ctx.tellFailure(msg, t); } - }); + }, MoreExecutors.directExecutor()); } catch (IOException e) { log.error("Failed to parse alarm: [{}]", msg.getData()); throw new TbNodeException(e); diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckRelationNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckRelationNode.java index 8fb64bbadf..89cd986b7e 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckRelationNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckRelationNode.java @@ -17,6 +17,7 @@ package org.thingsboard.rule.engine.filter; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.thingsboard.rule.engine.api.RuleNode; import org.thingsboard.rule.engine.api.TbContext; @@ -87,10 +88,10 @@ public class TbCheckRelationNode implements TbNode { private ListenableFuture processList(TbContext ctx, TbMsg msg) { if (EntitySearchDirection.FROM.name().equals(config.getDirection())) { return Futures.transformAsync(ctx.getRelationService() - .findByToAndTypeAsync(ctx.getTenantId(), msg.getOriginator(), config.getRelationType(), RelationTypeGroup.COMMON), this::isEmptyList); + .findByToAndTypeAsync(ctx.getTenantId(), msg.getOriginator(), config.getRelationType(), RelationTypeGroup.COMMON), this::isEmptyList, MoreExecutors.directExecutor()); } else { return Futures.transformAsync(ctx.getRelationService() - .findByFromAndTypeAsync(ctx.getTenantId(), msg.getOriginator(), config.getRelationType(), RelationTypeGroup.COMMON), this::isEmptyList); + .findByFromAndTypeAsync(ctx.getTenantId(), msg.getOriginator(), config.getRelationType(), RelationTypeGroup.COMMON), this::isEmptyList, MoreExecutors.directExecutor()); } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbAbstractGetAttributesNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbAbstractGetAttributesNode.java index be4e6b4e30..0bf1c23cc7 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbAbstractGetAttributesNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbAbstractGetAttributesNode.java @@ -21,6 +21,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import com.google.gson.JsonParseException; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; @@ -122,7 +123,7 @@ public abstract class TbAbstractGetAttributesNode putLatestTelemetry(TbContext ctx, EntityId entityId, TbMsg msg, String scope, List keys, ConcurrentHashMap> failuresMap) { @@ -152,7 +153,7 @@ public abstract class TbAbstractGetAttributesNode implements TbNode { private static final Gson gson = new Gson(); private static final JsonParser jsonParser = new JsonParser(); - private static final Type TYPE = new TypeToken>() {}.getType(); + private static final Type TYPE = new TypeToken>() { + }.getType(); protected C config; @@ -104,7 +106,7 @@ public abstract class TbAbstractGetEntityDetailsNode addContactProperties(JsonElement data, ListenableFuture entityFuture, EntityDetails entityDetails, String prefix) { @@ -114,7 +116,7 @@ public abstract class TbAbstractGetEntityDetailsNode implements TbNode } private void safeGetAttributes(TbContext ctx, TbMsg msg, T entityId) { - if(entityId == null || entityId.isNullUid()) { + if (entityId == null || entityId.isNullUid()) { ctx.tellNext(msg, FAILURE); return; } @@ -73,13 +74,13 @@ public abstract class TbEntityGetAttrNode implements TbNode private ListenableFuture> getAttributesAsync(TbContext ctx, EntityId entityId) { ListenableFuture> latest = ctx.getAttributesService().find(ctx.getTenantId(), entityId, SERVER_SCOPE, config.getAttrMapping().keySet()); return Futures.transform(latest, l -> - l.stream().map(i -> (KvEntry) i).collect(Collectors.toList())); + l.stream().map(i -> (KvEntry) i).collect(Collectors.toList()), MoreExecutors.directExecutor()); } private ListenableFuture> getLatestTelemetry(TbContext ctx, EntityId entityId) { ListenableFuture> latest = ctx.getTimeseriesService().findLatest(ctx.getTenantId(), entityId, config.getAttrMapping().keySet()); return Futures.transform(latest, l -> - l.stream().map(i -> (KvEntry) i).collect(Collectors.toList())); + l.stream().map(i -> (KvEntry) i).collect(Collectors.toList()), MoreExecutors.directExecutor()); } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNode.java index 861e7330c5..f185d02965 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetCustomerDetailsNode.java @@ -17,6 +17,7 @@ package org.thingsboard.rule.engine.metadata; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import lombok.extern.slf4j.Slf4j; import org.thingsboard.rule.engine.api.RuleNode; import org.thingsboard.rule.engine.api.TbContext; @@ -63,7 +64,7 @@ public class TbGetCustomerDetailsNode extends TbAbstractGetEntityDetailsNode getCustomer(TbContext ctx, TbMsg msg) { @@ -79,7 +80,7 @@ public class TbGetCustomerDetailsNode extends TbAbstractGetEntityDetailsNode { if (asset != null) { @@ -91,7 +92,7 @@ public class TbGetCustomerDetailsNode extends TbAbstractGetEntityDetailsNode { if (entityView != null) { @@ -103,7 +104,7 @@ public class TbGetCustomerDetailsNode extends TbAbstractGetEntityDetailsNode { return in != null ? Futures.immediateFuture(in.getOriginator()) : Futures.immediateFuture(null); - }); + }, MoreExecutors.directExecutor()); } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesCustomerIdAsyncLoader.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesCustomerIdAsyncLoader.java index ae1b54fffd..602ea8452b 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesCustomerIdAsyncLoader.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesCustomerIdAsyncLoader.java @@ -15,13 +15,17 @@ */ package org.thingsboard.rule.engine.util; -import com.google.common.util.concurrent.AsyncFunction; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbNodeException; import org.thingsboard.server.common.data.HasCustomerId; -import org.thingsboard.server.common.data.id.*; +import org.thingsboard.server.common.data.id.AssetId; +import org.thingsboard.server.common.data.id.CustomerId; +import org.thingsboard.server.common.data.id.DeviceId; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.UserId; public class EntitiesCustomerIdAsyncLoader { @@ -44,6 +48,6 @@ public class EntitiesCustomerIdAsyncLoader { private static ListenableFuture getCustomerAsync(ListenableFuture future) { return Futures.transformAsync(future, in -> in != null ? Futures.immediateFuture(in.getCustomerId()) - : Futures.immediateFuture(null)); + : Futures.immediateFuture(null), MoreExecutors.directExecutor()); } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesFieldsAsyncLoader.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesFieldsAsyncLoader.java index 74d586e1a7..a0a1c8629f 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesFieldsAsyncLoader.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesFieldsAsyncLoader.java @@ -17,6 +17,7 @@ package org.thingsboard.rule.engine.util; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbNodeException; import org.thingsboard.server.common.data.BaseData; @@ -66,6 +67,6 @@ public class EntitiesFieldsAsyncLoader { ListenableFuture future, Function converter) { return Futures.transformAsync(future, in -> in != null ? Futures.immediateFuture(converter.apply(in)) - : Futures.immediateFailedFuture(new RuntimeException("Entity not found!"))); + : Futures.immediateFailedFuture(new RuntimeException("Entity not found!")), MoreExecutors.directExecutor()); } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesRelatedDeviceIdAsyncLoader.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesRelatedDeviceIdAsyncLoader.java index b264bede07..e06113df8e 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesRelatedDeviceIdAsyncLoader.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesRelatedDeviceIdAsyncLoader.java @@ -15,9 +15,9 @@ */ package org.thingsboard.rule.engine.util; -import com.google.common.util.concurrent.AsyncFunction; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import org.apache.commons.collections.CollectionUtils; import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.data.DeviceRelationsQuery; @@ -40,7 +40,7 @@ public class EntitiesRelatedDeviceIdAsyncLoader { ListenableFuture> asyncDevices = deviceService.findDevicesByQuery(ctx.getTenantId(), query); return Futures.transformAsync(asyncDevices, d -> CollectionUtils.isNotEmpty(d) ? Futures.immediateFuture(d.get(0).getId()) - : Futures.immediateFuture(null)); + : Futures.immediateFuture(null), MoreExecutors.directExecutor()); } private static DeviceSearchQuery buildQuery(EntityId originator, DeviceRelationsQuery deviceRelationsQuery) { diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesRelatedEntityIdAsyncLoader.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesRelatedEntityIdAsyncLoader.java index 39b2817761..a478b6b903 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesRelatedEntityIdAsyncLoader.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesRelatedEntityIdAsyncLoader.java @@ -15,9 +15,9 @@ */ package org.thingsboard.rule.engine.util; -import com.google.common.util.concurrent.AsyncFunction; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import org.apache.commons.collections.CollectionUtils; import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.data.RelationsQuery; @@ -39,10 +39,10 @@ public class EntitiesRelatedEntityIdAsyncLoader { ListenableFuture> asyncRelation = relationService.findByQuery(ctx.getTenantId(), query); if (relationsQuery.getDirection() == EntitySearchDirection.FROM) { return Futures.transformAsync(asyncRelation, r -> CollectionUtils.isNotEmpty(r) ? Futures.immediateFuture(r.get(0).getTo()) - : Futures.immediateFuture(null)); + : Futures.immediateFuture(null), MoreExecutors.directExecutor()); } else if (relationsQuery.getDirection() == EntitySearchDirection.TO) { return Futures.transformAsync(asyncRelation, r -> CollectionUtils.isNotEmpty(r) ? Futures.immediateFuture(r.get(0).getFrom()) - : Futures.immediateFuture(null)); + : Futures.immediateFuture(null), MoreExecutors.directExecutor()); } return Futures.immediateFailedFuture(new IllegalStateException("Unknown direction")); } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesTenantIdAsyncLoader.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesTenantIdAsyncLoader.java index 1a2ff9a1c1..3ff25e1e8b 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesTenantIdAsyncLoader.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/util/EntitiesTenantIdAsyncLoader.java @@ -15,14 +15,20 @@ */ package org.thingsboard.rule.engine.util; -import com.google.common.util.concurrent.AsyncFunction; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbNodeException; import org.thingsboard.server.common.data.HasTenantId; import org.thingsboard.server.common.data.alarm.AlarmId; -import org.thingsboard.server.common.data.id.*; +import org.thingsboard.server.common.data.id.AssetId; +import org.thingsboard.server.common.data.id.CustomerId; +import org.thingsboard.server.common.data.id.DeviceId; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.RuleChainId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.id.UserId; public class EntitiesTenantIdAsyncLoader { @@ -51,6 +57,7 @@ public class EntitiesTenantIdAsyncLoader { private static ListenableFuture getTenantAsync(ListenableFuture future) { return Futures.transformAsync(future, in -> { return in != null ? Futures.immediateFuture(in.getTenantId()) - : Futures.immediateFuture(null);}); + : Futures.immediateFuture(null); + }, MoreExecutors.directExecutor()); } } From aabc22d7d2101d0a89908c02eb6e169a9066a02f Mon Sep 17 00:00:00 2001 From: VoBa Date: Tue, 10 Mar 2020 16:52:50 +0200 Subject: [PATCH 2/4] Non root docker user (#2460) * Non root docker user * Fixes for user - signle user for all services * Base image changed * Fixes for pvc removal * Moved to be in sync with PE * Changed to TB repository --- .../src/main/scripts/control/deb/postinst | 4 ++-- .../src/main/scripts/control/deb/preinst | 10 ++++---- .../src/main/scripts/control/rpm/postinst | 4 ++-- .../main/scripts/control/thingsboard.service | 2 +- .../src/main/scripts/install/install.sh | 2 +- .../src/main/scripts/install/upgrade.sh | 2 +- docker/README.md | 7 ++++++ docker/docker-create-log-folders.sh | 24 +++++++++++++++++++ k8s/database-setup.yml | 2 +- k8s/k8s-delete-all.sh | 4 +++- k8s/k8s-install-tb.sh | 2 +- k8s/k8s-upgrade-tb.sh | 2 +- k8s/postgres.yml | 2 ++ msa/js-executor/docker/Dockerfile | 4 +++- msa/js-executor/docker/start-js-executor.sh | 4 +++- msa/js-executor/pom.xml | 1 - msa/tb-node/docker/Dockerfile | 4 ++++ msa/tb-node/docker/start-tb-node.sh | 4 +++- msa/tb-node/pom.xml | 1 - msa/tb/pom.xml | 1 - msa/transport/coap/docker/Dockerfile | 2 ++ .../coap/docker/start-tb-coap-transport.sh | 2 ++ msa/transport/coap/pom.xml | 1 - msa/transport/http/docker/Dockerfile | 2 ++ .../http/docker/start-tb-http-transport.sh | 2 ++ msa/transport/http/pom.xml | 1 - msa/transport/mqtt/docker/Dockerfile | 2 ++ .../mqtt/docker/start-tb-mqtt-transport.sh | 2 ++ msa/transport/mqtt/pom.xml | 1 - msa/web-ui/docker/Dockerfile | 4 +++- msa/web-ui/docker/start-web-ui.sh | 4 +++- msa/web-ui/pom.xml | 1 - pom.xml | 1 + .../src/main/scripts/control/deb/postinst | 4 ++-- .../coap/src/main/scripts/control/deb/preinst | 10 ++++---- .../src/main/scripts/control/rpm/postinst | 4 ++-- .../scripts/control/tb-coap-transport.service | 2 +- .../src/main/scripts/control/deb/postinst | 4 ++-- .../http/src/main/scripts/control/deb/preinst | 10 ++++---- .../src/main/scripts/control/rpm/postinst | 4 ++-- .../scripts/control/tb-http-transport.service | 2 +- .../src/main/scripts/control/deb/postinst | 4 ++-- .../mqtt/src/main/scripts/control/deb/preinst | 10 ++++---- .../src/main/scripts/control/rpm/postinst | 4 ++-- .../scripts/control/tb-mqtt-transport.service | 2 +- 45 files changed, 113 insertions(+), 58 deletions(-) create mode 100755 docker/docker-create-log-folders.sh diff --git a/application/src/main/scripts/control/deb/postinst b/application/src/main/scripts/control/deb/postinst index 00979d1b1c..b59dff9252 100644 --- a/application/src/main/scripts/control/deb/postinst +++ b/application/src/main/scripts/control/deb/postinst @@ -2,8 +2,8 @@ set -e -chown -R ${pkg.name}: ${pkg.logFolder} -chown -R ${pkg.name}: ${pkg.installFolder} +chown -R ${pkg.user}: ${pkg.logFolder} +chown -R ${pkg.user}: ${pkg.installFolder} systemctl --no-reload enable ${pkg.name}.service >/dev/null 2>&1 || : exit 0 diff --git a/application/src/main/scripts/control/deb/preinst b/application/src/main/scripts/control/deb/preinst index ba4f417beb..eebe378588 100644 --- a/application/src/main/scripts/control/deb/preinst +++ b/application/src/main/scripts/control/deb/preinst @@ -2,21 +2,21 @@ set -e -if ! getent group ${pkg.name} >/dev/null; then - addgroup --system ${pkg.name} +if ! getent group ${pkg.user} >/dev/null; then + addgroup --system ${pkg.user} fi -if ! getent passwd ${pkg.name} >/dev/null; then +if ! getent passwd ${pkg.user} >/dev/null; then adduser --quiet \ --system \ - --ingroup ${pkg.name} \ + --ingroup ${pkg.user} \ --quiet \ --disabled-login \ --disabled-password \ --home ${pkg.installFolder} \ --no-create-home \ -gecos "Thingsboard application" \ - ${pkg.name} + ${pkg.user} fi exit 0 \ No newline at end of file diff --git a/application/src/main/scripts/control/rpm/postinst b/application/src/main/scripts/control/rpm/postinst index 8a7a88f7e0..d8021e2dd9 100644 --- a/application/src/main/scripts/control/rpm/postinst +++ b/application/src/main/scripts/control/rpm/postinst @@ -1,7 +1,7 @@ #!/bin/sh -chown -R ${pkg.name}: ${pkg.logFolder} -chown -R ${pkg.name}: ${pkg.installFolder} +chown -R ${pkg.user}: ${pkg.logFolder} +chown -R ${pkg.user}: ${pkg.installFolder} if [ $1 -eq 1 ] ; then # Initial installation diff --git a/application/src/main/scripts/control/thingsboard.service b/application/src/main/scripts/control/thingsboard.service index d456fc03c0..3fee5c88df 100644 --- a/application/src/main/scripts/control/thingsboard.service +++ b/application/src/main/scripts/control/thingsboard.service @@ -3,7 +3,7 @@ Description=${pkg.name} After=syslog.target [Service] -User=${pkg.name} +User=${pkg.user} ExecStart=${pkg.installFolder}/bin/${pkg.name}.jar SuccessExitStatus=143 diff --git a/application/src/main/scripts/install/install.sh b/application/src/main/scripts/install/install.sh index eb6025a261..acea08efde 100755 --- a/application/src/main/scripts/install/install.sh +++ b/application/src/main/scripts/install/install.sh @@ -44,7 +44,7 @@ installDir=${pkg.installFolder}/data source "${CONF_FOLDER}/${configfile}" -run_user=${pkg.name} +run_user=${pkg.user} su -s /bin/sh -c "java -cp ${jarfile} $JAVA_OPTS -Dloader.main=org.thingsboard.server.ThingsboardInstallApplication \ -Dinstall.data_dir=${installDir} \ diff --git a/application/src/main/scripts/install/upgrade.sh b/application/src/main/scripts/install/upgrade.sh index d4a49f8094..068276f2cb 100755 --- a/application/src/main/scripts/install/upgrade.sh +++ b/application/src/main/scripts/install/upgrade.sh @@ -43,7 +43,7 @@ installDir=${pkg.installFolder}/data source "${CONF_FOLDER}/${configfile}" -run_user=${pkg.name} +run_user=${pkg.user} su -s /bin/sh -c "java -cp ${jarfile} $JAVA_OPTS -Dloader.main=org.thingsboard.server.ThingsboardInstallApplication \ -Dinstall.data_dir=${installDir} \ diff --git a/docker/README.md b/docker/README.md index d4655f8863..ff61c2599b 100644 --- a/docker/README.md +++ b/docker/README.md @@ -17,6 +17,13 @@ In order to set database type change the value of `DATABASE` variable in `.env` **NOTE**: According to the database type corresponding docker service will be deployed (see `docker-compose.postgres.yml`, `docker-compose.cassandra.yml` for details). +Execute the following command to create log folders for the services and chown of these folders to the docker container users. +To be able to change user, **chown** command is used, which requires sudo permissions (script will request password for a sudo access): + +` +$ ./docker-create-log-folders.sh +` + Execute the following command to run installation: ` diff --git a/docker/docker-create-log-folders.sh b/docker/docker-create-log-folders.sh new file mode 100755 index 0000000000..1ac4539b30 --- /dev/null +++ b/docker/docker-create-log-folders.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# +# Copyright © 2016-2020 The Thingsboard Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +mkdir -p tb-node/log/ && sudo chown -R 799:799 tb-node/log/ + +mkdir -p tb-transports/coap/log && sudo chown -R 799:799 tb-transports/coap/log + +mkdir -p tb-transports/http/log && sudo chown -R 799:799 tb-transports/http/log + +mkdir -p tb-transports/mqtt/log && sudo chown -R 799:799 tb-transports/mqtt/log \ No newline at end of file diff --git a/k8s/database-setup.yml b/k8s/database-setup.yml index b48d6baf2b..d6f08d89bd 100644 --- a/k8s/database-setup.yml +++ b/k8s/database-setup.yml @@ -39,5 +39,5 @@ spec: volumeMounts: - mountPath: /config name: tb-node-config - command: ['sh', '-c', 'while [ ! -f /install-finished ]; do sleep 2; done;'] + command: ['sh', '-c', 'while [ ! -f /tmp/install-finished ]; do sleep 2; done;'] restartPolicy: Never diff --git a/k8s/k8s-delete-all.sh b/k8s/k8s-delete-all.sh index b0373b42f3..c5f531532c 100755 --- a/k8s/k8s-delete-all.sh +++ b/k8s/k8s-delete-all.sh @@ -15,4 +15,6 @@ # limitations under the License. # -kubectl -n thingsboard delete svc,sts,deploy,pv,pvc,cm,po,ing --all +kubectl -n thingsboard delete svc,sts,deploy,cm,po,ing --all + +kubectl -n thingsboard get pvc --no-headers=true | awk '//{print $1}' | xargs kubectl -n thingsboard delete --ignore-not-found=true pvc \ No newline at end of file diff --git a/k8s/k8s-install-tb.sh b/k8s/k8s-install-tb.sh index c13c8176ee..1702a5b3b5 100755 --- a/k8s/k8s-install-tb.sh +++ b/k8s/k8s-install-tb.sh @@ -22,7 +22,7 @@ function installTb() { kubectl apply -f tb-node-configmap.yml kubectl apply -f database-setup.yml && kubectl wait --for=condition=Ready pod/tb-db-setup --timeout=120s && - kubectl exec tb-db-setup -- sh -c 'export INSTALL_TB=true; export LOAD_DEMO='"$loadDemo"'; start-tb-node.sh; touch /install-finished;' + kubectl exec tb-db-setup -- sh -c 'export INSTALL_TB=true; export LOAD_DEMO='"$loadDemo"'; start-tb-node.sh; touch /tmp/install-finished;' kubectl delete pod tb-db-setup diff --git a/k8s/k8s-upgrade-tb.sh b/k8s/k8s-upgrade-tb.sh index a7d94174d4..a97db5ea97 100755 --- a/k8s/k8s-upgrade-tb.sh +++ b/k8s/k8s-upgrade-tb.sh @@ -38,6 +38,6 @@ fi kubectl apply -f database-setup.yml && kubectl wait --for=condition=Ready pod/tb-db-setup --timeout=120s && -kubectl exec tb-db-setup -- sh -c 'export UPGRADE_TB=true; export FROM_VERSION='"$fromVersion"'; start-tb-node.sh; touch /install-finished;' +kubectl exec tb-db-setup -- sh -c 'export UPGRADE_TB=true; export FROM_VERSION='"$fromVersion"'; start-tb-node.sh; touch /tmp/install-finished;' kubectl delete pod tb-db-setup diff --git a/k8s/postgres.yml b/k8s/postgres.yml index 56679ff880..08c7fe8d66 100644 --- a/k8s/postgres.yml +++ b/k8s/postgres.yml @@ -58,6 +58,8 @@ spec: env: - name: POSTGRES_DB value: "thingsboard" + - name: POSTGRES_PASSWORD + value: "postgres" - name: PGDATA value: /var/lib/postgresql/data/pgdata volumeMounts: diff --git a/msa/js-executor/docker/Dockerfile b/msa/js-executor/docker/Dockerfile index 4f4c85be82..276fd03b13 100644 --- a/msa/js-executor/docker/Dockerfile +++ b/msa/js-executor/docker/Dockerfile @@ -14,7 +14,7 @@ # limitations under the License. # -FROM debian:stretch +FROM thingsboard/base COPY start-js-executor.sh ${pkg.name}.deb /tmp/ @@ -25,4 +25,6 @@ RUN dpkg -i /tmp/${pkg.name}.deb RUN update-rc.d ${pkg.name} disable +USER ${pkg.user} + CMD ["start-js-executor.sh"] diff --git a/msa/js-executor/docker/start-js-executor.sh b/msa/js-executor/docker/start-js-executor.sh index 5415d04964..e3f6f85fab 100755 --- a/msa/js-executor/docker/start-js-executor.sh +++ b/msa/js-executor/docker/start-js-executor.sh @@ -26,4 +26,6 @@ identity=${pkg.name} source "${CONF_FOLDER}/${configfile}" -su -s /bin/sh -c "$mainfile" +cd ${pkg.installFolder}/bin + +exec /bin/sh -c "$mainfile" diff --git a/msa/js-executor/pom.xml b/msa/js-executor/pom.xml index f85355a11e..bac7fb35e9 100644 --- a/msa/js-executor/pom.xml +++ b/msa/js-executor/pom.xml @@ -36,7 +36,6 @@ ${basedir}/../.. tb-js-executor tb-js-executor - thingsboard /var/log/${pkg.name} /usr/share/${pkg.name} ${project.build.directory}/package/linux diff --git a/msa/tb-node/docker/Dockerfile b/msa/tb-node/docker/Dockerfile index 4cc9838a96..eee8330f15 100644 --- a/msa/tb-node/docker/Dockerfile +++ b/msa/tb-node/docker/Dockerfile @@ -25,4 +25,8 @@ RUN dpkg -i /tmp/${pkg.name}.deb RUN systemctl --no-reload disable --now ${pkg.name}.service > /dev/null 2>&1 || : +RUN chown -R ${pkg.user}:${pkg.user} /tmp + +USER ${pkg.user} + CMD ["start-tb-node.sh"] diff --git a/msa/tb-node/docker/start-tb-node.sh b/msa/tb-node/docker/start-tb-node.sh index 9b20fdca90..dca56164e9 100755 --- a/msa/tb-node/docker/start-tb-node.sh +++ b/msa/tb-node/docker/start-tb-node.sh @@ -18,12 +18,14 @@ CONF_FOLDER="/config" jarfile=${pkg.installFolder}/bin/${pkg.name}.jar configfile=${pkg.name}.conf -run_user=${pkg.name} +run_user=${pkg.user} source "${CONF_FOLDER}/${configfile}" export LOADER_PATH=/config,${LOADER_PATH} +cd ${pkg.installFolder}/bin + if [ "$INSTALL_TB" == "true" ]; then if [ "$LOAD_DEMO" == "true" ]; then diff --git a/msa/tb-node/pom.xml b/msa/tb-node/pom.xml index 6687a6cc06..6502aed0d6 100644 --- a/msa/tb-node/pom.xml +++ b/msa/tb-node/pom.xml @@ -36,7 +36,6 @@ ${basedir}/../.. thingsboard tb-node - thingsboard /var/log/${pkg.name} /usr/share/${pkg.name} diff --git a/msa/tb/pom.xml b/msa/tb/pom.xml index 1afecd234a..03d750251a 100644 --- a/msa/tb/pom.xml +++ b/msa/tb/pom.xml @@ -38,7 +38,6 @@ tb tb-postgres tb-cassandra - thingsboard /usr/share/${pkg.name} 2.4.2 diff --git a/msa/transport/coap/docker/Dockerfile b/msa/transport/coap/docker/Dockerfile index 5c5dddef50..07cb0101b9 100644 --- a/msa/transport/coap/docker/Dockerfile +++ b/msa/transport/coap/docker/Dockerfile @@ -25,4 +25,6 @@ RUN dpkg -i /tmp/${pkg.name}.deb RUN update-rc.d ${pkg.name} disable +USER ${pkg.user} + CMD ["start-tb-coap-transport.sh"] diff --git a/msa/transport/coap/docker/start-tb-coap-transport.sh b/msa/transport/coap/docker/start-tb-coap-transport.sh index c96368ce23..23ab476734 100755 --- a/msa/transport/coap/docker/start-tb-coap-transport.sh +++ b/msa/transport/coap/docker/start-tb-coap-transport.sh @@ -25,6 +25,8 @@ export LOADER_PATH=/config,${LOADER_PATH} echo "Starting '${project.name}' ..." +cd ${pkg.installFolder}/bin + exec java -cp ${jarfile} $JAVA_OPTS -Dloader.main=org.thingsboard.server.coap.ThingsboardCoapTransportApplication \ -Dspring.jpa.hibernate.ddl-auto=none \ -Dlogging.config=/config/logback.xml \ diff --git a/msa/transport/coap/pom.xml b/msa/transport/coap/pom.xml index 716e8f2f07..b4645f7253 100644 --- a/msa/transport/coap/pom.xml +++ b/msa/transport/coap/pom.xml @@ -36,7 +36,6 @@ ${basedir}/../../.. tb-coap-transport tb-coap-transport - thingsboard /var/log/${pkg.name} /usr/share/${pkg.name} diff --git a/msa/transport/http/docker/Dockerfile b/msa/transport/http/docker/Dockerfile index 13e8075549..b49cf204f8 100644 --- a/msa/transport/http/docker/Dockerfile +++ b/msa/transport/http/docker/Dockerfile @@ -25,4 +25,6 @@ RUN dpkg -i /tmp/${pkg.name}.deb RUN update-rc.d ${pkg.name} disable +USER ${pkg.user} + CMD ["start-tb-http-transport.sh"] diff --git a/msa/transport/http/docker/start-tb-http-transport.sh b/msa/transport/http/docker/start-tb-http-transport.sh index 600d538a91..eb15edf482 100755 --- a/msa/transport/http/docker/start-tb-http-transport.sh +++ b/msa/transport/http/docker/start-tb-http-transport.sh @@ -25,6 +25,8 @@ export LOADER_PATH=/config,${LOADER_PATH} echo "Starting '${project.name}' ..." +cd ${pkg.installFolder}/bin + exec java -cp ${jarfile} $JAVA_OPTS -Dloader.main=org.thingsboard.server.http.ThingsboardHttpTransportApplication \ -Dspring.jpa.hibernate.ddl-auto=none \ -Dlogging.config=/config/logback.xml \ diff --git a/msa/transport/http/pom.xml b/msa/transport/http/pom.xml index 5d12dec0ed..f91053a391 100644 --- a/msa/transport/http/pom.xml +++ b/msa/transport/http/pom.xml @@ -36,7 +36,6 @@ ${basedir}/../../.. tb-http-transport tb-http-transport - thingsboard /var/log/${pkg.name} /usr/share/${pkg.name} diff --git a/msa/transport/mqtt/docker/Dockerfile b/msa/transport/mqtt/docker/Dockerfile index 100f65951d..149911f8b5 100644 --- a/msa/transport/mqtt/docker/Dockerfile +++ b/msa/transport/mqtt/docker/Dockerfile @@ -25,4 +25,6 @@ RUN dpkg -i /tmp/${pkg.name}.deb RUN update-rc.d ${pkg.name} disable +USER ${pkg.user} + CMD ["start-tb-mqtt-transport.sh"] diff --git a/msa/transport/mqtt/docker/start-tb-mqtt-transport.sh b/msa/transport/mqtt/docker/start-tb-mqtt-transport.sh index 214599e138..2556d93b1d 100755 --- a/msa/transport/mqtt/docker/start-tb-mqtt-transport.sh +++ b/msa/transport/mqtt/docker/start-tb-mqtt-transport.sh @@ -25,6 +25,8 @@ export LOADER_PATH=/config,${LOADER_PATH} echo "Starting '${project.name}' ..." +cd ${pkg.installFolder}/bin + exec java -cp ${jarfile} $JAVA_OPTS -Dloader.main=org.thingsboard.server.mqtt.ThingsboardMqttTransportApplication \ -Dspring.jpa.hibernate.ddl-auto=none \ -Dlogging.config=/config/logback.xml \ diff --git a/msa/transport/mqtt/pom.xml b/msa/transport/mqtt/pom.xml index 25c1b0045e..b7ebccc4be 100644 --- a/msa/transport/mqtt/pom.xml +++ b/msa/transport/mqtt/pom.xml @@ -36,7 +36,6 @@ ${basedir}/../../.. tb-mqtt-transport tb-mqtt-transport - thingsboard /var/log/${pkg.name} /usr/share/${pkg.name} diff --git a/msa/web-ui/docker/Dockerfile b/msa/web-ui/docker/Dockerfile index 8f5e5a0498..3609c289e4 100644 --- a/msa/web-ui/docker/Dockerfile +++ b/msa/web-ui/docker/Dockerfile @@ -14,7 +14,7 @@ # limitations under the License. # -FROM debian:stretch +FROM thingsboard/base COPY start-web-ui.sh ${pkg.name}.deb /tmp/ @@ -25,4 +25,6 @@ RUN dpkg -i /tmp/${pkg.name}.deb RUN update-rc.d ${pkg.name} disable +USER ${pkg.user} + CMD ["start-web-ui.sh"] diff --git a/msa/web-ui/docker/start-web-ui.sh b/msa/web-ui/docker/start-web-ui.sh index 5415d04964..e3f6f85fab 100755 --- a/msa/web-ui/docker/start-web-ui.sh +++ b/msa/web-ui/docker/start-web-ui.sh @@ -26,4 +26,6 @@ identity=${pkg.name} source "${CONF_FOLDER}/${configfile}" -su -s /bin/sh -c "$mainfile" +cd ${pkg.installFolder}/bin + +exec /bin/sh -c "$mainfile" diff --git a/msa/web-ui/pom.xml b/msa/web-ui/pom.xml index ad750f6706..eff6772de4 100644 --- a/msa/web-ui/pom.xml +++ b/msa/web-ui/pom.xml @@ -36,7 +36,6 @@ ${basedir}/../.. tb-web-ui tb-web-ui - thingsboard /var/log/${pkg.name} /usr/share/${pkg.name} ${project.build.directory}/package/linux diff --git a/pom.xml b/pom.xml index ab7e658abf..6725766840 100755 --- a/pom.xml +++ b/pom.xml @@ -29,6 +29,7 @@ ${basedir} + thingsboard 2.1.3.RELEASE 5.1.5.RELEASE 5.1.4.RELEASE diff --git a/transport/coap/src/main/scripts/control/deb/postinst b/transport/coap/src/main/scripts/control/deb/postinst index d4066c027b..0767d3f2c7 100644 --- a/transport/coap/src/main/scripts/control/deb/postinst +++ b/transport/coap/src/main/scripts/control/deb/postinst @@ -1,6 +1,6 @@ #!/bin/sh -chown -R ${pkg.name}: ${pkg.logFolder} -chown -R ${pkg.name}: ${pkg.installFolder} +chown -R ${pkg.user}: ${pkg.logFolder} +chown -R ${pkg.user}: ${pkg.installFolder} update-rc.d ${pkg.name} defaults diff --git a/transport/coap/src/main/scripts/control/deb/preinst b/transport/coap/src/main/scripts/control/deb/preinst index 6be5959285..d2ebea46d7 100644 --- a/transport/coap/src/main/scripts/control/deb/preinst +++ b/transport/coap/src/main/scripts/control/deb/preinst @@ -1,18 +1,18 @@ #!/bin/sh -if ! getent group ${pkg.name} >/dev/null; then - addgroup --system ${pkg.name} +if ! getent group ${pkg.user} >/dev/null; then + addgroup --system ${pkg.user} fi -if ! getent passwd ${pkg.name} >/dev/null; then +if ! getent passwd ${pkg.user} >/dev/null; then adduser --quiet \ --system \ - --ingroup ${pkg.name} \ + --ingroup ${pkg.user} \ --quiet \ --disabled-login \ --disabled-password \ --home ${pkg.installFolder} \ --no-create-home \ -gecos "Thingsboard application" \ - ${pkg.name} + ${pkg.user} fi diff --git a/transport/coap/src/main/scripts/control/rpm/postinst b/transport/coap/src/main/scripts/control/rpm/postinst index 8a7a88f7e0..d8021e2dd9 100644 --- a/transport/coap/src/main/scripts/control/rpm/postinst +++ b/transport/coap/src/main/scripts/control/rpm/postinst @@ -1,7 +1,7 @@ #!/bin/sh -chown -R ${pkg.name}: ${pkg.logFolder} -chown -R ${pkg.name}: ${pkg.installFolder} +chown -R ${pkg.user}: ${pkg.logFolder} +chown -R ${pkg.user}: ${pkg.installFolder} if [ $1 -eq 1 ] ; then # Initial installation diff --git a/transport/coap/src/main/scripts/control/tb-coap-transport.service b/transport/coap/src/main/scripts/control/tb-coap-transport.service index d456fc03c0..3fee5c88df 100644 --- a/transport/coap/src/main/scripts/control/tb-coap-transport.service +++ b/transport/coap/src/main/scripts/control/tb-coap-transport.service @@ -3,7 +3,7 @@ Description=${pkg.name} After=syslog.target [Service] -User=${pkg.name} +User=${pkg.user} ExecStart=${pkg.installFolder}/bin/${pkg.name}.jar SuccessExitStatus=143 diff --git a/transport/http/src/main/scripts/control/deb/postinst b/transport/http/src/main/scripts/control/deb/postinst index d4066c027b..0767d3f2c7 100644 --- a/transport/http/src/main/scripts/control/deb/postinst +++ b/transport/http/src/main/scripts/control/deb/postinst @@ -1,6 +1,6 @@ #!/bin/sh -chown -R ${pkg.name}: ${pkg.logFolder} -chown -R ${pkg.name}: ${pkg.installFolder} +chown -R ${pkg.user}: ${pkg.logFolder} +chown -R ${pkg.user}: ${pkg.installFolder} update-rc.d ${pkg.name} defaults diff --git a/transport/http/src/main/scripts/control/deb/preinst b/transport/http/src/main/scripts/control/deb/preinst index 6be5959285..d2ebea46d7 100644 --- a/transport/http/src/main/scripts/control/deb/preinst +++ b/transport/http/src/main/scripts/control/deb/preinst @@ -1,18 +1,18 @@ #!/bin/sh -if ! getent group ${pkg.name} >/dev/null; then - addgroup --system ${pkg.name} +if ! getent group ${pkg.user} >/dev/null; then + addgroup --system ${pkg.user} fi -if ! getent passwd ${pkg.name} >/dev/null; then +if ! getent passwd ${pkg.user} >/dev/null; then adduser --quiet \ --system \ - --ingroup ${pkg.name} \ + --ingroup ${pkg.user} \ --quiet \ --disabled-login \ --disabled-password \ --home ${pkg.installFolder} \ --no-create-home \ -gecos "Thingsboard application" \ - ${pkg.name} + ${pkg.user} fi diff --git a/transport/http/src/main/scripts/control/rpm/postinst b/transport/http/src/main/scripts/control/rpm/postinst index 8a7a88f7e0..d8021e2dd9 100644 --- a/transport/http/src/main/scripts/control/rpm/postinst +++ b/transport/http/src/main/scripts/control/rpm/postinst @@ -1,7 +1,7 @@ #!/bin/sh -chown -R ${pkg.name}: ${pkg.logFolder} -chown -R ${pkg.name}: ${pkg.installFolder} +chown -R ${pkg.user}: ${pkg.logFolder} +chown -R ${pkg.user}: ${pkg.installFolder} if [ $1 -eq 1 ] ; then # Initial installation diff --git a/transport/http/src/main/scripts/control/tb-http-transport.service b/transport/http/src/main/scripts/control/tb-http-transport.service index d456fc03c0..3fee5c88df 100644 --- a/transport/http/src/main/scripts/control/tb-http-transport.service +++ b/transport/http/src/main/scripts/control/tb-http-transport.service @@ -3,7 +3,7 @@ Description=${pkg.name} After=syslog.target [Service] -User=${pkg.name} +User=${pkg.user} ExecStart=${pkg.installFolder}/bin/${pkg.name}.jar SuccessExitStatus=143 diff --git a/transport/mqtt/src/main/scripts/control/deb/postinst b/transport/mqtt/src/main/scripts/control/deb/postinst index d4066c027b..0767d3f2c7 100644 --- a/transport/mqtt/src/main/scripts/control/deb/postinst +++ b/transport/mqtt/src/main/scripts/control/deb/postinst @@ -1,6 +1,6 @@ #!/bin/sh -chown -R ${pkg.name}: ${pkg.logFolder} -chown -R ${pkg.name}: ${pkg.installFolder} +chown -R ${pkg.user}: ${pkg.logFolder} +chown -R ${pkg.user}: ${pkg.installFolder} update-rc.d ${pkg.name} defaults diff --git a/transport/mqtt/src/main/scripts/control/deb/preinst b/transport/mqtt/src/main/scripts/control/deb/preinst index 6be5959285..d2ebea46d7 100644 --- a/transport/mqtt/src/main/scripts/control/deb/preinst +++ b/transport/mqtt/src/main/scripts/control/deb/preinst @@ -1,18 +1,18 @@ #!/bin/sh -if ! getent group ${pkg.name} >/dev/null; then - addgroup --system ${pkg.name} +if ! getent group ${pkg.user} >/dev/null; then + addgroup --system ${pkg.user} fi -if ! getent passwd ${pkg.name} >/dev/null; then +if ! getent passwd ${pkg.user} >/dev/null; then adduser --quiet \ --system \ - --ingroup ${pkg.name} \ + --ingroup ${pkg.user} \ --quiet \ --disabled-login \ --disabled-password \ --home ${pkg.installFolder} \ --no-create-home \ -gecos "Thingsboard application" \ - ${pkg.name} + ${pkg.user} fi diff --git a/transport/mqtt/src/main/scripts/control/rpm/postinst b/transport/mqtt/src/main/scripts/control/rpm/postinst index 8a7a88f7e0..d8021e2dd9 100644 --- a/transport/mqtt/src/main/scripts/control/rpm/postinst +++ b/transport/mqtt/src/main/scripts/control/rpm/postinst @@ -1,7 +1,7 @@ #!/bin/sh -chown -R ${pkg.name}: ${pkg.logFolder} -chown -R ${pkg.name}: ${pkg.installFolder} +chown -R ${pkg.user}: ${pkg.logFolder} +chown -R ${pkg.user}: ${pkg.installFolder} if [ $1 -eq 1 ] ; then # Initial installation diff --git a/transport/mqtt/src/main/scripts/control/tb-mqtt-transport.service b/transport/mqtt/src/main/scripts/control/tb-mqtt-transport.service index d456fc03c0..3fee5c88df 100644 --- a/transport/mqtt/src/main/scripts/control/tb-mqtt-transport.service +++ b/transport/mqtt/src/main/scripts/control/tb-mqtt-transport.service @@ -3,7 +3,7 @@ Description=${pkg.name} After=syslog.target [Service] -User=${pkg.name} +User=${pkg.user} ExecStart=${pkg.installFolder}/bin/${pkg.name}.jar SuccessExitStatus=143 From 188c3e5b636e981cc3534c74bd27fdaaf6173fcd Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Tue, 10 Mar 2020 17:49:00 +0200 Subject: [PATCH 3/4] Upgrade Sql Ts & Timescale improvements (#2495) * psql & timescale ts upgrade improved * fix typo * fix typo 2 * removed tenant_id from timescale db schema & upgade scipt logic --- .../upgrade/2.4.3/schema_update_psql_ts.sql | 92 ++++++------- .../2.4.3/schema_update_timescale_ts.sql | 125 ++++++++---------- .../AbstractSqlTsDatabaseUpgradeService.java | 73 +++------- .../install/PsqlTsDatabaseUpgradeService.java | 51 ++++--- .../TimescaleTsDatabaseSchemaService.java | 4 +- .../TimescaleTsDatabaseUpgradeService.java | 54 ++++---- .../dao/model/sql/AbstractTsKvEntity.java | 5 + .../model/sqlts/latest/TsKvLatestEntity.java | 4 - .../ts/TimescaleTsKvCompositeKey.java | 1 - .../timescale/ts/TimescaleTsKvEntity.java | 19 +-- .../server/dao/model/sqlts/ts/TsKvEntity.java | 4 - ...stractChunkedAggregationTimeseriesDao.java | 36 ++--- .../dao/sqlts/AbstractSqlTimeseriesDao.java | 18 +-- .../TimescaleInsertTsRepository.java | 43 +++--- .../timescale/AggregationRepository.java | 25 ++-- .../timescale/TimescaleTimeseriesDao.java | 45 +++---- .../timescale/TsKvTimescaleRepository.java | 10 +- .../resources/sql/schema-timescale-idx.sql | 17 --- .../main/resources/sql/schema-timescale.sql | 5 +- .../server/dao/SqlDaoServiceTestSuite.java | 2 +- .../sql/timescale/drop-all-tables.sql | 2 +- 21 files changed, 259 insertions(+), 376 deletions(-) delete mode 100644 dao/src/main/resources/sql/schema-timescale-idx.sql diff --git a/application/src/main/data/upgrade/2.4.3/schema_update_psql_ts.sql b/application/src/main/data/upgrade/2.4.3/schema_update_psql_ts.sql index 2d012336ab..3d17bbef2f 100644 --- a/application/src/main/data/upgrade/2.4.3/schema_update_psql_ts.sql +++ b/application/src/main/data/upgrade/2.4.3/schema_update_psql_ts.sql @@ -14,33 +14,27 @@ -- limitations under the License. -- --- select check_version(); +-- call check_version(); -CREATE OR REPLACE FUNCTION check_version() RETURNS boolean AS $$ +CREATE OR REPLACE PROCEDURE check_version(INOUT valid_version boolean) LANGUAGE plpgsql AS $BODY$ DECLARE current_version integer; - valid_version boolean; BEGIN RAISE NOTICE 'Check the current installed PostgreSQL version...'; SELECT current_setting('server_version_num') INTO current_version; - IF current_version < 100000 THEN - valid_version := FALSE; - ELSE - valid_version := TRUE; - END IF; - IF valid_version = FALSE THEN - RAISE NOTICE 'Postgres version should be at least more than 10!'; - ELSE + IF current_version > 110000 THEN RAISE NOTICE 'PostgreSQL version is valid!'; RAISE NOTICE 'Schema update started...'; + SELECT true INTO valid_version; + ELSE + RAISE NOTICE 'Postgres version should be at least more than 10!'; END IF; - RETURN valid_version; END; -$$ LANGUAGE 'plpgsql'; +$BODY$; --- select create_partition_ts_kv_table(); +-- call create_partition_ts_kv_table(); -CREATE OR REPLACE FUNCTION create_partition_ts_kv_table() RETURNS VOID AS $$ +CREATE OR REPLACE PROCEDURE create_partition_ts_kv_table() LANGUAGE plpgsql AS $$ BEGIN ALTER TABLE ts_kv @@ -57,11 +51,11 @@ BEGIN ALTER TABLE ts_kv ALTER COLUMN key TYPE integer USING key::integer; END; -$$ LANGUAGE 'plpgsql'; +$$; --- select create_new_ts_kv_latest_table(); +-- call create_new_ts_kv_latest_table(); -CREATE OR REPLACE FUNCTION create_new_ts_kv_latest_table() RETURNS VOID AS $$ +CREATE OR REPLACE PROCEDURE create_new_ts_kv_latest_table() LANGUAGE plpgsql AS $$ BEGIN ALTER TABLE ts_kv_latest @@ -81,13 +75,13 @@ BEGIN ALTER TABLE ts_kv_latest ADD CONSTRAINT ts_kv_latest_pkey PRIMARY KEY (entity_id, key); END; -$$ LANGUAGE 'plpgsql'; +$$; --- select create_partitions(); +-- call create_partitions(); + +CREATE OR REPLACE PROCEDURE create_partitions() LANGUAGE plpgsql AS $$ -CREATE OR REPLACE FUNCTION create_partitions() RETURNS VOID AS -$$ DECLARE partition_date varchar; from_ts bigint; @@ -111,11 +105,11 @@ BEGIN CLOSE key_cursor; END; -$$ language 'plpgsql'; +$$; --- select create_ts_kv_dictionary_table(); +-- call create_ts_kv_dictionary_table(); -CREATE OR REPLACE FUNCTION create_ts_kv_dictionary_table() RETURNS VOID AS $$ +CREATE OR REPLACE PROCEDURE create_ts_kv_dictionary_table() LANGUAGE plpgsql AS $$ BEGIN CREATE TABLE IF NOT EXISTS ts_kv_dictionary @@ -125,12 +119,12 @@ BEGIN CONSTRAINT ts_key_id_pkey PRIMARY KEY (key) ); END; -$$ LANGUAGE 'plpgsql'; +$$; + +-- call insert_into_dictionary(); --- select insert_into_dictionary(); +CREATE OR REPLACE PROCEDURE insert_into_dictionary() LANGUAGE plpgsql AS $$ -CREATE OR REPLACE FUNCTION insert_into_dictionary() RETURNS VOID AS -$$ DECLARE insert_record RECORD; key_cursor CURSOR FOR SELECT DISTINCT key @@ -150,28 +144,27 @@ BEGIN END LOOP; CLOSE key_cursor; END; -$$ language 'plpgsql'; +$$; --- select insert_into_ts_kv(); +-- call insert_into_ts_kv(); -CREATE OR REPLACE FUNCTION insert_into_ts_kv() RETURNS void AS -$$ +CREATE OR REPLACE PROCEDURE insert_into_ts_kv() LANGUAGE plpgsql AS $$ DECLARE insert_size CONSTANT integer := 10000; insert_counter integer DEFAULT 0; insert_record RECORD; - insert_cursor CURSOR FOR SELECT CONCAT(first_part_uuid, '-', second_part_uuid, '-1', third_part_uuid, '-', fourth_part_uuid, '-', fifth_part_uuid)::uuid AS entity_id, + insert_cursor CURSOR FOR SELECT CONCAT(entity_id_uuid_first_part, '-', entity_id_uuid_second_part, '-1', entity_id_uuid_third_part, '-', entity_id_uuid_fourth_part, '-', entity_id_uuid_fifth_part)::uuid AS entity_id, ts_kv_records.key AS key, ts_kv_records.ts AS ts, ts_kv_records.bool_v AS bool_v, ts_kv_records.str_v AS str_v, ts_kv_records.long_v AS long_v, ts_kv_records.dbl_v AS dbl_v - FROM (SELECT SUBSTRING(entity_id, 8, 8) AS first_part_uuid, - SUBSTRING(entity_id, 4, 4) AS second_part_uuid, - SUBSTRING(entity_id, 1, 3) AS third_part_uuid, - SUBSTRING(entity_id, 16, 4) AS fourth_part_uuid, - SUBSTRING(entity_id, 20) AS fifth_part_uuid, + FROM (SELECT SUBSTRING(entity_id, 8, 8) AS entity_id_uuid_first_part, + SUBSTRING(entity_id, 4, 4) AS entity_id_uuid_second_part, + SUBSTRING(entity_id, 1, 3) AS entity_id_uuid_third_part, + SUBSTRING(entity_id, 16, 4) AS entity_id_uuid_fourth_part, + SUBSTRING(entity_id, 20) AS entity_id_uuid_fifth_part, key_id AS key, ts, bool_v, @@ -198,28 +191,27 @@ BEGIN END LOOP; CLOSE insert_cursor; END; -$$ LANGUAGE 'plpgsql'; +$$; --- select insert_into_ts_kv_latest(); +-- call insert_into_ts_kv_latest(); -CREATE OR REPLACE FUNCTION insert_into_ts_kv_latest() RETURNS void AS -$$ +CREATE OR REPLACE PROCEDURE insert_into_ts_kv_latest() LANGUAGE plpgsql AS $$ DECLARE insert_size CONSTANT integer := 10000; insert_counter integer DEFAULT 0; insert_record RECORD; - insert_cursor CURSOR FOR SELECT CONCAT(first_part_uuid, '-', second_part_uuid, '-1', third_part_uuid, '-', fourth_part_uuid, '-', fifth_part_uuid)::uuid AS entity_id, + insert_cursor CURSOR FOR SELECT CONCAT(entity_id_uuid_first_part, '-', entity_id_uuid_second_part, '-1', entity_id_uuid_third_part, '-', entity_id_uuid_fourth_part, '-', entity_id_uuid_fifth_part)::uuid AS entity_id, ts_kv_latest_records.key AS key, ts_kv_latest_records.ts AS ts, ts_kv_latest_records.bool_v AS bool_v, ts_kv_latest_records.str_v AS str_v, ts_kv_latest_records.long_v AS long_v, ts_kv_latest_records.dbl_v AS dbl_v - FROM (SELECT SUBSTRING(entity_id, 8, 8) AS first_part_uuid, - SUBSTRING(entity_id, 4, 4) AS second_part_uuid, - SUBSTRING(entity_id, 1, 3) AS third_part_uuid, - SUBSTRING(entity_id, 16, 4) AS fourth_part_uuid, - SUBSTRING(entity_id, 20) AS fifth_part_uuid, + FROM (SELECT SUBSTRING(entity_id, 8, 8) AS entity_id_uuid_first_part, + SUBSTRING(entity_id, 4, 4) AS entity_id_uuid_second_part, + SUBSTRING(entity_id, 1, 3) AS entity_id_uuid_third_part, + SUBSTRING(entity_id, 16, 4) AS entity_id_uuid_fourth_part, + SUBSTRING(entity_id, 20) AS entity_id_uuid_fifth_part, key_id AS key, ts, bool_v, @@ -246,6 +238,6 @@ BEGIN END LOOP; CLOSE insert_cursor; END; -$$ LANGUAGE 'plpgsql'; +$$; diff --git a/application/src/main/data/upgrade/2.4.3/schema_update_timescale_ts.sql b/application/src/main/data/upgrade/2.4.3/schema_update_timescale_ts.sql index b8a3f1850e..ebbc6933ae 100644 --- a/application/src/main/data/upgrade/2.4.3/schema_update_timescale_ts.sql +++ b/application/src/main/data/upgrade/2.4.3/schema_update_timescale_ts.sql @@ -14,60 +14,51 @@ -- limitations under the License. -- --- select check_version(); +-- call check_version(); + +CREATE OR REPLACE PROCEDURE check_version(INOUT valid_version boolean) LANGUAGE plpgsql AS $BODY$ -CREATE OR REPLACE FUNCTION check_version() RETURNS boolean AS $$ DECLARE current_version integer; - valid_version boolean; BEGIN RAISE NOTICE 'Check the current installed PostgreSQL version...'; SELECT current_setting('server_version_num') INTO current_version; - IF current_version < 90600 THEN - valid_version := FALSE; - ELSE - valid_version := TRUE; - END IF; - IF valid_version = FALSE THEN - RAISE NOTICE 'Postgres version should be at least more than 9.6!'; - ELSE + IF current_version > 110000 THEN RAISE NOTICE 'PostgreSQL version is valid!'; RAISE NOTICE 'Schema update started...'; + SELECT true INTO valid_version; + ELSE + RAISE NOTICE 'Postgres version should be at least more than 10!'; END IF; - RETURN valid_version; END; -$$ LANGUAGE 'plpgsql'; +$BODY$; --- select create_new_tenant_ts_kv_table(); +-- call create_new_ts_kv_table(); -CREATE OR REPLACE FUNCTION create_new_tenant_ts_kv_table() RETURNS VOID AS $$ +CREATE OR REPLACE PROCEDURE create_new_ts_kv_table() LANGUAGE plpgsql AS $$ BEGIN ALTER TABLE tenant_ts_kv RENAME TO tenant_ts_kv_old; - CREATE TABLE IF NOT EXISTS tenant_ts_kv + CREATE TABLE IF NOT EXISTS ts_kv ( LIKE tenant_ts_kv_old ); - ALTER TABLE tenant_ts_kv - ALTER COLUMN tenant_id TYPE uuid USING tenant_id::uuid; - ALTER TABLE tenant_ts_kv - ALTER COLUMN entity_id TYPE uuid USING entity_id::uuid; - ALTER TABLE tenant_ts_kv - ALTER COLUMN key TYPE integer USING key::integer; - ALTER TABLE tenant_ts_kv - ADD CONSTRAINT tenant_ts_kv_pkey PRIMARY KEY(tenant_id, entity_id, key, ts); + ALTER TABLE ts_kv ALTER COLUMN entity_id TYPE uuid USING entity_id::uuid; + ALTER TABLE ts_kv ALTER COLUMN key TYPE integer USING key::integer; + ALTER INDEX ts_kv_pkey RENAME TO tenant_ts_kv_pkey_old; ALTER INDEX idx_tenant_ts_kv RENAME TO idx_tenant_ts_kv_old; ALTER INDEX tenant_ts_kv_ts_idx RENAME TO tenant_ts_kv_ts_idx_old; --- PERFORM create_hypertable('tenant_ts_kv', 'ts', chunk_time_interval => 86400000, if_not_exists => true); - CREATE INDEX IF NOT EXISTS idx_tenant_ts_kv ON tenant_ts_kv(tenant_id, entity_id, key, ts); + ALTER TABLE ts_kv ADD CONSTRAINT ts_kv_pkey PRIMARY KEY(entity_id, key, ts); +-- CREATE INDEX IF NOT EXISTS ts_kv_ts_idx ON ts_kv(ts DESC); + ALTER TABLE ts_kv DROP COLUMN IF EXISTS tenant_id; END; -$$ LANGUAGE 'plpgsql'; +$$; --- select create_ts_kv_latest_table(); +-- call create_ts_kv_latest_table(); -CREATE OR REPLACE FUNCTION create_ts_kv_latest_table() RETURNS VOID AS $$ +CREATE OR REPLACE PROCEDURE create_ts_kv_latest_table() LANGUAGE plpgsql AS $$ BEGIN CREATE TABLE IF NOT EXISTS ts_kv_latest @@ -82,12 +73,12 @@ BEGIN CONSTRAINT ts_kv_latest_pkey PRIMARY KEY (entity_id, key) ); END; -$$ LANGUAGE 'plpgsql'; +$$; --- select create_ts_kv_dictionary_table(); +-- call create_ts_kv_dictionary_table(); -CREATE OR REPLACE FUNCTION create_ts_kv_dictionary_table() RETURNS VOID AS $$ +CREATE OR REPLACE PROCEDURE create_ts_kv_dictionary_table() LANGUAGE plpgsql AS $$ BEGIN CREATE TABLE IF NOT EXISTS ts_kv_dictionary @@ -97,12 +88,12 @@ BEGIN CONSTRAINT ts_key_id_pkey PRIMARY KEY (key) ); END; -$$ LANGUAGE 'plpgsql'; +$$; --- select insert_into_dictionary(); +-- call insert_into_dictionary(); + +CREATE OR REPLACE PROCEDURE insert_into_dictionary() LANGUAGE plpgsql AS $$ -CREATE OR REPLACE FUNCTION insert_into_dictionary() RETURNS VOID AS -$$ DECLARE insert_record RECORD; key_cursor CURSOR FOR SELECT DISTINCT key @@ -122,34 +113,28 @@ BEGIN END LOOP; CLOSE key_cursor; END; -$$ language 'plpgsql'; +$$; + +-- call insert_into_ts_kv(); --- select insert_into_tenant_ts_kv(); +CREATE OR REPLACE PROCEDURE insert_into_ts_kv() LANGUAGE plpgsql AS $$ -CREATE OR REPLACE FUNCTION insert_into_tenant_ts_kv() RETURNS void AS -$$ DECLARE insert_size CONSTANT integer := 10000; insert_counter integer DEFAULT 0; insert_record RECORD; - insert_cursor CURSOR FOR SELECT CONCAT(tenant_id_first_part_uuid, '-', tenant_id_second_part_uuid, '-1', tenant_id_third_part_uuid, '-', tenant_id_fourth_part_uuid, '-', tenant_id_fifth_part_uuid)::uuid AS tenant_id, - CONCAT(entity_id_first_part_uuid, '-', entity_id_second_part_uuid, '-1', entity_id_third_part_uuid, '-', entity_id_fourth_part_uuid, '-', entity_id_fifth_part_uuid)::uuid AS entity_id, - tenant_ts_kv_records.key AS key, - tenant_ts_kv_records.ts AS ts, - tenant_ts_kv_records.bool_v AS bool_v, - tenant_ts_kv_records.str_v AS str_v, - tenant_ts_kv_records.long_v AS long_v, - tenant_ts_kv_records.dbl_v AS dbl_v - FROM (SELECT SUBSTRING(tenant_id, 8, 8) AS tenant_id_first_part_uuid, - SUBSTRING(tenant_id, 4, 4) AS tenant_id_second_part_uuid, - SUBSTRING(tenant_id, 1, 3) AS tenant_id_third_part_uuid, - SUBSTRING(tenant_id, 16, 4) AS tenant_id_fourth_part_uuid, - SUBSTRING(tenant_id, 20) AS tenant_id_fifth_part_uuid, - SUBSTRING(entity_id, 8, 8) AS entity_id_first_part_uuid, - SUBSTRING(entity_id, 4, 4) AS entity_id_second_part_uuid, - SUBSTRING(entity_id, 1, 3) AS entity_id_third_part_uuid, - SUBSTRING(entity_id, 16, 4) AS entity_id_fourth_part_uuid, - SUBSTRING(entity_id, 20) AS entity_id_fifth_part_uuid, + insert_cursor CURSOR FOR SELECT CONCAT(entity_id_uuid_first_part, '-', entity_id_uuid_second_part, '-1', entity_id_uuid_third_part, '-', entity_id_uuid_fourth_part, '-', entity_id_uuid_fifth_part)::uuid AS entity_id, + new_ts_kv_records.key AS key, + new_ts_kv_records.ts AS ts, + new_ts_kv_records.bool_v AS bool_v, + new_ts_kv_records.str_v AS str_v, + new_ts_kv_records.long_v AS long_v, + new_ts_kv_records.dbl_v AS dbl_v + FROM (SELECT SUBSTRING(entity_id, 8, 8) AS entity_id_uuid_first_part, + SUBSTRING(entity_id, 4, 4) AS entity_id_uuid_second_part, + SUBSTRING(entity_id, 1, 3) AS entity_id_uuid_third_part, + SUBSTRING(entity_id, 16, 4) AS entity_id_uuid_fourth_part, + SUBSTRING(entity_id, 20) AS entity_id_uuid_fifth_part, key_id AS key, ts, bool_v, @@ -157,31 +142,31 @@ DECLARE long_v, dbl_v FROM tenant_ts_kv_old - INNER JOIN ts_kv_dictionary ON (tenant_ts_kv_old.key = ts_kv_dictionary.key)) AS tenant_ts_kv_records; + INNER JOIN ts_kv_dictionary ON (tenant_ts_kv_old.key = ts_kv_dictionary.key)) AS new_ts_kv_records; BEGIN OPEN insert_cursor; LOOP insert_counter := insert_counter + 1; FETCH insert_cursor INTO insert_record; IF NOT FOUND THEN - RAISE NOTICE '% records have been inserted into the new tenant_ts_kv table!',insert_counter - 1; + RAISE NOTICE '% records have been inserted into the new ts_kv table!',insert_counter - 1; EXIT; END IF; - INSERT INTO tenant_ts_kv(tenant_id, entity_id, key, ts, bool_v, str_v, long_v, dbl_v) - VALUES (insert_record.tenant_id, insert_record.entity_id, insert_record.key, insert_record.ts, insert_record.bool_v, insert_record.str_v, + INSERT INTO ts_kv(entity_id, key, ts, bool_v, str_v, long_v, dbl_v) + VALUES (insert_record.entity_id, insert_record.key, insert_record.ts, insert_record.bool_v, insert_record.str_v, insert_record.long_v, insert_record.dbl_v); IF MOD(insert_counter, insert_size) = 0 THEN - RAISE NOTICE '% records have been inserted into the new tenant_ts_kv table!',insert_counter; + RAISE NOTICE '% records have been inserted into the new ts_kv table!',insert_counter; END IF; END LOOP; CLOSE insert_cursor; END; -$$ LANGUAGE 'plpgsql'; +$$; + +-- call insert_into_ts_kv_latest(); --- select insert_into_ts_kv_latest(); +CREATE OR REPLACE PROCEDURE insert_into_ts_kv_latest() LANGUAGE plpgsql AS $$ -CREATE OR REPLACE FUNCTION insert_into_ts_kv_latest() RETURNS void AS -$$ DECLARE insert_size CONSTANT integer := 10000; insert_counter integer DEFAULT 0; @@ -191,7 +176,7 @@ DECLARE latest_records.key AS key, latest_records.entity_id AS entity_id, latest_records.ts AS ts - FROM (SELECT DISTINCT key AS key, entity_id AS entity_id, MAX(ts) AS ts FROM tenant_ts_kv GROUP BY key, entity_id) AS latest_records; + FROM (SELECT DISTINCT key AS key, entity_id AS entity_id, MAX(ts) AS ts FROM ts_kv GROUP BY key, entity_id) AS latest_records; BEGIN OPEN insert_cursor; LOOP @@ -201,7 +186,7 @@ BEGIN RAISE NOTICE '% records have been inserted into the ts_kv_latest table!',insert_counter - 1; EXIT; END IF; - SELECT entity_id AS entity_id, key AS key, ts AS ts, bool_v AS bool_v, str_v AS str_v, long_v AS long_v, dbl_v AS dbl_v INTO insert_record FROM tenant_ts_kv WHERE entity_id = latest_record.entity_id AND key = latest_record.key AND ts = latest_record.ts; + SELECT entity_id AS entity_id, key AS key, ts AS ts, bool_v AS bool_v, str_v AS str_v, long_v AS long_v, dbl_v AS dbl_v INTO insert_record FROM ts_kv WHERE entity_id = latest_record.entity_id AND key = latest_record.key AND ts = latest_record.ts; INSERT INTO ts_kv_latest(entity_id, key, ts, bool_v, str_v, long_v, dbl_v) VALUES (insert_record.entity_id, insert_record.key, insert_record.ts, insert_record.bool_v, insert_record.str_v, insert_record.long_v, insert_record.dbl_v); IF MOD(insert_counter, insert_size) = 0 THEN @@ -210,4 +195,4 @@ BEGIN END LOOP; CLOSE insert_cursor; END; -$$ LANGUAGE 'plpgsql'; +$$; diff --git a/application/src/main/java/org/thingsboard/server/service/install/AbstractSqlTsDatabaseUpgradeService.java b/application/src/main/java/org/thingsboard/server/service/install/AbstractSqlTsDatabaseUpgradeService.java index fe56ac129c..901f773515 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/AbstractSqlTsDatabaseUpgradeService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/AbstractSqlTsDatabaseUpgradeService.java @@ -22,38 +22,21 @@ import org.springframework.beans.factory.annotation.Value; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.sql.CallableStatement; import java.sql.Connection; +import java.sql.ResultSet; import java.sql.SQLException; import java.sql.SQLWarning; -import java.sql.Types; +import java.sql.Statement; @Slf4j public abstract class AbstractSqlTsDatabaseUpgradeService { protected static final String CALL_REGEX = "call "; - protected static final String CHECK_VERSION = "check_version()"; + protected static final String CHECK_VERSION = "check_version(false)"; + protected static final String CHECK_VERSION_TO_DELETE = "check_version(INOUT valid_version boolean)"; protected static final String DROP_TABLE = "DROP TABLE "; - protected static final String DROP_FUNCTION_IF_EXISTS = "DROP FUNCTION IF EXISTS "; - - private static final String CALL_CHECK_VERSION = CALL_REGEX + CHECK_VERSION; - - - private static final String FUNCTION = "function: {}"; - private static final String DROP_STATEMENT = "drop statement: {}"; - private static final String QUERY = "query: {}"; - private static final String SUCCESSFULLY_EXECUTED = "Successfully executed "; - private static final String FAILED_TO_EXECUTE = "Failed to execute "; - private static final String FAILED_DUE_TO = " due to: {}"; - - protected static final String SUCCESSFULLY_EXECUTED_FUNCTION = SUCCESSFULLY_EXECUTED + FUNCTION; - protected static final String FAILED_TO_EXECUTE_FUNCTION_DUE_TO = FAILED_TO_EXECUTE + FUNCTION + FAILED_DUE_TO; - - protected static final String SUCCESSFULLY_EXECUTED_DROP_STATEMENT = SUCCESSFULLY_EXECUTED + DROP_STATEMENT; - protected static final String FAILED_TO_EXECUTE_DROP_STATEMENT = FAILED_TO_EXECUTE + DROP_STATEMENT + FAILED_DUE_TO; - - protected static final String SUCCESSFULLY_EXECUTED_QUERY = SUCCESSFULLY_EXECUTED + QUERY; - protected static final String FAILED_TO_EXECUTE_QUERY = FAILED_TO_EXECUTE + QUERY + FAILED_DUE_TO; + protected static final String DROP_PROCEDURE_IF_EXISTS = "DROP PROCEDURE IF EXISTS "; + protected static final String DROP_PROCEDURE_CHECK_VERSION = DROP_PROCEDURE_IF_EXISTS + CHECK_VERSION_TO_DELETE; @Value("${spring.datasource.url}") protected String dbUrl; @@ -78,23 +61,22 @@ public abstract class AbstractSqlTsDatabaseUpgradeService { log.info("Check the current PostgreSQL version..."); boolean versionValid = false; try { - CallableStatement callableStatement = conn.prepareCall("{? = " + CALL_CHECK_VERSION + " }"); - callableStatement.registerOutParameter(1, Types.BOOLEAN); - callableStatement.execute(); - versionValid = callableStatement.getBoolean(1); - callableStatement.close(); + Statement statement = conn.createStatement(); + ResultSet resultSet = statement.executeQuery(CALL_REGEX + CHECK_VERSION); + resultSet.next(); + versionValid = resultSet.getBoolean(1); + statement.close(); } catch (Exception e) { log.info("Failed to check current PostgreSQL version due to: {}", e.getMessage()); } return versionValid; } - protected void executeFunction(Connection conn, String query) { - log.info("{} ... ", query); + protected void executeQuery(Connection conn, String query) { try { - CallableStatement callableStatement = conn.prepareCall("{" + query + "}"); - callableStatement.execute(); - SQLWarning warnings = callableStatement.getWarnings(); + Statement statement = conn.createStatement(); + statement.execute(query); //NOSONAR, ignoring because method used to execute thingsboard database upgrade script + SQLWarning warnings = statement.getWarnings(); if (warnings != null) { log.info("{}", warnings.getMessage()); SQLWarning nextWarning = warnings.getNextWarning(); @@ -103,31 +85,10 @@ public abstract class AbstractSqlTsDatabaseUpgradeService { nextWarning = nextWarning.getNextWarning(); } } - callableStatement.close(); - log.info(SUCCESSFULLY_EXECUTED_FUNCTION, query.replace(CALL_REGEX, "")); - Thread.sleep(2000); - } catch (Exception e) { - log.info(FAILED_TO_EXECUTE_FUNCTION_DUE_TO, query, e.getMessage()); - } - } - - protected void executeDropStatement(Connection conn, String query) { - try { - conn.createStatement().execute(query); //NOSONAR, ignoring because method used to execute thingsboard database upgrade script - log.info(SUCCESSFULLY_EXECUTED_DROP_STATEMENT, query); - Thread.sleep(5000); - } catch (InterruptedException | SQLException e) { - log.info(FAILED_TO_EXECUTE_DROP_STATEMENT, query, e.getMessage()); - } - } - - protected void executeQuery(Connection conn, String query) { - try { - conn.createStatement().execute(query); //NOSONAR, ignoring because method used to execute thingsboard database upgrade script - log.info(SUCCESSFULLY_EXECUTED_QUERY, query); Thread.sleep(5000); + log.info("Successfully executed query: {}", query); } catch (InterruptedException | SQLException e) { - log.info(FAILED_TO_EXECUTE_QUERY, query, e.getMessage()); + log.info("Failed to execute query: {} due to: {}", query, e.getMessage()); } } diff --git a/application/src/main/java/org/thingsboard/server/service/install/PsqlTsDatabaseUpgradeService.java b/application/src/main/java/org/thingsboard/server/service/install/PsqlTsDatabaseUpgradeService.java index eb951ed9ae..96f2c126a0 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/PsqlTsDatabaseUpgradeService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/PsqlTsDatabaseUpgradeService.java @@ -57,14 +57,13 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe private static final String DROP_TABLE_TS_KV_OLD = DROP_TABLE + TS_KV_OLD; private static final String DROP_TABLE_TS_KV_LATEST_OLD = DROP_TABLE + TS_KV_LATEST_OLD; - private static final String DROP_FUNCTION_CHECK_VERSION = DROP_FUNCTION_IF_EXISTS + CHECK_VERSION; - private static final String DROP_FUNCTION_CREATE_PARTITION_TS_KV_TABLE = DROP_FUNCTION_IF_EXISTS + CREATE_PARTITION_TS_KV_TABLE; - private static final String DROP_FUNCTION_CREATE_NEW_TS_KV_LATEST_TABLE = DROP_FUNCTION_IF_EXISTS + CREATE_NEW_TS_KV_LATEST_TABLE; - private static final String DROP_FUNCTION_CREATE_PARTITIONS = DROP_FUNCTION_IF_EXISTS + CREATE_PARTITIONS; - private static final String DROP_FUNCTION_CREATE_TS_KV_DICTIONARY_TABLE = DROP_FUNCTION_IF_EXISTS + CREATE_TS_KV_DICTIONARY_TABLE; - private static final String DROP_FUNCTION_INSERT_INTO_DICTIONARY = DROP_FUNCTION_IF_EXISTS + INSERT_INTO_DICTIONARY; - private static final String DROP_FUNCTION_INSERT_INTO_TS_KV = DROP_FUNCTION_IF_EXISTS + INSERT_INTO_TS_KV; - private static final String DROP_FUNCTION_INSERT_INTO_TS_KV_LATEST = DROP_FUNCTION_IF_EXISTS + INSERT_INTO_TS_KV_LATEST; + private static final String DROP_PROCEDURE_CREATE_PARTITION_TS_KV_TABLE = DROP_PROCEDURE_IF_EXISTS + CREATE_PARTITION_TS_KV_TABLE; + private static final String DROP_PROCEDURE_CREATE_NEW_TS_KV_LATEST_TABLE = DROP_PROCEDURE_IF_EXISTS + CREATE_NEW_TS_KV_LATEST_TABLE; + private static final String DROP_PROCEDURE_CREATE_PARTITIONS = DROP_PROCEDURE_IF_EXISTS + CREATE_PARTITIONS; + private static final String DROP_PROCEDURE_CREATE_TS_KV_DICTIONARY_TABLE = DROP_PROCEDURE_IF_EXISTS + CREATE_TS_KV_DICTIONARY_TABLE; + private static final String DROP_PROCEDURE_INSERT_INTO_DICTIONARY = DROP_PROCEDURE_IF_EXISTS + INSERT_INTO_DICTIONARY; + private static final String DROP_PROCEDURE_INSERT_INTO_TS_KV = DROP_PROCEDURE_IF_EXISTS + INSERT_INTO_TS_KV; + private static final String DROP_PROCEDURE_INSERT_INTO_TS_KV_LATEST = DROP_PROCEDURE_IF_EXISTS + INSERT_INTO_TS_KV_LATEST; @Override public void upgradeDatabase(String fromVersion) throws Exception { @@ -76,30 +75,30 @@ public class PsqlTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgradeSe loadSql(conn); boolean versionValid = checkVersion(conn); if (!versionValid) { - log.info("PostgreSQL version should be at least more than 10!"); + log.info("PostgreSQL version should be at least more than 11!"); log.info("Please upgrade your PostgreSQL and restart the script!"); } else { log.info("PostgreSQL version is valid!"); log.info("Updating schema ..."); - executeFunction(conn, CALL_CREATE_PARTITION_TS_KV_TABLE); - executeFunction(conn, CALL_CREATE_PARTITIONS); - executeFunction(conn, CALL_CREATE_TS_KV_DICTIONARY_TABLE); - executeFunction(conn, CALL_INSERT_INTO_DICTIONARY); - executeFunction(conn, CALL_INSERT_INTO_TS_KV); - executeFunction(conn, CALL_CREATE_NEW_TS_KV_LATEST_TABLE); - executeFunction(conn, CALL_INSERT_INTO_TS_KV_LATEST); + executeQuery(conn, CALL_CREATE_PARTITION_TS_KV_TABLE); + executeQuery(conn, CALL_CREATE_PARTITIONS); + executeQuery(conn, CALL_CREATE_TS_KV_DICTIONARY_TABLE); + executeQuery(conn, CALL_INSERT_INTO_DICTIONARY); + executeQuery(conn, CALL_INSERT_INTO_TS_KV); + executeQuery(conn, CALL_CREATE_NEW_TS_KV_LATEST_TABLE); + executeQuery(conn, CALL_INSERT_INTO_TS_KV_LATEST); - executeDropStatement(conn, DROP_TABLE_TS_KV_OLD); - executeDropStatement(conn, DROP_TABLE_TS_KV_LATEST_OLD); + executeQuery(conn, DROP_TABLE_TS_KV_OLD); + executeQuery(conn, DROP_TABLE_TS_KV_LATEST_OLD); - executeDropStatement(conn, DROP_FUNCTION_CHECK_VERSION); - executeDropStatement(conn, DROP_FUNCTION_CREATE_PARTITION_TS_KV_TABLE); - executeDropStatement(conn, DROP_FUNCTION_CREATE_PARTITIONS); - executeDropStatement(conn, DROP_FUNCTION_CREATE_TS_KV_DICTIONARY_TABLE); - executeDropStatement(conn, DROP_FUNCTION_INSERT_INTO_DICTIONARY); - executeDropStatement(conn, DROP_FUNCTION_INSERT_INTO_TS_KV); - executeDropStatement(conn, DROP_FUNCTION_CREATE_NEW_TS_KV_LATEST_TABLE); - executeDropStatement(conn, DROP_FUNCTION_INSERT_INTO_TS_KV_LATEST); + executeQuery(conn, DROP_PROCEDURE_CHECK_VERSION); + executeQuery(conn, DROP_PROCEDURE_CREATE_PARTITION_TS_KV_TABLE); + executeQuery(conn, DROP_PROCEDURE_CREATE_PARTITIONS); + executeQuery(conn, DROP_PROCEDURE_CREATE_TS_KV_DICTIONARY_TABLE); + executeQuery(conn, DROP_PROCEDURE_INSERT_INTO_DICTIONARY); + executeQuery(conn, DROP_PROCEDURE_INSERT_INTO_TS_KV); + executeQuery(conn, DROP_PROCEDURE_CREATE_NEW_TS_KV_LATEST_TABLE); + executeQuery(conn, DROP_PROCEDURE_INSERT_INTO_TS_KV_LATEST); executeQuery(conn, "ALTER TABLE ts_kv ADD COLUMN json_v json;"); executeQuery(conn, "ALTER TABLE ts_kv_latest ADD COLUMN json_v json;"); diff --git a/application/src/main/java/org/thingsboard/server/service/install/TimescaleTsDatabaseSchemaService.java b/application/src/main/java/org/thingsboard/server/service/install/TimescaleTsDatabaseSchemaService.java index 92a0a837fa..e8c542d956 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/TimescaleTsDatabaseSchemaService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/TimescaleTsDatabaseSchemaService.java @@ -45,13 +45,13 @@ public class TimescaleTsDatabaseSchemaService extends SqlAbstractDatabaseSchemaS private long chunkTimeInterval; public TimescaleTsDatabaseSchemaService() { - super("schema-timescale.sql", "schema-timescale-idx.sql"); + super("schema-timescale.sql", null); } @Override public void createDatabaseSchema() throws Exception { super.createDatabaseSchema(); - executeQuery("SELECT create_hypertable('tenant_ts_kv', 'ts', chunk_time_interval => " + chunkTimeInterval + ", if_not_exists => true);"); + executeQuery("SELECT create_hypertable('ts_kv', 'ts', chunk_time_interval => " + chunkTimeInterval + ", if_not_exists => true);"); } private void executeQuery(String query) { diff --git a/application/src/main/java/org/thingsboard/server/service/install/TimescaleTsDatabaseUpgradeService.java b/application/src/main/java/org/thingsboard/server/service/install/TimescaleTsDatabaseUpgradeService.java index a2a9611581..e438f965c8 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/TimescaleTsDatabaseUpgradeService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/TimescaleTsDatabaseUpgradeService.java @@ -43,27 +43,27 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr private static final String TENANT_TS_KV_OLD_TABLE = "tenant_ts_kv_old;"; private static final String CREATE_TS_KV_LATEST_TABLE = "create_ts_kv_latest_table()"; - private static final String CREATE_NEW_TENANT_TS_KV_TABLE = "create_new_tenant_ts_kv_table()"; + private static final String CREATE_NEW_TS_KV_TABLE = "create_new_ts_kv_table()"; private static final String CREATE_TS_KV_DICTIONARY_TABLE = "create_ts_kv_dictionary_table()"; private static final String INSERT_INTO_DICTIONARY = "insert_into_dictionary()"; - private static final String INSERT_INTO_TENANT_TS_KV = "insert_into_tenant_ts_kv()"; + private static final String INSERT_INTO_TS_KV = "insert_into_ts_kv()"; private static final String INSERT_INTO_TS_KV_LATEST = "insert_into_ts_kv_latest()"; private static final String CALL_CREATE_TS_KV_LATEST_TABLE = CALL_REGEX + CREATE_TS_KV_LATEST_TABLE; - private static final String CALL_CREATE_NEW_TENANT_TS_KV_TABLE = CALL_REGEX + CREATE_NEW_TENANT_TS_KV_TABLE; + private static final String CALL_CREATE_NEW_TENANT_TS_KV_TABLE = CALL_REGEX + CREATE_NEW_TS_KV_TABLE; private static final String CALL_CREATE_TS_KV_DICTIONARY_TABLE = CALL_REGEX + CREATE_TS_KV_DICTIONARY_TABLE; private static final String CALL_INSERT_INTO_DICTIONARY = CALL_REGEX + INSERT_INTO_DICTIONARY; - private static final String CALL_INSERT_INTO_TS_KV = CALL_REGEX + INSERT_INTO_TENANT_TS_KV; + private static final String CALL_INSERT_INTO_TS_KV = CALL_REGEX + INSERT_INTO_TS_KV; private static final String CALL_INSERT_INTO_TS_KV_LATEST = CALL_REGEX + INSERT_INTO_TS_KV_LATEST; private static final String DROP_OLD_TENANT_TS_KV_TABLE = DROP_TABLE + TENANT_TS_KV_OLD_TABLE; - private static final String DROP_FUNCTION_CREATE_TS_KV_LATEST_TABLE = DROP_FUNCTION_IF_EXISTS + CREATE_TS_KV_LATEST_TABLE; - private static final String DROP_FUNCTION_CREATE_TENANT_TS_KV_TABLE_COPY = DROP_FUNCTION_IF_EXISTS + CREATE_NEW_TENANT_TS_KV_TABLE; - private static final String DROP_FUNCTION_CREATE_TS_KV_DICTIONARY_TABLE = DROP_FUNCTION_IF_EXISTS + CREATE_TS_KV_DICTIONARY_TABLE; - private static final String DROP_FUNCTION_INSERT_INTO_DICTIONARY = DROP_FUNCTION_IF_EXISTS + INSERT_INTO_DICTIONARY; - private static final String DROP_FUNCTION_INSERT_INTO_TENANT_TS_KV = DROP_FUNCTION_IF_EXISTS + INSERT_INTO_TENANT_TS_KV; - private static final String DROP_FUNCTION_INSERT_INTO_TS_KV_LATEST = DROP_FUNCTION_IF_EXISTS + INSERT_INTO_TS_KV_LATEST; + private static final String DROP_PROCEDURE_CREATE_TS_KV_LATEST_TABLE = DROP_PROCEDURE_IF_EXISTS + CREATE_TS_KV_LATEST_TABLE; + private static final String DROP_PROCEDURE_CREATE_TENANT_TS_KV_TABLE_COPY = DROP_PROCEDURE_IF_EXISTS + CREATE_NEW_TS_KV_TABLE; + private static final String DROP_PROCEDURE_CREATE_TS_KV_DICTIONARY_TABLE = DROP_PROCEDURE_IF_EXISTS + CREATE_TS_KV_DICTIONARY_TABLE; + private static final String DROP_PROCEDURE_INSERT_INTO_DICTIONARY = DROP_PROCEDURE_IF_EXISTS + INSERT_INTO_DICTIONARY; + private static final String DROP_PROCEDURE_INSERT_INTO_TENANT_TS_KV = DROP_PROCEDURE_IF_EXISTS + INSERT_INTO_TS_KV; + private static final String DROP_PROCEDURE_INSERT_INTO_TS_KV_LATEST = DROP_PROCEDURE_IF_EXISTS + INSERT_INTO_TS_KV_LATEST; @Autowired private InstallScripts installScripts; @@ -78,33 +78,31 @@ public class TimescaleTsDatabaseUpgradeService extends AbstractSqlTsDatabaseUpgr loadSql(conn); boolean versionValid = checkVersion(conn); if (!versionValid) { - log.info("PostgreSQL version should be at least more than 9.6!"); + log.info("PostgreSQL version should be at least more than 11!"); log.info("Please upgrade your PostgreSQL and restart the script!"); } else { log.info("PostgreSQL version is valid!"); log.info("Updating schema ..."); - executeFunction(conn, CALL_CREATE_TS_KV_LATEST_TABLE); - executeFunction(conn, CALL_CREATE_NEW_TENANT_TS_KV_TABLE); + executeQuery(conn, CALL_CREATE_TS_KV_LATEST_TABLE); + executeQuery(conn, CALL_CREATE_NEW_TENANT_TS_KV_TABLE); - executeQuery(conn, "SELECT create_hypertable('tenant_ts_kv', 'ts', chunk_time_interval => " + chunkTimeInterval + ", if_not_exists => true);"); + executeQuery(conn, "SELECT create_hypertable('ts_kv', 'ts', chunk_time_interval => " + chunkTimeInterval + ", if_not_exists => true);"); - executeFunction(conn, CALL_CREATE_TS_KV_DICTIONARY_TABLE); - executeFunction(conn, CALL_INSERT_INTO_DICTIONARY); - executeFunction(conn, CALL_INSERT_INTO_TS_KV); - executeFunction(conn, CALL_INSERT_INTO_TS_KV_LATEST); + executeQuery(conn, CALL_CREATE_TS_KV_DICTIONARY_TABLE); + executeQuery(conn, CALL_INSERT_INTO_DICTIONARY); + executeQuery(conn, CALL_INSERT_INTO_TS_KV); + executeQuery(conn, CALL_INSERT_INTO_TS_KV_LATEST); - //executeQuery(conn, "SELECT set_chunk_time_interval('tenant_ts_kv', " + chunkTimeInterval +");"); + executeQuery(conn, DROP_OLD_TENANT_TS_KV_TABLE); - executeDropStatement(conn, DROP_OLD_TENANT_TS_KV_TABLE); + executeQuery(conn, DROP_PROCEDURE_CREATE_TS_KV_LATEST_TABLE); + executeQuery(conn, DROP_PROCEDURE_CREATE_TENANT_TS_KV_TABLE_COPY); + executeQuery(conn, DROP_PROCEDURE_CREATE_TS_KV_DICTIONARY_TABLE); + executeQuery(conn, DROP_PROCEDURE_INSERT_INTO_DICTIONARY); + executeQuery(conn, DROP_PROCEDURE_INSERT_INTO_TENANT_TS_KV); + executeQuery(conn, DROP_PROCEDURE_INSERT_INTO_TS_KV_LATEST); - executeDropStatement(conn, DROP_FUNCTION_CREATE_TS_KV_LATEST_TABLE); - executeDropStatement(conn, DROP_FUNCTION_CREATE_TENANT_TS_KV_TABLE_COPY); - executeDropStatement(conn, DROP_FUNCTION_CREATE_TS_KV_DICTIONARY_TABLE); - executeDropStatement(conn, DROP_FUNCTION_INSERT_INTO_DICTIONARY); - executeDropStatement(conn, DROP_FUNCTION_INSERT_INTO_TENANT_TS_KV); - executeDropStatement(conn, DROP_FUNCTION_INSERT_INTO_TS_KV_LATEST); - - executeQuery(conn, "ALTER TABLE tenant_ts_kv ADD COLUMN json_v json;"); + executeQuery(conn, "ALTER TABLE ts_kv ADD COLUMN json_v json;"); executeQuery(conn, "ALTER TABLE ts_kv_latest ADD COLUMN json_v json;"); log.info("schema timeseries updated!"); diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractTsKvEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractTsKvEntity.java index f0dd03b5ca..36d9421c32 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractTsKvEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractTsKvEntity.java @@ -36,6 +36,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.BOOLEAN_VALUE_COLU import static org.thingsboard.server.dao.model.ModelConstants.DOUBLE_VALUE_COLUMN; import static org.thingsboard.server.dao.model.ModelConstants.ENTITY_ID_COLUMN; import static org.thingsboard.server.dao.model.ModelConstants.JSON_VALUE_COLUMN; +import static org.thingsboard.server.dao.model.ModelConstants.KEY_COLUMN; import static org.thingsboard.server.dao.model.ModelConstants.LONG_VALUE_COLUMN; import static org.thingsboard.server.dao.model.ModelConstants.STRING_VALUE_COLUMN; import static org.thingsboard.server.dao.model.ModelConstants.TS_COLUMN; @@ -53,6 +54,10 @@ public abstract class AbstractTsKvEntity implements ToData { @Column(name = ENTITY_ID_COLUMN, columnDefinition = "uuid") protected UUID entityId; + @Id + @Column(name = KEY_COLUMN) + protected int key; + @Id @Column(name = TS_COLUMN) protected Long ts; diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sqlts/latest/TsKvLatestEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sqlts/latest/TsKvLatestEntity.java index 01fe8322e3..e7de4afa67 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sqlts/latest/TsKvLatestEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sqlts/latest/TsKvLatestEntity.java @@ -69,10 +69,6 @@ import static org.thingsboard.server.dao.model.ModelConstants.KEY_COLUMN; }) public final class TsKvLatestEntity extends AbstractTsKvEntity { - @Id - @Column(name = KEY_COLUMN) - private int key; - @Override public boolean isNotEmpty() { return strValue != null || longValue != null || doubleValue != null || booleanValue != null || jsonValue != null; diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sqlts/timescale/ts/TimescaleTsKvCompositeKey.java b/dao/src/main/java/org/thingsboard/server/dao/model/sqlts/timescale/ts/TimescaleTsKvCompositeKey.java index e7db0572ec..afcf9b1d51 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sqlts/timescale/ts/TimescaleTsKvCompositeKey.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sqlts/timescale/ts/TimescaleTsKvCompositeKey.java @@ -31,7 +31,6 @@ public class TimescaleTsKvCompositeKey implements Serializable { @Transient private static final long serialVersionUID = -4089175869616037523L; - private UUID tenantId; private UUID entityId; private int key; private long ts; diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sqlts/timescale/ts/TimescaleTsKvEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sqlts/timescale/ts/TimescaleTsKvEntity.java index 76a95667a9..832a85d3e0 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sqlts/timescale/ts/TimescaleTsKvEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sqlts/timescale/ts/TimescaleTsKvEntity.java @@ -18,25 +18,18 @@ package org.thingsboard.server.dao.model.sqlts.timescale.ts; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.util.StringUtils; -import org.thingsboard.server.common.data.kv.TsKvEntry; -import org.thingsboard.server.dao.model.ToData; import org.thingsboard.server.dao.model.sql.AbstractTsKvEntity; -import javax.persistence.Column; import javax.persistence.ColumnResult; import javax.persistence.ConstructorResult; import javax.persistence.Entity; -import javax.persistence.Id; import javax.persistence.IdClass; import javax.persistence.NamedNativeQueries; import javax.persistence.NamedNativeQuery; import javax.persistence.SqlResultSetMapping; import javax.persistence.SqlResultSetMappings; import javax.persistence.Table; -import java.util.UUID; -import static org.thingsboard.server.dao.model.ModelConstants.KEY_COLUMN; -import static org.thingsboard.server.dao.model.ModelConstants.TENANT_ID_COLUMN; import static org.thingsboard.server.dao.sqlts.timescale.AggregationRepository.FIND_AVG; import static org.thingsboard.server.dao.sqlts.timescale.AggregationRepository.FIND_AVG_QUERY; import static org.thingsboard.server.dao.sqlts.timescale.AggregationRepository.FIND_COUNT; @@ -52,7 +45,7 @@ import static org.thingsboard.server.dao.sqlts.timescale.AggregationRepository.F @Data @EqualsAndHashCode(callSuper = true) @Entity -@Table(name = "tenant_ts_kv") +@Table(name = "ts_kv") @IdClass(TimescaleTsKvCompositeKey.class) @SqlResultSetMappings({ @SqlResultSetMapping( @@ -116,15 +109,7 @@ import static org.thingsboard.server.dao.sqlts.timescale.AggregationRepository.F resultSetMapping = "timescaleCountMapping" ) }) -public final class TimescaleTsKvEntity extends AbstractTsKvEntity implements ToData { - - @Id - @Column(name = TENANT_ID_COLUMN, columnDefinition = "uuid") - private UUID tenantId; - - @Id - @Column(name = KEY_COLUMN) - private int key; +public final class TimescaleTsKvEntity extends AbstractTsKvEntity { public TimescaleTsKvEntity() { } diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sqlts/ts/TsKvEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sqlts/ts/TsKvEntity.java index 6d01b62d25..3a14d0c957 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sqlts/ts/TsKvEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sqlts/ts/TsKvEntity.java @@ -32,10 +32,6 @@ import static org.thingsboard.server.dao.model.ModelConstants.KEY_COLUMN; @IdClass(TsKvCompositeKey.class) public final class TsKvEntity extends AbstractTsKvEntity { - @Id - @Column(name = KEY_COLUMN) - private int key; - public TsKvEntity() { } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sqlts/AbstractChunkedAggregationTimeseriesDao.java b/dao/src/main/java/org/thingsboard/server/dao/sqlts/AbstractChunkedAggregationTimeseriesDao.java index 588f2ef0e4..c4ac4e9fd8 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sqlts/AbstractChunkedAggregationTimeseriesDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sqlts/AbstractChunkedAggregationTimeseriesDao.java @@ -96,7 +96,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq @Override public ListenableFuture removeLatest(TenantId tenantId, EntityId entityId, DeleteTsKvQuery query) { - return getRemoveLatestFuture(tenantId, entityId, query); + return getRemoveLatestFuture(entityId, query); } @Override @@ -125,9 +125,9 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq } @Override - protected ListenableFuture> findAllAsync(TenantId tenantId, EntityId entityId, ReadTsKvQuery query) { + protected ListenableFuture> findAllAsync(EntityId entityId, ReadTsKvQuery query) { if (query.getAggregation() == Aggregation.NONE) { - return findAllAsyncWithLimit(tenantId, entityId, query); + return findAllAsyncWithLimit(entityId, query); } else { long stepTs = query.getStartTs(); List>> futures = new ArrayList<>(); @@ -135,7 +135,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq long startTs = stepTs; long endTs = stepTs + query.getInterval(); long ts = startTs + (endTs - startTs) / 2; - futures.add(findAndAggregateAsync(tenantId, entityId, query.getKey(), startTs, endTs, ts, query.getAggregation())); + futures.add(findAndAggregateAsync(entityId, query.getKey(), startTs, endTs, ts, query.getAggregation())); stepTs = endTs; } return getTskvEntriesFuture(Futures.allAsList(futures)); @@ -143,7 +143,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq } @Override - protected ListenableFuture> findAllAsyncWithLimit(TenantId tenantId, EntityId entityId, ReadTsKvQuery query) { + protected ListenableFuture> findAllAsyncWithLimit(EntityId entityId, ReadTsKvQuery query) { Integer keyId = getOrSaveKeyId(query.getKey()); List tsKvEntities = tsKvRepository.findAllWithLimit( entityId.getId(), @@ -157,9 +157,9 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq return Futures.immediateFuture(DaoUtil.convertDataList(tsKvEntities)); } - protected ListenableFuture> findAndAggregateAsync(TenantId tenantId, EntityId entityId, String key, long startTs, long endTs, long ts, Aggregation aggregation) { + private ListenableFuture> findAndAggregateAsync(EntityId entityId, String key, long startTs, long endTs, long ts, Aggregation aggregation) { List> entitiesFutures = new ArrayList<>(); - switchAggregation(tenantId, entityId, key, startTs, endTs, aggregation, entitiesFutures); + switchAggregation(entityId, key, startTs, endTs, aggregation, entitiesFutures); return Futures.transform(setFutures(entitiesFutures), entity -> { if (entity != null && entity.isNotEmpty()) { entity.setEntityId(entityId.getId()); @@ -172,29 +172,29 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq }, MoreExecutors.directExecutor()); } - protected void switchAggregation(TenantId tenantId, EntityId entityId, String key, long startTs, long endTs, Aggregation aggregation, List> entitiesFutures) { + protected void switchAggregation(EntityId entityId, String key, long startTs, long endTs, Aggregation aggregation, List> entitiesFutures) { switch (aggregation) { case AVG: - findAvg(tenantId, entityId, key, startTs, endTs, entitiesFutures); + findAvg(entityId, key, startTs, endTs, entitiesFutures); break; case MAX: - findMax(tenantId, entityId, key, startTs, endTs, entitiesFutures); + findMax(entityId, key, startTs, endTs, entitiesFutures); break; case MIN: - findMin(tenantId, entityId, key, startTs, endTs, entitiesFutures); + findMin(entityId, key, startTs, endTs, entitiesFutures); break; case SUM: - findSum(tenantId, entityId, key, startTs, endTs, entitiesFutures); + findSum(entityId, key, startTs, endTs, entitiesFutures); break; case COUNT: - findCount(tenantId, entityId, key, startTs, endTs, entitiesFutures); + findCount(entityId, key, startTs, endTs, entitiesFutures); break; default: throw new IllegalArgumentException("Not supported aggregation type: " + aggregation); } } - protected void findCount(TenantId tenantId, EntityId entityId, String key, long startTs, long endTs, List> entitiesFutures) { + protected void findCount(EntityId entityId, String key, long startTs, long endTs, List> entitiesFutures) { Integer keyId = getOrSaveKeyId(key); entitiesFutures.add(tsKvRepository.findCount( entityId.getId(), @@ -203,7 +203,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq endTs)); } - protected void findSum(TenantId tenantId, EntityId entityId, String key, long startTs, long endTs, List> entitiesFutures) { + protected void findSum(EntityId entityId, String key, long startTs, long endTs, List> entitiesFutures) { Integer keyId = getOrSaveKeyId(key); entitiesFutures.add(tsKvRepository.findSum( entityId.getId(), @@ -212,7 +212,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq endTs)); } - protected void findMin(TenantId tenantId, EntityId entityId, String key, long startTs, long endTs, List> entitiesFutures) { + protected void findMin(EntityId entityId, String key, long startTs, long endTs, List> entitiesFutures) { Integer keyId = getOrSaveKeyId(key); entitiesFutures.add(tsKvRepository.findStringMin( entityId.getId(), @@ -226,7 +226,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq endTs)); } - protected void findMax(TenantId tenantId, EntityId entityId, String key, long startTs, long endTs, List> entitiesFutures) { + protected void findMax(EntityId entityId, String key, long startTs, long endTs, List> entitiesFutures) { Integer keyId = getOrSaveKeyId(key); entitiesFutures.add(tsKvRepository.findStringMax( entityId.getId(), @@ -240,7 +240,7 @@ public abstract class AbstractChunkedAggregationTimeseriesDao extends AbstractSq endTs)); } - protected void findAvg(TenantId tenantId, EntityId entityId, String key, long startTs, long endTs, List> entitiesFutures) { + protected void findAvg(EntityId entityId, String key, long startTs, long endTs, List> entitiesFutures) { Integer keyId = getOrSaveKeyId(key); entitiesFutures.add(tsKvRepository.findAvg( entityId.getId(), diff --git a/dao/src/main/java/org/thingsboard/server/dao/sqlts/AbstractSqlTimeseriesDao.java b/dao/src/main/java/org/thingsboard/server/dao/sqlts/AbstractSqlTimeseriesDao.java index a9277ec7e2..1d97aaddd8 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sqlts/AbstractSqlTimeseriesDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sqlts/AbstractSqlTimeseriesDao.java @@ -127,7 +127,7 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx protected ListenableFuture> processFindAllAsync(TenantId tenantId, EntityId entityId, List queries) { List>> futures = queries .stream() - .map(query -> findAllAsync(tenantId, entityId, query)) + .map(query -> findAllAsync(entityId, query)) .collect(Collectors.toList()); return Futures.transform(Futures.allAsList(futures), new Function>, List>() { @Nullable @@ -144,9 +144,9 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx }, service); } - protected abstract ListenableFuture> findAllAsync(TenantId tenantId, EntityId entityId, ReadTsKvQuery query); + protected abstract ListenableFuture> findAllAsync(EntityId entityId, ReadTsKvQuery query); - protected abstract ListenableFuture> findAllAsyncWithLimit(TenantId tenantId, EntityId entityId, ReadTsKvQuery query); + protected abstract ListenableFuture> findAllAsyncWithLimit(EntityId entityId, ReadTsKvQuery query); protected ListenableFuture> getTskvEntriesFuture(ListenableFuture>> future) { return Futures.transform(future, new Function>, List>() { @@ -164,12 +164,12 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx }, service); } - protected ListenableFuture> findNewLatestEntryFuture(TenantId tenantId, EntityId entityId, DeleteTsKvQuery query) { + protected ListenableFuture> findNewLatestEntryFuture(EntityId entityId, DeleteTsKvQuery query) { long startTs = 0; long endTs = query.getStartTs() - 1; ReadTsKvQuery findNewLatestQuery = new BaseReadTsKvQuery(query.getKey(), startTs, endTs, endTs - startTs, 1, Aggregation.NONE, DESC_ORDER); - return findAllAsync(tenantId, entityId, findNewLatestQuery); + return findAllAsync(entityId, findNewLatestQuery); } protected ListenableFuture getFindLatestFuture(EntityId entityId, String key) { @@ -189,7 +189,7 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx return Futures.immediateFuture(result); } - protected ListenableFuture getRemoveLatestFuture(TenantId tenantId, EntityId entityId, DeleteTsKvQuery query) { + protected ListenableFuture getRemoveLatestFuture(EntityId entityId, DeleteTsKvQuery query) { ListenableFuture latestFuture = getFindLatestFuture(entityId, query.getKey()); ListenableFuture booleanFuture = Futures.transform(latestFuture, tsKvEntry -> { @@ -217,7 +217,7 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx if (query.getRewriteLatestIfDeleted()) { ListenableFuture savedLatestFuture = Futures.transformAsync(booleanFuture, isRemove -> { if (isRemove) { - return getNewLatestEntryFuture(tenantId, entityId, query); + return getNewLatestEntryFuture(entityId, query); } return Futures.immediateFuture(null); }, service); @@ -296,8 +296,8 @@ public abstract class AbstractSqlTimeseriesDao extends JpaAbstractDaoListeningEx return keyId; } - private ListenableFuture getNewLatestEntryFuture(TenantId tenantId, EntityId entityId, DeleteTsKvQuery query) { - ListenableFuture> future = findNewLatestEntryFuture(tenantId, entityId, query); + private ListenableFuture getNewLatestEntryFuture(EntityId entityId, DeleteTsKvQuery query) { + ListenableFuture> future = findNewLatestEntryFuture(entityId, query); return Futures.transformAsync(future, entryList -> { if (entryList.size() == 1) { return getSaveLatestFuture(entityId, entryList.get(0)); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sqlts/insert/timescale/TimescaleInsertTsRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sqlts/insert/timescale/TimescaleInsertTsRepository.java index 738ae52a9d..1fa1fc4219 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sqlts/insert/timescale/TimescaleInsertTsRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sqlts/insert/timescale/TimescaleInsertTsRepository.java @@ -37,8 +37,8 @@ import java.util.List; public class TimescaleInsertTsRepository extends AbstractInsertRepository implements InsertTsRepository { private static final String INSERT_OR_UPDATE = - "INSERT INTO tenant_ts_kv (tenant_id, entity_id, key, ts, bool_v, str_v, long_v, dbl_v, json_v) VALUES(?, ?, ?, ?, ?, ?, ?, ?, cast(? AS json)) " + - "ON CONFLICT (tenant_id, entity_id, key, ts) DO UPDATE SET bool_v = ?, str_v = ?, long_v = ?, dbl_v = ?, json_v = cast(? AS json);"; + "INSERT INTO ts_kv (entity_id, key, ts, bool_v, str_v, long_v, dbl_v, json_v) VALUES(?, ?, ?, ?, ?, ?, ?, cast(? AS json)) " + + "ON CONFLICT (entity_id, key, ts) DO UPDATE SET bool_v = ?, str_v = ?, long_v = ?, dbl_v = ?, json_v = cast(? AS json);"; @Override public void saveOrUpdate(List> entities) { @@ -46,41 +46,40 @@ public class TimescaleInsertTsRepository extends AbstractInsertRepository implem @Override public void setValues(PreparedStatement ps, int i) throws SQLException { TimescaleTsKvEntity tsKvEntity = entities.get(i).getEntity(); - ps.setObject(1, tsKvEntity.getTenantId()); - ps.setObject(2, tsKvEntity.getEntityId()); - ps.setInt(3, tsKvEntity.getKey()); - ps.setLong(4, tsKvEntity.getTs()); + ps.setObject(1, tsKvEntity.getEntityId()); + ps.setInt(2, tsKvEntity.getKey()); + ps.setLong(3, tsKvEntity.getTs()); if (tsKvEntity.getBooleanValue() != null) { - ps.setBoolean(5, tsKvEntity.getBooleanValue()); - ps.setBoolean(10, tsKvEntity.getBooleanValue()); + ps.setBoolean(4, tsKvEntity.getBooleanValue()); + ps.setBoolean(9, tsKvEntity.getBooleanValue()); } else { - ps.setNull(5, Types.BOOLEAN); - ps.setNull(10, Types.BOOLEAN); + ps.setNull(4, Types.BOOLEAN); + ps.setNull(9, Types.BOOLEAN); } - ps.setString(6, replaceNullChars(tsKvEntity.getStrValue())); - ps.setString(11, replaceNullChars(tsKvEntity.getStrValue())); + ps.setString(5, replaceNullChars(tsKvEntity.getStrValue())); + ps.setString(10, replaceNullChars(tsKvEntity.getStrValue())); if (tsKvEntity.getLongValue() != null) { - ps.setLong(7, tsKvEntity.getLongValue()); - ps.setLong(12, tsKvEntity.getLongValue()); + ps.setLong(6, tsKvEntity.getLongValue()); + ps.setLong(11, tsKvEntity.getLongValue()); } else { - ps.setNull(7, Types.BIGINT); - ps.setNull(12, Types.BIGINT); + ps.setNull(6, Types.BIGINT); + ps.setNull(11, Types.BIGINT); } if (tsKvEntity.getDoubleValue() != null) { - ps.setDouble(8, tsKvEntity.getDoubleValue()); - ps.setDouble(13, tsKvEntity.getDoubleValue()); + ps.setDouble(7, tsKvEntity.getDoubleValue()); + ps.setDouble(12, tsKvEntity.getDoubleValue()); } else { - ps.setNull(8, Types.DOUBLE); - ps.setNull(13, Types.DOUBLE); + ps.setNull(7, Types.DOUBLE); + ps.setNull(12, Types.DOUBLE); } - ps.setString(9, replaceNullChars(tsKvEntity.getJsonValue())); - ps.setString(14, replaceNullChars(tsKvEntity.getJsonValue())); + ps.setString(8, replaceNullChars(tsKvEntity.getJsonValue())); + ps.setString(13, replaceNullChars(tsKvEntity.getJsonValue())); } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/sqlts/timescale/AggregationRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sqlts/timescale/AggregationRepository.java index ed784b96ba..28b666b03b 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sqlts/timescale/AggregationRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sqlts/timescale/AggregationRepository.java @@ -36,7 +36,7 @@ public class AggregationRepository { public static final String FIND_SUM = "findSum"; public static final String FIND_COUNT = "findCount"; - public static final String FROM_WHERE_CLAUSE = "FROM tenant_ts_kv tskv WHERE tskv.tenant_id = cast(:tenantId AS uuid) AND tskv.entity_id = cast(:entityId AS uuid) AND tskv.key= cast(:entityKey AS int) AND tskv.ts > :startTs AND tskv.ts <= :endTs GROUP BY tskv.tenant_id, tskv.entity_id, tskv.key, tsBucket ORDER BY tskv.tenant_id, tskv.entity_id, tskv.key, tsBucket"; + public static final String FROM_WHERE_CLAUSE = "FROM ts_kv tskv WHERE tskv.entity_id = cast(:entityId AS uuid) AND tskv.key= cast(:entityKey AS int) AND tskv.ts > :startTs AND tskv.ts <= :endTs GROUP BY tskv.entity_id, tskv.key, tsBucket ORDER BY tskv.entity_id, tskv.key, tsBucket"; public static final String FIND_AVG_QUERY = "SELECT time_bucket(:timeBucket, tskv.ts) AS tsBucket, :timeBucket AS interval, SUM(COALESCE(tskv.long_v, 0)) AS longValue, SUM(COALESCE(tskv.dbl_v, 0.0)) AS doubleValue, SUM(CASE WHEN tskv.long_v IS NULL THEN 0 ELSE 1 END) AS longCountValue, SUM(CASE WHEN tskv.dbl_v IS NULL THEN 0 ELSE 1 END) AS doubleCountValue, null AS strValue, 'AVG' AS aggType "; @@ -52,43 +52,42 @@ public class AggregationRepository { private EntityManager entityManager; @Async - public CompletableFuture> findAvg(UUID tenantId, UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { + public CompletableFuture> findAvg(UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { @SuppressWarnings("unchecked") - List resultList = getResultList(tenantId, entityId, entityKey, timeBucket, startTs, endTs, FIND_AVG); + List resultList = getResultList(entityId, entityKey, timeBucket, startTs, endTs, FIND_AVG); return CompletableFuture.supplyAsync(() -> resultList); } @Async - public CompletableFuture> findMax(UUID tenantId, UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { + public CompletableFuture> findMax(UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { @SuppressWarnings("unchecked") - List resultList = getResultList(tenantId, entityId, entityKey, timeBucket, startTs, endTs, FIND_MAX); + List resultList = getResultList(entityId, entityKey, timeBucket, startTs, endTs, FIND_MAX); return CompletableFuture.supplyAsync(() -> resultList); } @Async - public CompletableFuture> findMin(UUID tenantId, UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { + public CompletableFuture> findMin(UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { @SuppressWarnings("unchecked") - List resultList = getResultList(tenantId, entityId, entityKey, timeBucket, startTs, endTs, FIND_MIN); + List resultList = getResultList(entityId, entityKey, timeBucket, startTs, endTs, FIND_MIN); return CompletableFuture.supplyAsync(() -> resultList); } @Async - public CompletableFuture> findSum(UUID tenantId, UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { + public CompletableFuture> findSum(UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { @SuppressWarnings("unchecked") - List resultList = getResultList(tenantId, entityId, entityKey, timeBucket, startTs, endTs, FIND_SUM); + List resultList = getResultList(entityId, entityKey, timeBucket, startTs, endTs, FIND_SUM); return CompletableFuture.supplyAsync(() -> resultList); } @Async - public CompletableFuture> findCount(UUID tenantId, UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { + public CompletableFuture> findCount(UUID entityId, int entityKey, long timeBucket, long startTs, long endTs) { @SuppressWarnings("unchecked") - List resultList = getResultList(tenantId, entityId, entityKey, timeBucket, startTs, endTs, FIND_COUNT); + List resultList = getResultList(entityId, entityKey, timeBucket, startTs, endTs, FIND_COUNT); return CompletableFuture.supplyAsync(() -> resultList); } - private List getResultList(UUID tenantId, UUID entityId, int entityKey, long timeBucket, long startTs, long endTs, String query) { + private List getResultList(UUID entityId, int entityKey, long timeBucket, long startTs, long endTs, String query) { return entityManager.createNamedQuery(query) - .setParameter("tenantId", tenantId) .setParameter("entityId", entityId) .setParameter("entityKey", entityKey) .setParameter("timeBucket", timeBucket) diff --git a/dao/src/main/java/org/thingsboard/server/dao/sqlts/timescale/TimescaleTimeseriesDao.java b/dao/src/main/java/org/thingsboard/server/dao/sqlts/timescale/TimescaleTimeseriesDao.java index 4ca53a337b..bf4cf5d9e6 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sqlts/timescale/TimescaleTimeseriesDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sqlts/timescale/TimescaleTimeseriesDao.java @@ -88,24 +88,23 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements } @Override - protected ListenableFuture> findAllAsync(TenantId tenantId, EntityId entityId, ReadTsKvQuery query) { + protected ListenableFuture> findAllAsync(EntityId entityId, ReadTsKvQuery query) { if (query.getAggregation() == Aggregation.NONE) { - return findAllAsyncWithLimit(tenantId, entityId, query); + return findAllAsyncWithLimit(entityId, query); } else { long startTs = query.getStartTs(); long endTs = query.getEndTs(); long timeBucket = query.getInterval(); - ListenableFuture>> future = findAllAndAggregateAsync(tenantId, entityId, query.getKey(), startTs, endTs, timeBucket, query.getAggregation()); + ListenableFuture>> future = findAllAndAggregateAsync(entityId, query.getKey(), startTs, endTs, timeBucket, query.getAggregation()); return getTskvEntriesFuture(future); } } @Override - protected ListenableFuture> findAllAsyncWithLimit(TenantId tenantId, EntityId entityId, ReadTsKvQuery query) { + protected ListenableFuture> findAllAsyncWithLimit(EntityId entityId, ReadTsKvQuery query) { String strKey = query.getKey(); Integer keyId = getOrSaveKeyId(strKey); List timescaleTsKvEntities = tsKvRepository.findAllWithLimit( - tenantId.getId(), entityId.getId(), keyId, query.getStartTs(), @@ -117,8 +116,8 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements return Futures.immediateFuture(DaoUtil.convertDataList(timescaleTsKvEntities)); } - private ListenableFuture>> findAllAndAggregateAsync(TenantId tenantId, EntityId entityId, String key, long startTs, long endTs, long timeBucket, Aggregation aggregation) { - CompletableFuture> listCompletableFuture = switchAggregation(key, startTs, endTs, timeBucket, aggregation, entityId.getId(), tenantId.getId()); + private ListenableFuture>> findAllAndAggregateAsync(EntityId entityId, String key, long startTs, long endTs, long timeBucket, Aggregation aggregation) { + CompletableFuture> listCompletableFuture = switchAggregation(key, startTs, endTs, timeBucket, aggregation, entityId.getId()); SettableFuture> listenableFuture = SettableFuture.create(); listCompletableFuture.whenComplete((timescaleTsKvEntities, throwable) -> { if (throwable != null) { @@ -133,7 +132,6 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements timescaleTsKvEntities.forEach(entity -> { if (entity != null && entity.isNotEmpty()) { entity.setEntityId(entityId.getId()); - entity.setTenantId(tenantId.getId()); entity.setStrKey(key); result.add(Optional.of(DaoUtil.getData(entity))); } else { @@ -167,7 +165,6 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements String strKey = tsKvEntry.getKey(); Integer keyId = getOrSaveKeyId(strKey); TimescaleTsKvEntity entity = new TimescaleTsKvEntity(); - entity.setTenantId(tenantId.getId()); entity.setEntityId(entityId.getId()); entity.setTs(tsKvEntry.getTs()); entity.setKey(keyId); @@ -197,7 +194,6 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements Integer keyId = getOrSaveKeyId(strKey); return service.submit(() -> { tsKvRepository.delete( - tenantId.getId(), entityId.getId(), keyId, query.getStartTs(), @@ -208,7 +204,7 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements @Override public ListenableFuture removeLatest(TenantId tenantId, EntityId entityId, DeleteTsKvQuery query) { - return getRemoveLatestFuture(tenantId, entityId, query); + return getRemoveLatestFuture(entityId, query); } @Override @@ -216,27 +212,26 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements return service.submit(() -> null); } - private CompletableFuture> switchAggregation(String key, long startTs, long endTs, long timeBucket, Aggregation aggregation, UUID entityId, UUID tenantId) { + private CompletableFuture> switchAggregation(String key, long startTs, long endTs, long timeBucket, Aggregation aggregation, UUID entityId) { switch (aggregation) { case AVG: - return findAvg(key, startTs, endTs, timeBucket, entityId, tenantId); + return findAvg(key, startTs, endTs, timeBucket, entityId); case MAX: - return findMax(key, startTs, endTs, timeBucket, entityId, tenantId); + return findMax(key, startTs, endTs, timeBucket, entityId); case MIN: - return findMin(key, startTs, endTs, timeBucket, entityId, tenantId); + return findMin(key, startTs, endTs, timeBucket, entityId); case SUM: - return findSum(key, startTs, endTs, timeBucket, entityId, tenantId); + return findSum(key, startTs, endTs, timeBucket, entityId); case COUNT: - return findCount(key, startTs, endTs, timeBucket, entityId, tenantId); + return findCount(key, startTs, endTs, timeBucket, entityId); default: throw new IllegalArgumentException("Not supported aggregation type: " + aggregation); } } - private CompletableFuture> findCount(String key, long startTs, long endTs, long timeBucket, UUID entityId, UUID tenantId) { + private CompletableFuture> findCount(String key, long startTs, long endTs, long timeBucket, UUID entityId) { Integer keyId = getOrSaveKeyId(key); return aggregationRepository.findCount( - tenantId, entityId, keyId, timeBucket, @@ -244,10 +239,9 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements endTs); } - private CompletableFuture> findSum(String key, long startTs, long endTs, long timeBucket, UUID entityId, UUID tenantId) { + private CompletableFuture> findSum(String key, long startTs, long endTs, long timeBucket, UUID entityId) { Integer keyId = getOrSaveKeyId(key); return aggregationRepository.findSum( - tenantId, entityId, keyId, timeBucket, @@ -255,10 +249,9 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements endTs); } - private CompletableFuture> findMin(String key, long startTs, long endTs, long timeBucket, UUID entityId, UUID tenantId) { + private CompletableFuture> findMin(String key, long startTs, long endTs, long timeBucket, UUID entityId) { Integer keyId = getOrSaveKeyId(key); return aggregationRepository.findMin( - tenantId, entityId, keyId, timeBucket, @@ -266,10 +259,9 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements endTs); } - private CompletableFuture> findMax(String key, long startTs, long endTs, long timeBucket, UUID entityId, UUID tenantId) { + private CompletableFuture> findMax(String key, long startTs, long endTs, long timeBucket, UUID entityId) { Integer keyId = getOrSaveKeyId(key); return aggregationRepository.findMax( - tenantId, entityId, keyId, timeBucket, @@ -277,10 +269,9 @@ public class TimescaleTimeseriesDao extends AbstractSqlTimeseriesDao implements endTs); } - private CompletableFuture> findAvg(String key, long startTs, long endTs, long timeBucket, UUID entityId, UUID tenantId) { + private CompletableFuture> findAvg(String key, long startTs, long endTs, long timeBucket, UUID entityId) { Integer keyId = getOrSaveKeyId(key); return aggregationRepository.findAvg( - tenantId, entityId, keyId, timeBucket, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sqlts/timescale/TsKvTimescaleRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sqlts/timescale/TsKvTimescaleRepository.java index fb9cb6f7fe..d4e80dc1f5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sqlts/timescale/TsKvTimescaleRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sqlts/timescale/TsKvTimescaleRepository.java @@ -31,12 +31,10 @@ import java.util.UUID; @TimescaleDBTsDao public interface TsKvTimescaleRepository extends CrudRepository { - @Query("SELECT tskv FROM TimescaleTsKvEntity tskv WHERE tskv.tenantId = :tenantId " + - "AND tskv.entityId = :entityId " + + @Query("SELECT tskv FROM TimescaleTsKvEntity tskv WHERE tskv.entityId = :entityId " + "AND tskv.key = :entityKey " + "AND tskv.ts > :startTs AND tskv.ts <= :endTs") List findAllWithLimit( - @Param("tenantId") UUID tenantId, @Param("entityId") UUID entityId, @Param("entityKey") int key, @Param("startTs") long startTs, @@ -44,12 +42,10 @@ public interface TsKvTimescaleRepository extends CrudRepository :startTs AND tskv.ts <= :endTs") - void delete(@Param("tenantId") UUID tenantId, - @Param("entityId") UUID entityId, + void delete(@Param("entityId") UUID entityId, @Param("entityKey") int key, @Param("startTs") long startTs, @Param("endTs") long endTs); diff --git a/dao/src/main/resources/sql/schema-timescale-idx.sql b/dao/src/main/resources/sql/schema-timescale-idx.sql deleted file mode 100644 index b9a3737d47..0000000000 --- a/dao/src/main/resources/sql/schema-timescale-idx.sql +++ /dev/null @@ -1,17 +0,0 @@ --- --- Copyright © 2016-2020 The Thingsboard Authors --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- - -CREATE INDEX IF NOT EXISTS idx_tenant_ts_kv ON tenant_ts_kv(tenant_id, entity_id, key, ts); \ No newline at end of file diff --git a/dao/src/main/resources/sql/schema-timescale.sql b/dao/src/main/resources/sql/schema-timescale.sql index 7251d8be4e..b95c8b86ba 100644 --- a/dao/src/main/resources/sql/schema-timescale.sql +++ b/dao/src/main/resources/sql/schema-timescale.sql @@ -16,8 +16,7 @@ CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE; -CREATE TABLE IF NOT EXISTS tenant_ts_kv ( - tenant_id uuid NOT NULL, +CREATE TABLE IF NOT EXISTS ts_kv ( entity_id uuid NOT NULL, key int NOT NULL, ts bigint NOT NULL, @@ -26,7 +25,7 @@ CREATE TABLE IF NOT EXISTS tenant_ts_kv ( long_v bigint, dbl_v double precision, json_v json, - CONSTRAINT tenant_ts_kv_pkey PRIMARY KEY (tenant_id, entity_id, key, ts) + CONSTRAINT ts_kv_pkey PRIMARY KEY (entity_id, key, ts) ); CREATE TABLE IF NOT EXISTS ts_kv_dictionary ( diff --git a/dao/src/test/java/org/thingsboard/server/dao/SqlDaoServiceTestSuite.java b/dao/src/test/java/org/thingsboard/server/dao/SqlDaoServiceTestSuite.java index 7ebab237a8..6d306c4e71 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/SqlDaoServiceTestSuite.java +++ b/dao/src/test/java/org/thingsboard/server/dao/SqlDaoServiceTestSuite.java @@ -44,7 +44,7 @@ public class SqlDaoServiceTestSuite { // @ClassRule // public static CustomSqlUnit sqlUnit = new CustomSqlUnit( -// Arrays.asList("sql/schema-timescale.sql", "sql/schema-timescale-idx.sql", "sql/schema-entities.sql", "sql/schema-entities-idx.sql", "sql/system-data.sql", "sql/system-test.sql"), +// Arrays.asList("sql/schema-timescale.sql", "sql/schema-entities.sql", "sql/schema-entities-idx.sql", "sql/system-data.sql", "sql/system-test.sql"), // "sql/timescale/drop-all-tables.sql", // "sql-test.properties" // ); diff --git a/dao/src/test/resources/sql/timescale/drop-all-tables.sql b/dao/src/test/resources/sql/timescale/drop-all-tables.sql index 08d018dc1b..ac921c0f4a 100644 --- a/dao/src/test/resources/sql/timescale/drop-all-tables.sql +++ b/dao/src/test/resources/sql/timescale/drop-all-tables.sql @@ -12,7 +12,7 @@ DROP TABLE IF EXISTS event; DROP TABLE IF EXISTS relation; DROP TABLE IF EXISTS tb_user; DROP TABLE IF EXISTS tenant; -DROP TABLE IF EXISTS tenant_ts_kv; +DROP TABLE IF EXISTS ts_kv; DROP TABLE IF EXISTS ts_kv_latest; DROP TABLE IF EXISTS user_credentials; DROP TABLE IF EXISTS widget_type; From 72ef0ede740c92ce6087c02785aad91b8e1ef89c Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Wed, 11 Mar 2020 16:36:08 +0200 Subject: [PATCH 4/4] Fix RPM preinst script --- application/src/main/scripts/control/rpm/preinst | 6 +++--- transport/coap/src/main/scripts/control/rpm/preinst | 6 +++--- transport/http/src/main/scripts/control/rpm/preinst | 6 +++--- transport/mqtt/src/main/scripts/control/rpm/preinst | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/application/src/main/scripts/control/rpm/preinst b/application/src/main/scripts/control/rpm/preinst index e19fc884c8..db6306e4ac 100644 --- a/application/src/main/scripts/control/rpm/preinst +++ b/application/src/main/scripts/control/rpm/preinst @@ -1,6 +1,6 @@ #!/bin/sh -getent group ${pkg.name} >/dev/null || groupadd -r ${pkg.name} -getent passwd ${pkg.name} >/dev/null || \ -useradd -d ${pkg.installFolder} -g ${pkg.name} -M -r ${pkg.name} -s /sbin/nologin \ +getent group ${pkg.user} >/dev/null || groupadd -r ${pkg.user} +getent passwd ${pkg.user} >/dev/null || \ +useradd -d ${pkg.installFolder} -g ${pkg.user} -M -r ${pkg.user} -s /sbin/nologin \ -c "Thingsboard application" diff --git a/transport/coap/src/main/scripts/control/rpm/preinst b/transport/coap/src/main/scripts/control/rpm/preinst index e19fc884c8..db6306e4ac 100644 --- a/transport/coap/src/main/scripts/control/rpm/preinst +++ b/transport/coap/src/main/scripts/control/rpm/preinst @@ -1,6 +1,6 @@ #!/bin/sh -getent group ${pkg.name} >/dev/null || groupadd -r ${pkg.name} -getent passwd ${pkg.name} >/dev/null || \ -useradd -d ${pkg.installFolder} -g ${pkg.name} -M -r ${pkg.name} -s /sbin/nologin \ +getent group ${pkg.user} >/dev/null || groupadd -r ${pkg.user} +getent passwd ${pkg.user} >/dev/null || \ +useradd -d ${pkg.installFolder} -g ${pkg.user} -M -r ${pkg.user} -s /sbin/nologin \ -c "Thingsboard application" diff --git a/transport/http/src/main/scripts/control/rpm/preinst b/transport/http/src/main/scripts/control/rpm/preinst index e19fc884c8..db6306e4ac 100644 --- a/transport/http/src/main/scripts/control/rpm/preinst +++ b/transport/http/src/main/scripts/control/rpm/preinst @@ -1,6 +1,6 @@ #!/bin/sh -getent group ${pkg.name} >/dev/null || groupadd -r ${pkg.name} -getent passwd ${pkg.name} >/dev/null || \ -useradd -d ${pkg.installFolder} -g ${pkg.name} -M -r ${pkg.name} -s /sbin/nologin \ +getent group ${pkg.user} >/dev/null || groupadd -r ${pkg.user} +getent passwd ${pkg.user} >/dev/null || \ +useradd -d ${pkg.installFolder} -g ${pkg.user} -M -r ${pkg.user} -s /sbin/nologin \ -c "Thingsboard application" diff --git a/transport/mqtt/src/main/scripts/control/rpm/preinst b/transport/mqtt/src/main/scripts/control/rpm/preinst index e19fc884c8..db6306e4ac 100644 --- a/transport/mqtt/src/main/scripts/control/rpm/preinst +++ b/transport/mqtt/src/main/scripts/control/rpm/preinst @@ -1,6 +1,6 @@ #!/bin/sh -getent group ${pkg.name} >/dev/null || groupadd -r ${pkg.name} -getent passwd ${pkg.name} >/dev/null || \ -useradd -d ${pkg.installFolder} -g ${pkg.name} -M -r ${pkg.name} -s /sbin/nologin \ +getent group ${pkg.user} >/dev/null || groupadd -r ${pkg.user} +getent passwd ${pkg.user} >/dev/null || \ +useradd -d ${pkg.installFolder} -g ${pkg.user} -M -r ${pkg.user} -s /sbin/nologin \ -c "Thingsboard application"