From 529333c03394a88bb5aa00aab863e67babd62fd6 Mon Sep 17 00:00:00 2001 From: Virgil Date: Sat, 4 Apr 2026 19:02:35 +0000 Subject: [PATCH] fix(workspace): close partial workspaces without filesystem Co-Authored-By: Virgil --- workspace.go | 4 ++-- workspace_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/workspace.go b/workspace.go index 697a8f2..1b65a72 100644 --- a/workspace.go +++ b/workspace.go @@ -419,7 +419,7 @@ func (workspace *Workspace) closeAndCleanup(removeFiles bool) error { if workspace == nil { return nil } - if workspace.sqliteDatabase == nil || workspace.filesystem == nil { + if workspace.sqliteDatabase == nil { return nil } @@ -435,7 +435,7 @@ func (workspace *Workspace) closeAndCleanup(removeFiles bool) error { return core.E("store.Workspace.closeAndCleanup", "close workspace database", err) } } - if !removeFiles { + if !removeFiles || workspace.filesystem == nil { return nil } for _, path := range []string{workspace.databasePath, workspace.databasePath + "-wal", workspace.databasePath + "-shm"} { diff --git a/workspace_test.go b/workspace_test.go index 95eff0a..a0465e0 100644 --- a/workspace_test.go +++ b/workspace_test.go @@ -226,6 +226,30 @@ func TestWorkspace_Close_Good_PreservesFileForRecovery(t *testing.T) { assert.False(t, testFilesystem().Exists(workspace.databasePath)) } +func TestWorkspace_Close_Good_ClosesDatabaseWithoutFilesystem(t *testing.T) { + databasePath := testPath(t, "workspace-no-filesystem.duckdb") + + sqliteDatabase, err := openWorkspaceDatabase(databasePath) + require.NoError(t, err) + + workspace := &Workspace{ + name: "partial-workspace", + sqliteDatabase: sqliteDatabase, + databasePath: databasePath, + } + + require.NoError(t, workspace.Close()) + + _, execErr := sqliteDatabase.Exec("SELECT 1") + require.Error(t, execErr) + assert.Contains(t, execErr.Error(), "closed") + + assert.True(t, testFilesystem().Exists(databasePath)) + requireCoreOK(t, testFilesystem().Delete(databasePath)) + _ = testFilesystem().Delete(databasePath + "-wal") + _ = testFilesystem().Delete(databasePath + "-shm") +} + func TestWorkspace_RecoverOrphans_Good(t *testing.T) { stateDirectory := useWorkspaceStateDirectory(t)