package Ġcom . ant wer kz . bot t ler ocket . clusters Ċ Ċ import Ġcom . ant wer kz . bot t ler ocket . Bot tle Rocket Ċ import Ġcom . ant wer kz . bot t ler ocket . configuration . Configuration Ċ import Ġcom . ant wer kz . bot t ler ocket . configuration . configuration Ċ import Ġcom . ant wer kz . bot t ler ocket . configuration . types . Cluster Role . config svr Ċ import Ġcom . ant wer kz . bot t ler ocket . configuration . types . Cluster Role . shard svr Ċ import Ġcom . ant wer kz . bot t ler ocket . executable . Mong os Ċ import Ġcom . github . z af ark h aja . semver . Version Ċ import Ġcom . mongodb . Server Address Ċ import Ġjava . io . File Ċ Ċ class ĠSh arded Cluster Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġbase Dir : ĠFile Ġ= ĠBot tle Rocket . DEFAULT _ BASE _ DIR , ĊĠĠĠ Ġname : ĠString Ġ= ĠBot tle Rocket . DEFAULT _ NAME , ĊĠĠĠ Ġversion : ĠVersion Ġ= ĠBot tle Rocket . DEFAULT _ VERSION , ĊĠĠĠ Ġallocator : ĠPort Allocator Ġ= ĠBot tle Rocket . PORTS Ċ ) Ġ: ĠMongo Cluster ( base Dir , Ġname , Ġversion , Ġallocator ) Ġ{ ĊĠĠĠ Ġval Ġsh ards Ġ= Ġarray ListOf < Replica Set >() ĊĠĠĠ Ġval Ġmongo ses Ġ= Ġarray ListOf < Mong os >() ĊĠĠĠ Ġlateinit Ġvar Ġconfig Server : ĠReplica Set ĊĠĠĠ Ġvar Ġinitialized Ġ= Ġfalse ĊĊĠĠĠ Ġoverride ĊĠĠĠ Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Started ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Config Server () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Shards () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Mongo ses () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmongo ses . forEach Ġ{ Ġit . start () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsh ards . forEach Ġ{ Ġit . start () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! initialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsh ards . forEach Ġ{ Ġadd Member ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitialized Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Member ( replica Set : ĠReplica Set ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreplica Set . configure ( configuration ) ĊĠĠĠĠĠĠĠ Ġval Ġrepl Set Url Ġ= Ġreplica Set . replica Set Url () ĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġmongo ses . first (). run Command ("{ Ġadd Shard : Ġ$ repl Set Url Ġ} ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( results . getDouble (" ok "). toInt () Ġ!= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġadd Ġ${ replica Set . name } Ġto Ġcluster : Ġ Ġ$ results ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Started (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmongo ses . filter Ġ{ Ġit . is Alive () Ġ}. count () Ġ!= Ġ 0 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Server . is Started () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsh ards . filter Ġ{ Ġit . is Started () Ġ}. count () Ġ!= Ġ 0 ĊĠĠĠ Ġ} Ċ /* ĊĠĠĠ Ġoverride ĊĠĠĠ Ġfun Ġenable Auth () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . enable Auth () ĊĠĠĠĠĠĠĠ Ġconfig Servers . forEach Ġ{ Ġmongo Manager . enable Auth ( it , Ġkey File ) Ġ} ĊĠĠĠĠĠĠĠ Ġsh ards . forEach Ġ{ Ġrepl Set Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepl Set . nodes . forEach Ġ{ Ġmongo Manager . enable Auth ( it , Ġkey File ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmongo ses . forEach Ġ{ Ġmongo Manager . enable Auth ( it , Ġkey File ) Ġ} ĊĠĠĠ Ġ} Ċ */ ĊĠĠĠ Ġoverride Ġfun Ġconfigure ( update : ĠConfiguration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . configure ( update ) ĊĠĠĠĠĠĠĠ Ġsh ards . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . configure ( update ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmongo ses . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . configure ( update ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconfig Server . configure ( update ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Shards () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( shards . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Shard () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( replica Set Ġin Ġsh ards ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreplica Set . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Shard ( shard : ĠReplica Set Ġ= ĠReplica Set ( File ( cluster Root , Ġ" shard -${ shards . size } "), Ġ" shard -${ shards . size }", Ġallocator Ġ= Ġallocator )) Ġ{ ĊĠĠĠĠĠĠĠ Ġshard . configure ( configuration ) ĊĠĠĠĠĠĠĠ Ġshard . configure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsh arding Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcluster Role Ġ= Ġshard svr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig DB Ġ= Ġconfig Server . replica Set Url () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsh ards Ġ+= Ġshard ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Config Server () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! :: config Server . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Config Server () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconfig Server . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Config Server ( repl Set : ĠReplica Set Ġ= ĠReplica Set ( File ( cluster Root , Ġ" config server "), Ġ" config server ", Ġversion , Ġallocator Ġ= Ġallocator )) Ġ{ ĊĠĠĠĠĠĠĠ Ġrepl Set . configure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsh arding Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcluster Role Ġ= Ġconfig svr ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconfig Server Ġ= Ġrepl Set ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Mongo ses () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( mongo ses . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Mong os () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( mong os Ġin Ġmongo ses ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmong os . configure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsh arding Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig DB Ġ= Ġconfig Server . replica Set Url () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmong os . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Mong os ( config : ĠConfiguration Ġ= Ġconfiguration Ġ{ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġallocator . next () ĊĠĠĠĠĠĠĠ Ġval ĠnodeName Ġ= Ġ"$ name -$ port " ĊĠĠĠĠĠĠĠ Ġval Ġmong os Ġ= Ġmongo Manager . mong os ( File ( cluster Root , ĠnodeName ), ĠnodeName , Ġport ) ĊĠĠĠĠĠĠĠ Ġmong os . configure ( configuration ) ĊĠĠĠĠĠĠĠ Ġmong os . configure ( config ) ĊĠĠĠĠĠĠĠ Ġmongo ses Ġ+= Ġmong os ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride ĊĠĠĠ Ġfun Ġshutdown () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . shutdown () ĊĠĠĠĠĠĠĠ Ġmongo ses . forEach Ġ{ Ġit . shutdown () Ġ} ĊĠĠĠĠĠĠĠ Ġsh ards . forEach Ġ{ Ġit . shutdown () Ġ} ĊĠĠĠĠĠĠĠ Ġconfig Server . shutdown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Auth Enabled (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsh ards . map Ġ{ Ġit . is Auth Enabled () Ġ}. fold ( true ) Ġ{ Ġr , Ġt Ġ-> Ġr Ġ&& Ġt Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Server Address List (): ĠList < Server Address > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmongo ses . map Ġ{ Ġit . getServer Address () Ġ} ĊĠĠĠ Ġ} Ċ }