Fix race condition causing scheduled tasks not to run

Added synchronization to ensure gRPC worker is ready before HTTP worker starts. This prevents the race condition where autosave_crontab() tries to register cron jobs before the gRPC server is ready to accept them.

Co-authored-by: whyour <22700758+whyour@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2025-11-07 16:28:33 +00:00
parent d8ea840266
commit 15f4bcf363
2 changed files with 13134 additions and 9994 deletions

View File

@ -53,8 +53,28 @@ class Application {
} }
private startMasterProcess() { private startMasterProcess() {
// Fork gRPC worker first and wait for it to be ready
const grpcWorker = this.forkWorker('grpc');
// Wait for gRPC worker to signal it's ready before starting HTTP worker
const grpcReadyPromise = new Promise<void>((resolve) => {
const messageHandler = (msg: any) => {
if (msg === 'ready') {
grpcWorker.removeListener('message', messageHandler);
resolve();
}
};
grpcWorker.on('message', messageHandler);
});
// Start HTTP worker after gRPC is ready
grpcReadyPromise.then(() => {
Logger.info('gRPC worker is ready, starting HTTP worker');
this.forkWorker('http'); this.forkWorker('http');
this.forkWorker('grpc'); }).catch((error) => {
Logger.error('Failed to wait for gRPC worker:', error);
process.exit(1);
});
cluster.on('exit', (worker, code, signal) => { cluster.on('exit', (worker, code, signal) => {
const metadata = this.workerMetadataMap.get(worker.id); const metadata = this.workerMetadataMap.get(worker.id);

File diff suppressed because it is too large Load Diff