aboutsummaryrefslogtreecommitdiffstats
path: root/util/lamport/persisted_lamport.go
diff options
context:
space:
mode:
Diffstat (limited to 'util/lamport/persisted_lamport.go')
-rw-r--r--util/lamport/persisted_lamport.go78
1 files changed, 78 insertions, 0 deletions
diff --git a/util/lamport/persisted_lamport.go b/util/lamport/persisted_lamport.go
new file mode 100644
index 00000000..4f12dd1b
--- /dev/null
+++ b/util/lamport/persisted_lamport.go
@@ -0,0 +1,78 @@
+package lamport
+
+import (
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+)
+
+type Persisted struct {
+ Clock
+ filePath string
+}
+
+func NewPersisted(filePath string) *Persisted {
+ clock := &Persisted{
+ Clock: NewClock(),
+ filePath: filePath,
+ }
+ return clock
+}
+
+func LoadPersisted(filePath string) (*Persisted, error) {
+ clock := &Persisted{
+ filePath: filePath,
+ }
+
+ err := clock.read()
+ if err != nil {
+ return nil, err
+ }
+
+ return clock, nil
+}
+
+func (c *Persisted) Increment() (Time, error) {
+ time := c.Clock.Increment()
+ return time, c.Write()
+}
+
+func (c *Persisted) Witness(time Time) error {
+ // TODO: rework so that we write only when the clock was actually updated
+ c.Clock.Witness(time)
+ return c.Write()
+}
+
+func (c *Persisted) read() error {
+ content, err := ioutil.ReadFile(c.filePath)
+ if err != nil {
+ return err
+ }
+
+ var value uint64
+ n, err := fmt.Sscanf(string(content), "%d", &value)
+
+ if err != nil {
+ return err
+ }
+
+ if n != 1 {
+ return fmt.Errorf("could not read the clock")
+ }
+
+ c.Clock = NewClockWithTime(value)
+
+ return nil
+}
+
+func (c *Persisted) Write() error {
+ dir := filepath.Dir(c.filePath)
+ err := os.MkdirAll(dir, 0777)
+ if err != nil {
+ return err
+ }
+
+ data := []byte(fmt.Sprintf("%d", c.counter))
+ return ioutil.WriteFile(c.filePath, data, 0644)
+}