From b9ac141bffae2c71c1287cb08bc90ed379c6e006 Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Fri, 8 Dec 2023 12:34:24 +0200 Subject: [PATCH] When replacing base64 with links, keep the transaction with no rollback --- .../server/dao/resource/BaseImageService.java | 9 +++++---- .../dao/sql/resource/TbResourceInfoRepository.java | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/resource/BaseImageService.java b/dao/src/main/java/org/thingsboard/server/dao/resource/BaseImageService.java index ad3934f76e..29f9ba8ae0 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/resource/BaseImageService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/resource/BaseImageService.java @@ -27,7 +27,6 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.commons.lang3.tuple.Pair; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Base64Utils; import org.thingsboard.common.util.JacksonUtil; @@ -273,7 +272,7 @@ public class BaseImageService extends BaseResourceService implements ImageServic return resourceInfoDao.findSystemOrTenantImageByEtag(tenantId, ResourceType.IMAGE, etag); } - @Transactional(propagation = Propagation.NOT_SUPPORTED)// we don't want transaction to rollback in case of an image processing failure + @Transactional(noRollbackFor = Exception.class) // we don't want transaction to rollback in case of an image processing failure @Override public boolean replaceBase64WithImageUrl(HasImage entity, String type) { log.trace("Executing replaceBase64WithImageUrl [{}] [{}] [{}]", entity.getTenantId(), type, entity.getName()); @@ -288,7 +287,7 @@ public class BaseImageService extends BaseResourceService implements ImageServic return result.isUpdated(); } - @Transactional(propagation = Propagation.NOT_SUPPORTED)// we don't want transaction to rollback in case of an image processing failure + @Transactional(noRollbackFor = Exception.class) // we don't want transaction to rollback in case of an image processing failure @Override public boolean replaceBase64WithImageUrl(WidgetTypeDetails entity) { log.trace("Executing replaceBase64WithImageUrl [{}] [WidgetTypeDetails] [{}]", entity.getTenantId(), entity.getId()); @@ -314,7 +313,7 @@ public class BaseImageService extends BaseResourceService implements ImageServic return updated; } - @Transactional(propagation = Propagation.NOT_SUPPORTED)// we don't want transaction to rollback in case of an image processing failure + @Transactional(noRollbackFor = Exception.class) // we don't want transaction to rollback in case of an image processing failure @Override public boolean replaceBase64WithImageUrl(Dashboard entity) { log.trace("Executing replaceBase64WithImageUrl [{}] [Dashboard] [{}]", entity.getTenantId(), entity.getId()); @@ -462,6 +461,8 @@ public class BaseImageService extends BaseResourceService implements ImageServic } return UpdateResult.of(false, data); } + } else { + log.debug("[{}] Using existing image {} ({} - '{}') for '{}'", tenantId, imageInfo.getResourceKey(), imageInfo.getTenantId(), imageInfo.getName(), name); } return UpdateResult.of(true, DataConstants.TB_IMAGE_PREFIX + imageInfo.getLink()); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/resource/TbResourceInfoRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/resource/TbResourceInfoRepository.java index ced94e1ea8..62d9ec5155 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/resource/TbResourceInfoRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/resource/TbResourceInfoRepository.java @@ -66,7 +66,7 @@ public interface TbResourceInfoRepository extends JpaRepository findByTenantIdAndEtagAndResourceKeyStartingWith(UUID tenantId, String etag, String query); @Query(value = "SELECT * FROM resource r WHERE (r.tenant_id = '13814000-1dd2-11b2-8080-808080808080' OR r.tenant_id = :tenantId) " + - "AND r.resource_type = :resourceType AND r.etag = :etag LIMIT 1", nativeQuery = true) + "AND r.resource_type = :resourceType AND r.etag = :etag ORDER BY created_time, id LIMIT 1", nativeQuery = true) TbResourceInfoEntity findSystemOrTenantImageByEtag(@Param("tenantId") UUID tenantId, @Param("resourceType") String resourceType, @Param("etag") String etag);