diff --git a/packages/sdk-java/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/SessionResourceCollectionCollector.java b/packages/sdk-java/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/SessionResourceCollectionCollector.java index b1c8f807e1..2e41f82ead 100644 --- a/packages/sdk-java/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/SessionResourceCollectionCollector.java +++ b/packages/sdk-java/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/SessionResourceCollectionCollector.java @@ -432,7 +432,7 @@ public final class SessionResourceCollectionCollector { result, now + CLAIM_MILLIS, now, operationKey(claim.scope()), claim.generation()); } else { jdbc.update( - "UPDATE ma_operation SET result_json = ?, state = 'SUCCEEDED', completed_at = ?, claim_owner = NULL, claim_until = NULL, available_at = 0, failure_code = NULL, gmt_modified = ? WHERE operation_key = ? AND claim_generation = ?", + "UPDATE ma_operation SET result_json = ?, state = 'SUCCEEDED', completed_at = ?, claim_owner = NULL, claim_until = NULL, available_at = 9223372036854775807, failure_code = NULL, gmt_modified = ? WHERE operation_key = ? AND claim_generation = ?", result, now, now, operationKey(claim.scope()), claim.generation()); ManagedSessionRetirementStore.markCollectionCompleted(jdbc, claim.tenant(), claim.session(), operationKey(claim.scope())); jdbc.update( diff --git a/packages/sdk-java/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationCollector.java b/packages/sdk-java/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationCollector.java index 620f353f3d..5499ad3cdc 100644 --- a/packages/sdk-java/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationCollector.java +++ b/packages/sdk-java/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationCollector.java @@ -370,7 +370,7 @@ public final class ToolPublicationCollector { + " publication_id = ?", now, collected, released, claim.scope(), claim.publication()); jdbc.update( - "UPDATE ma_operation SET state = 'SUCCEEDED', claim_owner = NULL, claim_until = NULL, completed_at = ?, gmt_modified = ?, available_at = 0, result_json = ? WHERE operation_key = ? AND claim_generation = ?", + "UPDATE ma_operation SET state = 'SUCCEEDED', claim_owner = NULL, claim_until = NULL, completed_at = ?, gmt_modified = ?, available_at = 9223372036854775807, result_json = ? WHERE operation_key = ? AND claim_generation = ?", now, now, JSON.createObjectNode() diff --git a/packages/sdk-java/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionRetentionMySqlIT.java b/packages/sdk-java/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionRetentionMySqlIT.java index 7c7c80ee98..5def540cb1 100644 --- a/packages/sdk-java/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionRetentionMySqlIT.java +++ b/packages/sdk-java/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionRetentionMySqlIT.java @@ -118,7 +118,10 @@ class WorkspaceSessionRetentionMySqlIT { } @ParameterizedTest - @ValueSource(strings = {"UPDATE ma_output_capture SET retention_state", "UPDATE ma_session SET status = 'DELETED'", + // The retirement UPDATE now advances gmt_modified first, so match its full + // leading SET clause; a stale prefix silently stops injecting the fault. + @ValueSource(strings = {"UPDATE ma_output_capture SET gmt_modified = " + ManagedSchemaTime.SQL_NOW + ", retention_state", + "UPDATE ma_session SET status = 'DELETED'", "UPDATE ma_operation SET failure_code = NULL, phase = 'COMPLETED', state =", "INSERT INTO ma_public_event"}) void deletionRollsBackRetirementTombstoneReceiptAndEvent(String failureSql) { var store = store(Clock.systemUTC()); diff --git a/packages/sdk-java/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaPublicationLoadMySqlIT.java b/packages/sdk-java/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaPublicationLoadMySqlIT.java index 392af37aee..2c9100b563 100644 --- a/packages/sdk-java/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaPublicationLoadMySqlIT.java +++ b/packages/sdk-java/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaPublicationLoadMySqlIT.java @@ -102,7 +102,7 @@ class ManagedSchemaPublicationLoadMySqlIT { jdbc.batchUpdate("INSERT INTO ma_operation (operation_key, session_scope_key, scope_key, operation_id," + " operation_kind, tenant_id, session_id, target_kind, target_key, request_digest, request_json," + " phase, state, available_at, gmt_create, gmt_modified) VALUES (?, ?, ?, ?, 'CAPTURE_GC', ?, ?," - + " 'OUTPUT_CAPTURE', ?, ?, '{}', 'DELETING', 'SUCCEEDED', -1, 0, 0)", history); + + " 'OUTPUT_CAPTURE', ?, ?, '{}', 'DELETING', 'SUCCEEDED', 9223372036854775807, 0, 0)", history); previous = count; jdbc.update("UPDATE ma_output_capture SET retention_state = 'RETIRING' WHERE scope_key = ? AND publication_id = ?", scope, publication); @@ -170,7 +170,7 @@ class ManagedSchemaPublicationLoadMySqlIT { String scope = ManagedSessionStore.sessionScopeKey(TENANT, HEALTHY); String proofKey = ManagedSchemaKeys.operationKey(OperationKind.WORKSPACE_OPERATOR_RECOVERY, scope, scope, "proof"); - insertOperation(jdbc, proofKey, scope, "proof", "WORKSPACE_OPERATOR_RECOVERY", HEALTHY, scope, "SUCCEEDED", -1); + insertOperation(jdbc, proofKey, scope, "proof", "WORKSPACE_OPERATOR_RECOVERY", HEALTHY, scope, "SUCCEEDED", Long.MAX_VALUE); String protectedId = lowResourceId(scope, "protected"); byte[] body = "immutable-body".getBytes(java.nio.charset.StandardCharsets.UTF_8); insertResource(jdbc, scope, protectedId, "REFERENCED", body); @@ -272,7 +272,7 @@ class ManagedSchemaPublicationLoadMySqlIT { } jdbc.batchUpdate("INSERT INTO ma_operation (operation_key, session_scope_key, scope_key, operation_id, operation_kind, tenant_id," + " session_id, target_kind, target_key, request_digest, request_json, phase, state, available_at, gmt_create, gmt_modified)" - + " VALUES (?, ?, ?, ?, 'SESSION_RESOURCE_GC', ?, ?, 'SESSION', ?, ?, '{\"version\":1}', 'COLLECTING', 'SUCCEEDED', -1, 0, 0)", operations); + + " VALUES (?, ?, ?, ?, 'SESSION_RESOURCE_GC', ?, ?, 'SESSION', ?, ?, '{\"version\":1}', 'COLLECTING', 'SUCCEEDED', 9223372036854775807, 0, 0)", operations); jdbc.batchUpdate("INSERT INTO ma_resource (resource_key, session_scope_key, tenant_id, session_id, resource_id, kind, schema_version, byte_length, sha256, storage_kind, state, gmt_create) VALUES (?, ?, ?, ?, ?, 'managed-message-body', 1, 1, ?, 'MYSQL_INLINE', 'COLLECTED', " + ManagedSchemaTime.SQL_NOW + ")", resources); } } diff --git a/packages/sdk-java/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SessionResourceCollectionCollectorTest.java b/packages/sdk-java/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SessionResourceCollectionCollectorTest.java index c3e2415538..fb9b025b1b 100644 --- a/packages/sdk-java/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SessionResourceCollectionCollectorTest.java +++ b/packages/sdk-java/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SessionResourceCollectionCollectorTest.java @@ -881,7 +881,7 @@ public class SessionResourceCollectionCollectorTest extends ToolPublicationReten var collector = collector(true, Duration.ZERO); assertThat(collector.runOnce()).isTrue(); var completed = ledger(); - assertThat(((Number) completed.get("gc_next_at")).longValue()).isZero(); + assertThat(((Number) completed.get("gc_next_at")).longValue()).isEqualTo(Long.MAX_VALUE); assertThat(completed.get("state")).isEqualTo("SUCCEEDED"); assertThat(collector.runOnce()).isFalse(); assertThat(ledger().get("gc_generation")).isEqualTo(completed.get("gc_generation"));