From b62203b1f13f273cd6fadfa9da2114dd5889d5ee Mon Sep 17 00:00:00 2001 From: Aya Morisawa Date: Sun, 11 Nov 2018 14:27:00 +0900 Subject: [PATCH] Check MongoDB version (#3185) * Check MongoDB version * Fix bug --- src/index.ts | 17 +++++++++++++---- src/prelude/array.ts | 8 ++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/index.ts b/src/index.ts index c68f617c0..70b61a59f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -14,7 +14,7 @@ import * as portscanner from 'portscanner'; import isRoot = require('is-root'); import Xev from 'xev'; import * as program from 'commander'; -import mongo from './db/mongodb'; +import mongo, { nativeDbConn } from './db/mongodb'; import Logger from './misc/logger'; import EnvironmentInfo from './misc/environmentInfo'; @@ -23,6 +23,7 @@ import serverStats from './daemons/server-stats'; import notesStats from './daemons/notes-stats'; import loadConfig from './config/load'; import { Config } from './config/types'; +import { lessThan } from './prelude/array'; const clusterLog = debug('misskey:cluster'); const ev = new Xev(); @@ -158,11 +159,19 @@ function checkMongoDb(config: Config) { mongoDBLogger.info(`Connecting to ${uri}`); mongo.then(() => { + nativeDbConn().then(db => db.admin().serverInfo()).then(x => x.version).then((version: string) => { + mongoDBLogger.info(`Version: ${version}`); + if (lessThan(version.split('.').map(x => parseInt(x, 10)), [3, 6])) { + mongoDBLogger.error(`MongoDB version is less than 3.6. Please upgrade it.`); + process.exit(1); + } + }); + mongoDBLogger.succ('Connectivity confirmed'); }) - .catch(err => { - mongoDBLogger.error(err.message); - }); + .catch(err => { + mongoDBLogger.error(err.message); + }); } function spawnWorkers(limit: number) { diff --git a/src/prelude/array.ts b/src/prelude/array.ts index 69b52fde8..09457d2d0 100644 --- a/src/prelude/array.ts +++ b/src/prelude/array.ts @@ -49,3 +49,11 @@ export function groupBy(f: (x: T, y: T) => boolean, xs: T[]): T[][] { export function groupOn(f: (x: T) => S, xs: T[]): T[][] { return groupBy((a, b) => f(a) === f(b), xs); } + +export function lessThan(xs: number[], ys: number[]): boolean { + for (let i = 0; i < Math.min(xs.length, ys.length); i++) { + if (xs[i] < ys[i]) return true; + if (xs[i] > ys[i]) return false; + } + return xs.length < ys.length; +}