package Ġio . github . alex and rep iv ete au . echo Ċ Ċ import Ġio . github . alex and rep iv ete au . echo . core . ca us ality . Event Identifier Ċ import Ġio . github . alex and rep iv ete au . echo . core . ca us ality . SequenceNumber Ċ import Ġio . github . alex and rep iv ete au . echo . core . ca us ality . Site Identifier Ċ import Ġio . github . alex and rep iv ete au . echo . core . ca us ality . next Site Identifier Ċ import Ġio . github . alex and rep iv ete au . echo . demo . counter . PN Counter Event Ċ import Ġio . github . alex and rep iv ete au . echo . demo . counter . PN Projection Ċ import Ġio . github . alex and rep iv ete au . echo . projection s . One Way Projection Ċ import Ġio . github . alex and rep iv ete au . echo . sync . Sync Strategy . Companion . Once Ċ import Ġkotlin . math . round ToInt Ċ import Ġkotlin . random . Random Ċ import Ġkotlin . test . Ignore Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . time . measure Time Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . test . run Test Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ class ĠScal ability Test Ġ{ ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠA Ġ[ One Way Projection ] Ġthat Ġsimply Ġtakes Ġthe Ġlast Ġvalue . ĠThe Ġoperation Ġis Ġcom mut ative , Ġide mpot ent ĊĠĠ Ġ* Ġand Ġassoci ative . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġclass ĠL WW Projection < T > Ġ: ĠOne Way Projection < Pair < Event Identifier , ĠT >, ĠT > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġforward ( ĊĠĠĠĠĠĠĠ Ġmodel : ĠPair < Event Identifier , ĠT >, ĊĠĠĠĠĠĠĠ Ġidentifier : ĠEvent Identifier , ĊĠĠĠĠĠĠĠ Ġevent : ĠT ĊĠĠĠ Ġ): ĠPair < Event Identifier , ĠT > Ġ{ ĊĠĠĠĠĠ Ġval Ġ( id , Ġdata ) Ġ= Ġmodel ĊĠĠĠĠĠ Ġreturn Ġif Ġ( identifier Ġ>= Ġid ) Ġidentifier Ġto Ġevent Ġelse Ġid Ġto Ġdata ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// ĠTODO Ġ: ĠSee Ġhow Ġwe Ġmay Ġdiscard Ġir relevant Ġoperations . ĊĊĠ Ġ@ Ignore ĊĠ Ġ@ Test ĊĠ Ġfun Ġtest Scal ability () Ġ= Ġrun Test Ġ{ ĊĠĠĠ Ġval Ġsites Ġ= Ġ 1 0 0 ĊĠĠĠ Ġval Ġops Ġ= Ġ 1 0 0 0 ĊĠĠĠ Ġval Ġprojection Ġ= ĠL WW Projection < Int >() ĊĠĠĠ Ġval Ġinitial Ġ= ĠEvent Identifier ( SequenceNumber . Min , ĠSite Identifier . Min ) Ġto Ġ 0 ĊĊĠĠĠ Ġ// ĠMe as ured Ġperformance Ġ- ĠStandard Ġlog Ġ( immutable ) Ġ: Ġup Ġto ĠĠĠĠĠĠĠĠĠ 4 9 ' 9 9 9 Ġop - site / sec . ĊĠĠĠ Ġ// ĠMe as ured Ġperformance Ġ- ĠCustom Ġlog ĠĠ Ġ( immutable ) Ġ: Ġmore Ġthan ĠĠ 1 ' 0 0 0 ' 0 0 0 Ġop - site / sec . ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠOf Ġcourse , Ġthe Ġhuge Ġperformance Ġboost Ġcomes Ġfrom Ġskipped Ġoperations Ġfrom Ġthe Ġprimary , Ġwhich ĊĠĠĠ Ġ// Ġdoes Ġnot Ġhave Ġto Ġdeliver Ġintermediate Ġlog Ġvalues Ġto Ġthe Ġreplica . ĊĊĠĠĠ Ġval Ġduration Ġ= Ġmeasure Time Ġ{ ĊĠĠĠĠĠ Ġwith Context ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprimary Ġ= Ġmutable Site ( Random . next Site Identifier (), Ġinitial , Ġprojection Ġ= Ġprojection ) ĊĠĠĠĠĠĠĠ Ġval Ġdone Ġ= ĠChannel < Site Identifier >() ĊĊĠĠĠĠĠĠĠ Ġrepeat ( sites ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠRandom . next Site Identifier () ĊĠĠĠĠĠĠĠĠĠ Ġval Ġreplica Ġ= Ġmutable Site ( id , Ġinitial , Ġprojection Ġ= Ġprojection ) ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġsync Job Ġ= Ġlaunch Ġ{ Ġsync ( replica , Ġprimary ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreplica . first Ġ{ Ġ(_, Ġit ) Ġ-> Ġit Ġ== Ġ 1 0 0 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Job . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdone . send ( id ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrepeat ( ops ) Ġ{ Ġprimary . event Ġ{ Ġyield ( 1 0 0 0 ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġprimary . event Ġ{ Ġyield ( 1 0 0 1 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe 're Ġdone Ġreplic ating Ġthe Ġevents Ġeverywhere . ĊĠĠĠĠĠĠĠ Ġrepeat ( sites ) Ġ{ Ġdone . receive () Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġspeed Ġ= Ġ( sites Ġ* Ġops Ġ* Ġ 1 0 0 0 . 0 ) Ġ/ Ġ( duration . in Whole Milliseconds ) ĊĠĠĠ Ġprintln (" T ook Ġ${ duration . in Whole Milliseconds } Ġms , Ġat Ġ${ speed . round ToInt ()} Ġops - site / sec .") ĊĠ Ġ} ĊĊĠ Ġ@ Ignore ĊĠ Ġ@ Test ĊĠ Ġfun Ġcompare Mutable History To Exchange () Ġ= Ġrun Test Ġ{ ĊĠĠĠ Ġval Ġops Ġ= Ġ 1 0 0 _ 0 0 0 ĊĠĠĠ Ġval Ġprimary Ġ= Ġmutable Site ( Site Identifier . Min , Ġ 0 , ĠP N Projection , Ġstrategy Ġ= ĠOnce ) ĊĠĠĠ Ġrepeat ( ops ) Ġ{ Ġprimary . event Ġ{ Ġyield ( PN Counter Event . Increment ) Ġ} Ġ} ĊĊĠĠĠ Ġval Ġhistory Ġ= Ġmutable Site ( Site Identifier . Max , Ġ 0 , ĠP N Projection ) ĊĠĠĠ Ġval Ġexchange Ġ= Ġexchange () ĊĊĠĠĠ Ġval Ġhistory Duration Ġ= Ġmeasure Time Ġ{ Ġsync ( primary , Ġhistory ) Ġ} ĊĠĠĠ Ġval Ġexchange Duration Ġ= Ġmeasure Time Ġ{ Ġsync ( primary , Ġexchange ) Ġ} ĊĠĠĠ Ġval Ġspeed Ġ= ĊĠĠĠĠĠĠĠ Ġ(( history Duration . in Whole Milliseconds . toFloat () Ġ/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexchange Duration . in Whole Milliseconds . toFloat ()) Ġ* Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. round ToInt () ĊĠĠĠ Ġval Ġhistory Ops Ġ= Ġops Ġ* Ġ 1 0 0 0 . 0 Ġ/ Ġhistory Duration . in Whole Milliseconds ĊĠĠĠ Ġval Ġexchange Ops Ġ= Ġops Ġ* Ġ 1 0 0 0 . 0 Ġ/ Ġexchange Duration . in Whole Milliseconds ĊĊĠĠĠ Ġ// ĠMe as ured Ġperformance Ġ( history ) Ġ Ġ: ĠĠĠĠĠĠĠ 2 5 ' 0 0 0 Ġops / sec ĊĠĠĠ Ġ// ĠMe as ured Ġperformance Ġ( exchange ) Ġ: ĠĠĠĠĠĠĠ 3 5 ' 0 0 0 Ġops / sec Ġ( 1 2 5 % Ġ- Ġ 1 5 0 %) ĊĠĠĠ Ġprintln (" T ook Ġ${ history Duration . in Whole Milliseconds } Ġms Ġfor Ġhistory , Ġat Ġ$ history Ops Ġops / sec .") ĊĠĠĠ Ġprintln ( ĊĠĠĠĠĠĠĠ Ġ" T ook Ġ${ exchange Duration . in Whole Milliseconds } Ġms Ġfor Ġexchange Ġ( speed Ġ${ speed }% ), Ġat Ġ$ exchange Ops Ġops / sec .") ĊĠ Ġ} Ċ } Ċ