diff --git a/repository/git.go b/repository/git.go index d01a8e680ed3d48aa86cb8525cd64d027664b553..db411792ee6fadd112c973d3dd3b813fd1fd5dce 100644 --- a/repository/git.go +++ b/repository/git.go @@ -366,6 +366,7 @@ func (repo *GitRepo) createClocks() error { return nil } +// LoadClocks read the clocks values from the on-disk repo func (repo *GitRepo) LoadClocks() error { createClock, err := lamport.LoadPersisted(repo.GetPath() + createClockFile) if err != nil { @@ -382,6 +383,7 @@ func (repo *GitRepo) LoadClocks() error { return nil } +// WriteClocks write the clocks values into the repo func (repo *GitRepo) WriteClocks() error { err := repo.createClock.Write() if err != nil { @@ -396,18 +398,24 @@ func (repo *GitRepo) WriteClocks() error { return nil } +// CreateTimeIncrement increment the creation clock and return the new value. func (repo *GitRepo) CreateTimeIncrement() (lamport.Time, error) { return repo.createClock.Increment() } +// EditTimeIncrement increment the edit clock and return the new value. func (repo *GitRepo) EditTimeIncrement() (lamport.Time, error) { return repo.editClock.Increment() } +// CreateWitness witness another create time and increment the corresponding clock +// if needed. func (repo *GitRepo) CreateWitness(time lamport.Time) error { return repo.createClock.Witness(time) } +// EditWitness witness another edition time and increment the corresponding clock +// if needed. func (repo *GitRepo) EditWitness(time lamport.Time) error { return repo.editClock.Witness(time) } diff --git a/repository/repo.go b/repository/repo.go index 053837db4c4dc2c565dcddf236876780c9c46919..0cddf38a8a4291cd0f82ffee37c58b7cf3e3b711 100644 --- a/repository/repo.go +++ b/repository/repo.go @@ -76,16 +76,24 @@ type Repo interface { type ClockedRepo interface { Repo + // LoadClocks read the clocks values from the on-disk repo LoadClocks() error + // WriteClocks write the clocks values into the repo WriteClocks() error + // CreateTimeIncrement increment the creation clock and return the new value. CreateTimeIncrement() (lamport.Time, error) + // EditTimeIncrement increment the edit clock and return the new value. EditTimeIncrement() (lamport.Time, error) + // CreateWitness witness another create time and increment the corresponding + // clock if needed. CreateWitness(time lamport.Time) error + // EditWitness witness another edition time and increment the corresponding + // clock if needed. EditWitness(time lamport.Time) error } diff --git a/util/lamport/lamport.go b/util/lamport/lamport.go index 640c58bc2175d627af996a7986b2133047bb7e90..0372bb6f4df253d44406a203b436613902056096 100644 --- a/util/lamport/lamport.go +++ b/util/lamport/lamport.go @@ -41,12 +41,15 @@ type Clock struct { // Time is the value of a Clock. type Time uint64 +// NewClock create a new clock with the value 1. +// Value 0 is considered as invalid. func NewClock() Clock { return Clock{ counter: 1, } } +// NewClockWithTime create a new clock with a value. func NewClockWithTime(time uint64) Clock { return Clock{ counter: time, diff --git a/util/lamport/persisted_lamport.go b/util/lamport/persisted_lamport.go index 22b23dcbf4daa7a617d837c371fbfd31ba0fc996..ab4b93b1705c7c02a4e2eed569a6318bb144a93c 100644 --- a/util/lamport/persisted_lamport.go +++ b/util/lamport/persisted_lamport.go @@ -12,6 +12,7 @@ type Persisted struct { filePath string } +// NewPersisted create a new persisted Lamport clock func NewPersisted(filePath string) (*Persisted, error) { clock := &Persisted{ Clock: NewClock(), @@ -27,6 +28,7 @@ func NewPersisted(filePath string) (*Persisted, error) { return clock, nil } +// LoadPersisted load a persisted Lamport clock from a file func LoadPersisted(filePath string) (*Persisted, error) { clock := &Persisted{ filePath: filePath, @@ -40,11 +42,14 @@ func LoadPersisted(filePath string) (*Persisted, error) { return clock, nil } +// Increment is used to return the value of the lamport clock and increment it afterwards func (c *Persisted) Increment() (Time, error) { time := c.Clock.Increment() return time, c.Write() } +// Witness is called to update our local clock if necessary after +// witnessing a clock value received from another process func (c *Persisted) Witness(time Time) error { // TODO: rework so that we write only when the clock was actually updated c.Clock.Witness(time)