fix: refresh reserved turns at execution lease boundary
This commit is contained in:
@@ -354,7 +354,10 @@ export class InMemoryReservedTurnStore {
|
|||||||
await this.acquireNationLease(nation.nationId, nation.officerLevel);
|
await this.acquireNationLease(nation.nationId, nation.officerLevel);
|
||||||
}
|
}
|
||||||
await Promise.all([
|
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(),
|
nation ? this.refreshNationTurns(nation.nationId, nation.officerLevel) : Promise.resolve(),
|
||||||
]);
|
]);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -368,8 +371,8 @@ export class InMemoryReservedTurnStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async refreshGeneralTurns(generalId: number): Promise<void> {
|
async refreshGeneralTurns(generalId: number, force = false): Promise<void> {
|
||||||
if (this.dirtyGeneralIds.has(generalId)) {
|
if (!force && this.dirtyGeneralIds.has(generalId)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const rows = await this.prisma.generalTurn.findMany({
|
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 () => {
|
it('rejects an active foreign lease before reading the queue', async () => {
|
||||||
const harness = buildHarness({
|
const harness = buildHarness({
|
||||||
revision: 4,
|
revision: 4,
|
||||||
|
|||||||
Reference in New Issue
Block a user