瀏覽代碼

Print some debug info when panicing in leveldb

Jakob Borg 11 年之前
父節點
當前提交
1bc1c0b14f
共有 1 個文件被更改,包括 32 次插入1 次删除
  1. 32 1
      internal/files/leveldb.go

+ 32 - 1
internal/files/leveldb.go

@@ -17,6 +17,7 @@ package files
 
 import (
 	"bytes"
+	"fmt"
 	"runtime"
 	"sort"
 	"sync"
@@ -59,6 +60,21 @@ type versionList struct {
 	versions []fileVersion
 }
 
+func (l versionList) String() string {
+	var b bytes.Buffer
+	var id protocol.DeviceID
+	b.WriteString("{")
+	for i, v := range l.versions {
+		if i > 0 {
+			b.WriteString(", ")
+		}
+		copy(id[:], v.device)
+		fmt.Fprintf(&b, "{%d, %v}", v.version, id)
+	}
+	b.WriteString("}")
+	return b.String()
+}
+
 type fileList []protocol.FileInfo
 
 func (l fileList) Len() int {
@@ -576,9 +592,15 @@ func ldbWithGlobal(db *leveldb.DB, folder []byte, truncate bool, fn fileIterator
 			l.Debugln(dbi.Key())
 			panic("no versions?")
 		}
-		fk := deviceKey(folder, vl.versions[0].device, globalKeyName(dbi.Key()))
+		name := globalKeyName(dbi.Key())
+		fk := deviceKey(folder, vl.versions[0].device, name)
 		bs, err := snap.Get(fk, nil)
 		if err != nil {
+			l.Debugf("folder: %q (%x)", folder, folder)
+			l.Debugf("key: %q (%x)", dbi.Key(), dbi.Key())
+			l.Debugf("vl: %v", vl)
+			l.Debugf("name: %q (%x)", name, name)
+			l.Debugf("fk: %q (%x)", fk, fk)
 			panic(err)
 		}
 
@@ -670,6 +692,15 @@ outer:
 				fk := deviceKey(folder, vl.versions[i].device, name)
 				bs, err := snap.Get(fk, nil)
 				if err != nil {
+					var id protocol.DeviceID
+					copy(id[:], device)
+					l.Debugf("device: %v", id)
+					l.Debugf("need: %v, have: %v", need, have)
+					l.Debugf("key: %q (%x)", dbi.Key(), dbi.Key())
+					l.Debugf("vl: %v", vl)
+					l.Debugf("i: %v", i)
+					l.Debugf("fk: %q (%x)", fk, fk)
+					l.Debugf("name: %q (%x)", name, name)
 					panic(err)
 				}