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

View file

@ -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
}

View file

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