From 22834bb8f270ca0bc2d7f353e5dbd24658891716 Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Wed, 24 Apr 2024 13:40:47 +0300 Subject: [PATCH 1/4] Fix notifications count update race condition in tests --- .../service/notification/NotificationApiWsClient.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/service/notification/NotificationApiWsClient.java b/application/src/test/java/org/thingsboard/server/service/notification/NotificationApiWsClient.java index 96e3e4732ed..1ecae638a60 100644 --- a/application/src/test/java/org/thingsboard/server/service/notification/NotificationApiWsClient.java +++ b/application/src/test/java/org/thingsboard/server/service/notification/NotificationApiWsClient.java @@ -106,8 +106,11 @@ public void onMessage(String s) { } } } else if (updateType == CmdUpdateType.NOTIFICATIONS_COUNT) { - lastCountUpdate = JacksonUtil.treeToValue(update, UnreadNotificationsCountUpdate.class); - unreadCount = lastCountUpdate.getTotalUnreadCount(); + UnreadNotificationsCountUpdate countUpdate = JacksonUtil.treeToValue(update, UnreadNotificationsCountUpdate.class); + if (lastCountUpdate == null || countUpdate.getSequenceNumber() > lastCountUpdate.getSequenceNumber()) { + lastCountUpdate = countUpdate; + unreadCount = lastCountUpdate.getTotalUnreadCount(); + } } super.onMessage(s); } From f602b59ff8d4d85643bc9543e363644507bafd0d Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Wed, 24 Apr 2024 13:49:09 +0300 Subject: [PATCH 2/4] tmp logs for tests investigation --- .../resources/application-test.properties | 2 +- .../src/test/resources/logback-test.xml | 5 +++ .../dao/sql/JpaPartitionedAbstractDao.java | 31 ++++++++++++++----- .../server/dao/tenant/TenantServiceImpl.java | 2 +- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/application/src/test/resources/application-test.properties b/application/src/test/resources/application-test.properties index 92959e45527..021ac600df6 100644 --- a/application/src/test/resources/application-test.properties +++ b/application/src/test/resources/application-test.properties @@ -53,4 +53,4 @@ sql.ttl.audit_logs.ttl=2592000 sql.edge_events.partition_size=168 sql.ttl.edge_events.edge_event_ttl=2592000 -server.log_controller_error_stack_trace=false +server.log_controller_error_stack_trace=true diff --git a/application/src/test/resources/logback-test.xml b/application/src/test/resources/logback-test.xml index 8b20a2817a0..db6c489b7f9 100644 --- a/application/src/test/resources/logback-test.xml +++ b/application/src/test/resources/logback-test.xml @@ -32,6 +32,11 @@ + + + + + diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/JpaPartitionedAbstractDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/JpaPartitionedAbstractDao.java index 45438a9b515..c3efcd19a62 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/JpaPartitionedAbstractDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/JpaPartitionedAbstractDao.java @@ -15,25 +15,42 @@ */ package org.thingsboard.server.dao.sql; -import org.thingsboard.server.dao.model.BaseEntity; -import org.thingsboard.server.dao.util.SqlDao; - import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.thingsboard.server.common.data.EntityType; +import org.thingsboard.server.dao.model.BaseEntity; +import org.thingsboard.server.dao.sqlts.insert.sql.SqlPartitioningRepository; +import org.thingsboard.server.dao.util.SqlDao; @SqlDao +@Slf4j public abstract class JpaPartitionedAbstractDao, D> extends JpaAbstractDao { @PersistenceContext private EntityManager entityManager; + @Autowired + private SqlPartitioningRepository partitioningRepository; + @Override protected E doSave(E entity, boolean isNew) { createPartition(entity); - if (isNew) { - entityManager.persist(entity); - } else { - entity = entityManager.merge(entity); + if (getEntityType() == EntityType.NOTIFICATION) { + log.trace("Created partition for entity {}. available partitions: {}", entity, partitioningRepository.fetchPartitions("notification")); + } + try { + if (isNew) { + entityManager.persist(entity); + } else { + entity = entityManager.merge(entity); + } + } catch (Throwable t) { + if (getEntityType() == EntityType.NOTIFICATION) { + log.trace("Failed to save {} (isNew {})", entity, isNew, t); + } + throw t; } return entity; } diff --git a/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java index 8b3e65c927b..668f4577ee6 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java @@ -199,7 +199,7 @@ public Tenant saveTenant(Tenant tenant) { @Override @Transactional public Tenant saveTenant(Tenant tenant, Consumer defaultEntitiesCreator) { - log.trace("Executing saveTenant [{}]", tenant); + log.error("Executing saveTenant [{}]", tenant); tenant.setRegion(DEFAULT_TENANT_REGION); if (tenant.getTenantProfileId() == null) { TenantProfile tenantProfile = this.tenantProfileService.findOrCreateDefaultTenantProfile(TenantId.SYS_TENANT_ID); From ed918faeedb08a613200ae3fcb0ff28b5ec3d767 Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Wed, 24 Apr 2024 13:51:41 +0300 Subject: [PATCH 3/4] NotificationEntity toString --- .../thingsboard/server/dao/model/sql/NotificationEntity.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationEntity.java index 7d84f03e460..79e06c0073f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/NotificationEntity.java @@ -24,6 +24,7 @@ import jakarta.persistence.Table; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.ToString; import org.hibernate.annotations.Formula; import org.thingsboard.server.common.data.id.NotificationId; import org.thingsboard.server.common.data.id.NotificationRequestId; @@ -43,6 +44,7 @@ @EqualsAndHashCode(callSuper = true) @Entity @Table(name = ModelConstants.NOTIFICATION_TABLE_NAME) +@ToString(callSuper = true) public class NotificationEntity extends BaseSqlEntity { @Column(name = ModelConstants.NOTIFICATION_REQUEST_ID_PROPERTY, nullable = false) From bd2f118ea750c57d76845554c9ee4f7ae4ccdfaa Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Wed, 24 Apr 2024 13:57:53 +0300 Subject: [PATCH 4/4] more logs --- .../thingsboard/server/controller/TenantControllerTest.java | 5 ++++- application/src/test/resources/logback-test.xml | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/application/src/test/java/org/thingsboard/server/controller/TenantControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/TenantControllerTest.java index 63747d2c195..1964c7979d2 100644 --- a/application/src/test/java/org/thingsboard/server/controller/TenantControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/TenantControllerTest.java @@ -719,7 +719,10 @@ public void whenTenantIsDeleted_thenDeleteQueues() throws Exception { savedDifferentTenant = doPost("/api/tenant", savedDifferentTenant, Tenant.class); TenantId tenantId = differentTenantId; await().atMost(30, TimeUnit.SECONDS).untilAsserted(() -> { - assertThat(partitionService.getMyPartitions(new QueueKey(ServiceType.TB_RULE_ENGINE, tenantId))).isNotNull(); + QueueKey queueKey = new QueueKey(ServiceType.TB_RULE_ENGINE, tenantId); + List partitions = partitionService.getMyPartitions(queueKey); + log.error("[{}] partitions: {}", queueKey, partitions); + assertThat(partitions).isNotNull(); }); TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_RULE_ENGINE, tenantId, tenantId); assertThat(tpi.getTenantId()).hasValue(tenantId); diff --git a/application/src/test/resources/logback-test.xml b/application/src/test/resources/logback-test.xml index db6c489b7f9..a67778bba9d 100644 --- a/application/src/test/resources/logback-test.xml +++ b/application/src/test/resources/logback-test.xml @@ -36,6 +36,7 @@ +