aboutsummaryrefslogtreecommitdiffstats
path: root/encoding.go
diff options
context:
space:
mode:
Diffstat (limited to 'encoding.go')
-rw-r--r--encoding.go87
1 files changed, 54 insertions, 33 deletions
diff --git a/encoding.go b/encoding.go
index 09645ab..bc68d2f 100644
--- a/encoding.go
+++ b/encoding.go
@@ -66,6 +66,27 @@ func (e *encoder) EncodeNode(n *node) error {
return nil
}
+func (e *encoder) EncodeStore(s *store) error {
+ if err := e.EncodeUint64(s.MaxCost); err != nil {
+ return err
+ }
+
+ if err := e.EncodeUint64(uint64(s.Policy.Type)); err != nil {
+ return err
+ }
+
+ if err := e.EncodeUint64(s.Length); err != nil {
+ return err
+ }
+
+ for v := s.Evict.EvictNext; v != &s.Evict; v = v.EvictNext {
+ if err := e.EncodeNode(v); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
type decoder struct {
r *bufio.Reader
buf []byte
@@ -137,56 +158,33 @@ func (d *decoder) DecodeNodes() (*node, error) {
return n, err
}
-func (s *store) Snapshot(w io.WriteSeeker) error {
- s.mu.Lock()
- defer s.mu.Unlock()
-
- w.Seek(0, io.SeekStart)
- wr := newEncoder(w)
-
- wr.EncodeUint64(s.MaxCost)
- wr.EncodeUint64(uint64(s.Policy.Type))
- wr.EncodeUint64(s.Lenght)
-
- for v := s.Evict.EvictNext; v != &s.Evict; v = v.EvictNext {
- if err := wr.EncodeNode(v); err != nil {
- return err
- }
- }
- wr.w.Flush()
- return nil
-}
-
-func (s *store) LoadSnapshot(r io.ReadSeeker) error {
- r.Seek(0, io.SeekStart)
- rr := newDecoder(r)
-
- maxCost, err := rr.DecodeUint64()
+func (d *decoder) DecodeStore(s *store) error {
+ maxCost, err := d.DecodeUint64()
if err != nil {
return err
}
s.MaxCost = maxCost
- policy, err := rr.DecodeUint64()
+ policy, err := d.DecodeUint64()
if err != nil {
return err
}
s.Policy.SetPolicy(EvictionPolicyType(policy))
- lenght, err := rr.DecodeUint64()
+ length, err := d.DecodeUint64()
if err != nil {
return err
}
- s.Lenght = lenght
+ s.Length = length
k := 128
- for k < int(s.Lenght) {
+ for k < int(s.Length) {
k = k << 1
}
s.Bucket = make([]node, k)
- for range s.Lenght {
- v, err := rr.DecodeNodes()
+ for range s.Length {
+ v, err := d.DecodeNodes()
if err != nil {
return err
}
@@ -201,8 +199,8 @@ func (s *store) LoadSnapshot(r io.ReadSeeker) error {
v.HashNext.HashPrev = v
v.HashPrev.HashNext = v
- v.EvictPrev = &s.Evict
- v.EvictNext = v.EvictPrev.EvictNext
+ v.EvictNext = &s.Evict
+ v.EvictPrev = v.EvictNext.EvictPrev
v.EvictNext.EvictPrev = v
v.EvictPrev.EvictNext = v
@@ -210,3 +208,26 @@ func (s *store) LoadSnapshot(r io.ReadSeeker) error {
}
return nil
}
+
+func (s *store) Snapshot(w io.WriteSeeker) error {
+ s.mu.Lock()
+ defer s.mu.Unlock()
+
+ if _, err := w.Seek(0, io.SeekStart); err != nil {
+ return err
+ }
+
+ wr := newEncoder(w)
+ defer wr.Flush()
+
+ return wr.EncodeStore(s)
+}
+
+func (s *store) LoadSnapshot(r io.ReadSeeker) error {
+ if _, err := r.Seek(0, io.SeekStart); err != nil {
+ return err
+ }
+ d := newDecoder(r)
+
+ return d.DecodeStore(s)
+}