diff options
| author | Chris Lu <chris.lu@gmail.com> | 2018-06-24 15:19:57 -0700 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2018-06-24 15:19:57 -0700 |
| commit | f339e9c2846fca06e85345077c0cdb7ed4ba8cca (patch) | |
| tree | 5634b6be38856af2d8843fb61cfe8ace51345823 /weed/storage/volume_super_block.go | |
| parent | 03a0def4c34d32fe0ed650163fa453016e986138 (diff) | |
| download | seaweedfs-f339e9c2846fca06e85345077c0cdb7ed4ba8cca.tar.xz seaweedfs-f339e9c2846fca06e85345077c0cdb7ed4ba8cca.zip | |
add support for extra super block info
Diffstat (limited to 'weed/storage/volume_super_block.go')
| -rw-r--r-- | weed/storage/volume_super_block.go | 56 |
1 files changed, 45 insertions, 11 deletions
diff --git a/weed/storage/volume_super_block.go b/weed/storage/volume_super_block.go index b15b848bd..5d62aff5f 100644 --- a/weed/storage/volume_super_block.go +++ b/weed/storage/volume_super_block.go @@ -5,7 +5,9 @@ import ( "os" "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/pb/master_pb" "github.com/chrislusf/seaweedfs/weed/util" + "github.com/golang/protobuf/proto" ) const ( @@ -25,9 +27,15 @@ type SuperBlock struct { ReplicaPlacement *ReplicaPlacement Ttl *TTL CompactRevision uint16 + Extra *master_pb.SuperBlockExtra + extraSize uint16 } func (s *SuperBlock) BlockSize() int { + switch version { + case Version2: + return _SuperBlockSize + int(s.extraSize) + } return _SuperBlockSize } @@ -40,6 +48,22 @@ func (s *SuperBlock) Bytes() []byte { header[1] = s.ReplicaPlacement.Byte() s.Ttl.ToBytes(header[2:4]) util.Uint16toBytes(header[4:6], s.CompactRevision) + + if s.Extra != nil { + extraData, err := proto.Marshal(s.Extra) + if err != nil { + glog.Fatalf("cannot marshal super block extra %+v: %v", s.Extra, err) + } + extraSize := len(extraData) + if extraSize > 256*256 { + glog.Fatalf("super block extra size is %d bigger than %d: %v", extraSize, 256*256) + } + s.extraSize = uint16(extraSize) + util.Uint16toBytes(header[6:8], s.extraSize) + + header = append(header, extraData...) + } + return header } @@ -69,16 +93,6 @@ func (v *Volume) readSuperBlock() (err error) { return err } -func parseSuperBlock(header []byte) (superBlock SuperBlock, err error) { - superBlock.version = Version(header[0]) - if superBlock.ReplicaPlacement, err = NewReplicaPlacementFromByte(header[1]); err != nil { - err = fmt.Errorf("cannot read replica type: %s", err.Error()) - } - superBlock.Ttl = LoadTTLFromBytes(header[2:4]) - superBlock.CompactRevision = util.BytesToUint16(header[4:6]) - return -} - // 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 { @@ -90,5 +104,25 @@ func ReadSuperBlock(dataFile *os.File) (superBlock SuperBlock, err error) { err = fmt.Errorf("cannot read volume %s super block: %v", dataFile.Name(), e) return } - return parseSuperBlock(header) + superBlock.version = Version(header[0]) + if superBlock.ReplicaPlacement, err = NewReplicaPlacementFromByte(header[1]); err != nil { + err = fmt.Errorf("cannot read replica type: %s", err.Error()) + return + } + superBlock.Ttl = LoadTTLFromBytes(header[2:4]) + superBlock.CompactRevision = util.BytesToUint16(header[4:6]) + superBlock.extraSize = util.BytesToUint16(header[6:8]) + + if superBlock.extraSize > 0 { + // read more + extraData := make([]byte, int(superBlock.extraSize)) + superBlock.Extra = &master_pb.SuperBlockExtra{} + err = proto.Unmarshal(extraData, superBlock.Extra) + if err != nil { + err = fmt.Errorf("cannot read volume %s super block extra: %v", dataFile.Name(), e) + return + } + } + + return } |
