add support for extra super block info

This commit is contained in:
Chris Lu 2018-06-24 15:19:57 -07:00
parent 03a0def4c3
commit f339e9c284
4 changed files with 96 additions and 48 deletions

View file

@ -13,6 +13,7 @@ It has these top-level messages:
HeartbeatResponse HeartbeatResponse
VolumeInformationMessage VolumeInformationMessage
Empty Empty
SuperBlockExtra
*/ */
package master_pb package master_pb
@ -244,11 +245,20 @@ func (m *Empty) String() string { return proto.CompactTextString(m) }
func (*Empty) ProtoMessage() {} func (*Empty) ProtoMessage() {}
func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
type SuperBlockExtra struct {
}
func (m *SuperBlockExtra) Reset() { *m = SuperBlockExtra{} }
func (m *SuperBlockExtra) String() string { return proto.CompactTextString(m) }
func (*SuperBlockExtra) ProtoMessage() {}
func (*SuperBlockExtra) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
func init() { func init() {
proto.RegisterType((*Heartbeat)(nil), "master_pb.Heartbeat") proto.RegisterType((*Heartbeat)(nil), "master_pb.Heartbeat")
proto.RegisterType((*HeartbeatResponse)(nil), "master_pb.HeartbeatResponse") proto.RegisterType((*HeartbeatResponse)(nil), "master_pb.HeartbeatResponse")
proto.RegisterType((*VolumeInformationMessage)(nil), "master_pb.VolumeInformationMessage") proto.RegisterType((*VolumeInformationMessage)(nil), "master_pb.VolumeInformationMessage")
proto.RegisterType((*Empty)(nil), "master_pb.Empty") proto.RegisterType((*Empty)(nil), "master_pb.Empty")
proto.RegisterType((*SuperBlockExtra)(nil), "master_pb.SuperBlockExtra")
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -423,39 +433,40 @@ var _Seaweed_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("seaweed.proto", fileDescriptor0) } func init() { proto.RegisterFile("seaweed.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{ var fileDescriptor0 = []byte{
// 540 bytes of a gzipped FileDescriptorProto // 553 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x74, 0x93, 0xcf, 0x6e, 0xd3, 0x4e, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x74, 0x93, 0xdf, 0x6e, 0xd3, 0x30,
0x10, 0xc7, 0x7f, 0x76, 0xdd, 0xa4, 0x9e, 0x34, 0xfd, 0xa5, 0x2b, 0x84, 0xac, 0x52, 0x20, 0x84, 0x14, 0xc6, 0x49, 0x96, 0xb5, 0xcb, 0xd9, 0xba, 0x75, 0x16, 0x42, 0xd1, 0x18, 0x50, 0xc2, 0x4d,
0x8b, 0x25, 0x50, 0x84, 0xca, 0x89, 0x03, 0x17, 0x22, 0x10, 0x55, 0x40, 0x54, 0x8e, 0xe0, 0x6a, 0x24, 0xd0, 0x84, 0xc6, 0x15, 0x17, 0xdc, 0x6c, 0x1a, 0x62, 0x1a, 0x88, 0x29, 0x15, 0xdc, 0x46,
0x6d, 0xec, 0x29, 0x5a, 0x75, 0xbd, 0xb6, 0x76, 0x37, 0x25, 0xee, 0x4b, 0xf0, 0x24, 0xbc, 0x05, 0x6e, 0x72, 0x86, 0xac, 0x39, 0xb6, 0xe5, 0xb8, 0xa3, 0xd9, 0x4b, 0xf0, 0x24, 0xbc, 0x05, 0x0f,
0x0f, 0x86, 0x76, 0x36, 0x4e, 0x22, 0xfe, 0xdc, 0x66, 0x3f, 0xf3, 0x1d, 0xcf, 0x78, 0xbe, 0xbb, 0x86, 0x7c, 0xd2, 0xb4, 0x15, 0x7f, 0xee, 0xec, 0xdf, 0xf9, 0x4e, 0xfc, 0xe5, 0x7c, 0x36, 0x8c,
0x30, 0x34, 0xc8, 0xbf, 0x21, 0x96, 0xd3, 0x46, 0xd7, 0xb6, 0x66, 0x71, 0xc5, 0x8d, 0x45, 0x9d, 0x1a, 0xe4, 0xdf, 0x11, 0xab, 0x13, 0x63, 0xb5, 0xd3, 0x2c, 0xae, 0x79, 0xe3, 0xd0, 0x16, 0x66,
0x37, 0xcb, 0xc9, 0x8f, 0x10, 0xe2, 0xf7, 0xc8, 0xb5, 0x5d, 0x22, 0xb7, 0xec, 0x04, 0x42, 0xd1, 0x96, 0xfe, 0x0c, 0x21, 0xfe, 0x80, 0xdc, 0xba, 0x19, 0x72, 0xc7, 0xf6, 0x21, 0x14, 0x26, 0x09,
0x24, 0xc1, 0x38, 0x48, 0xe3, 0x2c, 0x14, 0x0d, 0x63, 0x10, 0x35, 0xb5, 0xb6, 0x49, 0x38, 0x0e, 0x26, 0x41, 0x16, 0xe7, 0xa1, 0x30, 0x8c, 0x41, 0x64, 0xb4, 0x75, 0x49, 0x38, 0x09, 0xb2, 0x51,
0xd2, 0x61, 0x46, 0x31, 0x7b, 0x08, 0xd0, 0xac, 0x96, 0x52, 0x14, 0xf9, 0x4a, 0xcb, 0xe4, 0x80, 0x4e, 0x6b, 0xf6, 0x04, 0xc0, 0xcc, 0x67, 0x52, 0x94, 0xc5, 0xdc, 0xca, 0x64, 0x8b, 0xb4, 0x71,
0xb4, 0xb1, 0x27, 0x9f, 0xb5, 0x64, 0x29, 0x8c, 0x2a, 0xbe, 0xce, 0x6f, 0x6b, 0xb9, 0xaa, 0x30, 0x47, 0xbe, 0x58, 0xc9, 0x32, 0x18, 0xd7, 0x7c, 0x51, 0xdc, 0x69, 0x39, 0xaf, 0xb1, 0x28, 0xf5,
0x2f, 0xea, 0x95, 0xb2, 0x49, 0x44, 0xe5, 0x27, 0x15, 0x5f, 0x7f, 0x21, 0x3c, 0x73, 0x94, 0x8d, 0x5c, 0xb9, 0x24, 0xa2, 0xf6, 0xfd, 0x9a, 0x2f, 0xbe, 0x12, 0x3e, 0xf7, 0x94, 0x4d, 0x60, 0xcf,
0xe1, 0xd8, 0x29, 0xaf, 0x85, 0xc4, 0xfc, 0x06, 0xdb, 0xe4, 0x70, 0x1c, 0xa4, 0x51, 0x06, 0x15, 0x2b, 0x6f, 0x84, 0xc4, 0xe2, 0x16, 0xdb, 0x64, 0x7b, 0x12, 0x64, 0x51, 0x0e, 0x35, 0x5f, 0xbc,
0x5f, 0xbf, 0x13, 0x12, 0xe7, 0xd8, 0xb2, 0xc7, 0x30, 0x28, 0xb9, 0xe5, 0x79, 0x81, 0xca, 0xa2, 0x17, 0x12, 0xaf, 0xb0, 0x65, 0xcf, 0x60, 0xb7, 0xe2, 0x8e, 0x17, 0x25, 0x2a, 0x87, 0x36, 0x19,
0x4e, 0x7a, 0xd4, 0x0b, 0x1c, 0x9a, 0x11, 0x71, 0xf3, 0x69, 0x5e, 0xdc, 0x24, 0x7d, 0xca, 0x50, 0xd0, 0x59, 0xe0, 0xd1, 0x39, 0x11, 0xef, 0xcf, 0xf2, 0xf2, 0x36, 0x19, 0x52, 0x85, 0xd6, 0xde,
0xec, 0xe6, 0xe3, 0x65, 0x25, 0x54, 0x4e, 0x93, 0x1f, 0x51, 0xeb, 0x98, 0xc8, 0x95, 0x1b, 0xff, 0x1f, 0xaf, 0x6a, 0xa1, 0x0a, 0x72, 0xbe, 0x43, 0x47, 0xc7, 0x44, 0xae, 0xbd, 0xfd, 0x77, 0x30,
0x35, 0xf4, 0xfd, 0x6c, 0x26, 0x89, 0xc7, 0x07, 0xe9, 0xe0, 0xe2, 0xe9, 0x74, 0xbb, 0x8d, 0xa9, 0xec, 0xbc, 0x35, 0x49, 0x3c, 0xd9, 0xca, 0x76, 0x4f, 0x5f, 0x9c, 0xac, 0xa6, 0x71, 0xd2, 0xd9,
0x1f, 0xef, 0x52, 0x5d, 0xd7, 0xba, 0xe2, 0x56, 0xd4, 0xea, 0x23, 0x1a, 0xc3, 0xbf, 0x62, 0xd6, 0xbb, 0x54, 0x37, 0xda, 0xd6, 0xdc, 0x09, 0xad, 0x3e, 0x61, 0xd3, 0xf0, 0x6f, 0x98, 0xf7, 0x3d,
0xd5, 0x4c, 0x0c, 0x9c, 0x6e, 0xd7, 0x95, 0xa1, 0x69, 0x6a, 0x65, 0x90, 0xa5, 0xf0, 0xbf, 0xcf, 0x69, 0x03, 0x87, 0xab, 0x71, 0xe5, 0xd8, 0x18, 0xad, 0x1a, 0x64, 0x19, 0x1c, 0x74, 0xf5, 0xa9,
0x2f, 0xc4, 0x1d, 0x7e, 0x10, 0x95, 0xb0, 0xb4, 0xc3, 0x28, 0xfb, 0x1d, 0xb3, 0x73, 0x88, 0x0d, 0xb8, 0xc7, 0x8f, 0xa2, 0x16, 0x8e, 0x66, 0x18, 0xe5, 0x7f, 0x62, 0x76, 0x0c, 0x71, 0x83, 0xa5,
0x16, 0x1a, 0xed, 0x1c, 0x5b, 0xda, 0x6a, 0x9c, 0xed, 0x00, 0xbb, 0x0f, 0x3d, 0x89, 0xbc, 0x44, 0x45, 0x77, 0x85, 0x2d, 0x4d, 0x35, 0xce, 0xd7, 0x80, 0x3d, 0x82, 0x81, 0x44, 0x5e, 0xa1, 0x5d,
0xbd, 0x59, 0xeb, 0xe6, 0x34, 0xf9, 0x19, 0x42, 0xf2, 0xaf, 0xd1, 0xc8, 0xb3, 0x92, 0xfa, 0x0d, 0x8e, 0x75, 0xb9, 0x4b, 0x7f, 0x85, 0x90, 0xfc, 0xcf, 0x1a, 0x65, 0x56, 0xd1, 0x79, 0xa3, 0x3c,
0xb3, 0x50, 0x94, 0x6e, 0x27, 0x46, 0xdc, 0x21, 0x7d, 0x3d, 0xca, 0x28, 0x66, 0x8f, 0x00, 0x8a, 0x14, 0x95, 0x9f, 0x49, 0x23, 0xee, 0x91, 0xbe, 0x1e, 0xe5, 0xb4, 0x66, 0x4f, 0x01, 0x4a, 0x2d,
0x5a, 0x4a, 0x2c, 0x5c, 0xe1, 0xe6, 0xe3, 0x7b, 0xc4, 0xed, 0x8c, 0x6c, 0xd8, 0xd9, 0x15, 0x65, 0x25, 0x96, 0xbe, 0x71, 0xf9, 0xf1, 0x0d, 0xe2, 0x67, 0x46, 0x31, 0xac, 0xe3, 0x8a, 0xf2, 0xd8,
0xb1, 0x23, 0xde, 0xa9, 0x27, 0x70, 0x5c, 0xa2, 0x44, 0xdb, 0x09, 0xbc, 0x53, 0x03, 0xcf, 0xbc, 0x93, 0x2e, 0xa9, 0xe7, 0xb0, 0x57, 0xa1, 0x44, 0xd7, 0x0b, 0xba, 0xa4, 0x76, 0x3b, 0xd6, 0x49,
0xe4, 0x39, 0x30, 0x7f, 0x2c, 0xf3, 0x65, 0xbb, 0x15, 0xf6, 0x48, 0x38, 0xda, 0x64, 0xde, 0xb4, 0x5e, 0x01, 0xeb, 0xb6, 0x55, 0x31, 0x6b, 0x57, 0xc2, 0x01, 0x09, 0xc7, 0xcb, 0xca, 0x59, 0xdb,
0x9d, 0xfa, 0x01, 0xc4, 0x1a, 0x79, 0x99, 0xd7, 0x4a, 0xb6, 0x64, 0xde, 0x51, 0x76, 0xe4, 0xc0, 0xab, 0x1f, 0x43, 0x6c, 0x91, 0x57, 0x85, 0x56, 0xb2, 0xa5, 0xf0, 0x76, 0xf2, 0x1d, 0x0f, 0x3e,
0x27, 0x25, 0x5b, 0xf6, 0x0c, 0x4e, 0x35, 0x36, 0x52, 0x14, 0x3c, 0x6f, 0x24, 0x2f, 0xb0, 0x42, 0x2b, 0xd9, 0xb2, 0x97, 0x70, 0x68, 0xd1, 0x48, 0x51, 0xf2, 0xc2, 0x48, 0x5e, 0x62, 0x8d, 0xaa,
0xd5, 0xf9, 0x38, 0xda, 0x24, 0xae, 0x3a, 0xce, 0x12, 0xe8, 0xdf, 0xa2, 0x36, 0xee, 0xb7, 0x62, 0xcf, 0x71, 0xbc, 0x2c, 0x5c, 0xf7, 0x9c, 0x25, 0x30, 0xbc, 0x43, 0xdb, 0xf8, 0xdf, 0x8a, 0x49,
0x92, 0x74, 0x47, 0x36, 0x82, 0x03, 0x6b, 0x65, 0x02, 0x44, 0x5d, 0x38, 0xe9, 0xc3, 0xe1, 0xdb, 0xd2, 0x6f, 0xd9, 0x18, 0xb6, 0x9c, 0x93, 0x09, 0x10, 0xf5, 0xcb, 0x74, 0x08, 0xdb, 0x17, 0xb5,
0xaa, 0xb1, 0xed, 0xc5, 0xf7, 0x00, 0xfa, 0x0b, 0xff, 0x22, 0xd8, 0x25, 0x0c, 0x17, 0xa8, 0xca, 0x71, 0x6d, 0x7a, 0x08, 0x07, 0xd3, 0xb9, 0x41, 0x7b, 0x26, 0x75, 0x79, 0x7b, 0xb1, 0x70, 0x96,
0xdd, 0x1b, 0xb8, 0xb7, 0x77, 0x1f, 0xb6, 0xf4, 0xec, 0xfc, 0x6f, 0xb4, 0xbb, 0x00, 0x93, 0xff, 0x9f, 0xfe, 0x08, 0x60, 0x38, 0xed, 0x1e, 0x09, 0xbb, 0x84, 0xd1, 0x14, 0x55, 0xb5, 0x7e, 0x16,
0xd2, 0xe0, 0x45, 0xc0, 0x5e, 0xc1, 0x70, 0x8e, 0xd8, 0xcc, 0x6a, 0xa5, 0xb0, 0xb0, 0x58, 0xb2, 0x0f, 0x37, 0xae, 0xc8, 0x8a, 0x1e, 0x1d, 0xff, 0x8b, 0xf6, 0x77, 0x22, 0x7d, 0x90, 0x05, 0xaf,
0xd1, 0x5e, 0x11, 0x75, 0x3e, 0xfb, 0x83, 0xf8, 0xd2, 0x65, 0x8f, 0x1e, 0xe6, 0xcb, 0x5f, 0x01, 0x03, 0xf6, 0x16, 0x46, 0x57, 0x88, 0xe6, 0x5c, 0x2b, 0x85, 0xa5, 0xc3, 0x8a, 0x8d, 0x37, 0x9a,
0x00, 0x00, 0xff, 0xff, 0x41, 0x64, 0x8a, 0xd9, 0xa9, 0x03, 0x00, 0x00, 0xc8, 0xcc, 0xd1, 0x5f, 0xa4, 0x6b, 0x9d, 0x0d, 0xe8, 0xad, 0xbe, 0xf9, 0x1d, 0x00, 0x00, 0xff,
0xff, 0x29, 0x21, 0x59, 0xcb, 0xbc, 0x03, 0x00, 0x00,
} }

View file

@ -46,3 +46,6 @@ message VolumeInformationMessage {
message Empty { message Empty {
} }
message SuperBlockExtra {
}

View file

@ -5,7 +5,9 @@ import (
"os" "os"
"github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/glog"
"github.com/chrislusf/seaweedfs/weed/pb/master_pb"
"github.com/chrislusf/seaweedfs/weed/util" "github.com/chrislusf/seaweedfs/weed/util"
"github.com/golang/protobuf/proto"
) )
const ( const (
@ -25,9 +27,15 @@ type SuperBlock struct {
ReplicaPlacement *ReplicaPlacement ReplicaPlacement *ReplicaPlacement
Ttl *TTL Ttl *TTL
CompactRevision uint16 CompactRevision uint16
Extra *master_pb.SuperBlockExtra
extraSize uint16
} }
func (s *SuperBlock) BlockSize() int { func (s *SuperBlock) BlockSize() int {
switch version {
case Version2:
return _SuperBlockSize + int(s.extraSize)
}
return _SuperBlockSize return _SuperBlockSize
} }
@ -40,6 +48,22 @@ func (s *SuperBlock) Bytes() []byte {
header[1] = s.ReplicaPlacement.Byte() header[1] = s.ReplicaPlacement.Byte()
s.Ttl.ToBytes(header[2:4]) s.Ttl.ToBytes(header[2:4])
util.Uint16toBytes(header[4:6], s.CompactRevision) 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 return header
} }
@ -69,16 +93,6 @@ func (v *Volume) readSuperBlock() (err error) {
return err 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 // ReadSuperBlock reads from data file and load it into volume's super block
func ReadSuperBlock(dataFile *os.File) (superBlock SuperBlock, err error) { func ReadSuperBlock(dataFile *os.File) (superBlock SuperBlock, err error) {
if _, err = dataFile.Seek(0, 0); err != nil { 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) err = fmt.Errorf("cannot read volume %s super block: %v", dataFile.Name(), e)
return 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
} }

View file

@ -1,10 +1,10 @@
package storage package storage
import ( import (
"testing"
"os"
"io/ioutil" "io/ioutil"
"math/rand" "math/rand"
"os"
"testing"
) )
/* /*