can1357/oh-my-pi · error · Error

Unable to allocate unique backup path in ${destinationDir}

Error message

Unable to allocate unique backup path in ${destinationDir}

What it means

writeBackupFile tries repeatedly to find a non-existing backup filename (with unique suffix tokens) via exclusive create; if every attempt collides with EEXIST it exhausts its attempts and throws this Error. It effectively means the backup directory is full of colliding names or the uniqueness scheme failed.

Source

Thrown at packages/mnemopi/src/dr/recovery.ts:123

		typeof error === "object" &&
		"code" in error &&
		(error as { readonly code?: unknown }).code === code
	);
}

function writeBackupFile(destinationDir: string, timestamp: string, bytes: Uint8Array): string {
	for (let attempt = 0; attempt < 64; attempt += 1) {
		const suffix = attempt === 0 ? "" : `_${nextUniqueToken()}`;
		const backupPath = join(destinationDir, `mnemopi_backup_${timestamp}${suffix}.db.gz`);
		try {
			writeFileSync(backupPath, bytes, { flag: "wx" });
			return backupPath;
		} catch (error) {
			if (hasErrorCode(error, "EEXIST")) continue;
			throw error;
		}
	}
	throw new Error(`Unable to allocate unique backup path in ${destinationDir}`);
}

function restoreTempPath(targetPath: string): string {
	return join(dirname(targetPath), `.${basename(targetPath)}.${process.pid}.${nextUniqueToken()}.restore.tmp`);
}

function defaultBackupDir(env: Env = process.env): string {
	const explicit = env.MNEMOPI_BACKUP_DIR;
	if (explicit !== undefined && explicit.length > 0) return explicit;
	const dir = configuredDataDir(env);
	return join(dirname(dir), "backups");
}

export function getDefaultPaths(env: Env = process.env): RecoveryPaths {
	return {
		dataDir: configuredDataDir(env),
		backupDir: defaultBackupDir(env),
		dbPath: configuredDbPath(env),

View on GitHub (pinned to 9690622007)

Solutions

  1. Clean up old backup files from destinationDir and retry the backup
  2. Use a fresh/empty backup directory (pass backupDir to createBackup)
  3. Increase spacing between backup runs or include more entropy in filenames

Example fix

// before
createBackup(dbPath, "/var/backups/mnemopi"); // thousands of stale files
// after
fs.rmSync("/var/backups/mnemopi", { /* prune files older than N days */ });
createBackup(dbPath, "/var/backups/mnemopi");
Defensive patterns

Strategy: retry

Try / catch

try {
	const result = createBackup(dbPath, backupDir);
} catch (err) {
	if (err.message.startsWith("Unable to allocate unique backup path")) {
		pruneOldBackups(backupDir, { keep: 10 });
		const result = createBackup(dbPath, backupDir);
	}
}

Prevention

When it happens

Trigger: Many backups within the same timestamp window exhausting the unique-token attempts; a destinationDir stuffed with thousands of files from prior runs; a filesystem where exclusive-create semantics misbehave; extremely long backup filenames plus busy directory causing persistent collisions.

Common situations: Cron jobs writing backups every second into one directory; archived backup dirs migrated onto systems that preserved all files; clock skew producing identical timestamps with exhausted random tokens.

Related errors


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/938a8183ae7ff9a2. Report an issue: GitHub.