From 11d4986517c9b413e553c31225a66133ea0a1d61 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Wed, 20 Jan 2016 11:10:22 -0800 Subject: [PATCH] Humanize serialization of version vectors (again) --- cmd/syncthing/gui.go | 2 +- cmd/syncthing/main.go | 2 +- lib/model/model.go | 2 +- lib/model/rwfolder.go | 4 ++-- lib/protocol/deviceid.go | 11 +++++++++-- lib/protocol/deviceid_test.go | 14 ++++++++++++++ lib/protocol/vector.go | 14 +++++++------- lib/protocol/vector_xdr.go | 4 ++-- lib/scanner/walk.go | 2 +- 9 files changed, 38 insertions(+), 17 deletions(-) diff --git a/cmd/syncthing/gui.go b/cmd/syncthing/gui.go index 6410d15d..4bc27098 100644 --- a/cmd/syncthing/gui.go +++ b/cmd/syncthing/gui.go @@ -1220,7 +1220,7 @@ type jsonVersionVector protocol.Vector func (v jsonVersionVector) MarshalJSON() ([]byte, error) { res := make([]string, len(v)) for i, c := range v { - res[i] = fmt.Sprintf("%d:%d", c.ID, c.Value) + res[i] = fmt.Sprintf("%v:%d", c.ID, c.Value) } return json.Marshal(res) } diff --git a/cmd/syncthing/main.go b/cmd/syncthing/main.go index 6bc14161..75589686 100644 --- a/cmd/syncthing/main.go +++ b/cmd/syncthing/main.go @@ -1208,7 +1208,7 @@ func cleanConfigDirectory() { // short ID:s; that is, that the devices in the cluster all have unique // initial 64 bits. func checkShortIDs(cfg *config.Wrapper) error { - exists := make(map[uint64]protocol.DeviceID) + exists := make(map[protocol.ShortID]protocol.DeviceID) for deviceID := range cfg.Devices() { shortID := deviceID.Short() if otherID, ok := exists[shortID]; ok { diff --git a/lib/model/model.go b/lib/model/model.go index 2ca41467..00f7ad89 100644 --- a/lib/model/model.go +++ b/lib/model/model.go @@ -67,7 +67,7 @@ type Model struct { finder *db.BlockFinder progressEmitter *ProgressEmitter id protocol.DeviceID - shortID uint64 + shortID protocol.ShortID cacheIgnoredFiles bool protectedFiles []string diff --git a/lib/model/rwfolder.go b/lib/model/rwfolder.go index 1252275e..ab384d46 100644 --- a/lib/model/rwfolder.go +++ b/lib/model/rwfolder.go @@ -87,7 +87,7 @@ type rwFolder struct { ignorePerms bool copiers int pullers int - shortID uint64 + shortID protocol.ShortID order config.PullOrder maxConflicts int sleep time.Duration @@ -108,7 +108,7 @@ type rwFolder struct { errorsMut sync.Mutex } -func newRWFolder(m *Model, shortID uint64, cfg config.FolderConfiguration) *rwFolder { +func newRWFolder(m *Model, shortID protocol.ShortID, cfg config.FolderConfiguration) *rwFolder { p := &rwFolder{ stateTracker: stateTracker{ folder: cfg.ID, diff --git a/lib/protocol/deviceid.go b/lib/protocol/deviceid.go index 2e0334a6..1723051e 100644 --- a/lib/protocol/deviceid.go +++ b/lib/protocol/deviceid.go @@ -16,6 +16,7 @@ import ( ) type DeviceID [32]byte +type ShortID uint64 var LocalDeviceID = DeviceID{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} @@ -69,14 +70,20 @@ func (n DeviceID) Equals(other DeviceID) bool { } // Short returns an integer representing bits 0-63 of the device ID. -func (n DeviceID) Short() uint64 { - return binary.BigEndian.Uint64(n[:]) +func (n DeviceID) Short() ShortID { + return ShortID(binary.BigEndian.Uint64(n[:])) } func (n *DeviceID) MarshalText() ([]byte, error) { return []byte(n.String()), nil } +func (s ShortID) String() string { + var bs [8]byte + binary.BigEndian.PutUint64(bs[:], uint64(s)) + return base32.StdEncoding.EncodeToString(bs[:])[:7] +} + func (n *DeviceID) UnmarshalText(bs []byte) error { id := string(bs) id = strings.Trim(id, "=") diff --git a/lib/protocol/deviceid_test.go b/lib/protocol/deviceid_test.go index 613557d3..4c964f29 100644 --- a/lib/protocol/deviceid_test.go +++ b/lib/protocol/deviceid_test.go @@ -74,3 +74,17 @@ func TestMarshallingDeviceID(t *testing.T) { t.Error("Compare error") } } + +func TestShortIDString(t *testing.T) { + id, _ := DeviceIDFromString(formatted) + + sid := id.Short().String() + if len(sid) != 7 { + t.Errorf("Wrong length for short ID: got %d, want 7", len(sid)) + } + + want := formatted[:len(sid)] + if sid != want { + t.Errorf("Wrong short ID: got %q, want %q", sid, want) + } +} diff --git a/lib/protocol/vector.go b/lib/protocol/vector.go index 6c17ac64..4b0920a6 100644 --- a/lib/protocol/vector.go +++ b/lib/protocol/vector.go @@ -10,31 +10,31 @@ type Vector []Counter // Counter represents a single counter in the version vector. type Counter struct { - ID uint64 + ID ShortID Value uint64 } // Update returns a Vector with the index for the specific ID incremented by // one. If it is possible, the vector v is updated and returned. If it is not, // a copy will be created, updated and returned. -func (v Vector) Update(ID uint64) Vector { +func (v Vector) Update(id ShortID) Vector { for i := range v { - if v[i].ID == ID { + if v[i].ID == id { // Update an existing index v[i].Value++ return v - } else if v[i].ID > ID { + } else if v[i].ID > id { // Insert a new index nv := make(Vector, len(v)+1) copy(nv, v[:i]) - nv[i].ID = ID + nv[i].ID = id nv[i].Value = 1 copy(nv[i+1:], v[i:]) return nv } } // Append a new index - return append(v, Counter{ID, 1}) + return append(v, Counter{id, 1}) } // Merge returns the vector containing the maximum indexes from v and b. If it @@ -105,7 +105,7 @@ func (v Vector) Concurrent(b Vector) bool { } // Counter returns the current value of the given counter ID. -func (v Vector) Counter(id uint64) uint64 { +func (v Vector) Counter(id ShortID) uint64 { for _, c := range v { if c.ID == id { return c.Value diff --git a/lib/protocol/vector_xdr.go b/lib/protocol/vector_xdr.go index 01efa7e4..17dacbc7 100644 --- a/lib/protocol/vector_xdr.go +++ b/lib/protocol/vector_xdr.go @@ -21,7 +21,7 @@ type xdrReader interface { func (v Vector) EncodeXDRInto(w xdrWriter) (int, error) { w.WriteUint32(uint32(len(v))) for i := range v { - w.WriteUint64(v[i].ID) + w.WriteUint64(uint64(v[i].ID)) w.WriteUint64(v[i].Value) } return 4 + 16*len(v), nil @@ -35,7 +35,7 @@ func (v *Vector) DecodeXDRFrom(r xdrReader) error { } n := make(Vector, l) for i := range n { - n[i].ID = r.ReadUint64() + n[i].ID = ShortID(r.ReadUint64()) n[i].Value = r.ReadUint64() } *v = n diff --git a/lib/scanner/walk.go b/lib/scanner/walk.go index abc47ded..04d4c650 100644 --- a/lib/scanner/walk.go +++ b/lib/scanner/walk.go @@ -69,7 +69,7 @@ type Walker struct { // Number of routines to use for hashing Hashers int // Our vector clock id - ShortID uint64 + ShortID protocol.ShortID // Optional progress tick interval which defines how often FolderScanProgress // events are emitted. Negative number means disabled. ProgressTickIntervalS int