/* Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ* Ċ Ġ* ĠThe ĠOpen Search ĠContributors Ġrequire Ġcontributions Ġmade Ġto Ċ Ġ* Ġthis Ġfile Ġbe Ġlicensed Ġunder Ġthe ĠApache - 2 . 0 Ġlicense Ġor Ġa Ċ Ġ* Ġcompatible Ġopen Ġsource Ġlicense . Ċ Ġ* Ċ Ġ* ĠMod ifications ĠCopyright ĠOpen Search ĠContributors . ĠSee Ċ Ġ* ĠGitHub Ġhistory Ġfor Ġdetails . Ċ Ġ*/ Ċ package Ġorg . opense arch . index . trans log Ċ Ċ import Ġorg . apache . lucene . store . ByteArray Data Output Ċ import Ġorg . hamcrest . Matchers . equalTo Ċ import Ġorg . mockito . Mockito Ċ import Ġorg . opense arch . common . UUID s Ċ import Ġorg . opense arch . common . bytes . Bytes Array Ċ import Ġorg . opense arch . common . bytes . Re le as able Bytes Reference Ċ import Ġorg . opense arch . common . collect . Tuple Ċ import Ġorg . opense arch . common . util . Big Arrays Ċ import Ġorg . opense arch . core . internal . io . IO Utils Ċ import Ġorg . opense arch . index . seq no . Retention Lease Ċ import Ġorg . opense arch . index . seq no . Retention Le ases Ċ import Ġorg . opense arch . index . shard . Shard Id Ċ import Ġorg . opense arch . test . Open Search TestCase Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . channels . File Channel Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Open Option Ċ import Ġjava . nio . file . Path Ċ import Ġjava . util .* Ċ import Ġjava . util . function . Supplier ĊĊ Ċ class ĠRep lication Trans log Deletion Policy Tests Ġ: ĠOpen Search TestCase () Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTOT AL _ OPS _ IN _ GEN Ġ= Ġ 1 0 L ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġtest With Retention Lease () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġreaders And Writer : ĠTuple < Mutable List < Trans log Reader >, ĠTrans log Writer ?> Ġ= Ġcreate Read ers And Writer ( now ) ĊĠĠĠĠĠĠĠ Ġval Ġall G ens : ĠMutable List < Base Trans log Reader > Ġ= ĠArrayList ( readers And Writer . v 1 ()) ĊĠĠĠĠĠĠĠ Ġreaders And Writer . v 2 ()?. let Ġ{ Ġall G ens . add ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġretention Le ases Supplier : ĠSupplier < Retention Le ases > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Retention Le ases ( now , Ġ 0 L , Ġall G ens . size Ġ* ĠTOT AL _ OPS _ IN _ GEN Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminimum Ret aining SequenceNumber : ĠLong Ġ= Ġretention Le ases Supplier . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. lease s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map To Long Ġ{ Ġobj : ĠRet ention Lease Ġ-> Ġobj . ret aining SequenceNumber () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. min () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse ( Long . MAX _ VALUE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Reader : ĠLong Ġ= Ġminimum Ret aining SequenceNumber Ġ/ ĠTOT AL _ OPS _ IN _ GEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Gen Ġ= Ġall G ens [ selected Reader . toInt ()]. generation ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreaders And Writer . v 2 ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRep lication Trans log Deletion Policy . getMin Trans log Gen By Retention Lease ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreaders And Writer . v 1 (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretention Le ases Supplier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠequalTo ( selected Gen ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO Utils . close ( readers And Writer . v 1 ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO Utils . close ( readers And Writer . v 2 ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġtest By Size And Retention Lease () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġreaders And Writer : ĠTuple < Mutable List < Trans log Reader >, ĠTrans log Writer ?> Ġ= Ġcreate Read ers And Writer ( now ) ĊĠĠĠĠĠĠĠ Ġval Ġall G ens : ĠMutable List < Base Trans log Reader > Ġ= ĠArrayList ( readers And Writer . v 1 ()) ĊĠĠĠĠĠĠĠ Ġreaders And Writer . v 2 ()?. let Ġ{ Ġall G ens . add ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Reader Ġ= Ġrandom Int Between ( 0 , Ġall G ens . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Generation Ġ= Ġall G ens [ selected Reader ]. generation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRet aining Ġseq no Ġis Ġpart Ġof Ġlower Ġgen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall G ens . stream (). skip ( selected Reader . to Long ()). map Ġ{ Ġobj : ĠBase Trans log Reader Ġ-> Ġobj . size InBytes () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reduce Ġ{ Ġa : ĠLong , Ġb : ĠLong Ġ-> Ġjava . lang . Long . sum ( a , Ġb ) Ġ}. get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġretention Le ases Supplier : ĠSupplier < Retention Le ases > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Retention Le ases ( now , Ġ 0 L , Ġselected Generation Ġ* ĠTOT AL _ OPS _ IN _ GEN Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreaders And Writer . v 2 ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRep lication Trans log Deletion Policy . min Trans log Gen Required ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreaders And Writer . v 1 (), Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt . MAX _ VALUE . to Long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt . MAX _ VALUE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt . MAX _ VALUE . to Long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretention Le ases Supplier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠequalTo ( selected Generation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTrans log Deletion Policy . getMin Trans log Gen By Age ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreaders And Writer . v 1 (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreaders And Writer . v 2 (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 0 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠequalTo ( readers And Writer . v 2 ()?. generation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRet ention Ġlease Ġis Ġpart Ġof Ġhigher Ġgen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretention Le ases Supplier Ġ= Ġcreate Retention Le ases ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnow , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Generation Ġ* ĠTOT AL _ OPS _ IN _ GEN , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall G ens . size Ġ* ĠTOT AL _ OPS _ IN _ GEN Ġ+ ĠTOT AL _ OPS _ IN _ GEN Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreaders And Writer . v 2 ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRep lication Trans log Deletion Policy . min Trans log Gen Required ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreaders And Writer . v 1 (), Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLong . MIN _ VALUE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt . MAX _ VALUE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLong . MAX _ VALUE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretention Le ases Supplier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠequalTo ( selected Generation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO Utils . close ( readers And Writer . v 1 ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO Utils . close ( readers And Writer . v 2 ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcreate Retention Le ases ( now : ĠLong , Ġlowest Seq No : ĠLong , Ġhighest Seq No : ĠLong ): ĠSupplier < Retention Le ases > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġle ases Ġ= ĠLinkedList < Retention Lease >() ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Le ases Ġ= Ġrandom Int Between ( 1 , Ġ 5 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠnumberOf Le ases ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseq No Ġ= Ġrandom Long Between ( lowest Seq No , Ġhighest Seq No ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġle ases . add ( Retention Lease (" test _$ i ", Ġseq No , Ġnow Ġ- Ġ( numberOf Le ases Ġ- Ġi ) Ġ* Ġ 1 0 0 0 , Ġ" test ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠSupplier Ġ{ ĠRet ention Le ases ( 1 L , Ġ 1 L , Ġle ases ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcreate Read ers And Writer ( now : ĠLong ): ĠTuple < Mutable List < Trans log Reader >, ĠTrans log Writer ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemp Dir : ĠPath Ġ= Ġcreate TempDir () ĊĠĠĠĠĠĠĠ ĠFiles . create File ( temp Dir . resolve ( Trans log . CHECK POINT _ FILE _ NAME )) ĊĠĠĠĠĠĠĠ Ġvar Ġwriter : ĠTrans log Writer ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġreaders : ĠMutable List < Trans log Reader > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Read ers Ġ= Ġrandom Int Between ( 0 , Ġ 1 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġtrans log UUID Ġ= ĠUUID s . random Base 6 4 UUID ( random ()) ĊĠĠĠĠĠĠĠ Ġfor Ġ( gen Ġin Ġ 1 .. numberOf Read ers Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( writer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠMockito . spy ( writer . close Into Reader ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . do Return ( writer . lastModified Time ). ` when `( reader ). lastModified Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreaders . add ( reader ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter Ġ= ĠTrans log Writer . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSh ard Id (" index ", Ġ" uuid ", Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrans log UUID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgen . to Long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Dir . resolve ( Trans log . get Filename ( gen . to Long ())), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġpath : ĠPath , Ġoptions : ĠArray < Open Option > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Channel . open ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* options ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTrans log Config . DEFAULT _ BUFFER _ SIZE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ 1 L Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ 1 L Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrandom Non Negative Long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTr agic Exception Holder (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBig Arrays . NON _ REC Y CL ING _ INSTANCE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter Ġ= ĠMockito . spy ( writer ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMockito . do Return ( now Ġ- Ġ( numberOf Read ers Ġ- Ġgen Ġ+ Ġ 1 ) Ġ* Ġ 1 0 0 0 ). ` when `( writer ). lastModified Time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠByteArray ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠByteArray Data Output ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Seq No : ĠLong Ġ= Ġ( gen Ġ- Ġ 1 ) Ġ* ĠTOT AL _ OPS _ IN _ GEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Seq No : ĠLong Ġ= Ġstart Seq No Ġ+ ĠTOT AL _ OPS _ IN _ GEN Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( ops Ġin Ġend Seq No Ġdown To Ġstart Seq No ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . reset ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . writeInt ( ops . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . add ( Re le as able Bytes Reference . wrap ( Bytes Array ( bytes )), Ġops ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠTuple ( readers , Ġwriter ) ĊĠĠĠ Ġ} Ċ }