mirror of
https://github.com/octoleo/syncthing.git
synced 2024-11-09 23:00:58 +00:00
Load localVersion for all nodes
This commit is contained in:
parent
7943902d73
commit
91cc0cd05e
@ -103,6 +103,14 @@ func globalKey(repo, file []byte) []byte {
|
|||||||
func nodeKeyName(key []byte) []byte {
|
func nodeKeyName(key []byte) []byte {
|
||||||
return key[1+64+32:]
|
return key[1+64+32:]
|
||||||
}
|
}
|
||||||
|
func nodeKeyRepo(key []byte) []byte {
|
||||||
|
repo := key[1 : 1+64]
|
||||||
|
izero := bytes.IndexByte(repo, 0)
|
||||||
|
return repo[:izero]
|
||||||
|
}
|
||||||
|
func nodeKeyNode(key []byte) []byte {
|
||||||
|
return key[1+64 : 1+64+32]
|
||||||
|
}
|
||||||
|
|
||||||
func globalKeyName(key []byte) []byte {
|
func globalKeyName(key []byte) []byte {
|
||||||
return key[1+64:]
|
return key[1+64:]
|
||||||
@ -405,6 +413,30 @@ func ldbWithHave(db *leveldb.DB, repo, node []byte, fn fileIterator) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ldbWithAllRepo(db *leveldb.DB, repo []byte, fn func(node []byte, f protocol.FileInfo) bool) {
|
||||||
|
start := nodeKey(repo, nil, nil) // before all repo/node files
|
||||||
|
limit := nodeKey(repo, protocol.LocalNodeID[:], []byte{0xff, 0xff, 0xff, 0xff}) // after all repo/node files
|
||||||
|
snap, err := db.GetSnapshot()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer snap.Release()
|
||||||
|
dbi := snap.NewIterator(&util.Range{Start: start, Limit: limit}, nil)
|
||||||
|
defer dbi.Release()
|
||||||
|
|
||||||
|
for dbi.Next() {
|
||||||
|
node := nodeKeyNode(dbi.Key())
|
||||||
|
var f protocol.FileInfo
|
||||||
|
err := f.UnmarshalXDR(dbi.Value())
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if cont := fn(node, f); !cont {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func ldbGet(db *leveldb.DB, repo, node, file []byte) protocol.FileInfo {
|
func ldbGet(db *leveldb.DB, repo, node, file []byte) protocol.FileInfo {
|
||||||
nk := nodeKey(repo, node, file)
|
nk := nodeKey(repo, node, file)
|
||||||
bs, err := db.Get(nk, nil)
|
bs, err := db.Get(nk, nil)
|
||||||
|
15
files/set.go
15
files/set.go
@ -34,15 +34,18 @@ func NewSet(repo string, db *leveldb.DB) *Set {
|
|||||||
db: db,
|
db: db,
|
||||||
}
|
}
|
||||||
|
|
||||||
var lv uint64
|
var nodeID protocol.NodeID
|
||||||
ldbWithHave(db, []byte(repo), protocol.LocalNodeID[:], func(f protocol.FileInfo) bool {
|
ldbWithAllRepo(db, []byte(repo), func(node []byte, f protocol.FileInfo) bool {
|
||||||
if f.LocalVersion > lv {
|
copy(nodeID[:], node)
|
||||||
lv = f.LocalVersion
|
if f.LocalVersion > s.localVersion[nodeID] {
|
||||||
|
s.localVersion[nodeID] = f.LocalVersion
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
s.localVersion[protocol.LocalNodeID] = lv
|
if debug {
|
||||||
clock(lv)
|
l.Debugf("loaded localVersion for %q: %#v", repo, s.localVersion)
|
||||||
|
}
|
||||||
|
clock(s.localVersion[protocol.LocalNodeID])
|
||||||
|
|
||||||
return &s
|
return &s
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user