11const http = require ( 'http' ) ;
22const https = require ( 'https' ) ;
33const cluster = require ( 'cluster' ) ;
4+ const { series } = require ( 'async' ) ;
45const arsenal = require ( 'arsenal' ) ;
56const { RedisClient, StatsClient } = require ( 'arsenal' ) . metrics ;
67const monitoringClient = require ( './utilities/monitoringHandler' ) ;
@@ -12,6 +13,7 @@ const _config = require('./Config').config;
1213const { blacklistedPrefixes } = require ( '../constants' ) ;
1314const api = require ( './api/api' ) ;
1415const data = require ( './data/wrapper' ) ;
16+ const metadata = require ( './metadata/wrapper' ) ;
1517const { initManagement } = require ( './management' ) ;
1618
1719const routes = arsenal . s3routes . routes ;
@@ -48,6 +50,7 @@ class S3Server {
4850 */
4951 constructor ( worker ) {
5052 this . worker = worker ;
53+ this . cluster = true ;
5154 http . globalAgent . keepAlive = true ;
5255
5356 process . on ( 'SIGINT' , this . cleanUp . bind ( this ) ) ;
@@ -67,6 +70,7 @@ class S3Server {
6770 } ) ;
6871 this . caughtExceptionShutdown ( ) ;
6972 } ) ;
73+ this . started = false ;
7074 }
7175
7276 routeRequest ( req , res ) {
@@ -165,47 +169,62 @@ class S3Server {
165169 }
166170
167171 caughtExceptionShutdown ( ) {
172+ if ( ! this . cluster ) {
173+ process . exit ( 1 ) ;
174+ }
168175 logger . error ( 'shutdown of worker due to exception' , {
169176 workerId : this . worker ? this . worker . id : undefined ,
170177 workerPid : this . worker ? this . worker . process . pid : undefined ,
171178 } ) ;
172179 // Will close all servers, cause disconnect event on master and kill
173180 // worker process with 'SIGTERM'.
174- this . worker . kill ( ) ;
181+ if ( this . worker ) {
182+ this . worker . kill ( ) ;
183+ }
175184 }
176185
177186 initiateStartup ( log ) {
178- clientCheck ( true , log , ( err , results ) => {
187+ series ( [
188+ next => metadata . setup ( next ) ,
189+ next => clientCheck ( true , log , next ) ,
190+ ] , ( err , results ) => {
179191 if ( err ) {
180192 log . info ( 'initial health check failed, delaying startup' , {
181193 error : err ,
182194 healthStatus : results ,
183195 } ) ;
184196 setTimeout ( ( ) => this . initiateStartup ( log ) , 2000 ) ;
185- } else {
186- log . debug ( 'initial health check succeeded' ) ;
187- if ( _config . listenOn . length > 0 ) {
188- _config . listenOn . forEach ( item => {
189- this . startup ( item . port , item . ip ) ;
190- } ) ;
191- } else {
192- this . startup ( _config . port ) ;
193- }
197+ return ;
198+ }
199+ log . debug ( 'initial health check succeeded' ) ;
200+ if ( _config . listenOn . length > 0 ) {
201+ _config . listenOn . forEach ( item => {
202+ this . startup ( item . port , item . ip ) ;
203+ } ) ;
204+ return ;
205+ }
206+ if ( ! this . started ) {
207+ this . startup ( _config . port ) ;
208+ this . started = true ;
194209 }
195210 } ) ;
196211 }
197212}
198213
199214function main ( ) {
200- let clusters = _config . clusters || 1 ;
215+ // TODO: change config to use workers prop. name for clarity
216+ let workers = _config . clusters || 1 ;
201217 if ( process . env . S3BACKEND === 'mem' ) {
202- clusters = 1 ;
218+ workers = 1 ;
203219 }
204- if ( cluster . isMaster ) {
205- // Make sure all workers use the same report token
220+ this . cluster = workers > 1 ;
221+ if ( ! this . cluster ) {
206222 process . env . REPORT_TOKEN = _config . reportToken ;
207-
208- for ( let n = 0 ; n < clusters ; n ++ ) {
223+ const server = new S3Server ( ) ;
224+ server . initiateStartup ( logger . newRequestLogger ( ) ) ;
225+ }
226+ if ( this . cluster && cluster . isMaster ) {
227+ for ( let n = 0 ; n < workers ; n ++ ) {
209228 const worker = cluster . fork ( ) ;
210229 logger . info ( 'new worker forked' , {
211230 workerId : worker . id ,
@@ -214,8 +233,8 @@ function main() {
214233 }
215234 setInterval ( ( ) => {
216235 const len = Object . keys ( cluster . workers ) . length ;
217- if ( len < clusters ) {
218- for ( let i = len ; i < clusters ; i ++ ) {
236+ if ( len < workers ) {
237+ for ( let i = len ; i < workers ; i ++ ) {
219238 const newWorker = cluster . fork ( ) ;
220239 logger . info ( 'new worker forked' , {
221240 workerId : newWorker . id ,
@@ -245,7 +264,8 @@ function main() {
245264 workerPid : worker . process . pid ,
246265 } ) ;
247266 } ) ;
248- } else {
267+ }
268+ if ( this . cluster && cluster . isWorker ) {
249269 const server = new S3Server ( cluster . worker ) ;
250270 server . initiateStartup ( logger . newRequestLogger ( ) ) ;
251271 }
0 commit comments