Keep restricted engines reserved through asynchronous retirement
This commit is contained in:
@@ -686,3 +686,39 @@ test("the shared engine budget evicts idle code families and rejects busy oversu
|
||||
}
|
||||
assert.equal(engineBudget.stats().engines, 0);
|
||||
});
|
||||
|
||||
test("engine retirement accounting keeps its admission lease busy", async () => {
|
||||
const observations = [];
|
||||
let idle;
|
||||
const engineBudget = new RestrictedEngineBudget(1, async () => ({
|
||||
usage: async () => {
|
||||
observations.push(idle());
|
||||
await new Promise((done) => setImmediate(done));
|
||||
return { cpuMicroseconds: 0, memoryBytes: 1024 };
|
||||
},
|
||||
release: async () => {},
|
||||
}));
|
||||
const acquire = engineBudget.acquire.bind(engineBudget);
|
||||
engineBudget.acquire = (isIdle, evict) => {
|
||||
idle = isIdle;
|
||||
return acquire(isIdle, evict);
|
||||
};
|
||||
const f = await fixture(registry("return request.input;"), { engineBudget });
|
||||
try {
|
||||
f.start("first");
|
||||
assert.equal((await f.receive()).output, "first");
|
||||
assert.ok(observations.length > 0);
|
||||
assert.ok(
|
||||
observations.every((value) => !value),
|
||||
"An engine must not become evictable during asynchronous retirement accounting",
|
||||
);
|
||||
assert.equal(f.stats().idle, 1);
|
||||
assert.equal(idle(), true);
|
||||
f.start("second");
|
||||
assert.equal((await f.receive()).output, "second");
|
||||
assert.equal(f.stats().starts, 1);
|
||||
} finally {
|
||||
await f.close();
|
||||
}
|
||||
assert.equal(engineBudget.stats().engines, 0);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user