mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2025-09-19 16:17:58 +08:00
refactor volume_loading.go out of volume.go
This commit is contained in:
@@ -39,13 +39,6 @@ func (v *Volume) String() string {
|
|||||||
return fmt.Sprintf("Id:%v, dir:%s, Collection:%s, dataFile:%v, nm:%v, readOnly:%v", v.Id, v.dir, v.Collection, v.dataFile, v.nm, v.readOnly)
|
return fmt.Sprintf("Id:%v, dir:%s, Collection:%s, dataFile:%v, nm:%v, readOnly:%v", v.Id, v.dir, v.Collection, v.dataFile, v.nm, v.readOnly)
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadVolumeWithoutIndex(dirname string, collection string, id VolumeId, needleMapKind NeedleMapType) (v *Volume, e error) {
|
|
||||||
v = &Volume{dir: dirname, Collection: collection, Id: id}
|
|
||||||
v.SuperBlock = SuperBlock{}
|
|
||||||
v.needleMapKind = needleMapKind
|
|
||||||
e = v.load(false, false, needleMapKind)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
func (v *Volume) FileName() (fileName string) {
|
func (v *Volume) FileName() (fileName string) {
|
||||||
if v.Collection == "" {
|
if v.Collection == "" {
|
||||||
fileName = path.Join(v.dir, v.Id.String())
|
fileName = path.Join(v.dir, v.Id.String())
|
||||||
@@ -57,81 +50,11 @@ func (v *Volume) FileName() (fileName string) {
|
|||||||
func (v *Volume) DataFile() *os.File {
|
func (v *Volume) DataFile() *os.File {
|
||||||
return v.dataFile
|
return v.dataFile
|
||||||
}
|
}
|
||||||
func (v *Volume) load(alsoLoadIndex bool, createDatIfMissing bool, needleMapKind NeedleMapType) error {
|
|
||||||
var e error
|
|
||||||
fileName := v.FileName()
|
|
||||||
|
|
||||||
if exists, canRead, canWrite, modifiedTime := checkFile(fileName + ".dat"); exists {
|
|
||||||
if !canRead {
|
|
||||||
return fmt.Errorf("cannot read Volume Data file %s.dat", fileName)
|
|
||||||
}
|
|
||||||
if canWrite {
|
|
||||||
v.dataFile, e = os.OpenFile(fileName+".dat", os.O_RDWR|os.O_CREATE, 0644)
|
|
||||||
v.lastModifiedTime = uint64(modifiedTime.Unix())
|
|
||||||
} else {
|
|
||||||
glog.V(0).Infoln("opening " + fileName + ".dat in READONLY mode")
|
|
||||||
v.dataFile, e = os.Open(fileName + ".dat")
|
|
||||||
v.readOnly = true
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if createDatIfMissing {
|
|
||||||
v.dataFile, e = os.OpenFile(fileName+".dat", os.O_RDWR|os.O_CREATE, 0644)
|
|
||||||
} else {
|
|
||||||
return fmt.Errorf("Volume Data file %s.dat does not exist.", fileName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if e != nil {
|
|
||||||
if !os.IsPermission(e) {
|
|
||||||
return fmt.Errorf("cannot load Volume Data %s.dat: %v", fileName, e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if v.ReplicaPlacement == nil {
|
|
||||||
e = v.readSuperBlock()
|
|
||||||
} else {
|
|
||||||
e = v.maybeWriteSuperBlock()
|
|
||||||
}
|
|
||||||
if e == nil && alsoLoadIndex {
|
|
||||||
var indexFile *os.File
|
|
||||||
if v.readOnly {
|
|
||||||
glog.V(1).Infoln("open to read file", fileName+".idx")
|
|
||||||
if indexFile, e = os.OpenFile(fileName+".idx", os.O_RDONLY, 0644); e != nil {
|
|
||||||
return fmt.Errorf("cannot read Volume Index %s.idx: %v", fileName, e)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
glog.V(1).Infoln("open to write file", fileName+".idx")
|
|
||||||
if indexFile, e = os.OpenFile(fileName+".idx", os.O_RDWR|os.O_CREATE, 0644); e != nil {
|
|
||||||
return fmt.Errorf("cannot write Volume Index %s.idx: %v", fileName, e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if e = CheckVolumeDataIntegrity(v, indexFile); e != nil {
|
|
||||||
v.readOnly = true
|
|
||||||
glog.V(0).Infof("volumeDataIntegrityChecking failed %v", e)
|
|
||||||
}
|
|
||||||
switch needleMapKind {
|
|
||||||
case NeedleMapInMemory:
|
|
||||||
glog.V(0).Infoln("loading index file", fileName+".idx", "readonly", v.readOnly)
|
|
||||||
if v.nm, e = LoadNeedleMap(indexFile); e != nil {
|
|
||||||
glog.V(0).Infof("loading index %s error: %v", fileName+".idx", e)
|
|
||||||
}
|
|
||||||
case NeedleMapLevelDb:
|
|
||||||
glog.V(0).Infoln("loading leveldb file", fileName+".ldb")
|
|
||||||
if v.nm, e = NewLevelDbNeedleMap(fileName+".ldb", indexFile); e != nil {
|
|
||||||
glog.V(0).Infof("loading leveldb %s error: %v", fileName+".ldb", e)
|
|
||||||
}
|
|
||||||
case NeedleMapBoltDb:
|
|
||||||
glog.V(0).Infoln("loading boltdb file", fileName+".bdb")
|
|
||||||
if v.nm, e = NewBoltDbNeedleMap(fileName+".bdb", indexFile); e != nil {
|
|
||||||
glog.V(0).Infof("loading boltdb %s error: %v", fileName+".bdb", e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return e
|
|
||||||
}
|
|
||||||
func (v *Volume) Version() Version {
|
func (v *Volume) Version() Version {
|
||||||
return v.SuperBlock.Version()
|
return v.SuperBlock.Version()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Volume) Size() int64 {
|
func (v *Volume) Size() int64 {
|
||||||
stat, e := v.dataFile.Stat()
|
stat, e := v.dataFile.Stat()
|
||||||
if e == nil {
|
if e == nil {
|
||||||
|
89
weed/storage/volume_loading.go
Normal file
89
weed/storage/volume_loading.go
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/chrislusf/seaweedfs/weed/glog"
|
||||||
|
)
|
||||||
|
|
||||||
|
func loadVolumeWithoutIndex(dirname string, collection string, id VolumeId, needleMapKind NeedleMapType) (v *Volume, e error) {
|
||||||
|
v = &Volume{dir: dirname, Collection: collection, Id: id}
|
||||||
|
v.SuperBlock = SuperBlock{}
|
||||||
|
v.needleMapKind = needleMapKind
|
||||||
|
e = v.load(false, false, needleMapKind)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *Volume) load(alsoLoadIndex bool, createDatIfMissing bool, needleMapKind NeedleMapType) error {
|
||||||
|
var e error
|
||||||
|
fileName := v.FileName()
|
||||||
|
|
||||||
|
if exists, canRead, canWrite, modifiedTime := checkFile(fileName + ".dat"); exists {
|
||||||
|
if !canRead {
|
||||||
|
return fmt.Errorf("cannot read Volume Data file %s.dat", fileName)
|
||||||
|
}
|
||||||
|
if canWrite {
|
||||||
|
v.dataFile, e = os.OpenFile(fileName+".dat", os.O_RDWR|os.O_CREATE, 0644)
|
||||||
|
v.lastModifiedTime = uint64(modifiedTime.Unix())
|
||||||
|
} else {
|
||||||
|
glog.V(0).Infoln("opening " + fileName + ".dat in READONLY mode")
|
||||||
|
v.dataFile, e = os.Open(fileName + ".dat")
|
||||||
|
v.readOnly = true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if createDatIfMissing {
|
||||||
|
v.dataFile, e = os.OpenFile(fileName+".dat", os.O_RDWR|os.O_CREATE, 0644)
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("Volume Data file %s.dat does not exist.", fileName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if e != nil {
|
||||||
|
if !os.IsPermission(e) {
|
||||||
|
return fmt.Errorf("cannot load Volume Data %s.dat: %v", fileName, e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if v.ReplicaPlacement == nil {
|
||||||
|
e = v.readSuperBlock()
|
||||||
|
} else {
|
||||||
|
e = v.maybeWriteSuperBlock()
|
||||||
|
}
|
||||||
|
if e == nil && alsoLoadIndex {
|
||||||
|
var indexFile *os.File
|
||||||
|
if v.readOnly {
|
||||||
|
glog.V(1).Infoln("open to read file", fileName+".idx")
|
||||||
|
if indexFile, e = os.OpenFile(fileName+".idx", os.O_RDONLY, 0644); e != nil {
|
||||||
|
return fmt.Errorf("cannot read Volume Index %s.idx: %v", fileName, e)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
glog.V(1).Infoln("open to write file", fileName+".idx")
|
||||||
|
if indexFile, e = os.OpenFile(fileName+".idx", os.O_RDWR|os.O_CREATE, 0644); e != nil {
|
||||||
|
return fmt.Errorf("cannot write Volume Index %s.idx: %v", fileName, e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if e = CheckVolumeDataIntegrity(v, indexFile); e != nil {
|
||||||
|
v.readOnly = true
|
||||||
|
glog.V(0).Infof("volumeDataIntegrityChecking failed %v", e)
|
||||||
|
}
|
||||||
|
switch needleMapKind {
|
||||||
|
case NeedleMapInMemory:
|
||||||
|
glog.V(0).Infoln("loading index file", fileName+".idx", "readonly", v.readOnly)
|
||||||
|
if v.nm, e = LoadNeedleMap(indexFile); e != nil {
|
||||||
|
glog.V(0).Infof("loading index %s error: %v", fileName+".idx", e)
|
||||||
|
}
|
||||||
|
case NeedleMapLevelDb:
|
||||||
|
glog.V(0).Infoln("loading leveldb file", fileName+".ldb")
|
||||||
|
if v.nm, e = NewLevelDbNeedleMap(fileName+".ldb", indexFile); e != nil {
|
||||||
|
glog.V(0).Infof("loading leveldb %s error: %v", fileName+".ldb", e)
|
||||||
|
}
|
||||||
|
case NeedleMapBoltDb:
|
||||||
|
glog.V(0).Infoln("loading boltdb file", fileName+".bdb")
|
||||||
|
if v.nm, e = NewBoltDbNeedleMap(fileName+".bdb", indexFile); e != nil {
|
||||||
|
glog.V(0).Infof("loading boltdb %s error: %v", fileName+".bdb", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return e
|
||||||
|
}
|
Reference in New Issue
Block a user