Răsfoiți Sursa

Humanize serialization of version vectors (again)

Jakob Borg 9 ani în urmă
părinte
comite
11d4986517

+ 1 - 1
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)
 }

+ 1 - 1
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 {

+ 1 - 1
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
 

+ 2 - 2
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,

+ 9 - 2
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, "=")

+ 14 - 0
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)
+	}
+}

+ 7 - 7
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

+ 2 - 2
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

+ 1 - 1
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