Load localVersion for all nodes

This commit is contained in:
Jakob Borg 2014-07-17 11:00:54 +02:00
parent 7943902d73
commit 91cc0cd05e
2 changed files with 41 additions and 6 deletions

View File

@ -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)

View File

@ -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
} }