fix:回写恢复记录
This commit is contained in:
parent
6cf9bae121
commit
722106edc7
@ -10,6 +10,8 @@ import com.cisd.tms.modules.backup.service.ResourceTaskQueryService;
|
|||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.time.DateTimeException;
|
import java.time.DateTimeException;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.OffsetDateTime;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@ -41,6 +43,7 @@ public class ResourceTaskQueryServiceImpl implements ResourceTaskQueryService {
|
|||||||
RestoreStatusSnapshot status = restoreStatusFileReader.read(resolveTaskDir(active.getRunnerStatePath()));
|
RestoreStatusSnapshot status = restoreStatusFileReader.read(resolveTaskDir(active.getRunnerStatePath()));
|
||||||
String latestStatus = defaultIfBlank(status.status(), active.getStatus());
|
String latestStatus = defaultIfBlank(status.status(), active.getStatus());
|
||||||
repairMissingTask(active, status, latestStatus);
|
repairMissingTask(active, status, latestStatus);
|
||||||
|
syncExistingTask(active.getTaskId(), status, latestStatus);
|
||||||
ResourceRestoreLatestResponse response = new ResourceRestoreLatestResponse();
|
ResourceRestoreLatestResponse response = new ResourceRestoreLatestResponse();
|
||||||
response.setTaskId(active.getTaskId());
|
response.setTaskId(active.getTaskId());
|
||||||
response.setBackupId(active.getBackupId());
|
response.setBackupId(active.getBackupId());
|
||||||
@ -65,6 +68,7 @@ public class ResourceTaskQueryServiceImpl implements ResourceTaskQueryService {
|
|||||||
}
|
}
|
||||||
RestoreStatusSnapshot status = restoreStatusFileReader.read(resolveTaskDir(entity));
|
RestoreStatusSnapshot status = restoreStatusFileReader.read(resolveTaskDir(entity));
|
||||||
String latestStatus = defaultIfBlank(status.status(), entity.getStatus());
|
String latestStatus = defaultIfBlank(status.status(), entity.getStatus());
|
||||||
|
syncExistingTask(entity, status, latestStatus);
|
||||||
response.setTaskId(entity.getTaskId());
|
response.setTaskId(entity.getTaskId());
|
||||||
response.setBackupId(entity.getBackupId());
|
response.setBackupId(entity.getBackupId());
|
||||||
response.setStatus(latestStatus);
|
response.setStatus(latestStatus);
|
||||||
@ -109,6 +113,25 @@ public class ResourceTaskQueryServiceImpl implements ResourceTaskQueryService {
|
|||||||
resourceRestoreTaskRepository.save(entity);
|
resourceRestoreTaskRepository.save(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void syncExistingTask(String taskId, RestoreStatusSnapshot status, String latestStatus) {
|
||||||
|
if (trim(taskId).isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resourceRestoreTaskRepository.findByTaskId(taskId)
|
||||||
|
.ifPresent(entity -> syncExistingTask(entity, status, latestStatus));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void syncExistingTask(ResourceRestoreTaskEntity entity, RestoreStatusSnapshot status, String latestStatus) {
|
||||||
|
if (entity == null || !isTerminal(latestStatus) || latestStatus.equalsIgnoreCase(trim(entity.getStatus()))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
entity.setStatus(latestStatus);
|
||||||
|
entity.setErrorMessage(status.message());
|
||||||
|
entity.setFinishTime(parseLocalDateTime(status.updatedAt(), entity.getFinishTime()));
|
||||||
|
entity.setUpdateTime(LocalDateTime.now());
|
||||||
|
resourceRestoreTaskRepository.update(entity);
|
||||||
|
}
|
||||||
|
|
||||||
private Path resolveStatePath(String statusFilePath) {
|
private Path resolveStatePath(String statusFilePath) {
|
||||||
return trim(statusFilePath).isEmpty() ? null : Path.of(statusFilePath).normalize();
|
return trim(statusFilePath).isEmpty() ? null : Path.of(statusFilePath).normalize();
|
||||||
}
|
}
|
||||||
@ -157,7 +180,11 @@ public class ResourceTaskQueryServiceImpl implements ResourceTaskQueryService {
|
|||||||
try {
|
try {
|
||||||
return LocalDateTime.parse(text);
|
return LocalDateTime.parse(text);
|
||||||
} catch (DateTimeException ex) {
|
} catch (DateTimeException ex) {
|
||||||
return fallback;
|
try {
|
||||||
|
return OffsetDateTime.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ")).toLocalDateTime();
|
||||||
|
} catch (DateTimeException ignored) {
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
|||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import org.junit.jupiter.api.Assertions;
|
import org.junit.jupiter.api.Assertions;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
@ -61,6 +62,41 @@ class ResourceTaskQueryServiceTest {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldSyncExistingRestoreTaskWhenStatusFileIsTerminal() throws Exception {
|
||||||
|
Path taskDir = tempDir.resolve("RRST-TASK-20260429-000001");
|
||||||
|
Files.createDirectories(taskDir);
|
||||||
|
Files.writeString(taskDir.resolve("status.json"), """
|
||||||
|
{
|
||||||
|
"status":"SUCCESS",
|
||||||
|
"phase":"DONE",
|
||||||
|
"message":"restore applied",
|
||||||
|
"updatedAt":"2026-05-22T16:16:01+0800"
|
||||||
|
}
|
||||||
|
""");
|
||||||
|
ResourceRestoreTaskEntity entity = restoreTask(taskDir);
|
||||||
|
ResourceRestoreTaskRepository repository = Mockito.mock(ResourceRestoreTaskRepository.class);
|
||||||
|
Mockito.when(repository.findAll()).thenReturn(List.of(entity));
|
||||||
|
ResourceTaskQueryService service = new ResourceTaskQueryServiceImpl(
|
||||||
|
repository,
|
||||||
|
new RestoreStatusFileReader(new ObjectMapper()),
|
||||||
|
new ActiveRestoreStateStore(resourceBackupProperties(), new ObjectMapper())
|
||||||
|
);
|
||||||
|
|
||||||
|
ResourceRestoreLatestResponse latest = service.getLatestRestore();
|
||||||
|
|
||||||
|
Assertions.assertEquals("SUCCESS", latest.getStatus());
|
||||||
|
Assertions.assertEquals("DONE", latest.getPhase());
|
||||||
|
Assertions.assertEquals("restore applied", latest.getMessage());
|
||||||
|
Assertions.assertEquals("2026-05-22T16:16:01+0800", latest.getFinishedAt());
|
||||||
|
Mockito.verify(repository).update(Mockito.argThat(updated ->
|
||||||
|
"RRST-TASK-20260429-000001".equals(updated.getTaskId())
|
||||||
|
&& "SUCCESS".equals(updated.getStatus())
|
||||||
|
&& "restore applied".equals(updated.getErrorMessage())
|
||||||
|
&& updated.getFinishTime() != null
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
private static ResourceRestoreTaskEntity restoreTask(Path taskDir) {
|
private static ResourceRestoreTaskEntity restoreTask(Path taskDir) {
|
||||||
ResourceRestoreTaskEntity entity = new ResourceRestoreTaskEntity();
|
ResourceRestoreTaskEntity entity = new ResourceRestoreTaskEntity();
|
||||||
entity.setTaskId("RRST-TASK-20260429-000001");
|
entity.setTaskId("RRST-TASK-20260429-000001");
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user