This commit is contained in:
legop3
2026-09-28 17:43:23 -04:00
parent 9de0bfb1e7
commit cd4aee4e74
5 changed files with 40 additions and 5 deletions
@@ -98,6 +98,27 @@ function saveSnapshot(root) {
return model;
});
}
// Explicitly retire format 1 models after the wheel-policy replacement. Only
// recognized old-format manifests qualify; malformed or future models are kept.
function removeObsoleteModels(root) {
return serial(async () => {
const directory = path.join(root, 'models');
let entries;
try { entries = await fs.readdir(directory, { withFileTypes: true }); }
catch (error) { if (error.code === 'ENOENT') return; throw error; }
for (const entry of entries) {
if (!entry.isDirectory() || !UUID.test(entry.name)) continue;
const target = path.join(directory, entry.name);
let model;
try { model = await metadata(target); }
catch { continue; }
if (model.specification?.version === 1 && !leases.has(target)) {
await fs.rm(target, { recursive: true });
}
}
});
}
function listModels(root) {
return serial(async () => {
let entries;
@@ -116,4 +137,4 @@ function listModels(root) {
return models;
});
}
module.exports = { listModels, acquireModel, adoptCheckpoint, saveSnapshot };
module.exports = { removeObsoleteModels, listModels, acquireModel, adoptCheckpoint, saveSnapshot };
@@ -13,6 +13,7 @@ const { createRecording } = require('./recording');
const { recoverRecordings, enforceRetention } = require('./storage');
const { createTrainer } = require('./training');
const { createDriving } = require('./driving');
const { removeObsoleteModels } = require('./models');
const { createGateway } = require('./socketGateway');
function createRuntime({ config, logger }) {
@@ -221,6 +222,7 @@ function createRuntime({ config, logger }) {
async function start() {
await fs.mkdir(recordingsRoot, { recursive: true });
await recoverRecordings(recordingsRoot);
await removeObsoleteModels(root);
await trainer.start();
running = true;
driving.attach();
+2
View File
@@ -397,6 +397,8 @@ function advanceTurn(roverId) {
return;
}
if (queue.queue.length === 0) {
// Empty queues must not expose the departed driver through turn.currentId.
queue.current = null;
stopRover(roverId);
clearTurnTimer(roverId, queue);
setActiveDriver(roverId, null);