Skip to content

Commit b7daad6

Browse files
davimacedodplewis
authored andcommitted
Handle shutdown on grid adapters (parse-community#5943)
* Handle shutdown on grid adapters * Add tests * Fix postgres test
1 parent 5aa1f8a commit b7daad6

6 files changed

+81
-21
lines changed

spec/GridFSBucketStorageAdapter.spec.js

+15
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,19 @@ describe('GridFSBucket and GridStore interop', () => {
6060
await gfsAdapter.deleteFile('myFileName');
6161
await expectMissingFile(gfsAdapter, 'myFileName');
6262
});
63+
64+
it('handleShutdown, close connection', done => {
65+
const databaseURI = 'mongodb://localhost:27017/parse';
66+
const gfsAdapter = new GridFSBucketAdapter(databaseURI);
67+
68+
gfsAdapter._connect().then(db => {
69+
expect(db.serverConfig.connections().length > 0).toEqual(true);
70+
expect(db.serverConfig.s.connected).toEqual(true);
71+
gfsAdapter.handleShutdown().then(() => {
72+
expect(db.serverConfig.connections().length > 0).toEqual(false);
73+
expect(db.serverConfig.s.connected).toEqual(false);
74+
done();
75+
});
76+
});
77+
});
6378
});

spec/GridStoreAdapter.spec.js

+15
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,19 @@ describe_only_db('mongo')('GridStoreAdapter', () => {
9696
})
9797
.catch(fail);
9898
});
99+
100+
it('handleShutdown, close connection', done => {
101+
const databaseURI = 'mongodb://localhost:27017/parse';
102+
const gridStoreAdapter = new GridStoreAdapter(databaseURI);
103+
104+
gridStoreAdapter._connect().then(db => {
105+
expect(db.serverConfig.connections().length > 0).toEqual(true);
106+
expect(db.serverConfig.s.connected).toEqual(true);
107+
gridStoreAdapter.handleShutdown().then(() => {
108+
expect(db.serverConfig.connections().length > 0).toEqual(false);
109+
expect(db.serverConfig.s.connected).toEqual(false);
110+
done();
111+
});
112+
});
113+
});
99114
});

spec/ParseServer.spec.js

+14-8
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,20 @@ describe('Server Url Checks', () => {
6666
const newConfiguration = Object.assign({}, defaultConfiguration, {
6767
databaseAdapter,
6868
serverStartComplete: () => {
69-
parseServer.handleShutdown();
70-
parseServer.server.close(err => {
71-
if (err) {
72-
done.fail('Close Server Error');
73-
}
74-
reconfigureServer({}).then(() => {
75-
expect(close).toBe(true);
76-
done();
69+
let promise = Promise.resolve();
70+
if (process.env.PARSE_SERVER_TEST_DB !== 'postgres') {
71+
promise = parseServer.config.filesController.adapter._connect();
72+
}
73+
promise.then(() => {
74+
parseServer.handleShutdown();
75+
parseServer.server.close(err => {
76+
if (err) {
77+
done.fail('Close Server Error');
78+
}
79+
reconfigureServer({}).then(() => {
80+
expect(close).toBe(true);
81+
done();
82+
});
7783
});
7884
});
7985
},

src/Adapters/Files/GridFSBucketAdapter.js

+11-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ export class GridFSBucketAdapter extends FilesAdapter {
3232
this._connectionPromise = MongoClient.connect(
3333
this._databaseURI,
3434
this._mongoOptions
35-
).then(client => client.db(client.s.options.dbName));
35+
).then(client => {
36+
this._client = client;
37+
return client.db(client.s.options.dbName);
38+
});
3639
}
3740
return this._connectionPromise;
3841
}
@@ -98,6 +101,13 @@ export class GridFSBucketAdapter extends FilesAdapter {
98101
const bucket = await this._getBucket();
99102
return bucket.openDownloadStreamByName(filename);
100103
}
104+
105+
handleShutdown() {
106+
if (!this._client) {
107+
return Promise.resolve();
108+
}
109+
return this._client.close(false);
110+
}
101111
}
102112

103113
export default GridFSBucketAdapter;

src/Adapters/Files/GridStoreAdapter.js

+11-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ export class GridStoreAdapter extends FilesAdapter {
3333
this._connectionPromise = MongoClient.connect(
3434
this._databaseURI,
3535
this._mongoOptions
36-
).then(client => client.db(client.s.options.dbName));
36+
).then(client => {
37+
this._client = client;
38+
return client.db(client.s.options.dbName);
39+
});
3740
}
3841
return this._connectionPromise;
3942
}
@@ -99,6 +102,13 @@ export class GridStoreAdapter extends FilesAdapter {
99102
});
100103
});
101104
}
105+
106+
handleShutdown() {
107+
if (!this._client) {
108+
return Promise.resolve();
109+
}
110+
return this._client.close(false);
111+
}
102112
}
103113

104114
export default GridStoreAdapter;

src/ParseServer.js

+15-11
Original file line numberDiff line numberDiff line change
@@ -114,18 +114,22 @@ class ParseServer {
114114
}
115115

116116
handleShutdown() {
117-
const { adapter } = this.config.databaseController;
118-
if (adapter && typeof adapter.handleShutdown === 'function') {
119-
const promise = adapter.handleShutdown();
120-
if (promise instanceof Promise) {
121-
return promise.then(() => {
122-
if (this.config.serverCloseComplete) {
123-
this.config.serverCloseComplete();
124-
}
125-
});
126-
}
117+
const promises = [];
118+
const { adapter: databaseAdapter } = this.config.databaseController;
119+
if (
120+
databaseAdapter &&
121+
typeof databaseAdapter.handleShutdown === 'function'
122+
) {
123+
promises.push(databaseAdapter.handleShutdown());
124+
}
125+
const { adapter: fileAdapter } = this.config.filesController;
126+
if (fileAdapter && typeof fileAdapter.handleShutdown === 'function') {
127+
promises.push(fileAdapter.handleShutdown());
127128
}
128-
return Promise.resolve().then(() => {
129+
return (promises.length > 0
130+
? Promise.all(promises)
131+
: Promise.resolve()
132+
).then(() => {
129133
if (this.config.serverCloseComplete) {
130134
this.config.serverCloseComplete();
131135
}

0 commit comments

Comments
 (0)