Skip to content

Commit

Permalink
fix(server): fix multi-region database connectivity issues (#1801)
Browse files Browse the repository at this point in the history
* fix(server): fix multi-region database connectivity issues
  • Loading branch information
HUAHUAI23 committed Jan 11, 2024
1 parent 1b75bac commit aa28e7e
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 9 deletions.
6 changes: 6 additions & 0 deletions server/src/database/database-usage-limit-task.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@ import { SystemDatabase } from 'src/system-database'
import { ServerConfig } from 'src/constants'
import { BundleService } from 'src/application/bundle.service'
import pLimit from 'src/utils/p-limit'
import { RegionService } from 'src/region/region.service'

@Injectable()
export class DatabaseUsageLimitTaskService {
constructor(
private readonly databaseService: DatabaseService,
private readonly bundleService: BundleService,
private readonly regionService: RegionService,
) {}

private readonly logger = new Logger(DatabaseUsageLimitTaskService.name)
Expand Down Expand Up @@ -86,9 +88,11 @@ export class DatabaseUsageLimitTaskService {
const bundle = await this.bundleService.findOne(appid)
const { databaseCapacity } = bundle.resource
const database = await this.databaseService.findOne(appid)
const region = await this.regionService.findByAppId(appid)
const permission = await this.databaseService.getUserPermission(
database.name,
database.user,
region,
)

if (databaseCapacity < database.dataSize) {
Expand All @@ -97,13 +101,15 @@ export class DatabaseUsageLimitTaskService {
await this.databaseService.revokeWritePermission(
database.name,
database.user,
region,
)
}
} else {
if (permission === DatabasePermission.Read) {
await this.databaseService.grantWritePermission(
database.name,
database.user,
region,
)
}
}
Expand Down
33 changes: 26 additions & 7 deletions server/src/database/database.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import {
import { exec } from 'node:child_process'
import { promisify } from 'node:util'
import { DatabaseSyncRecord } from './entities/database-sync-record'
import { ObjectId } from 'mongodb'
import { MongoClient, ObjectId } from 'mongodb'

const p_exec = promisify(exec)

Expand Down Expand Up @@ -142,9 +142,13 @@ export class DatabaseService {
return { db, client }
}

async revokeWritePermission(name: string, username: string) {
const db = SystemDatabase.client.db(name)
async revokeWritePermission(name: string, username: string, region: Region) {
const conf = region.databaseConf
const client = new MongoClient(conf.controlConnectionUri)

try {
await client.connect()
const db = client.db(name)
const result = await db.command({
updateUser: username,
roles: [
Expand All @@ -160,12 +164,18 @@ export class DatabaseService {
error,
)
throw error
} finally {
await client.close()
}
}

async grantWritePermission(name: string, username: string) {
const db = SystemDatabase.client.db(name)
async grantWritePermission(name: string, username: string, region: Region) {
const conf = region.databaseConf
const client = new MongoClient(conf.controlConnectionUri)

try {
await client.connect()
const db = client.db(name)
const result = await db.command({
updateUser: username,
roles: [
Expand All @@ -181,12 +191,19 @@ export class DatabaseService {
error,
)
throw error
} finally {
await client.close()
}
}

async getUserPermission(name: string, username: string) {
async getUserPermission(name: string, username: string, region: Region) {
const conf = region.databaseConf
const client = new MongoClient(conf.controlConnectionUri)

try {
const result = await this.db.command({
await client.connect()
const db = client.db(name)
const result = await db.command({
usersInfo: { user: username, db: name },
})
const permission =
Expand All @@ -202,6 +219,8 @@ export class DatabaseService {
error,
)
throw error
} finally {
await client.close()
}
}

Expand Down
4 changes: 2 additions & 2 deletions server/src/database/mongo.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export class MongoService {
password: string,
) {
const conf = region.databaseConf
const client = new MongoClient(conf.connectionUri)
const client = new MongoClient(conf.controlConnectionUri)

try {
await client.connect()
Expand Down Expand Up @@ -51,7 +51,7 @@ export class MongoService {
*/
async deleteDatabase(region: Region, name: string) {
const conf = region.databaseConf
const client = new MongoClient(conf.connectionUri)
const client = new MongoClient(conf.controlConnectionUri)

try {
await client.connect()
Expand Down

0 comments on commit aa28e7e

Please sign in to comment.