Skip to content

Commit f0906d4

Browse files
Fix first-create race in message server config persistence
Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
1 parent 484077b commit f0906d4

2 files changed

Lines changed: 16 additions & 7 deletions

File tree

‎hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MessageServerConfigServiceImpl.java‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
package org.apache.hertzbeat.manager.service.impl;
1919

20+
import jakarta.persistence.EntityManager;
21+
import jakarta.persistence.PersistenceException;
2022
import java.util.UUID;
2123
import org.apache.hertzbeat.base.dao.GeneralConfigDao;
2224
import org.apache.hertzbeat.common.constants.GeneralConfigTypeEnum;
@@ -48,12 +50,14 @@ public class MessageServerConfigServiceImpl implements MessageServerConfigServic
4850
private final ConfigService configService;
4951
private final MessageServerConfigMapper mapper;
5052
private final GeneralConfigDao generalConfigDao;
53+
private final EntityManager entityManager;
5154

5255
public MessageServerConfigServiceImpl(ConfigService configService, MessageServerConfigMapper mapper,
53-
GeneralConfigDao generalConfigDao) {
56+
GeneralConfigDao generalConfigDao, EntityManager entityManager) {
5457
this.configService = configService;
5558
this.mapper = mapper;
5659
this.generalConfigDao = generalConfigDao;
60+
this.entityManager = entityManager;
5761
}
5862

5963
@Override
@@ -129,8 +133,9 @@ private String create(String type, Object config) {
129133
.revision(revision)
130134
.build();
131135
try {
132-
generalConfigDao.saveAndFlush(entity);
133-
} catch (DataIntegrityViolationException exception) {
136+
entityManager.persist(entity);
137+
entityManager.flush();
138+
} catch (PersistenceException | DataIntegrityViolationException exception) {
134139
throw new MessageServerConfigConflictException();
135140
}
136141
return revision;

‎hertzbeat-manager/src/test/java/org/apache/hertzbeat/manager/service/MessageServerConfigServiceTest.java‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,14 @@
2121
import static org.junit.jupiter.api.Assertions.assertThrows;
2222
import static org.mockito.ArgumentMatchers.any;
2323
import static org.mockito.ArgumentMatchers.eq;
24+
import static org.mockito.Mockito.doThrow;
2425
import static org.mockito.Mockito.never;
2526
import static org.mockito.Mockito.verify;
2627
import static org.mockito.Mockito.when;
2728

29+
import jakarta.persistence.EntityManager;
30+
import jakarta.persistence.PersistenceException;
31+
2832
import org.apache.hertzbeat.base.dao.GeneralConfigDao;
2933
import org.apache.hertzbeat.common.entity.dto.MailServerConfig;
3034
import org.apache.hertzbeat.common.entity.dto.sms.SmsConfig;
@@ -33,7 +37,6 @@
3337
import org.apache.hertzbeat.manager.pojo.dto.SmsServerConfigRequest;
3438
import org.apache.hertzbeat.manager.service.impl.MessageServerConfigServiceImpl;
3539
import org.apache.hertzbeat.common.util.JsonUtil;
36-
import org.springframework.dao.DataIntegrityViolationException;
3740
import org.junit.jupiter.api.BeforeEach;
3841
import org.junit.jupiter.api.Test;
3942
import org.junit.jupiter.api.extension.ExtendWith;
@@ -49,11 +52,13 @@ class MessageServerConfigServiceTest {
4952
private MessageServerConfigMapper mapper;
5053
@Mock
5154
private GeneralConfigDao generalConfigDao;
55+
@Mock
56+
private EntityManager entityManager;
5257
private MessageServerConfigServiceImpl service;
5358

5459
@BeforeEach
5560
void setUp() {
56-
service = new MessageServerConfigServiceImpl(configService, mapper, generalConfigDao);
61+
service = new MessageServerConfigServiceImpl(configService, mapper, generalConfigDao, entityManager);
5762
}
5863

5964
@Test
@@ -115,8 +120,7 @@ void firstCreateUsesMissingRevisionAndUniqueKeyLoserIsTheSameStableConflict() {
115120
MailServerConfig merged = new MailServerConfig();
116121
when(generalConfigDao.findByType("email")).thenReturn(null);
117122
when(mapper.toEmailConfig(request, null)).thenReturn(merged);
118-
when(generalConfigDao.saveAndFlush(any()))
119-
.thenThrow(new DataIntegrityViolationException("secret-db-exception"));
123+
doThrow(new PersistenceException("secret-db-exception")).when(entityManager).flush();
120124

121125
MessageServerConfigConflictException conflict = assertThrows(
122126
MessageServerConfigConflictException.class, () -> service.saveEmailConfig(request));

0 commit comments

Comments
 (0)