/* Ċ Ġ* Ġ ĠCopyright Ġ 2 0 1 8 Ġa coder 2 0 1 3 Ċ Ġ* Ċ Ġ* Ġ Ġ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 . Ċ Ġ*/ Ċ Ċ // ĠCopyright Ġ 2 0 1 5 ĠThe Ġetcd ĠAuthors Ċ // Ċ // Ġ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 Ġcom . song . y ama . raft Ċ Ċ import Ġcom . song . y ama . raft . exception . Raft Exception Ċ Ċ /** Ċ Ġ* ĠProgress Ġrepresents Ġa Ġfollow er âĢĻ s Ġprogress Ġin Ġthe Ġview Ġof Ġthe Ġleader . ĠLeader Ġmaintains Ġprog resses Ġof Ġall Ġfollow ers , Ċ Ġ* Ġand Ġsends Ġentries Ġto Ġthe Ġfollow er Ġbased Ġon Ġits Ġprogress . Ċ Ġ*/ Ċ class ĠProgress Ġ{ ĊĊĠĠĠ Ġvar Ġmatch : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġvar Ġnext : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠState Ġdefines Ġhow Ġthe Ġleader Ġshould Ġinteract Ġwith Ġthe Ġfollow er . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhen Ġin ĠProgress State Probe , Ġleader Ġsends Ġat Ġmost Ġone Ġreplication Ġmessage Ġper Ġheartbeat Ġinterval . ĠIt Ġalso Ġprob es ĊĠĠĠĠ Ġ* Ġactual Ġprogress Ġof Ġthe Ġfollow er . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhen Ġin ĠProgress State Replic ate , Ġleader Ġoptim istic ally Ġincreases Ġnext Ġto Ġthe Ġlatest Ġentry Ġsent Ġafter Ġsending ĊĠĠĠĠ Ġ* Ġreplication Ġmessage . ĠThis Ġis Ġan Ġoptimized Ġstate Ġfor Ġfast Ġreplic ating Ġlog Ġentries Ġto Ġthe Ġfollow er . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhen Ġin ĠProgress State Snapshot , Ġleader Ġshould Ġhave Ġsent Ġout Ġsnapshot Ġbefore Ġand Ġstops Ġsending Ġany Ġreplication ĊĠĠĠĠ Ġ* Ġmessage . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġstate : ĠProgress State Type Ġ= ĠProgress State Type . Progress State Probe ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPause d Ġis Ġused Ġin ĠProgress State Probe . ĠWhen ĠPause d Ġis Ġtrue , Ġra ft Ġshould Ġpause Ġsending Ġreplication Ġmessage Ġto Ġthis ĊĠĠĠĠ Ġ* Ġpeer . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġpaused : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPending Snapshot Ġis Ġused Ġin ĠProgress State Snapshot . ĠIf Ġthere Ġis Ġa Ġpending Ġsnapshot , Ġthe Ġpending Snapshot Ġwill Ġbe Ġset ĊĠĠĠĠ Ġ* Ġto Ġthe Ġindex Ġof Ġthe Ġsnapshot . ĠIf Ġpending Snapshot Ġis Ġset , Ġthe Ġreplication Ġprocess Ġof Ġthis ĠProgress Ġwill Ġbe Ġpaused . ĊĠĠĠĠ Ġ* Ġra ft Ġwill Ġnot Ġres end Ġsnapshot Ġuntil Ġthe Ġpending Ġone Ġis Ġreported Ġto Ġbe Ġfailed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġpending Snapshot : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRecent Active Ġis Ġtrue Ġif Ġthe Ġprogress Ġis Ġrecently Ġactive . ĠRe ceiving Ġany Ġmessages Ġfrom Ġthe Ġcorresponding Ġfollow er ĊĠĠĠĠ Ġ* Ġindicates Ġthe Ġprogress Ġis Ġactive . ĠRecent Active Ġcan Ġbe Ġreset Ġto Ġfalse Ġafter Ġan Ġelection Ġtimeout . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġis Recent Active : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġinfl ights Ġis Ġa Ġsl iding Ġwindow Ġfor Ġthe Ġin flight Ġmessages . ĠEach Ġin flight Ġmessage Ġcontains Ġone Ġor Ġmore Ġlog Ġentries . ĊĠĠĠĠ Ġ* ĠThe Ġmax Ġnumber Ġof Ġentries Ġper Ġmessage Ġis Ġdefined Ġin Ġra ft Ġconfig Ġas ĠMax Size Per Msg . ĠThus Ġin flight Ġeffectively ĊĠĠĠĠ Ġ* Ġlimits Ġboth Ġthe Ġnumber Ġof Ġin flight Ġmessages Ġand Ġthe Ġbandwidth Ġeach ĠProgress Ġcan Ġuse . ĠWhen Ġinfl ights Ġis Ġfull , Ġno ĊĠĠĠĠ Ġ* Ġmore Ġmessage Ġshould Ġbe Ġsent . ĠWhen Ġa Ġleader Ġsends Ġout Ġa Ġmessage , Ġthe Ġindex Ġof Ġthe Ġlast Ġentry Ġshould Ġbe Ġadded Ġto ĊĠĠĠĠ Ġ* Ġinfl ights . ĠThe Ġindex ĠMUST Ġbe Ġadded Ġinto Ġinfl ights Ġin Ġorder . ĠWhen Ġa Ġleader Ġreceives Ġa Ġreply , Ġthe Ġprevious ĊĠĠĠĠ Ġ* Ġinfl ights Ġshould Ġbe Ġfreed Ġby Ġcalling Ġinfl ights . free To Ġwith Ġthe Ġindex Ġof Ġthe Ġlast Ġreceived Ġentry . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġins : ĠIn flight Ġ= ĠIn flight () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIs Le arner Ġis Ġtrue Ġif Ġthis Ġprogress Ġis Ġtracked Ġfor Ġa Ġle arner . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġis Le arner : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġconstructor () Ġ{} ĊĊĊĠĠĠ Ġconstructor ( match : ĠLong , Ġnext : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . match Ġ= Ġmatch ĊĠĠĠĠĠĠĠ Ġthis . next Ġ= Ġnext ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġconstructor ( next : ĠLong , Ġmatch : ĠLong , Ġins : ĠIn flight ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . match Ġ= Ġmatch ĊĠĠĠĠĠĠĠ Ġthis . next Ġ= Ġnext ĊĠĠĠĠĠĠĠ Ġthis . ins Ġ= Ġins ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġconstructor ( state : ĠProgress State Type , Ġmatch : ĠLong , Ġnext : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . match Ġ= Ġmatch ĊĠĠĠĠĠĠĠ Ġthis . next Ġ= Ġnext ĊĠĠĠĠĠĠĠ Ġthis . state Ġ= Ġstate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġconstructor ( next : ĠLong , Ġins : ĠIn flight , Ġis Le arner : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . next Ġ= Ġnext ĊĠĠĠĠĠĠĠ Ġthis . ins Ġ= Ġins ĊĠĠĠĠĠĠĠ Ġthis . is Le arner Ġ= Ġis Le arner ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( next : ĠLong , Ġmatch : ĠLong , Ġins : ĠIn flight , Ġis Le arner : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . match Ġ= Ġmatch ĊĠĠĠĠĠĠĠ Ġthis . next Ġ= Ġnext ĊĠĠĠĠĠĠĠ Ġthis . ins Ġ= Ġins ĊĠĠĠĠĠĠĠ Ġthis . is Le arner Ġ= Ġis Le arner ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( match : ĠLong , Ġnext : ĠLong , Ġstate : ĠProgress State Type , Ġins : ĠIn flight ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . match Ġ= Ġmatch ĊĠĠĠĠĠĠĠ Ġthis . next Ġ= Ġnext ĊĠĠĠĠĠĠĠ Ġthis . state Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġthis . ins Ġ= Ġins ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( match : ĠLong , Ġnext : ĠLong , Ġstate : ĠProgress State Type , Ġpending Snapshot : ĠLong , Ġins : ĠIn flight ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . match Ġ= Ġmatch ĊĠĠĠĠĠĠĠ Ġthis . next Ġ= Ġnext ĊĠĠĠĠĠĠĠ Ġthis . state Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġthis . pending Snapshot Ġ= Ġpending Snapshot ĊĠĠĠĠĠĠĠ Ġthis . ins Ġ= Ġins ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( state : ĠProgress State Type , Ġis Paused : ĠBoolean , Ġins : ĠIn flight ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . state Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġthis . paused Ġ= Ġis Paused ĊĠĠĠĠĠĠĠ Ġthis . ins Ġ= Ġins ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( next : ĠLong , Ġpaused : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . next Ġ= Ġnext ĊĠĠĠĠĠĠĠ Ġthis . paused Ġ= Ġpaused ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( is Le arner : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . is Le arner Ġ= Ġis Le arner ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset State ( state : ĠProgress State Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . paused Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġthis . pending Snapshot Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġthis . state Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġins . reset () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbecome Snapshot ( snapshot i : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreset State ( Progress State Type . Progress State Snapshot ) ĊĠĠĠĠĠĠĠ Ġpending Snapshot Ġ= Ġsnapshot i ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbecome Probe () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġoriginal Ġstate Ġis ĠProgress State Snapshot , Ġprogress Ġknows Ġthat ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġpending Ġsnapshot Ġhas Ġbeen Ġsent Ġto Ġthis Ġpeer Ġsuccessfully , Ġthen ĊĠĠĠĠĠĠĠ Ġ// Ġprob es Ġfrom Ġpending Snapshot Ġ+ Ġ 1 . ĊĠĠĠĠĠĠĠ Ġif Ġ( this . state Ġ== ĠProgress State Type . Progress State Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpending Snapshot Ġ= Ġthis . pending Snapshot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset State ( Progress State Type . Progress State Probe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . next Ġ= ĠMath . max ( this . match Ġ+ Ġ 1 , Ġpending Snapshot Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset State ( Progress State Type . Progress State Probe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . next Ġ= Ġthis . match Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbecome Replic ate () Ġ{ ĊĠĠĠĠĠĠĠ Ġreset State ( Progress State Type . Progress State Replic ate ) ĊĠĠĠĠĠĠĠ Ġthis . next Ġ= Ġthis . match Ġ+ Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġoptim istic Update ( n : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . next Ġ= Ġn Ġ+ Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġmaybe Update Ġreturns Ġfalse Ġif Ġthe Ġgiven Ġn Ġindex Ġcomes Ġfrom Ġan Ġoutdated Ġmessage . ĠOtherwise Ġit Ġupdates Ġthe Ġprogress ĊĠĠĠĠ Ġ* Ġand Ġreturns Ġtrue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmaybe Update ( n : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġupdated Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( match Ġ< Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Ġ= Ġn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdated Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresume () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( next Ġ< Ġn Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ= Ġn Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġupdated ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġmaybe De cr To Ġreturns Ġfalse Ġif Ġthe Ġgiven Ġto Ġindex Ġcomes Ġfrom Ġan Ġout Ġof Ġorder Ġmessage . ĠOtherwise Ġit Ġde creases Ġthe ĊĠĠĠĠ Ġ* Ġprogress Ġnext Ġindex Ġto Ġmin ( rejected , Ġlast ) Ġand Ġreturns Ġtrue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmaybe De cr To ( rejected : ĠLong , Ġlast : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠProgress State Type . Progress State Replic ate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġrejection Ġmust Ġbe Ġstale Ġif Ġthe Ġprogress Ġhas Ġmatched Ġand Ġ" rejected " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġis Ġsmaller Ġthan Ġ" match ". ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rejected Ġ<= Ġmatch ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdirectly Ġdecrease Ġnext Ġto Ġmatch Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ= Ġmatch Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġrejection Ġmust Ġbe Ġstale Ġif Ġ" rejected " Ġdoes Ġnot Ġmatch Ġnext Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( this . next Ġ- Ġ 1 Ġ!= Ġrejected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . next Ġ= ĠMath . min ( rejected , Ġlast Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( next Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . next Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġresume () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpause () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . paused Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresume () Ġ{ ĊĠĠĠĠĠĠĠ Ġpaused Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIs Paused Ġreturns Ġwhether Ġsending Ġlog Ġentries Ġto Ġthis Ġnode Ġhas Ġbeen ĊĠĠĠĠ Ġ* Ġpaused . ĠA Ġnode Ġmay Ġbe Ġpaused Ġbecause Ġit Ġhas Ġrejected Ġrecent ĊĠĠĠĠ Ġ* ĠMsg Apps , Ġis Ġcurrently Ġwaiting Ġfor Ġa Ġsnapshot , Ġor Ġhas Ġreached Ġthe ĊĠĠĠĠ Ġ* ĠMax In flight Msgs Ġlimit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Paused (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this . state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProgress State Type . Progress State Probe Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . paused ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠProgress State Type . Progress State Replic ate Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ins . is Full () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProgress State Type . Progress State Snapshot Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠR aft Exception (" Unknown Ġstate Ġtype ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsnapshot Failure () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . pending Snapshot Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġneed Snapshot Abort Ġreturns Ġtrue Ġif Ġsnapshot Ġprogress 's ĠMatch ĊĠĠĠĠ Ġ* Ġis Ġequal Ġor Ġhigher Ġthan Ġthe Ġpending Snapshot . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġneed Snapshot Abort (): ĠBoolean Ġ= Ġthis . state Ġ== ĠProgress State Type . Progress State Snapshot Ġ&& Ġthis . match Ġ>= Ġthis . pending Snapshot ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Progress ( match =$ match , Ġnext =$ next , Ġstate =$ state , Ġpaused =$ paused , Ġpending Snapshot =$ pending Snapshot , Ġis Recent Active =$ is Recent Active , Ġins =$ ins , Ġis Le arner =$ is Le arner )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠProgress State Type Ġ{ ĊĠĠĠĠĠĠĠ ĠProgress State Probe , ĠProgress State Replic ate , ĠProgress State Snapshot ĊĠĠĠ Ġ} Ċ } Ċ