fix: refresh reserved turns at execution lease boundary

This commit is contained in:
2026-08-05 01:37:25 +00:00
parent 6eba8e24c3
commit bd62197655
2 changed files with 19 additions and 3 deletions
@@ -354,7 +354,10 @@ export class InMemoryReservedTurnStore {
await this.acquireNationLease(nation.nationId, nation.officerLevel);
}
await Promise.all([
this.refreshGeneralTurns(generalId),
// A newly acquired lease starts a fresh API/daemon ownership boundary.
// Re-read PostgreSQL even if a prior run left a stale dirty marker;
// repeated access under the same held lease keeps local mutations.
this.refreshGeneralTurns(generalId, !hadGeneralLease),
nation ? this.refreshNationTurns(nation.nationId, nation.officerLevel) : Promise.resolve(),
]);
} catch (error) {
@@ -368,8 +371,8 @@ export class InMemoryReservedTurnStore {
}
}
async refreshGeneralTurns(generalId: number): Promise<void> {
if (this.dirtyGeneralIds.has(generalId)) {
async refreshGeneralTurns(generalId: number, force = false): Promise<void> {
if (!force && this.dirtyGeneralIds.has(generalId)) {
return;
}
const rows = await this.prisma.generalTurn.findMany({
@@ -202,6 +202,19 @@ describe('reserved turn daemon lease', () => {
});
});
it('refreshes a stale dirty cache after acquiring a fresh lease but preserves mutations under the held lease', async () => {
const harness = buildHarness();
harness.store.setGeneralTurn(7, 0, { action: '휴식', args: {} });
await harness.store.prepareTurnsForExecution(7);
expect(harness.store.getGeneralTurn(7, 0).action).toBe('che_훈련');
harness.store.setGeneralTurn(7, 0, { action: 'che_사기진작', args: {} });
await harness.store.prepareTurnsForExecution(7);
expect(harness.store.getGeneralTurn(7, 0).action).toBe('che_사기진작');
expect(harness.generalFindMany).toHaveBeenCalledOnce();
});
it('rejects an active foreign lease before reading the queue', async () => {
const harness = buildHarness({
revision: 4,