From aba4fa82155c9bbdf8c6ee99a4d28531c3f523f6 Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Wed, 15 Jun 2022 11:09:08 +0300 Subject: [PATCH] Performance improvement for entities export --- .../ie/exporting/impl/AssetExportService.java | 2 +- .../impl/DashboardExportService.java | 2 +- .../impl/DefaultEntityExportService.java | 18 +++++++++++------ .../exporting/impl/DeviceExportService.java | 4 ++-- .../impl/DeviceProfileExportService.java | 4 ++-- .../impl/EntityViewExportService.java | 4 ++-- .../sync/vc/data/EntitiesExportCtx.java | 20 +++++++++++++++++++ 7 files changed, 40 insertions(+), 14 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/AssetExportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/AssetExportService.java index e4daec3e3c..3c60fd2976 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/AssetExportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/AssetExportService.java @@ -34,7 +34,7 @@ public class AssetExportService extends BaseEntityExportService ctx, Asset asset, EntityExportData exportData) { - asset.setCustomerId(getExternalIdOrElseInternal(asset.getCustomerId())); + asset.setCustomerId(getExternalIdOrElseInternal(ctx, asset.getCustomerId())); } @Override diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DashboardExportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DashboardExportService.java index 8b2c669bd2..1064962082 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DashboardExportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DashboardExportService.java @@ -36,7 +36,7 @@ public class DashboardExportService extends BaseEntityExportService ctx, Dashboard dashboard, EntityExportData exportData) { if (CollectionUtils.isNotEmpty(dashboard.getAssignedCustomers())) { dashboard.getAssignedCustomers().forEach(customerInfo -> { - customerInfo.setCustomerId(getExternalIdOrElseInternal(customerInfo.getCustomerId())); + customerInfo.setCustomerId(getExternalIdOrElseInternal(ctx, customerInfo.getCustomerId())); }); } } diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DefaultEntityExportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DefaultEntityExportService.java index 50dee59fa7..1a1aec32c0 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DefaultEntityExportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DefaultEntityExportService.java @@ -53,7 +53,8 @@ import java.util.stream.Collectors; @Primary public class DefaultEntityExportService, D extends EntityExportData> implements EntityExportService { - @Autowired @Lazy + @Autowired + @Lazy protected ExportableEntitiesService exportableEntitiesService; @Autowired private RelationService relationService; @@ -82,8 +83,8 @@ public class DefaultEntityExportService relations = exportRelations(ctx, entity); relations.forEach(relation -> { - relation.setFrom(getExternalIdOrElseInternal(relation.getFrom())); - relation.setTo(getExternalIdOrElseInternal(relation.getTo())); + relation.setFrom(getExternalIdOrElseInternal(ctx, relation.getFrom())); + relation.setTo(getExternalIdOrElseInternal(ctx, relation.getTo())); }); exportData.setRelations(relations); } @@ -134,10 +135,15 @@ public class DefaultEntityExportService ID getExternalIdOrElseInternal(ID internalId) { + protected ID getExternalIdOrElseInternal(EntitiesExportCtx ctx, ID internalId) { if (internalId == null || internalId.isNullUid()) return internalId; - return Optional.ofNullable(exportableEntitiesService.getExternalIdByInternal(internalId)) - .orElse(internalId); + var result = ctx.getExternalId(internalId); + if (result == null) { + result = Optional.ofNullable(exportableEntitiesService.getExternalIdByInternal(internalId)) + .orElse(internalId); + ctx.putExternalId(internalId, result); + } + return result; } protected D newExportData() { diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DeviceExportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DeviceExportService.java index 4ca7a3ff18..f3a8141e0d 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DeviceExportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DeviceExportService.java @@ -38,8 +38,8 @@ public class DeviceExportService extends BaseEntityExportService ctx, Device device, DeviceExportData exportData) { - device.setCustomerId(getExternalIdOrElseInternal(device.getCustomerId())); - device.setDeviceProfileId(getExternalIdOrElseInternal(device.getDeviceProfileId())); + device.setCustomerId(getExternalIdOrElseInternal(ctx, device.getCustomerId())); + device.setDeviceProfileId(getExternalIdOrElseInternal(ctx, device.getDeviceProfileId())); if (ctx.getSettings().isExportCredentials()) { exportData.setCredentials(deviceCredentialsService.findDeviceCredentialsByDeviceId(ctx.getTenantId(), device.getId())); } diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DeviceProfileExportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DeviceProfileExportService.java index c6e0d2d363..3e076ddc13 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DeviceProfileExportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DeviceProfileExportService.java @@ -33,8 +33,8 @@ public class DeviceProfileExportService extends BaseEntityExportService ctx, DeviceProfile deviceProfile, EntityExportData exportData) { - deviceProfile.setDefaultDashboardId(getExternalIdOrElseInternal(deviceProfile.getDefaultDashboardId())); - deviceProfile.setDefaultRuleChainId(getExternalIdOrElseInternal(deviceProfile.getDefaultRuleChainId())); + deviceProfile.setDefaultDashboardId(getExternalIdOrElseInternal(ctx, deviceProfile.getDefaultDashboardId())); + deviceProfile.setDefaultRuleChainId(getExternalIdOrElseInternal(ctx, deviceProfile.getDefaultRuleChainId())); } @Override diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/EntityViewExportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/EntityViewExportService.java index aebb284157..1f3459f18f 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/EntityViewExportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/EntityViewExportService.java @@ -33,8 +33,8 @@ public class EntityViewExportService extends BaseEntityExportService ctx, EntityView entityView, EntityExportData exportData) { - entityView.setEntityId(getExternalIdOrElseInternal(entityView.getEntityId())); - entityView.setCustomerId(getExternalIdOrElseInternal(entityView.getCustomerId())); + entityView.setEntityId(getExternalIdOrElseInternal(ctx, entityView.getEntityId())); + entityView.setCustomerId(getExternalIdOrElseInternal(ctx, entityView.getCustomerId())); } @Override diff --git a/application/src/main/java/org/thingsboard/server/service/sync/vc/data/EntitiesExportCtx.java b/application/src/main/java/org/thingsboard/server/service/sync/vc/data/EntitiesExportCtx.java index 130a09f255..c57c9f6d79 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/vc/data/EntitiesExportCtx.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/vc/data/EntitiesExportCtx.java @@ -17,6 +17,8 @@ package org.thingsboard.server.service.sync.vc.data; import com.google.common.util.concurrent.ListenableFuture; import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.sync.ie.EntityExportSettings; import org.thingsboard.server.common.data.sync.vc.request.create.VersionCreateConfig; @@ -24,8 +26,11 @@ import org.thingsboard.server.common.data.sync.vc.request.create.VersionCreateRe import org.thingsboard.server.service.security.model.SecurityUser; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +@Slf4j @Data public abstract class EntitiesExportCtx { @@ -33,12 +38,14 @@ public abstract class EntitiesExportCtx { protected final CommitGitRequest commit; protected final R request; private final List> futures; + private final Map externalIdMap; public EntitiesExportCtx(SecurityUser user, CommitGitRequest commit, R request) { this.user = user; this.commit = commit; this.request = request; this.futures = new ArrayList<>(); + this.externalIdMap = new HashMap<>(); } protected EntitiesExportCtx(EntitiesExportCtx other) { @@ -46,6 +53,7 @@ public abstract class EntitiesExportCtx { this.commit = other.getCommit(); this.request = other.getRequest(); this.futures = other.getFutures(); + this.externalIdMap = other.getExternalIdMap(); } public void add(ListenableFuture future) { @@ -65,4 +73,16 @@ public abstract class EntitiesExportCtx { } public abstract EntityExportSettings getSettings(); + + @SuppressWarnings("unchecked") + public ID getExternalId(ID internalId) { + var result = externalIdMap.get(internalId); + log.debug("[{}][{}] Local cache {} for id", internalId.getEntityType(), internalId.getId(), result != null ? "hit" : "miss"); + return (ID) result; + } + + public void putExternalId(EntityId internalId, EntityId externalId) { + log.debug("[{}][{}] Local cache put: {}", internalId.getEntityType(), internalId.getId(), externalId); + externalIdMap.put(internalId, externalId); + } }