From d403a29f665a67c872866743e86f96e4daccc8db Mon Sep 17 00:00:00 2001 From: HUAHUAI23 Date: Fri, 28 Jun 2024 09:47:18 +0000 Subject: [PATCH] ok --- .../dedicated-database-task.service.ts | 6 ++-- .../dedicated-database.service.ts | 33 ++++++++++++++++--- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/server/src/database/dedicated-database/dedicated-database-task.service.ts b/server/src/database/dedicated-database/dedicated-database-task.service.ts index 8d4b87c..83f9d49 100644 --- a/server/src/database/dedicated-database/dedicated-database-task.service.ts +++ b/server/src/database/dedicated-database/dedicated-database-task.service.ts @@ -99,10 +99,12 @@ export class DedicatedDatabaseTaskService { return } - await this.dbService.databaseConnectionIsOk(appid) + const connectionOk = await this.dbService.databaseConnectionIsOk(appid) + manifest = await this.dbService.getDeployManifest(region, user, appid) const unavailable = manifest?.status?.phase !== 'Running' - if (unavailable) { + + if (unavailable && !connectionOk) { await this.relock(appid, waitingTime) return } diff --git a/server/src/database/dedicated-database/dedicated-database.service.ts b/server/src/database/dedicated-database/dedicated-database.service.ts index aa20c5a..4af52b5 100644 --- a/server/src/database/dedicated-database/dedicated-database.service.ts +++ b/server/src/database/dedicated-database/dedicated-database.service.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@nestjs/common' +import { Injectable, Logger } from '@nestjs/common' import { Region } from 'src/region/entities/region' import { DedicatedDatabase, @@ -36,6 +36,8 @@ const p_exec = promisify(exec) @Injectable() export class DedicatedDatabaseService { + private readonly logger = new Logger(DedicatedDatabase.name) + constructor( private readonly cluster: ClusterService, private readonly mongoService: MongoService, @@ -288,7 +290,7 @@ export class DedicatedDatabaseService { `mongodump --uri='${connectionUri}' --gzip --archive=${filePath}`, ) } catch (error) { - console.error(`failed to export db ${appid}`, error) + this.logger.error(`failed to export db ${appid}`, error) throw error } finally { await SystemDatabase.db @@ -387,15 +389,36 @@ export class DedicatedDatabaseService { } } - async databaseConnectionIsOk(appid: string) { + async databaseConnectionIsOk(appid: string): Promise { try { const { client } = await this.findAndConnect(appid) const admin = client.db('admin') const replSetStatus = await admin.command({ replSetGetStatus: 1 }) - console.log(replSetStatus) + const members = replSetStatus.members + const replicaSetOk: boolean = replSetStatus.ok === 1 + + const healthyMembers = members.filter( + (member: any) => member.health === 1, + ) + + const primary = healthyMembers.find( + (member: any) => member.stateStr === 'PRIMARY', + ) - return true + const majorityCount = Math.ceil(members.length / 2) + + const isClusterHealthy = + replicaSetOk && primary && healthyMembers.length >= majorityCount + + if (isClusterHealthy) { + return true + } + + return false } catch (error) { + this.logger.verbose( + `dedicatedDatabase health check failed ${appid}\n${error.message}`, + ) return false } }