From 8bf0c7784c761f8399eaf3ec67282aa2538b7a2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=B5=E5=AD=90=E6=99=8F?= Date: Wed, 15 Nov 2017 19:13:23 +0800 Subject: [PATCH 1/4] Add Postgres `handleShutdown` Function --- src/Adapters/Storage/Postgres/PostgresStorageAdapter.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js b/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js index 4560ab9b2e..188107fa01 100644 --- a/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js +++ b/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js @@ -574,6 +574,15 @@ export class PostgresStorageAdapter { this._pgp = pgp; } + handleShutdown() { + if (!this._pgp) { + return; + } + // For immediate app exit, shutting down all connection pools + // See API: http://vitaly-t.github.io/pg-promise/module-pg-promise.html#~end + this._pgp.end(); + } + _ensureSchemaCollectionExists(conn) { conn = conn || this._client; return conn.none('CREATE TABLE IF NOT EXISTS "_SCHEMA" ( "className" varChar(120), "schema" jsonb, "isParseClass" bool, PRIMARY KEY ("className") )') From 01e8a6879b8be6c8482c88cc082cc9f5a3efe314 Mon Sep 17 00:00:00 2001 From: Benjamin Wilson Friedman Date: Thu, 16 Nov 2017 15:49:11 -0800 Subject: [PATCH 2/4] Adds Table of Contents to README (#4357) * adds table of contents * remove empty line, moved greenkeeper up with other statuses Add Spec Trigger Need Error Handle --- resources/buildConfigDefinitions.js | 4 ++-- spec/ParseLiveQueryServer.spec.js | 2 +- spec/helper.js | 12 +++++++++--- src/Options/index.js | 2 +- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/resources/buildConfigDefinitions.js b/resources/buildConfigDefinitions.js index ffe5b2e65d..99ddb24743 100644 --- a/resources/buildConfigDefinitions.js +++ b/resources/buildConfigDefinitions.js @@ -1,11 +1,11 @@ /** * Parse Server Configuration Builder - * + * * This module builds the definitions file (src/Options/Definitions.js) * from the src/Options/index.js options interfaces. * The Definitions.js module is responsible for the default values as well * as the mappings for the CLI. - * + * * To rebuild the definitions file, run * `$ node resources/buildConfigDefinitions.js` */ diff --git a/spec/ParseLiveQueryServer.spec.js b/spec/ParseLiveQueryServer.spec.js index 86a68b5694..deebaa3b39 100644 --- a/spec/ParseLiveQueryServer.spec.js +++ b/spec/ParseLiveQueryServer.spec.js @@ -474,7 +474,7 @@ describe('ParseLiveQueryServer', function() { // Trigger disconnect event parseWebSocket.emit('disconnect'); expect(spy).toHaveBeenCalled(); - // call for ws_connect, another for ws_disconnect + // call for ws_connect, another for ws_disconnect expect(spy.calls.count()).toBe(2); }); diff --git a/spec/helper.js b/spec/helper.js index 109f1b0716..60d1c8c67d 100644 --- a/spec/helper.js +++ b/spec/helper.js @@ -122,7 +122,13 @@ var server; const reconfigureServer = changedConfiguration => { return new Promise((resolve, reject) => { if (server) { - return server.close(() => { + try { + server.handleShutdown() + } catch (err) { + // expect throw error, need handle it. + // http://vitaly-t.github.io/pg-promise/module-pg-promise.html#%7Eend + } + return server.server.close(() => { server = undefined; reconfigureServer(changedConfiguration).then(resolve, reject); }); @@ -140,8 +146,8 @@ const reconfigureServer = changedConfiguration => { console.error(err); fail('should not call next'); }); - server = parseServer.server; - server.on('connection', connection => { + server = parseServer; + server.server.on('connection', connection => { const key = `${connection.remoteAddress}:${connection.remotePort}`; openConnections[key] = connection; connection.on('close', () => { delete openConnections[key] }); diff --git a/src/Options/index.js b/src/Options/index.js index d21e715270..5d5f4ecc8b 100644 --- a/src/Options/index.js +++ b/src/Options/index.js @@ -116,7 +116,7 @@ export interface ParseServerOptions { enableSingleSchemaCache: ?boolean; // = false /* Sets the number of characters in generated object id's, default 10 */ objectIdSize: ?number; // = 10 - /* The port to run the ParseServer. defaults to 1337. + /* The port to run the ParseServer. defaults to 1337. :ENV: PORT */ port: ?number; // = 1337 /* The host to serve ParseServer on. defaults to 0.0.0.0 */ From e18c75f13ea94250a5d7e6501bcd056dd5d643e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=B5=E5=AD=90=E6=99=8F?= Date: Fri, 17 Nov 2017 14:59:40 +0800 Subject: [PATCH 3/4] Adds Table of Contents to README (#4357) * adds table of contents * remove empty line, moved greenkeeper up with other statuses Add Spec Trigger Need Error Handle --- spec/ParseServer.spec.js | 12 ++++++++++++ spec/helper.js | 12 +++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/spec/ParseServer.spec.js b/spec/ParseServer.spec.js index bc78106e26..51c70cfd89 100644 --- a/spec/ParseServer.spec.js +++ b/spec/ParseServer.spec.js @@ -33,4 +33,16 @@ describe('Server Url Checks', () => { done(); }); }); + + it('handleShutdown', (done) => { + const parseServer = ParseServer.start(defaultConfiguration) + + parseServer.handleShutdown(); + parseServer.server.close((err) => { + if (err) { + done.fail('Close server err'); + } + done(); + }) + }) }); diff --git a/spec/helper.js b/spec/helper.js index 60d1c8c67d..109f1b0716 100644 --- a/spec/helper.js +++ b/spec/helper.js @@ -122,13 +122,7 @@ var server; const reconfigureServer = changedConfiguration => { return new Promise((resolve, reject) => { if (server) { - try { - server.handleShutdown() - } catch (err) { - // expect throw error, need handle it. - // http://vitaly-t.github.io/pg-promise/module-pg-promise.html#%7Eend - } - return server.server.close(() => { + return server.close(() => { server = undefined; reconfigureServer(changedConfiguration).then(resolve, reject); }); @@ -146,8 +140,8 @@ const reconfigureServer = changedConfiguration => { console.error(err); fail('should not call next'); }); - server = parseServer; - server.server.on('connection', connection => { + server = parseServer.server; + server.on('connection', connection => { const key = `${connection.remoteAddress}:${connection.remotePort}`; openConnections[key] = connection; connection.on('close', () => { delete openConnections[key] }); From 13f4b3358ab1082cbdb42c373cfcd8c5422da08d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=B5=E5=AD=90=E6=99=8F?= Date: Fri, 17 Nov 2017 17:24:38 +0800 Subject: [PATCH 4/4] Finished Testing --- spec/ParseServer.spec.js | 12 ------------ spec/helper.js | 27 ++++++++++++++++++++------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/spec/ParseServer.spec.js b/spec/ParseServer.spec.js index 51c70cfd89..bc78106e26 100644 --- a/spec/ParseServer.spec.js +++ b/spec/ParseServer.spec.js @@ -33,16 +33,4 @@ describe('Server Url Checks', () => { done(); }); }); - - it('handleShutdown', (done) => { - const parseServer = ParseServer.start(defaultConfiguration) - - parseServer.handleShutdown(); - parseServer.server.close((err) => { - if (err) { - done.fail('Close server err'); - } - done(); - }) - }) }); diff --git a/spec/helper.js b/spec/helper.js index 109f1b0716..367afc2224 100644 --- a/spec/helper.js +++ b/spec/helper.js @@ -116,32 +116,45 @@ if (process.env.PARSE_SERVER_TEST_CACHE === 'redis') { const openConnections = {}; // Set up a default API server for testing with default configuration. -var server; +var parseServer; // Allows testing specific configurations of Parse Server const reconfigureServer = changedConfiguration => { return new Promise((resolve, reject) => { - if (server) { - return server.close(() => { - server = undefined; + if (parseServer) { + return parseServer.server.close(() => { + parseServer.handleShutdown(); + parseServer = undefined; reconfigureServer(changedConfiguration).then(resolve, reject); }); } try { + databaseAdapter.handleShutdown(); const newConfiguration = Object.assign({}, defaultConfiguration, changedConfiguration, { __indexBuildCompletionCallbackForTests: indexBuildPromise => indexBuildPromise.then(resolve, reject), mountPath: '/1', port, }); + if (process.env.PARSE_SERVER_TEST_DB === 'postgres') { + databaseAdapter = new PostgresStorageAdapter({ + uri: process.env.PARSE_SERVER_TEST_DATABASE_URI || postgresURI, + collectionPrefix: 'test_', + }); + } else { + databaseAdapter = new MongoStorageAdapter({ + uri: mongoURI, + collectionPrefix: 'test_', + }); + } + newConfiguration.databaseAdapter = databaseAdapter cache.clear(); - const parseServer = ParseServer.start(newConfiguration); + parseServer = ParseServer.start(newConfiguration); parseServer.app.use(require('./testing-routes').router); parseServer.expressApp.use('/1', (err) => { console.error(err); fail('should not call next'); }); - server = parseServer.server; - server.on('connection', connection => { + parseServer.server.on('connection', connection => { const key = `${connection.remoteAddress}:${connection.remotePort}`; openConnections[key] = connection; connection.on('close', () => { delete openConnections[key] });