package Ġdb . f enn ec . ch ol la Ċ Ċ import Ġcom . google . common . collect . Immutable Set Ċ import Ġcom . google . common . f logger . Fluent Logger Ċ import Ġcom . google . common . util . concurrent . Rate Limiter Ċ import Ġdb . f enn ec . f ql . Key Ċ import Ġdb . f enn ec . gate keeper . Gate keeper Ċ import Ġdb . f enn ec . gate keeper . Local Gate keeper Ċ import Ġdb . f enn ec . kv . KV Ċ import Ġdb . f enn ec . common . Log Definition . Companion . config Ċ import Ġdb . f enn ec . proto . F Meta Proto Ċ Ċ class ĠCh ol la ( val Ġkv : ĠK V , Ġval Ġgate keeper : ĠGate keeper Ġ= ĠLocal Gate keeper ()) Ġ: ĠRunnable Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠ Ġrun With Status () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġrun With Status ( ns Whitelist : ĠSet < String > Ġ= Ġset Of ()): ĠCho Status Ġ{ ĊĠĠĠĠĠĠĠ ĠR ATE _ LIMITER . acquire () ĊĠĠĠĠĠĠĠ Ġif Ġ(! kv . isOpen ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkv . open () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnamespaces Ġ= Ġkv . list () ĊĊĠĠĠĠĠĠĠ Ġval Ġremoved Ġ= ĠImmutable Set . builder < Key >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( ns Ġin Ġnamespaces ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ns Whitelist . isEmpty () Ġ|| Ġ( ns Whitelist . isNotEmpty () Ġ&& Ġns Whitelist . contains ( ns ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess NS ( ns , Ġremoved ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠCho Status ( removed Ġ= Ġremoved . build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess NS ( ns : ĠString , Ġremoved : ĠImmutable Set . Builder < Key >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmeta Keys Ġ= ĠHashSet < String >() ĊĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġkv . keys ( ns ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġkeys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key . endsWith (" meta ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Keys . add ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( meta Keys . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( meta Key Ġin Ġmeta Keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcleanup Meta ( ns , Ġraw Meta Key Ġ= Ġmeta Key , Ġremoved Ġ= Ġremoved ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcleanup Meta ( ns : ĠString , Ġraw Meta Key : ĠString , Ġremoved : ĠImmutable Set . Builder < Key >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmeta Key Ġ= ĠKey ( ns Ġ= Ġns , Ġfield Ġ= Ġraw Meta Key ) ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġkv . get ( meta Key ) ĊĠĠĠĠĠĠĠ Ġval Ġmeta Proto Ġ= ĠF Meta Proto . parseFrom ( bytes ) ĊĠĠĠĠĠĠĠ Ġval Ġcolon Index Ġ= Ġraw Meta Key . indexOf (': ') ĊĠĠĠĠĠĠĠ Ġif Ġ( colon Index Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Prefix Ġ= Ġraw Meta Key . substring ( 0 , Ġcolon Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgate keeper . acquire ( field Prefix , Ġns ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiltered Suffix es Ġ= ĠArrayList < Long >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( suffix Ġin Ġmeta Proto . used Label Suffix List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġ"$ field Prefix :$ suffix " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbucket Bytes Ġ= Ġkv . get ( Key ( ns Ġ= Ġns , Ġfield Ġ= Ġfield )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bucket Bytes !!. isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠKey ( ns Ġ= Ġns , Ġfield Ġ= Ġfield ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremoved . add ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkv . remove ( Key ( ns Ġ= Ġns , Ġfield Ġ= Ġfield )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Suffix es . add ( suffix ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkv . put ( meta Key , Ġmeta Proto . to Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. clear Used Label Suffix () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAll Used Label Suffix ( filtered Suffix es ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġprivate Ġval Ġlog Ġ= ĠFluent Logger . for En closing Class (). config () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠR ATE _ LIMITER Ġ= ĠRate Limiter . create ( 1 . 0 Ġ/ Ġ( 6 0 Ġ* Ġ 6 0 )) ĊĠĠĠ Ġ} Ċ }