diff options
| author | j.laycock <joseph.laycock@4sightimaging.com> | 2019-08-28 14:48:06 +0100 |
|---|---|---|
| committer | j.laycock <joseph.laycock@4sightimaging.com> | 2019-08-30 12:30:00 +0100 |
| commit | 0e5d3b1a705a902a1876139b585d5b2922a92ce4 (patch) | |
| tree | ad6fc5ecdba3198dcd9398719d383259c8ba0dfe /weed/storage/volume_super_block.go | |
| parent | 36bde84000e81fb811ba8605b39057b915f6cad3 (diff) | |
| download | seaweedfs-0e5d3b1a705a902a1876139b585d5b2922a92ce4.tar.xz seaweedfs-0e5d3b1a705a902a1876139b585d5b2922a92ce4.zip | |
Move memory_map_windows to new folder, intercept most of the read and write calls to volume dat files
Diffstat (limited to 'weed/storage/volume_super_block.go')
| -rw-r--r-- | weed/storage/volume_super_block.go | 67 |
1 files changed, 46 insertions, 21 deletions
diff --git a/weed/storage/volume_super_block.go b/weed/storage/volume_super_block.go index 164c887e1..9ef615cb3 100644 --- a/weed/storage/volume_super_block.go +++ b/weed/storage/volume_super_block.go @@ -4,6 +4,8 @@ import ( "fmt" "os" + "github.com/joeslay/seaweedfs/weed/storage/memory_map" + "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/master_pb" "github.com/chrislusf/seaweedfs/weed/storage/needle" @@ -70,24 +72,34 @@ func (s *SuperBlock) Bytes() []byte { } func (v *Volume) maybeWriteSuperBlock() error { - stat, e := v.dataFile.Stat() - if e != nil { - glog.V(0).Infof("failed to stat datafile %s: %v", v.dataFile.Name(), e) - return e - } - if stat.Size() == 0 { - v.SuperBlock.version = needle.CurrentVersion - _, e = v.dataFile.Write(v.SuperBlock.Bytes()) - if e != nil && os.IsPermission(e) { - //read-only, but zero length - recreate it! - if v.dataFile, e = os.Create(v.dataFile.Name()); e == nil { - if _, e = v.dataFile.Write(v.SuperBlock.Bytes()); e == nil { - v.readOnly = false + + mem_map, exists := memory_map.FileMemoryMap[v.FileName()] + if exists { + if mem_map.End_Of_File == -1 { + v.SuperBlock.version = needle.CurrentVersion + memory_map.WriteMemory(mem_map, 0, uint64(len(v.SuperBlock.Bytes())), v.SuperBlock.Bytes()) + } + return nil + } else { + stat, e := v.dataFile.Stat() + if e != nil { + glog.V(0).Infof("failed to stat datafile %s: %v", v.dataFile.Name(), e) + return e + } + if stat.Size() == 0 { + v.SuperBlock.version = needle.CurrentVersion + _, e = v.dataFile.Write(v.SuperBlock.Bytes()) + if e != nil && os.IsPermission(e) { + //read-only, but zero length - recreate it! + if v.dataFile, e = os.Create(v.dataFile.Name()); e == nil { + if _, e = v.dataFile.Write(v.SuperBlock.Bytes()); e == nil { + v.readOnly = false + } } } } + return e } - return e } func (v *Volume) readSuperBlock() (err error) { @@ -97,15 +109,28 @@ func (v *Volume) readSuperBlock() (err error) { // ReadSuperBlock reads from data file and load it into volume's super block func ReadSuperBlock(dataFile *os.File) (superBlock SuperBlock, err error) { - if _, err = dataFile.Seek(0, 0); err != nil { - err = fmt.Errorf("cannot seek to the beginning of %s: %v", dataFile.Name(), err) - return - } + header := make([]byte, _SuperBlockSize) - if _, e := dataFile.Read(header); e != nil { - err = fmt.Errorf("cannot read volume %s super block: %v", dataFile.Name(), e) - return + mem_map, exists := memory_map.FileMemoryMap[dataFile.Name()] + if exists { + mem_buffer, e := memory_map.ReadMemory(mem_map, 0, _SuperBlockSize) + if err != nil { + err = fmt.Errorf("cannot read volume %s super block: %v", dataFile.Name(), e) + return + } + copy(header, mem_buffer.Buffer) + memory_map.ReleaseMemory(mem_buffer) + } else { + if _, err = dataFile.Seek(0, 0); err != nil { + err = fmt.Errorf("cannot seek to the beginning of %s: %v", dataFile.Name(), err) + return + } + if _, e := dataFile.Read(header); e != nil { + err = fmt.Errorf("cannot read volume %s super block: %v", dataFile.Name(), e) + return + } } + superBlock.version = needle.Version(header[0]) if superBlock.ReplicaPlacement, err = NewReplicaPlacementFromByte(header[1]); err != nil { err = fmt.Errorf("cannot read replica type: %s", err.Error()) |
