summaryrefslogtreecommitdiffstats
path: root/encoding.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--encoding.go96
1 files changed, 50 insertions, 46 deletions
diff --git a/encoding.go b/encoding.go
index bd2d4b7..09645ab 100644
--- a/encoding.go
+++ b/encoding.go
@@ -7,38 +7,42 @@ import (
"time"
)
-type Encoder struct {
- *bufio.Writer
+type encoder struct {
+ w *bufio.Writer
buf []byte
}
-func NewEncoder(w io.Writer) *Encoder {
- return &Encoder{
- Writer: bufio.NewWriter(w),
- buf: make([]byte, 8),
+func newEncoder(w io.Writer) *encoder {
+ return &encoder{
+ w: bufio.NewWriter(w),
+ buf: make([]byte, 8),
}
}
-func (e *Encoder) EncodeUint64(val uint64) error {
+func (e *encoder) Flush() error {
+ return e.w.Flush()
+}
+
+func (e *encoder) EncodeUint64(val uint64) error {
binary.LittleEndian.PutUint64(e.buf, val)
- _, err := e.Write(e.buf)
+ _, err := e.w.Write(e.buf)
return err
}
-func (e *Encoder) EncodeTime(val time.Time) error {
+func (e *encoder) EncodeTime(val time.Time) error {
return e.EncodeUint64(uint64(val.Unix()))
}
-func (e *Encoder) EncodeBytes(val []byte) error {
+func (e *encoder) EncodeBytes(val []byte) error {
if err := e.EncodeUint64(uint64(len(val))); err != nil {
return err
}
- _, err := e.Write(val)
+ _, err := e.w.Write(val)
return err
}
-func (e *Encoder) EncodeNode(n *Node) error {
+func (e *encoder) EncodeNode(n *node) error {
if err := e.EncodeUint64(n.Hash); err != nil {
return err
}
@@ -62,27 +66,27 @@ func (e *Encoder) EncodeNode(n *Node) error {
return nil
}
-type Decoder struct {
- *bufio.Reader
+type decoder struct {
+ r *bufio.Reader
buf []byte
}
-func NewDecoder(r io.Reader) *Decoder {
- return &Decoder{
- Reader: bufio.NewReader(r),
- buf: make([]byte, 8),
+func newDecoder(r io.Reader) *decoder {
+ return &decoder{
+ r: bufio.NewReader(r),
+ buf: make([]byte, 8),
}
}
-func (d *Decoder) DecodeUint64() (uint64, error) {
- _, err := io.ReadFull(d, d.buf)
+func (d *decoder) DecodeUint64() (uint64, error) {
+ _, err := io.ReadFull(d.r, d.buf)
if err != nil {
return 0, err
}
return binary.LittleEndian.Uint64(d.buf), nil
}
-func (d *Decoder) DecodeTime() (time.Time, error) {
+func (d *decoder) DecodeTime() (time.Time, error) {
ts, err := d.DecodeUint64()
if err != nil {
return zero[time.Time](), err
@@ -90,18 +94,18 @@ func (d *Decoder) DecodeTime() (time.Time, error) {
return time.Unix(int64(ts), 0), nil
}
-func (d *Decoder) DecodeBytes() ([]byte, error) {
+func (d *decoder) DecodeBytes() ([]byte, error) {
lenVal, err := d.DecodeUint64()
if err != nil {
return nil, err
}
data := make([]byte, lenVal)
- _, err = io.ReadFull(d, data)
+ _, err = io.ReadFull(d.r, data)
return data, err
}
-func (d *Decoder) DecodeNodes() (*Node, error) {
- n := &Node{}
+func (d *decoder) DecodeNodes() (*node, error) {
+ n := &node{}
hash, err := d.DecodeUint64()
if err != nil {
@@ -133,63 +137,63 @@ func (d *Decoder) DecodeNodes() (*Node, error) {
return n, err
}
-func (s *Store) Snapshot(w io.WriteSeeker) error {
- s.mu.RLock()
- defer s.mu.RUnlock()
+func (s *store) Snapshot(w io.WriteSeeker) error {
+ s.mu.Lock()
+ defer s.mu.Unlock()
w.Seek(0, io.SeekStart)
- wr := NewEncoder(w)
+ wr := newEncoder(w)
- wr.EncodeUint64(s.maxCost)
- wr.EncodeUint64(uint64(s.strategy.Type))
- wr.EncodeUint64(s.lenght)
+ 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 {
+ for v := s.Evict.EvictNext; v != &s.Evict; v = v.EvictNext {
if err := wr.EncodeNode(v); err != nil {
return err
}
}
- wr.Flush()
+ wr.w.Flush()
return nil
}
-func (s *Store) LoadSnapshot(r io.ReadSeeker) error {
+func (s *store) LoadSnapshot(r io.ReadSeeker) error {
r.Seek(0, io.SeekStart)
- rr := NewDecoder(r)
+ rr := newDecoder(r)
maxCost, err := rr.DecodeUint64()
if err != nil {
return err
}
- s.maxCost = maxCost
+ s.MaxCost = maxCost
policy, err := rr.DecodeUint64()
if err != nil {
return err
}
- s.strategy.SetPolicy(EvictionPolicyType(policy))
+ s.Policy.SetPolicy(EvictionPolicyType(policy))
lenght, err := rr.DecodeUint64()
if err != nil {
return err
}
- s.lenght = lenght
+ s.Lenght = lenght
k := 128
- for k < int(s.lenght) {
+ for k < int(s.Lenght) {
k = k << 1
}
- s.bucket = make([]Node, k)
- for range s.lenght {
+ s.Bucket = make([]node, k)
+ for range s.Lenght {
v, err := rr.DecodeNodes()
if err != nil {
return err
}
- idx := v.Hash % uint64(len(s.bucket))
+ idx := v.Hash % uint64(len(s.Bucket))
- bucket := &s.bucket[idx]
+ bucket := &s.Bucket[idx]
lazyInitBucket(bucket)
v.HashPrev = bucket
@@ -197,12 +201,12 @@ func (s *Store) LoadSnapshot(r io.ReadSeeker) error {
v.HashNext.HashPrev = v
v.HashPrev.HashNext = v
- v.EvictPrev = &s.evict
+ v.EvictPrev = &s.Evict
v.EvictNext = v.EvictPrev.EvictNext
v.EvictNext.EvictPrev = v
v.EvictPrev.EvictNext = v
- s.cost = s.cost + uint64(len(v.Key)) + uint64(len(v.Value))
+ s.Cost = s.Cost + uint64(len(v.Key)) + uint64(len(v.Value))
}
return nil
}