Browse Source

avoid using the bytes out side of the transaction

fix https://github.com/chrislusf/seaweedfs/issues/656
pull/657/head
Chris Lu 7 years ago
parent
commit
88d608b661
  1. 17
      weed/storage/needle_map_boltdb.go

17
weed/storage/needle_map_boltdb.go

@ -75,8 +75,8 @@ func generateBoltDbFile(dbFileName string, indexFile *os.File) error {
} }
func (m *BoltDbNeedleMap) Get(key uint64) (element *needle.NeedleValue, ok bool) { func (m *BoltDbNeedleMap) Get(key uint64) (element *needle.NeedleValue, ok bool) {
var offset, size uint32
bytes := make([]byte, 8) bytes := make([]byte, 8)
var data []byte
util.Uint64toBytes(bytes, key) util.Uint64toBytes(bytes, key)
err := m.db.View(func(tx *bolt.Tx) error { err := m.db.View(func(tx *bolt.Tx) error {
bucket := tx.Bucket(boltdbBucket) bucket := tx.Bucket(boltdbBucket)
@ -84,15 +84,22 @@ func (m *BoltDbNeedleMap) Get(key uint64) (element *needle.NeedleValue, ok bool)
return fmt.Errorf("Bucket %q not found!", boltdbBucket) return fmt.Errorf("Bucket %q not found!", boltdbBucket)
} }
data = bucket.Get(bytes)
data := bucket.Get(bytes)
if len(data) != 8 {
glog.V(0).Infof("wrong data length: %d", len(data))
return fmt.Errorf("wrong data length: %d", len(data))
}
offset = util.BytesToUint32(data[0:4])
size = util.BytesToUint32(data[4:8])
return nil return nil
}) })
if err != nil || len(data) != 8 {
if err != nil {
return nil, false return nil, false
} }
offset := util.BytesToUint32(data[0:4])
size := util.BytesToUint32(data[4:8])
return &needle.NeedleValue{Key: needle.Key(key), Offset: offset, Size: size}, true return &needle.NeedleValue{Key: needle.Key(key), Offset: offset, Size: size}, true
} }

Loading…
Cancel
Save