package Ġim . to ss . util . cache . impl Ċ Ċ import Ġim . to ss . util . cache .* Ċ import Ġim . to ss . util . cache . metrics . Cache Meter Ċ import Ġim . to ss . util . cache . metrics . Cache Metrics Ċ import Ġim . to ss . util . concurrent . lock . Mutex Lock Ċ import Ġim . to ss . util . concurrent . lock . run Or Retry Ċ import Ġim . to ss . util . coroutine . run WithTimeout Ċ import Ġim . to ss . util . data . serializer . Serializer Ċ import Ġim . to ss . util . reflection . Type Digest Ċ import Ġim . to ss . util . repository . Key FieldValue Repository Ċ import Ġkotlinx . coroutines . Timeout Cancellation Exception Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġmu . Kotlin Logging Ċ import Ġjava . lang . reflect . Type Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} Ċ Ċ data Ġclass ĠMulti Field Cache Impl < TKey : ĠAny >( ĊĠĠĠ Ġoverride Ġval Ġname : ĠString , ĊĠĠĠ Ġval Ġkey Function : ĠCache . Key Function , ĊĠĠĠ Ġval Ġlock : ĠMutex Lock , ĊĠĠĠ Ġval Ġrepository : ĠKey FieldValue Repository , ĊĠĠĠ Ġval Ġserializer : ĠSerializer , ĊĠĠĠ Ġval Ġcontext : ĠCor outine Context ?, ĊĠĠĠ Ġoverride Ġval Ġoptions : ĠCache Options , ĊĠĠĠ Ġprivate Ġval Ġmetrics : ĠCache Metrics Ġ= ĠCache Metrics ( name ), ĊĠĠĠ Ġprivate Ġval ĠtypeName : ĠString Ġ= Ġ" Multi Field Cache " Ċ ) Ġ: ĠCache , ĠCache Meter Ġby Ġmetrics , ĠMulti Field Cache < TKey >() Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtype Digest : ĠType Digest Ġ= ĠType Digest ( ĊĠĠĠĠĠĠĠ Ġenvironments Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" serializer . name " Ġto Ġserializer . name ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġkeys Ġ= ĠKeys < TKey >( name , Ġkey Function , Ġoptions , Ġtype Digest ) ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġ< T > Ġrun WithContext ( context : ĠCor outine Context ?, Ġblock : Ġsuspend Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( context Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġev ict ( key : ĠTKey ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun WithContext ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . increment Ev ict Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Col d Time ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Modified ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . delete ( keys . key ( key )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< T : ĠAny > Ġload ( key : ĠTKey , Ġfield : ĠString , Ġforce Load : ĠBoolean , Ġtype : ĠType ?, Ġfetch : Ġ( suspend Ġ() Ġ-> ĠT )) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun WithContext ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun WithTimeout ( options . operation Timeout . to Millis ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . cache Mode Ġ== ĠCache Mode . E VI CTION _ ONLY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġev ict ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Or Retry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( force Load Ġ|| Ġ! is Col d Time ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload To Cache ( key , Ġfield , Ġtype , Ġfetch ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . cache Failure Policy . handle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ typeName . load (): Ġexception Ġoccured Ġon Ġload : Ġcache =$ name , Ġkey =$ key , Ġfield =$ field ", Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġ< T : ĠAny > Ġload To Cache ( key : ĠTKey , Ġfield : ĠString , Ġtype : ĠType ?, Ġfetch : Ġ( suspend Ġ() Ġ-> ĠT )): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlock Ġ= Ġlock For Load < T >( key , Ġfield , Ġtype ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġfetch () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . load ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . release () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Throws ( Mutex Lock . Failed Acquire Exception :: class ) ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< T : ĠAny > Ġlock For Load ( ĊĠĠĠĠĠĠĠ Ġkey : ĠTKey , ĊĠĠĠĠĠĠĠ Ġfield : ĠString , ĊĠĠĠĠĠĠĠ Ġtype : ĠType ?, ĊĠĠĠĠĠĠĠ Ġtimeout : ĠLong ĊĠĠĠ Ġ): ĠCache Value Loader < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( options . enable P ess im istic Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp ess im istic Lock For Load ( key , Ġfield , Ġtype , Ġtimeout ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbasic Lock For Load ( key , Ġfield , Ġtype ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< T : ĠAny > Ġp ess im istic Lock For Load ( key : ĠTKey , Ġfield : ĠString , Ġtype : ĠType ?, Ġtimeout : ĠLong ): ĠCache Value Loader < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! options . enable P ess im istic Lock ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Support P ess im istic Lock Exception () ĊĊĠĠĠĠĠĠĠ Ġval Ġlock Key Ġ= Ġkeys . fetch Key ( key , Ġfield ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! lock . acquire ( lock Key , Ġtimeout )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠMutex Lock . Failed Acquire Exception ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠP ess im istic Key Field Cache Value Loader ( key , Ġfield , Ġtype , Ġacquire New Version ( key , Ġfield ), Ġlock Key ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< T : ĠAny > Ġoptim istic Lock For Load ( key : ĠTKey , Ġfield : ĠString , Ġtype : ĠType ?): ĠCache Value Loader < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! options . enable Optim istic Lock ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Support Optim istic Lock Exception () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbasic Lock For Load ( key , Ġfield , Ġtype ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġ< T : ĠAny > Ġbasic Lock For Load ( key : ĠTKey , Ġfield : ĠString , Ġtype : ĠType ?): ĠCache Value Loader < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBasic Key Field Cache Value Loader ( key , Ġfield , Ġtype , Ġacquire New Version ( key , Ġfield )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġ< T : Any > Ġcompare And Load ( key : ĠTKey , Ġfield : ĠString , Ġversion : ĠLong , Ġtype : ĠType ?, Ġvalue : ĠT ): ĠLoad Result < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( compare And Acquire ( key , Ġfield , Ġversion )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Bytes Ġ= Ġserializer . serialize ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . set ( keys . key ( key ), Ġkeys . field ( field , Ġtype ), Ġdata Bytes , Ġoptions . ttl . to Millis (), ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . increment Put Count () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Result ( value ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . delete ( keys . key ( key ), Ġkeys . field ( field , Ġtype )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" optim istic Ġlock Ġfailure Ġoccured Ġon Ġload , Ġpur ged Ġcached Ġdata . Ġcache =$ name , Ġkey =$ key , Ġfield =$ field ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Result ( value , Ġsuccess Ġ= Ġfalse , Ġis Optim istic Lock Failure Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠP ess im istic Key Field Cache Value Loader < T : ĠAny >( ĊĠĠĠĠĠĠĠ Ġval Ġkey : ĠTKey , ĊĠĠĠĠĠĠĠ Ġval Ġfield : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġtype : ĠType ?, ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġversion : ĠLong , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlock Key : ĠString ĊĠĠĠ Ġ): ĠCache Value Loader < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġloaded Ġ= ĠAtomic Boolean ( false ) ĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( value : ĠT ): ĠLoad Result < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( loaded . compare AndSet ( false , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompare And Load ( key , Ġfield , Ġversion , Ġtype , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock . release ( lock Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAlready Loaded Exception () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( loaded . compare AndSet ( false , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock . release ( lock Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠBasic Key Field Cache Value Loader < T : ĠAny >( ĊĠĠĠĠĠĠĠ Ġval Ġkey : ĠTKey , ĊĠĠĠĠĠĠĠ Ġval Ġfield : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġtype : ĠType ?, ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġversion : ĠLong ĊĠĠĠ Ġ): ĠCache Value Loader < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġloaded Ġ= ĠAtomic Boolean ( false ) ĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( value : ĠT ): ĠLoad Result < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( loaded . compare AndSet ( false , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcompare And Load ( key , Ġfield , Ġversion , Ġtype , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAlready Loaded Exception () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġrelease () Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< T : ĠAny > Ġget ( key : ĠTKey , Ġfield : ĠString , Ġtype : ĠType ?): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( options . cache Mode Ġ== ĠCache Mode . E VI CTION _ ONLY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrun WithContext ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run WithContext Ġrun WithTimeout ( options . operation Timeout . to Millis ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġcached Ġ= Ġread From Cache < T >( key , Ġfield , Ġtype )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . increment Miss Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . increment Hit Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . is Apply T tl If Hit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . expire ( keys . key ( key ), Ġoptions . ttl . to Millis (), ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠTimeout Cancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . cache Failure Policy . handle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ typeName . get (): Ġtimeout Ġoccured Ġon Ġread Ġfrom Ġcache : Ġcache =$ name , Ġkey =$ key , Ġfield =$ field ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . cache Failure Policy . handle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ typeName . get (): Ġexception Ġoccured Ġon Ġread Ġfrom Ġcache : Ġcache =$ name , Ġkey =$ key , Ġfield =$ field ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . increment Miss Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< T : ĠAny > Ġget Or Load ( key : ĠTKey , Ġfield : ĠString , Ġtype : ĠType ?, Ġfetch : Ġ( suspend Ġ() Ġ-> ĠT )): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun WithContext ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . cache Mode Ġ== ĠCache Mode . E VI CTION _ ONLY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . increment Miss Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run WithContext Ġfetch () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run WithContext Ġrun WithTimeout ( options . operation Timeout . to Millis ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Or Retry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġcached Ġ= Ġread From Cache < T >( key , Ġfield , Ġtype )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġif Ġ( is Col d Time ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . increment Miss Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfetch () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġload To Cache ( key , Ġfield , Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . increment Miss Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfetch () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . increment Hit Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . is Apply T tl If Hit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . expire ( keys . key ( key ), Ġoptions . ttl . to Millis (), ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠTimeout Cancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . cache Failure Policy . handle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ typeName . get Or Load (): Ġtimeout Ġoccured Ġon Ġread Ġfrom Ġcache : Ġcache =$ name , Ġkey =$ key , Ġfield =$ field ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . cache Failure Policy . handle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ typeName . get Or Load (): Ġexception Ġoccured Ġon Ġread Ġfrom Ġcache : Ġcache =$ name , Ġkey =$ key , Ġfield =$ field ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . increment Miss Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfetch () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< T : ĠAny > Ġget Or Lock For Load ( key : ĠTKey , Ġfield : ĠString , Ġtype : ĠType ?): ĠResult Get Or Lock For Load < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun WithContext ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . cache Mode Ġ== ĠCache Mode . E VI CTION _ ONLY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . increment Miss Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run WithContext ĠResult Get Or Lock For Load () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run WithContext Ġrun WithTimeout ( options . operation Timeout . to Millis ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Or Retry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġcached Ġ= Ġread From Cache < T >( key , Ġfield , Ġtype )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġif Ġ( is Col d Time ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . increment Miss Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult Get Or Lock For Load () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . increment Miss Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult Get Or Lock For Load ( loader Ġ= Ġlock For Load ( key , Ġfield , Ġtype )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . increment Hit Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . is Apply T tl If Hit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . expire ( keys . key ( key ), Ġoptions . ttl . to Millis (), ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult Get Or Lock For Load ( cached ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠTimeout Cancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . cache Failure Policy . handle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ typeName . get Or Lock For Load (): Ġtimeout Ġoccured Ġon Ġread Ġfrom Ġcache : Ġcache =$ name , Ġkey =$ key , Ġfield =$ field ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . cache Failure Policy . handle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ typeName . get Or Lock For Load (): Ġexception Ġoccured Ġon Ġread Ġfrom Ġcache : Ġcache =$ name , Ġkey =$ key , Ġfield =$ field ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . increment Miss Count () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult Get Or Lock For Load () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġ< T > Ġread From Cache ( key : ĠTKey , Ġfield : ĠString , Ġtype : ĠType ?): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcached Data Ġ= Ġrepository . get ( keys . key ( key ), Ġkeys . field ( field , Ġtype )) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( cached Data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserializer . deserialize < T >( cached Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠKeys < K Ġ: ĠAny >( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġkey Function : ĠCache . Key Function , ĊĠĠĠĠĠĠĠ Ġval Ġoptions : ĠCache Options , ĊĠĠĠĠĠĠĠ Ġval Ġdigest : ĠType Digest ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġkey ( key : ĠK ): ĠString Ġ= Ġkey Function . function ( name , Ġkey ) ĊĠĠĠĠĠĠĠ Ġfun Ġfield ( field : ĠString , Ġtype : ĠType ?): ĠString Ġ= Ġif Ġ( options . is olation ByType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ field | ${ options . version }| ${ digest . digest ( type )}" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ field | ${ options . version }" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġlock ( key : ĠK , Ġpostfix : ĠString ): ĠString Ġ= Ġ"${ key ( key )} |$ postfix " ĊĠĠĠĠĠĠĠ Ġfun Ġcold ( key : ĠK ) Ġ= Ġlock ( key , Ġ"@ COL D ") ĊĠĠĠĠĠĠĠ Ġfun Ġfetch Key ( key : ĠK , Ġfield : ĠString ) Ġ= Ġlock ( key , Ġ"$ field @ FETCH ") ĊĠĠĠĠĠĠĠ Ġfun Ġoptim istic Lock ( key : ĠK ) Ġ= Ġlock ( key , Ġ"@ NOTE VI CT ") ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġuse Col d Time (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġoptions . cold Time . to Millis () Ġ> Ġ 0 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġset Col d Time ( key : ĠTKey ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( use Col d Time ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . acquire ( keys . cold ( key ), Ġoptions . cold Time . to Millis (), ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġis Col d Time ( key : ĠTKey ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( use Col d Time ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlock . is Acquire d ( keys . cold ( key )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġset Modified ( key : ĠTKey ) Ġ= Ġrepository . delete ( keys . optim istic Lock ( key )) ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġacquire New Version ( key : ĠTKey , Ġfield : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( options . enable Optim istic Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . incr By ( keys . optim istic Lock ( key ), Ġfield , Ġ 1 , Ġoptions . lock Timeout . to Millis (), ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 L ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcompare And Acquire ( key : ĠTKey , Ġfield : ĠString , Ġversion : ĠLong ) Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( options . enable Optim istic Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ== Ġacquire New Version ( key , Ġfield ) Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ