mirror of
https://github.com/octoleo/syncthing.git
synced 2024-11-10 15:20:56 +00:00
668979605b
* cmd/stindex: Unify access to key from cached variable. Avoid calling the Key() method from the iterator each time the value is needed. Just reuse the cache variable already assigned before the switch block. * cmd/stindex: Display the prefix byte value for unknown key types. Make it easier to diagnose corrupt / unknown key type entries by showing their decimal value, correlating with the definitions in keyer.go. * cmd/stindex: Add missing KeyType values in stindex dump code. Recently added DB key prefixes KeyTypeBlockListMap and KeyTypeVersion were unknown to the stindex dumping tool. Add basic parsing to dump their key structure.
122 lines
3.4 KiB
Go
122 lines
3.4 KiB
Go
// Copyright (C) 2015 The Syncthing Authors.
|
|
//
|
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
// You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
|
|
package main
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"fmt"
|
|
"log"
|
|
"time"
|
|
|
|
"github.com/syncthing/syncthing/lib/db"
|
|
"github.com/syncthing/syncthing/lib/db/backend"
|
|
"github.com/syncthing/syncthing/lib/protocol"
|
|
)
|
|
|
|
func dump(ldb backend.Backend) {
|
|
it, err := ldb.NewPrefixIterator(nil)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
for it.Next() {
|
|
key := it.Key()
|
|
switch key[0] {
|
|
case db.KeyTypeDevice:
|
|
folder := binary.BigEndian.Uint32(key[1:])
|
|
device := binary.BigEndian.Uint32(key[1+4:])
|
|
name := nulString(key[1+4+4:])
|
|
fmt.Printf("[device] F:%d D:%d N:%q", folder, device, name)
|
|
|
|
var f protocol.FileInfo
|
|
err := f.Unmarshal(it.Value())
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Printf(" V:%v\n", f)
|
|
|
|
case db.KeyTypeGlobal:
|
|
folder := binary.BigEndian.Uint32(key[1:])
|
|
name := nulString(key[1+4:])
|
|
var flv db.VersionList
|
|
flv.Unmarshal(it.Value())
|
|
fmt.Printf("[global] F:%d N:%q V:%s\n", folder, name, flv)
|
|
|
|
case db.KeyTypeBlock:
|
|
folder := binary.BigEndian.Uint32(key[1:])
|
|
hash := key[1+4 : 1+4+32]
|
|
name := nulString(key[1+4+32:])
|
|
fmt.Printf("[block] F:%d H:%x N:%q I:%d\n", folder, hash, name, binary.BigEndian.Uint32(it.Value()))
|
|
|
|
case db.KeyTypeDeviceStatistic:
|
|
fmt.Printf("[dstat] K:%x V:%x\n", key, it.Value())
|
|
|
|
case db.KeyTypeFolderStatistic:
|
|
fmt.Printf("[fstat] K:%x V:%x\n", key, it.Value())
|
|
|
|
case db.KeyTypeVirtualMtime:
|
|
folder := binary.BigEndian.Uint32(key[1:])
|
|
name := nulString(key[1+4:])
|
|
val := it.Value()
|
|
var real, virt time.Time
|
|
real.UnmarshalBinary(val[:len(val)/2])
|
|
virt.UnmarshalBinary(val[len(val)/2:])
|
|
fmt.Printf("[mtime] F:%d N:%q R:%v V:%v\n", folder, name, real, virt)
|
|
|
|
case db.KeyTypeFolderIdx:
|
|
key := binary.BigEndian.Uint32(key[1:])
|
|
fmt.Printf("[folderidx] K:%d V:%q\n", key, it.Value())
|
|
|
|
case db.KeyTypeDeviceIdx:
|
|
key := binary.BigEndian.Uint32(key[1:])
|
|
val := it.Value()
|
|
if len(val) == 0 {
|
|
fmt.Printf("[deviceidx] K:%d V:<nil>\n", key)
|
|
} else {
|
|
dev := protocol.DeviceIDFromBytes(val)
|
|
fmt.Printf("[deviceidx] K:%d V:%s\n", key, dev)
|
|
}
|
|
|
|
case db.KeyTypeIndexID:
|
|
device := binary.BigEndian.Uint32(key[1:])
|
|
folder := binary.BigEndian.Uint32(key[5:])
|
|
fmt.Printf("[indexid] D:%d F:%d I:%x\n", device, folder, it.Value())
|
|
|
|
case db.KeyTypeFolderMeta:
|
|
folder := binary.BigEndian.Uint32(key[1:])
|
|
fmt.Printf("[foldermeta] F:%d V:%x\n", folder, it.Value())
|
|
|
|
case db.KeyTypeMiscData:
|
|
fmt.Printf("[miscdata] K:%q V:%q\n", key[1:], it.Value())
|
|
|
|
case db.KeyTypeSequence:
|
|
folder := binary.BigEndian.Uint32(key[1:])
|
|
seq := binary.BigEndian.Uint64(key[5:])
|
|
fmt.Printf("[sequence] F:%d S:%d V:%q\n", folder, seq, it.Value())
|
|
|
|
case db.KeyTypeNeed:
|
|
folder := binary.BigEndian.Uint32(key[1:])
|
|
file := string(key[5:])
|
|
fmt.Printf("[need] F:%d V:%q\n", folder, file)
|
|
|
|
case db.KeyTypeBlockList:
|
|
fmt.Printf("[blocklist] H:%x\n", key[1:])
|
|
|
|
case db.KeyTypeBlockListMap:
|
|
folder := binary.BigEndian.Uint32(key[1:])
|
|
hash := key[5:37]
|
|
fileName := string(key[37:])
|
|
fmt.Printf("[blocklistmap] F:%d H:%x N:%s\n", folder, hash, fileName)
|
|
|
|
case db.KeyTypeVersion:
|
|
fmt.Printf("[version] H:%x\n", key[1:])
|
|
|
|
default:
|
|
fmt.Printf("[??? %d]\n %x\n %x\n", key[0], key, it.Value())
|
|
}
|
|
}
|
|
}
|