Skip to content

Commit da08869

Browse files
committed
[server] Delete prebuild records when purging workspaces
1 parent b422b93 commit da08869

File tree

5 files changed

+68
-7
lines changed

5 files changed

+68
-7
lines changed

components/gitpod-db/src/typeorm/entity/db-prebuild-info-entry.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,8 @@ export class DBPrebuildInfo {
3131
})(),
3232
})
3333
info: PrebuildInfo;
34+
35+
// This column triggers the db-sync deletion mechanism. It's not intended for public consumption.
36+
@Column()
37+
deleted?: boolean;
3438
}

components/gitpod-db/src/typeorm/entity/db-prebuilt-workspace.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,8 @@ export class DBPrebuiltWorkspace implements PrebuiltWorkspace {
7777
transformer: Transformer.MAP_BIGINT_TO_NUMBER,
7878
})
7979
statusVersion: number;
80+
81+
// This column triggers the db-sync deletion mechanism. It's not intended for public consumption.
82+
@Column()
83+
deleted?: boolean;
8084
}

components/gitpod-db/src/typeorm/workspace-db-impl.ts

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ import { DBPrebuiltWorkspaceUpdatable } from "./entity/db-prebuilt-workspace-upd
5353
import { BUILTIN_WORKSPACE_PROBE_USER_ID } from "../user-db";
5454
import { DBPrebuildInfo } from "./entity/db-prebuild-info-entry";
5555
import { daysBefore } from "@gitpod/gitpod-protocol/lib/util/timeutil";
56+
import {
57+
reportPrebuildInfoPurged,
58+
reportPrebuiltWorkspacePurged,
59+
reportWorkspaceInstancePurged,
60+
reportWorkspacePurged,
61+
} from "@gitpod/gitpod-db/lib/prometheus-metrics";
5662

5763
type RawTo<T> = (instance: WorkspaceInstance, ws: Workspace) => T;
5864
interface OrderBy {
@@ -981,8 +987,27 @@ export abstract class AbstractTypeORMWorkspaceDBImpl implements WorkspaceDB {
981987
* around to deleting them.
982988
*/
983989
public async hardDeleteWorkspace(workspaceId: string): Promise<void> {
984-
await (await this.getWorkspaceInstanceRepo()).update({ workspaceId }, { deleted: true });
985-
await (await this.getWorkspaceRepo()).update(workspaceId, { deleted: true });
990+
const prebuild = await this.findPrebuildByWorkspaceID(workspaceId);
991+
if (prebuild !== undefined) {
992+
// There are prebuilds linked to this workspace. We need to delete these first.
993+
const prebuildsDeleted = await (
994+
await this.getPrebuiltWorkspaceRepo()
995+
).update({ id: prebuild.id }, { deleted: true });
996+
reportPrebuiltWorkspacePurged(prebuildsDeleted.affected || 0);
997+
998+
// Delete the d_b_prebuilt_workspace_updatable record?
999+
// await (await this.getPrebuiltWorkspaceUpdatableRepo()).update()
1000+
1001+
const prebuildInfos = await (
1002+
await this.getPrebuildInfoRepo()
1003+
).update({ prebuildId: prebuild.id }, { deleted: true });
1004+
reportPrebuildInfoPurged(prebuildInfos.affected || 0);
1005+
}
1006+
const instances = await (await this.getWorkspaceInstanceRepo()).update({ workspaceId }, { deleted: true });
1007+
reportWorkspaceInstancePurged(instances.affected || 0);
1008+
1009+
const workspaces = await (await this.getWorkspaceRepo()).update(workspaceId, { deleted: true });
1010+
reportWorkspacePurged(workspaces.affected || 0);
9861011
}
9871012

9881013
public async findAllWorkspaces(

components/server/src/prometheus-metrics.ts

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,10 +169,40 @@ export function increasePrebuildsStartedCounter() {
169169

170170
const workspacesPurgedTotal = new prometheusClient.Counter({
171171
name: "gitpod_server_workspaces_purged_total",
172-
help: "Counter of workspaces hard deleted by periodic job running on server.",
172+
help: "Counter of workspaces hard deleted by periodic gc.",
173173
registers: [prometheusClient.register],
174174
});
175175

176-
export function reportWorkspacePurged() {
177-
workspacesPurgedTotal.inc();
176+
export function reportWorkspacePurged(count: number) {
177+
workspacesPurgedTotal.inc(count);
178+
}
179+
180+
const prebuildWorkspacesPurgedTotal = new prometheusClient.Counter({
181+
name: "gitpod_server_prebuild_workspaces_purged_total",
182+
help: "Counter of prebuild workspaces hard deleted by periodic gc.",
183+
registers: [prometheusClient.register],
184+
});
185+
186+
export function reportPrebuiltWorkspacePurged(count: number) {
187+
prebuildWorkspacesPurgedTotal.inc(count);
188+
}
189+
190+
const prebuildInfoPurgedTotal = new prometheusClient.Counter({
191+
name: "gitpod_server_prebuild_info_purged_total",
192+
help: "Counter of prebuild info records hard deleted by periodic gc.",
193+
registers: [prometheusClient.register],
194+
});
195+
196+
export function reportPrebuildInfoPurged(count: number) {
197+
prebuildInfoPurgedTotal.inc(count);
198+
}
199+
200+
const workspaceInstancePurgedTotal = new prometheusClient.Counter({
201+
name: "gitpod_server_workspace_instances_purged_total",
202+
help: "Counter of workspace instances records hard deleted by periodic gc.",
203+
registers: [prometheusClient.register],
204+
});
205+
206+
export function reportWorkspaceInstancePurged(count: number) {
207+
workspaceInstancePurgedTotal.inc(count);
178208
}

components/server/src/workspace/workspace-deletion-service.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import { TraceContext } from "@gitpod/gitpod-protocol/lib/util/tracing";
1919
import { WorkspaceManagerClientProvider } from "@gitpod/ws-manager/lib/client-provider";
2020
import { DeleteVolumeSnapshotRequest } from "@gitpod/ws-manager/lib";
2121
import { log } from "@gitpod/gitpod-protocol/lib/util/logging";
22-
import { reportWorkspacePurged } from "../prometheus-metrics";
2322

2423
@injectable()
2524
export class WorkspaceDeletionService {
@@ -57,7 +56,6 @@ export class WorkspaceDeletionService {
5756
public async hardDeleteWorkspace(ctx: TraceContext, workspaceId: string): Promise<void> {
5857
await this.db.trace(ctx).hardDeleteWorkspace(workspaceId);
5958
log.info(`Purged Workspace ${workspaceId} and all WorkspaceInstances for this workspace`, { workspaceId });
60-
reportWorkspacePurged();
6159
}
6260

6361
/**

0 commit comments

Comments
 (0)