From b62203b1f13f273cd6fadfa9da2114dd5889d5ee Mon Sep 17 00:00:00 2001
From: Aya Morisawa <AyaMorisawa4869@gmail.com>
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 c68f617c09..70b61a59f3 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 69b52fde87..09457d2d0a 100644
--- a/src/prelude/array.ts
+++ b/src/prelude/array.ts
@@ -49,3 +49,11 @@ export function groupBy<T>(f: (x: T, y: T) => boolean, xs: T[]): T[][] {
 export function groupOn<T, S>(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;
+}
-- 
GitLab