windmill-labs/windmill · error

A data table called ${name} was created while this setup was

Error message

A data table called ${name} was created while this setup was running. Choose another name and try again.

What it means

During the data-table setup wizard, writeRow claims a data table name and then writes the database config. If between the pre-flight check and the write another admin created a data table with the same name (the claim no longer verifies as ours), the setup aborts with this error instead of silently repointing someone else's table at a database they never chose.

Source

Thrown at frontend/src/lib/components/workspaceSettings/addDataTableModel.ts:431

 * Adds the data table to the workspace config, once everything it points at exists.
 * `edit_datatable_config` replaces the whole map, so the rest is read back and sent with
 * it. Re-runnable: a second attempt overwrites the entry it wrote.
 */
async function writeRow(
	deps: RunDeps,
	claims: Claims,
	name: string,
	database: { resource_type: 'postgresql' | 'instance'; resource_path: string }
): Promise<Claims> {
	const settings = await WorkspaceService.getSettings({ workspace: deps.workspace })
	const datatables: Record<string, any> = { ...(settings.datatable?.datatables ?? {}) }
	// Free when the pre-flight looked, taken by the time we write: repointing it here would
	// silently hand another admin's data table a database they never chose.
	if (
		datatables[name] &&
		!stillOurs(claims, 'row', name, datatables[name]?.database?.resource_path)
	) {
		throw new Error(
			`A data table called ${name} was created while this setup was running. Choose another name and try again.`
		)
	}
	datatables[name] = { ...(datatables[name] ?? {}), database }
	await WorkspaceService.editDataTableConfig({
		workspace: deps.workspace,
		requestBody: { settings: { datatables }, renames: [], deleted_datatables: [] }
	})
	return claim(claims, 'row', name, database.resource_path)
}

/**
 * `removed` — the row this run wrote is gone. `kept` — the undo could not reach the server, so
 * it is still there and the caller has to keep saying so. `foreign` — the name now points
 * somewhere this run never wrote, so there is nothing of ours to take back.
 */
type Rollback = 'removed' | 'kept' | 'foreign'

View on GitHub (pinned to e474e8803c)

Solutions

  1. Choose a different data table name and rerun the setup, as the message instructs
  2. Coordinate with the other admin so only one setup runs at a time
  3. Refresh the workspace settings page to pick up the newly created table — it may already be configured as intended
Defensive patterns

Strategy: retry

Validate before calling

// before writing, confirm the name is still free/ours
const tables = await WorkspaceService.getDataTableConfig({ workspace })
if (tables[name] && !isOurClaim) console.warn(`Data table '${name}' already exists — pick another name`)

Try / catch

try {
  await runSetup(...)
} catch (e) {
  if (String(e.message).startsWith('A data table called')) {
    // surface UI prompt to choose a new table name, then retry setup
  }
}

Prevention

When it happens

Trigger: Two admins run the add-data-table setup concurrently with the same table name; the first completes and creates the table, the second's stillOurs() claim check fails right before WorkspaceService.editDataTableConfig runs.

Common situations: Concurrent workspace configuration by multiple admins; rerunning a stale setup wizard tab after someone else already finished the same setup.

Related errors


AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03). Data as JSON: /api/errors/7d6bd7e21d04ee08. Report an issue: GitHub.