/* Ċ Ġ* ĠCopyright Ġ@ Ġ 2 0 1 8 Ġ- Ġpresent Ġ 8 x 8 , ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . j its i . video bridge . load _ management Ċ Ċ import Ġorg . j its i . config . J its i Config Ċ import Ġorg . j its i . met acon fig . config Ċ import Ġorg . j its i . met acon fig . from Ċ import Ġorg . j its i . nl j . util . NE VER Ċ import Ġorg . j its i . nl j . util . Ordered JsonObject Ċ import Ġorg . j its i . utils . logging 2 . c debug Ċ import Ġorg . j its i . utils . logging 2 . create Logger Ċ import Ġjava . time . Clock Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ import Ġjava . util . logging . Level Ċ Ċ class ĠJ vb Load Manager < T Ġ: ĠJ vb Load Measurement > Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġj vb Load Threshold : ĠT , ĊĠĠĠ Ġprivate Ġval Ġj vb Recovery Threshold : ĠT , ĊĠĠĠ Ġprivate Ġval Ġload Reducer : ĠJ vb Load Reducer , ĊĠĠĠ Ġprivate Ġval Ġclock : ĠClock Ġ= ĠClock . system UTC () Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= Ġcreate Logger ( min LogLevel Ġ= ĠLevel . ALL ) ĊĊĠĠĠ Ġval Ġreducer Enabled : ĠBoolean Ġby Ġconfig (" video bridge . load - management . reducer - enabled ". from ( J its i Config . new Config )) ĊĊĠĠĠ Ġprivate Ġvar Ġlast Reducer Time : ĠInstant Ġ= ĠNE VER ĊĊĠĠĠ Ġprivate Ġvar Ġstate : ĠState Ġ= ĠState . NOT _ OVER LOADED ĊĊĠĠĠ Ġprivate Ġvar Ġmost Recent Load Measurement : ĠT ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġload Update ( load Measurement : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . c debug Ġ{ Ġ" Got Ġa Ġload Ġmeasurement Ġof Ġ$ load Measurement " Ġ} ĊĠĠĠĠĠĠĠ Ġmost Recent Load Measurement Ġ= Ġload Measurement ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= Ġclock . instant () ĊĠĠĠĠĠĠĠ Ġif Ġ( load Measurement . get Load () Ġ>= Ġj vb Load Threshold . get Load ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . OVER LOADED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reducer Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Load Ġmeasurement Ġ$ load Measurement Ġis Ġabove Ġthreshold Ġof Ġ$ j vb Load Threshold ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( can Run Reducer ( now )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Running Ġload Ġreducer ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Reducer . reduce Load () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Reducer Time Ġ= Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Load Ġreducer Ġran Ġat Ġ$ last Reducer Time , Ġwhich Ġis Ġwithin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ load Reducer . impact Time ()} Ġof Ġnow , Ġnot Ġrunning Ġreduce " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . NOT _ OVER LOADED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reducer Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( load Measurement . get Load () Ġ< Ġj vb Recovery Threshold . get Load ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( can Run Reducer ( now )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( load Reducer . recover ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Recovery Ġran Ġafter Ġa Ġload Ġmeasurement Ġof Ġ$ load Measurement Ġ( which Ġwas Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" below Ġthreshold Ġof Ġ$ j vb Recovery Threshold ) Ġwas Ġreceived " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Reducer Time Ġ= Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . c debug Ġ{ Ġ" Recovery Ġhad Ġno Ġwork Ġto Ġdo " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . c debug Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Load Ġmeasurement Ġ$ load Measurement Ġis Ġbelow Ġrecovery Ġthreshold , Ġbut Ġload Ġreducer Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ran Ġat Ġ$ last Reducer Time , Ġwhich Ġis Ġwithin Ġ${ load Reducer . impact Time ()} Ġof Ġnow , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" not Ġrunning Ġrecover " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetCurrent St ress Level (): ĠDouble Ġ= ĊĠĠĠĠĠĠĠ Ġmost Recent Load Measurement ?. div ( j vb Load Threshold ) Ġ?: Ġ 0 . 0 ĊĊĠĠĠ Ġfun Ġget Stats () Ġ= ĠOrdered JsonObject (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġput (" state ", Ġstate . toString ()) ĊĠĠĠĠĠĠĠ Ġput (" stress ", ĠgetCurrent St ress Level (). toString ()) ĊĠĠĠĠĠĠĠ Ġput (" reducer _ enabled ", Ġreducer Enabled . toString ()) ĊĠĠĠĠĠĠĠ Ġput (" reducer ", Ġload Reducer . get Stats ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcan Run Reducer ( now : ĠInstant ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ ĠDuration . between ( last Reducer Time , Ġnow ) Ġ>= Ġload Reducer . impact Time () ĊĊĠĠĠ Ġenum Ġclass ĠState Ġ{ ĊĠĠĠĠĠĠĠ ĠOVER LOADED , ĊĠĠĠĠĠĠĠ ĠNOT _ OVER LOADED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaverage Participant St ress : ĠDouble Ġby Ġconfig Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" video bridge . load - management . average - participant - stress ". from ( J its i Config . new Config ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ