mirror of
https://github.com/MarginaliaSearch/MarginaliaSearch.git
synced 2025-02-23 21:18:58 +00:00
(control) Fix bug where finishing one process ad hoc task would remove all other tasks from the db
This commit is contained in:
parent
a6abd31ead
commit
405300b4b2
@ -4,6 +4,7 @@ package nu.marginalia.control.model;
|
|||||||
public record TaskHeartbeat(
|
public record TaskHeartbeat(
|
||||||
String taskName,
|
String taskName,
|
||||||
String taskBase,
|
String taskBase,
|
||||||
|
String instanceUuidFull,
|
||||||
String serviceUuuidFull,
|
String serviceUuuidFull,
|
||||||
double lastSeenMillis,
|
double lastSeenMillis,
|
||||||
Integer progress,
|
Integer progress,
|
||||||
|
@ -56,7 +56,7 @@ public class HeartbeatService {
|
|||||||
List<TaskHeartbeat> heartbeats = new ArrayList<>();
|
List<TaskHeartbeat> heartbeats = new ArrayList<>();
|
||||||
try (var conn = dataSource.getConnection();
|
try (var conn = dataSource.getConnection();
|
||||||
var stmt = conn.prepareStatement("""
|
var stmt = conn.prepareStatement("""
|
||||||
SELECT TASK_NAME, TASK_BASE, SERVICE_INSTANCE, STATUS, STAGE_NAME, PROGRESS, TIMESTAMPDIFF(MICROSECOND, TASK_HEARTBEAT.HEARTBEAT_TIME, CURRENT_TIMESTAMP(6)) AS TSDIFF
|
SELECT TASK_NAME, TASK_BASE, INSTANCE, SERVICE_INSTANCE, STATUS, STAGE_NAME, PROGRESS, TIMESTAMPDIFF(MICROSECOND, TASK_HEARTBEAT.HEARTBEAT_TIME, CURRENT_TIMESTAMP(6)) AS TSDIFF
|
||||||
FROM TASK_HEARTBEAT
|
FROM TASK_HEARTBEAT
|
||||||
""")) {
|
""")) {
|
||||||
var rs = stmt.executeQuery();
|
var rs = stmt.executeQuery();
|
||||||
@ -65,6 +65,7 @@ public class HeartbeatService {
|
|||||||
heartbeats.add(new TaskHeartbeat(
|
heartbeats.add(new TaskHeartbeat(
|
||||||
rs.getString("TASK_NAME"),
|
rs.getString("TASK_NAME"),
|
||||||
rs.getString("TASK_BASE"),
|
rs.getString("TASK_BASE"),
|
||||||
|
rs.getString("INSTANCE"),
|
||||||
rs.getString("SERVICE_INSTANCE"),
|
rs.getString("SERVICE_INSTANCE"),
|
||||||
rs.getLong("TSDIFF") / 1000.,
|
rs.getLong("TSDIFF") / 1000.,
|
||||||
progress < 0 ? null : progress,
|
progress < 0 ? null : progress,
|
||||||
@ -83,10 +84,10 @@ public class HeartbeatService {
|
|||||||
try (var conn = dataSource.getConnection();
|
try (var conn = dataSource.getConnection();
|
||||||
var stmt = conn.prepareStatement("""
|
var stmt = conn.prepareStatement("""
|
||||||
DELETE FROM TASK_HEARTBEAT
|
DELETE FROM TASK_HEARTBEAT
|
||||||
WHERE SERVICE_INSTANCE = ?
|
WHERE INSTANCE = ?
|
||||||
""")) {
|
""")) {
|
||||||
|
|
||||||
stmt.setString(1, heartbeat.serviceUuuidFull());
|
stmt.setString(1, heartbeat.instanceUuidFull());
|
||||||
stmt.executeUpdate();
|
stmt.executeUpdate();
|
||||||
}
|
}
|
||||||
catch (SQLException ex) {
|
catch (SQLException ex) {
|
||||||
|
@ -0,0 +1,73 @@
|
|||||||
|
package nu.marginalia.control.svc;
|
||||||
|
|
||||||
|
import com.zaxxer.hikari.HikariConfig;
|
||||||
|
import com.zaxxer.hikari.HikariDataSource;
|
||||||
|
import nu.marginalia.control.model.TaskHeartbeat;
|
||||||
|
import nu.marginalia.service.control.ServiceEventLog;
|
||||||
|
import org.junit.jupiter.api.AfterAll;
|
||||||
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
|
import org.junit.jupiter.api.Tag;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.parallel.Execution;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
import org.testcontainers.containers.MariaDBContainer;
|
||||||
|
import org.testcontainers.junit.jupiter.Container;
|
||||||
|
import org.testcontainers.junit.jupiter.Testcontainers;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
import static org.junit.jupiter.api.parallel.ExecutionMode.SAME_THREAD;
|
||||||
|
|
||||||
|
@Testcontainers
|
||||||
|
@Execution(SAME_THREAD)
|
||||||
|
@Tag("slow")
|
||||||
|
class HeartbeatServiceTest {
|
||||||
|
@Container
|
||||||
|
static MariaDBContainer<?> mariaDBContainer = new MariaDBContainer<>("mariadb")
|
||||||
|
.withDatabaseName("WMSA_prod")
|
||||||
|
.withUsername("wmsa")
|
||||||
|
.withPassword("wmsa")
|
||||||
|
.withInitScript("db/migration/V23_07_0_007__task_status.sql")
|
||||||
|
.withNetworkAliases("mariadb");
|
||||||
|
|
||||||
|
|
||||||
|
static HikariDataSource dataSource;
|
||||||
|
@BeforeAll
|
||||||
|
public static void setup() {
|
||||||
|
HikariConfig config = new HikariConfig();
|
||||||
|
config.setJdbcUrl(mariaDBContainer.getJdbcUrl());
|
||||||
|
config.setUsername("wmsa");
|
||||||
|
config.setPassword("wmsa");
|
||||||
|
|
||||||
|
dataSource = new HikariDataSource(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterAll
|
||||||
|
public static void tearDown() {
|
||||||
|
dataSource.close();
|
||||||
|
mariaDBContainer.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void removeTaskHeartbeat() throws SQLException {
|
||||||
|
var service = new HeartbeatService(dataSource, Mockito.mock(ServiceEventLog.class));
|
||||||
|
|
||||||
|
try (var conn = dataSource.getConnection();
|
||||||
|
var stmt = conn.createStatement()) {
|
||||||
|
stmt.executeUpdate("""
|
||||||
|
INSERT INTO TASK_HEARTBEAT(TASK_NAME, TASK_BASE, INSTANCE, SERVICE_INSTANCE, HEARTBEAT_TIME, STATUS)
|
||||||
|
VALUES ("test1", "test", "instance1", "instance", NOW(), "RUNNING"),
|
||||||
|
("test2", "test", "instance2", "instance", NOW(), "RUNNING")
|
||||||
|
""");
|
||||||
|
|
||||||
|
service.removeTaskHeartbeat(new TaskHeartbeat(
|
||||||
|
"test1", "test", "instance1", "instance", 1, null, "test", "ok")
|
||||||
|
);
|
||||||
|
assertEquals(1, service.getTaskHeartbeats().size());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user