Skip to content

Commit 775b87a

Browse files
further wip
1 parent 963f6fd commit 775b87a

11 files changed

Lines changed: 413 additions & 149 deletions

File tree

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"scripts": {
77
"build": "cross-env SKIP_ENV_VALIDATION=1 yarn workspaces foreach -A run build",
88
"test": "yarn workspaces foreach -A run test",
9-
"dev": "yarn dev:prisma:migrate:dev && npm-run-all --print-label --parallel dev:zoekt dev:backend dev:web watch:mcp watch:schemas",
9+
"dev": "concurrently --kill-others --names \"zoekt,worker,web,mcp,schemas\" 'yarn dev:zoekt' 'yarn dev:backend' 'yarn dev:web' 'yarn watch:mcp' 'yarn watch:schemas'",
1010
"with-env": "cross-env PATH=\"$PWD/bin:$PATH\" dotenv -e .env.development -c --",
1111
"dev:zoekt": "yarn with-env zoekt-webserver -index .sourcebot/index -rpc",
1212
"dev:backend": "yarn with-env yarn workspace @sourcebot/backend dev:watch",
@@ -21,9 +21,9 @@
2121
"build:deps": "yarn workspaces foreach -R --from '{@sourcebot/schemas,@sourcebot/error,@sourcebot/crypto,@sourcebot/db,@sourcebot/shared}' run build"
2222
},
2323
"devDependencies": {
24+
"concurrently": "^9.2.1",
2425
"cross-env": "^7.0.3",
25-
"dotenv-cli": "^8.0.0",
26-
"npm-run-all": "^4.1.5"
26+
"dotenv-cli": "^8.0.0"
2727
},
2828
"packageManager": "yarn@4.7.0",
2929
"resolutions": {

packages/backend/src/connectionManager.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -364,12 +364,12 @@ export class ConnectionManager {
364364
}
365365
}
366366

367-
public dispose() {
367+
public async dispose() {
368368
if (this.interval) {
369369
clearInterval(this.interval);
370370
}
371-
this.worker.close();
372-
this.queue.close();
371+
await this.worker.close();
372+
await this.queue.close();
373373
}
374374
}
375375

packages/backend/src/ee/repoPermissionSyncer.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,12 @@ export class RepoPermissionSyncer {
101101
}, 1000 * 5);
102102
}
103103

104-
public dispose() {
104+
public async dispose() {
105105
if (this.interval) {
106106
clearInterval(this.interval);
107107
}
108-
this.worker.close();
109-
this.queue.close();
108+
await this.worker.close();
109+
await this.queue.close();
110110
}
111111

112112
private async schedulePermissionSync(repos: Repo[]) {

packages/backend/src/ee/userPermissionSyncer.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,12 @@ export class UserPermissionSyncer {
101101
}, 1000 * 5);
102102
}
103103

104-
public dispose() {
104+
public async dispose() {
105105
if (this.interval) {
106106
clearInterval(this.interval);
107107
}
108-
this.worker.close();
109-
this.queue.close();
108+
await this.worker.close();
109+
await this.queue.close();
110110
}
111111

112112
private async schedulePermissionSync(users: User[]) {

packages/backend/src/index.ts

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,28 @@ else if (env.EXPERIMENT_EE_PERMISSION_SYNC_ENABLED === 'true' && hasEntitlement(
9090
}
9191

9292
const cleanup = async (signal: string) => {
93-
logger.info(`Recieved ${signal}, cleaning up...`);
94-
95-
connectionManager.dispose();
96-
repoManager.dispose();
97-
repoPermissionSyncer.dispose();
98-
userPermissionSyncer.dispose();
99-
indexSyncer.dispose();
93+
logger.info(`Received ${signal}, cleaning up...`);
94+
95+
const shutdownTimeout = 30000; // 30 seconds
96+
97+
try {
98+
await Promise.race([
99+
Promise.all([
100+
indexSyncer.dispose(),
101+
repoManager.dispose(),
102+
connectionManager.dispose(),
103+
repoPermissionSyncer.dispose(),
104+
userPermissionSyncer.dispose(),
105+
promClient.dispose(),
106+
]),
107+
new Promise((_, reject) =>
108+
setTimeout(() => reject(new Error('Shutdown timeout')), shutdownTimeout)
109+
)
110+
]);
111+
logger.info('All workers shut down gracefully');
112+
} catch (error) {
113+
logger.warn('Shutdown timeout or error, forcing exit:', error instanceof Error ? error.message : String(error));
114+
}
100115

101116
await prisma.$disconnect();
102117
await redis.quit();

0 commit comments

Comments
 (0)