Merge "Add tests for vfile.py" into feature/losf

This commit is contained in:
Zuul 2019-10-05 03:14:05 +00:00 committed by Gerrit Code Review
commit dd8b12e2a8
10 changed files with 1577 additions and 444 deletions

View File

@ -336,14 +336,14 @@ func (m *VolumeIndex) GetRepairTool() bool {
} }
type Volume struct { type Volume struct {
VolumeIndex uint32 `protobuf:"varint,1,opt,name=volume_index,json=volumeIndex,proto3" json:"volume_index,omitempty"` VolumeIndex uint32 `protobuf:"varint,1,opt,name=volume_index,json=volumeIndex,proto3" json:"volume_index,omitempty"`
VolumeType uint32 `protobuf:"varint,2,opt,name=volume_type,json=volumeType,proto3" json:"volume_type,omitempty"` VolumeType VolumeType `protobuf:"varint,2,opt,name=volume_type,json=volumeType,proto3,enum=filemgr.VolumeType" json:"volume_type,omitempty"`
VolumeState uint32 `protobuf:"varint,3,opt,name=volume_state,json=volumeState,proto3" json:"volume_state,omitempty"` VolumeState uint32 `protobuf:"varint,3,opt,name=volume_state,json=volumeState,proto3" json:"volume_state,omitempty"`
Partition uint32 `protobuf:"varint,4,opt,name=partition,proto3" json:"partition,omitempty"` Partition uint32 `protobuf:"varint,4,opt,name=partition,proto3" json:"partition,omitempty"`
NextOffset uint64 `protobuf:"varint,5,opt,name=next_offset,json=nextOffset,proto3" json:"next_offset,omitempty"` NextOffset uint64 `protobuf:"varint,5,opt,name=next_offset,json=nextOffset,proto3" json:"next_offset,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
} }
func (m *Volume) Reset() { *m = Volume{} } func (m *Volume) Reset() { *m = Volume{} }
@ -378,11 +378,11 @@ func (m *Volume) GetVolumeIndex() uint32 {
return 0 return 0
} }
func (m *Volume) GetVolumeType() uint32 { func (m *Volume) GetVolumeType() VolumeType {
if m != nil { if m != nil {
return m.VolumeType return m.VolumeType
} }
return 0 return VolumeType_VOLUME_DEFAULT
} }
func (m *Volume) GetVolumeState() uint32 { func (m *Volume) GetVolumeState() uint32 {
@ -1680,70 +1680,70 @@ func init() {
func init() { proto.RegisterFile("fmgr.proto", fileDescriptor_1fcd0776e05e82a6) } func init() { proto.RegisterFile("fmgr.proto", fileDescriptor_1fcd0776e05e82a6) }
var fileDescriptor_1fcd0776e05e82a6 = []byte{ var fileDescriptor_1fcd0776e05e82a6 = []byte{
// 1039 bytes of a gzipped FileDescriptorProto // 1037 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0xdd, 0x6e, 0xe3, 0x44, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x56, 0xdd, 0x72, 0xdb, 0x44,
0x14, 0x5e, 0xe7, 0x7f, 0x4f, 0x7e, 0xea, 0x9d, 0x2d, 0x25, 0xb4, 0x40, 0x8b, 0xd1, 0xc2, 0x52, 0x14, 0x46, 0xb6, 0xfc, 0x93, 0xe3, 0x9f, 0xb8, 0xdb, 0x10, 0x4c, 0x02, 0xb4, 0x88, 0x01, 0x4a,
0xa4, 0x4a, 0x2c, 0x5c, 0x14, 0xb8, 0xca, 0xb6, 0xde, 0x52, 0x6d, 0x9a, 0x84, 0x89, 0xb7, 0x5b, 0x98, 0xc9, 0x0c, 0xa5, 0x17, 0x01, 0xae, 0x5c, 0xc7, 0x0d, 0x19, 0x12, 0xdb, 0xac, 0xd5, 0xb4,
0x24, 0x24, 0xcb, 0xa5, 0x93, 0xc6, 0xac, 0x63, 0x1b, 0xcf, 0x24, 0x6d, 0x7a, 0xc5, 0x7b, 0x70, 0xcc, 0x30, 0xa3, 0x51, 0xc8, 0x3a, 0x11, 0x55, 0x24, 0x21, 0xad, 0xdd, 0xb8, 0x57, 0xbc, 0x07,
0x83, 0x78, 0x00, 0x1e, 0x89, 0x67, 0x41, 0xf3, 0x63, 0xc7, 0xb1, 0x43, 0xdb, 0x95, 0x56, 0xdc, 0x37, 0x0c, 0xaf, 0xc2, 0x7b, 0xf0, 0x2c, 0xec, 0x9f, 0x64, 0x59, 0x72, 0x63, 0x67, 0xa6, 0x37,
0x58, 0x3e, 0xdf, 0x9c, 0x99, 0xf9, 0xbe, 0x73, 0xce, 0xcc, 0x1c, 0x80, 0xd1, 0xe4, 0x32, 0xda, 0x9e, 0x3d, 0xdf, 0x1e, 0x9d, 0xfd, 0xbe, 0x73, 0x8e, 0x77, 0x0f, 0xc0, 0xf8, 0xfa, 0x32, 0xdc,
0x0b, 0xa3, 0x80, 0x05, 0xa8, 0x3a, 0x72, 0x3d, 0x32, 0xb9, 0x8c, 0x8c, 0xef, 0x01, 0x75, 0x5d, 0x0f, 0x42, 0x9f, 0xfa, 0xa8, 0x32, 0x76, 0x5c, 0xc2, 0x4c, 0xe3, 0x07, 0x40, 0x27, 0x4e, 0x44,
0xca, 0x06, 0x4e, 0xc4, 0x5c, 0xe6, 0x06, 0x3e, 0x3d, 0xf6, 0x47, 0x01, 0x7a, 0x02, 0xad, 0x30, 0x87, 0x76, 0x48, 0x1d, 0xea, 0xf8, 0x5e, 0x74, 0xec, 0x8d, 0x7d, 0xf4, 0x39, 0x34, 0x83, 0x18,
0x46, 0xec, 0x73, 0x97, 0xd1, 0xb6, 0xb6, 0xa3, 0x3d, 0x6d, 0xe2, 0x66, 0x82, 0x3e, 0x77, 0x19, 0xb1, 0xce, 0x1d, 0x1a, 0xb5, 0xb5, 0x87, 0xda, 0xa3, 0x06, 0x6e, 0x24, 0xe8, 0x53, 0x06, 0x1a,
0x35, 0xce, 0xe0, 0xd1, 0xd2, 0x64, 0x31, 0xf7, 0x43, 0x78, 0x98, 0x78, 0xa9, 0x69, 0x0b, 0x60, 0x2f, 0xe1, 0xde, 0xc2, 0xc7, 0xe2, 0xdb, 0x8f, 0x60, 0x23, 0xf1, 0x52, 0x9f, 0xcd, 0x81, 0x25,
0xc5, 0xca, 0x85, 0x55, 0x2b, 0x4f, 0xa0, 0xc5, 0x57, 0x1e, 0x4e, 0x47, 0x23, 0xf7, 0xfa, 0x1e, 0x91, 0x0b, 0xcb, 0x22, 0x5f, 0x43, 0x93, 0x47, 0x1e, 0x4d, 0xc6, 0x63, 0xe7, 0x66, 0x8d, 0xb0,
0xcb, 0x6e, 0x40, 0x85, 0x0a, 0x5f, 0xb1, 0x5c, 0x03, 0x2b, 0x6b, 0xc5, 0x76, 0xc5, 0x55, 0xdb, 0xdb, 0x50, 0x8e, 0x84, 0xaf, 0x08, 0x57, 0xc7, 0xca, 0x5a, 0x72, 0x5c, 0x71, 0xd9, 0x71, 0x06,
0x19, 0x00, 0x87, 0x6e, 0x64, 0xfa, 0x2c, 0x72, 0x09, 0x45, 0xeb, 0x50, 0x26, 0x3e, 0x8b, 0xe6, 0xc0, 0xa1, 0x13, 0xf6, 0x3c, 0x1a, 0x3a, 0x24, 0x42, 0x5b, 0x50, 0x22, 0x6c, 0x39, 0x63, 0xc7,
0x6d, 0x6d, 0xa7, 0xf8, 0xf4, 0x21, 0x96, 0x86, 0xf1, 0x97, 0x06, 0xf5, 0xd3, 0xc0, 0x9b, 0x4e, 0x14, 0x1f, 0x6d, 0x60, 0x69, 0x18, 0xff, 0x68, 0x50, 0x3b, 0xf3, 0xdd, 0xc9, 0x35, 0x39, 0xf6,
0xc8, 0xb1, 0x7f, 0x41, 0xae, 0xb9, 0x97, 0xcb, 0x7f, 0x14, 0x19, 0x69, 0xa0, 0x1d, 0xa8, 0xff, 0x2e, 0xc8, 0x0d, 0xf7, 0x72, 0xf8, 0x42, 0x91, 0x91, 0x06, 0x7a, 0x08, 0xb5, 0x3f, 0x26, 0x76,
0x36, 0x75, 0x22, 0xc7, 0x67, 0xae, 0x4f, 0x2e, 0x04, 0x9b, 0x1a, 0x4e, 0x43, 0xe8, 0x23, 0x80, 0x68, 0x7b, 0xd4, 0xf1, 0xc8, 0x85, 0x60, 0x53, 0xc5, 0x69, 0x08, 0x7d, 0x0c, 0x10, 0xd8, 0x97,
0xd0, 0xb9, 0x24, 0x36, 0x0b, 0xde, 0x10, 0x5f, 0xd0, 0x69, 0x70, 0x25, 0x97, 0xc4, 0xe2, 0x00, 0xc4, 0xa2, 0xfe, 0x2b, 0xe2, 0x09, 0x3a, 0x75, 0xae, 0xe4, 0x92, 0x98, 0x1c, 0x40, 0xbb, 0x20,
0xda, 0x02, 0x61, 0xd8, 0xd4, 0xbd, 0x21, 0xed, 0x92, 0x58, 0xba, 0xc6, 0x81, 0xa1, 0x7b, 0x43, 0x0c, 0x2b, 0x72, 0xde, 0x90, 0xb6, 0x2e, 0x42, 0x57, 0x39, 0x30, 0x62, 0x36, 0x7a, 0x00, 0xb5,
0xd0, 0x36, 0xd4, 0x23, 0x12, 0x3a, 0x6e, 0x64, 0xb3, 0x20, 0xf0, 0xda, 0x65, 0xb1, 0x3a, 0x48, 0x90, 0x04, 0xb6, 0x13, 0xb2, 0xaf, 0x7d, 0xb7, 0x5d, 0x12, 0xd1, 0x41, 0x42, 0x26, 0x43, 0x8c,
0xc8, 0x0a, 0x02, 0xcf, 0xf8, 0x5b, 0x83, 0x8a, 0x24, 0x89, 0x3e, 0x81, 0xc6, 0x4c, 0xfc, 0xd9, 0x7f, 0x35, 0x28, 0x4b, 0x92, 0xe8, 0x53, 0xa8, 0x4f, 0xc5, 0xca, 0x4a, 0xd3, 0xac, 0x4d, 0x53,
0x69, 0x9a, 0xf5, 0x59, 0x4a, 0xc2, 0x36, 0x28, 0xd3, 0x66, 0xf3, 0x90, 0xa8, 0x4c, 0x80, 0x84, 0x12, 0x9e, 0x80, 0x32, 0x2d, 0x3a, 0x0b, 0x88, 0x20, 0xdb, 0x7c, 0x7c, 0x7f, 0x5f, 0xf5, 0xc6,
0xac, 0x79, 0x98, 0x5e, 0x83, 0x32, 0x87, 0x11, 0x15, 0x3c, 0x35, 0x69, 0xc8, 0xa1, 0xe5, 0xbc, 0xbe, 0x0c, 0x64, 0xb2, 0x2d, 0x0c, 0xd3, 0x64, 0x9d, 0x0a, 0x1c, 0x51, 0x9b, 0x12, 0x95, 0x51,
0x94, 0xb2, 0x79, 0xd9, 0x86, 0xba, 0x4f, 0xae, 0x99, 0x1d, 0x8c, 0x46, 0x94, 0x30, 0x41, 0xb8, 0x15, 0x69, 0xc4, 0xa1, 0xc5, 0x62, 0xe9, 0xd9, 0x62, 0x31, 0x15, 0x1e, 0xb9, 0xa1, 0x96, 0x3f,
0x84, 0x81, 0x43, 0x7d, 0x81, 0x18, 0x7f, 0x68, 0xf0, 0xe8, 0x88, 0xb0, 0x5e, 0x82, 0x88, 0x64, 0x1e, 0x47, 0x84, 0x0a, 0x15, 0x3a, 0x06, 0x0e, 0x0d, 0x04, 0x62, 0xfc, 0xa5, 0xc1, 0xbd, 0x23,
0xff, 0x4f, 0xdc, 0x33, 0xe1, 0x2c, 0xe5, 0xc2, 0x39, 0x87, 0x35, 0x5e, 0x86, 0x32, 0xa2, 0xf4, 0x42, 0xfb, 0x09, 0x22, 0x3a, 0x60, 0x0d, 0x41, 0x0f, 0xf2, 0x82, 0x1a, 0x77, 0xe5, 0x9e, 0xc9,
0x1e, 0x75, 0xf8, 0x39, 0x94, 0x12, 0x3a, 0xad, 0x67, 0x8f, 0xf7, 0xd4, 0x31, 0xdb, 0x3b, 0x4d, 0xb1, 0x9e, 0xcb, 0xf1, 0x0c, 0x36, 0x79, 0x6f, 0xca, 0xec, 0x44, 0x6b, 0x34, 0xe7, 0x97, 0xa0,
0x78, 0x61, 0xe1, 0x90, 0xdd, 0xba, 0x98, 0xdb, 0xfa, 0x1b, 0xa8, 0xaa, 0x6d, 0xd1, 0x17, 0x50, 0xaf, 0xca, 0xaf, 0x70, 0xc8, 0x1e, 0x5d, 0xcc, 0x1d, 0xfd, 0x04, 0x2a, 0xea, 0x58, 0xf4, 0x15,
0x95, 0xac, 0xa9, 0xa8, 0xc8, 0xfa, 0xb3, 0xb5, 0xcc, 0xba, 0x38, 0x1e, 0x37, 0x76, 0x41, 0x97, 0x54, 0x24, 0xeb, 0x48, 0xb4, 0x69, 0xed, 0xf1, 0x66, 0x26, 0x2e, 0x8e, 0xf7, 0x8d, 0x3d, 0x68,
0xd0, 0x22, 0xa0, 0xfc, 0x6c, 0xa8, 0xf0, 0x6b, 0x22, 0xfc, 0xca, 0x32, 0xfe, 0xd1, 0xa0, 0xd9, 0x49, 0x68, 0x9e, 0x50, 0xfe, 0x87, 0x51, 0xe9, 0xd7, 0x44, 0xfa, 0x95, 0x65, 0xfc, 0xa7, 0x41,
0x23, 0x57, 0x71, 0x4d, 0xbf, 0x3b, 0x6d, 0xd9, 0xec, 0x15, 0xf3, 0xd9, 0x5b, 0x70, 0x2a, 0xa5, 0xa3, 0x4f, 0x5e, 0xc7, 0x8d, 0xfe, 0xee, 0xb4, 0x65, 0xab, 0x57, 0xcc, 0x57, 0x6f, 0xce, 0x49,
0x39, 0xa1, 0x5d, 0x28, 0xcb, 0x6c, 0x95, 0xc5, 0x26, 0xeb, 0x99, 0x4d, 0x44, 0xda, 0xb0, 0x74, 0x4f, 0x73, 0x42, 0x7b, 0x50, 0x92, 0xd5, 0x2a, 0x89, 0x43, 0xb6, 0x32, 0x87, 0x88, 0xb2, 0x61,
0xc9, 0x86, 0xb0, 0x92, 0x0b, 0xe1, 0xef, 0x1a, 0xb4, 0x12, 0x81, 0x32, 0xe3, 0xf7, 0x28, 0xac, 0xe9, 0x92, 0x4d, 0x61, 0x39, 0x97, 0xc2, 0x3f, 0x35, 0x68, 0x26, 0x02, 0x65, 0xc5, 0xd7, 0x68,
0x84, 0x42, 0xe1, 0xad, 0x29, 0xe4, 0xb3, 0xa8, 0xa7, 0x18, 0x60, 0x12, 0x7a, 0x73, 0x8e, 0x1c, 0xac, 0x84, 0x42, 0xe1, 0xce, 0x14, 0xf2, 0x55, 0x6c, 0xa5, 0x18, 0x60, 0x12, 0xb8, 0x33, 0x8e,
0x12, 0xaf, 0x7f, 0xfe, 0x2b, 0xf9, 0x85, 0x49, 0xa4, 0x09, 0x75, 0x4c, 0x7c, 0x27, 0x76, 0xf8, 0x1c, 0x12, 0x77, 0x70, 0xfe, 0x3b, 0xf9, 0x8d, 0x4a, 0xa4, 0x01, 0x35, 0x4c, 0x3c, 0x3b, 0x76,
0x53, 0xa6, 0x45, 0x7a, 0x88, 0xb4, 0x20, 0x28, 0xf1, 0x61, 0x41, 0xb6, 0x81, 0xc5, 0x7f, 0x4e, 0xf8, 0x5b, 0x96, 0x45, 0x7a, 0x88, 0xb2, 0x20, 0xd0, 0xf9, 0xb6, 0x20, 0x5b, 0xc7, 0x62, 0x9d,
0x48, 0xe1, 0xb6, 0x18, 0x17, 0x97, 0x62, 0x9c, 0x39, 0x93, 0xa5, 0xec, 0x99, 0xbc, 0xfb, 0x96, 0x13, 0x52, 0xb8, 0x2d, 0xc7, 0xc5, 0x85, 0x1c, 0x67, 0xfe, 0x93, 0x7a, 0xf6, 0x3f, 0xb9, 0xfa,
0x91, 0xaa, 0xd2, 0x1a, 0xbe, 0x84, 0xf7, 0x7e, 0x5c, 0xdc, 0x71, 0x72, 0xa4, 0xc7, 0x79, 0xae, 0xea, 0x91, 0xaa, 0xd2, 0x1a, 0xbe, 0x86, 0xf7, 0x7f, 0x9e, 0x5f, 0x7c, 0x72, 0xa7, 0xcf, 0x79,
0xe0, 0x6e, 0xdc, 0xc0, 0xc6, 0x4a, 0x67, 0x8a, 0xf6, 0xa1, 0x1a, 0x08, 0x33, 0xae, 0xf4, 0x8f, 0x2e, 0xe1, 0x6e, 0xbc, 0x81, 0xed, 0xa5, 0xce, 0x11, 0x3a, 0x80, 0x8a, 0x2f, 0xcc, 0xb8, 0xd3,
0x93, 0xe8, 0xaf, 0x9c, 0x81, 0x63, 0x77, 0xf4, 0x19, 0xac, 0x09, 0x51, 0xa9, 0xab, 0x55, 0xbe, 0x3f, 0x49, 0xb2, 0xbf, 0xf4, 0x0b, 0x1c, 0xbb, 0xa3, 0x2f, 0x60, 0x53, 0x88, 0x4a, 0xdd, 0xb7,
0x04, 0x4d, 0x0e, 0x0f, 0xe2, 0xeb, 0xd5, 0xe8, 0x00, 0xdc, 0xce, 0x2e, 0xab, 0xbe, 0x90, 0x53, 0xf2, 0x79, 0x68, 0x70, 0x78, 0x18, 0xdf, 0xb9, 0x46, 0x07, 0xe0, 0x76, 0x76, 0x59, 0xf5, 0x85,
0xef, 0x41, 0xab, 0x1b, 0x38, 0x17, 0x77, 0x24, 0xe8, 0x09, 0xb4, 0x5c, 0x6a, 0xe7, 0xdf, 0x82, 0x9c, 0x7a, 0x97, 0x3d, 0x58, 0xbe, 0x7d, 0xb1, 0xa2, 0x40, 0xec, 0x39, 0x72, 0x22, 0x2b, 0xff,
0xa6, 0x4b, 0x53, 0x52, 0xee, 0x8e, 0xf5, 0xcf, 0x00, 0xb2, 0x3a, 0xfe, 0x73, 0xa7, 0x0f, 0xa0, 0x40, 0x34, 0x9c, 0x28, 0x25, 0x65, 0x75, 0xae, 0x7f, 0x05, 0x90, 0xdd, 0xf1, 0xd6, 0x93, 0x3e,
0xe6, 0x93, 0x2b, 0x5b, 0xe0, 0x52, 0x73, 0xd5, 0x27, 0x57, 0xbd, 0x15, 0x5a, 0xf2, 0xf5, 0xf9, 0x84, 0xaa, 0x47, 0x5e, 0x5b, 0x02, 0x97, 0x9a, 0x2b, 0xcc, 0xee, 0x2f, 0xd1, 0x92, 0xef, 0xcf,
0x1a, 0x2a, 0x52, 0xc7, 0x3b, 0x2e, 0x32, 0x63, 0x0c, 0x8f, 0x17, 0x41, 0xa2, 0x98, 0xd0, 0x30, 0x17, 0x50, 0x96, 0x3a, 0xde, 0x71, 0x93, 0x19, 0x57, 0x70, 0x7f, 0x9e, 0xa4, 0x08, 0x93, 0x28,
0xf0, 0x29, 0xe1, 0x57, 0xd9, 0x72, 0x82, 0x17, 0x57, 0x99, 0x2a, 0xa7, 0xb7, 0xce, 0xe8, 0x11, 0x60, 0x03, 0x07, 0xe1, 0x57, 0xd9, 0x62, 0x81, 0xe7, 0x57, 0x99, 0x6a, 0xa7, 0x3b, 0x57, 0xf4,
0x34, 0xe4, 0xd4, 0x41, 0x44, 0xf8, 0x93, 0xbf, 0x01, 0x95, 0x50, 0xfc, 0x29, 0x29, 0xca, 0xba, 0x08, 0xea, 0xf2, 0xd3, 0x61, 0x48, 0xf8, 0x1c, 0xc0, 0x18, 0x05, 0x62, 0xa5, 0xa4, 0x28, 0x6b,
0x3b, 0xaf, 0x55, 0x28, 0x9b, 0x93, 0x90, 0xcd, 0x8d, 0x16, 0x34, 0x8e, 0x08, 0xe3, 0x07, 0x5d, 0x75, 0x5d, 0x2b, 0x50, 0xea, 0x5d, 0x07, 0x74, 0x66, 0x34, 0xa1, 0xce, 0x9e, 0x24, 0xfe, 0x47,
0x5c, 0xf9, 0xc6, 0x09, 0xe8, 0x49, 0x8b, 0x73, 0x10, 0xf8, 0x8c, 0xf8, 0x0c, 0x7d, 0x0b, 0x0d, 0x17, 0x57, 0xbe, 0x71, 0x0a, 0xad, 0x64, 0xee, 0xe9, 0xfa, 0x1e, 0x65, 0x43, 0x02, 0xfa, 0x0e,
0x4e, 0xdc, 0x26, 0xb2, 0x67, 0x50, 0x6a, 0x36, 0x12, 0x35, 0x2f, 0xa6, 0x9e, 0x37, 0x70, 0xd8, 0xea, 0x9c, 0xb8, 0x45, 0xe4, 0x20, 0xa1, 0xd4, 0x6c, 0x27, 0x6a, 0x9e, 0x4d, 0x5c, 0x77, 0x68,
0x98, 0xf7, 0x14, 0x73, 0x5c, 0xe7, 0xb0, 0x6a, 0x2f, 0x8c, 0x9f, 0xa0, 0xb9, 0x34, 0x9a, 0x6a, 0xd3, 0x2b, 0x3e, 0x68, 0xcc, 0x70, 0x8d, 0xc3, 0x6a, 0xe6, 0x30, 0x7e, 0x81, 0xc6, 0xc2, 0x6e,
0x5e, 0xb4, 0xa5, 0xe6, 0x65, 0x1d, 0xca, 0xc1, 0xd8, 0xa1, 0x63, 0xa5, 0x5b, 0x1a, 0x68, 0x13, 0x6a, 0xa2, 0xd1, 0x16, 0x26, 0x1a, 0x36, 0x76, 0xf8, 0x57, 0x76, 0x74, 0xa5, 0x74, 0x4b, 0x03,
0x6a, 0x7c, 0x35, 0x91, 0x2c, 0xd9, 0x3d, 0x24, 0xb6, 0xf1, 0x29, 0x54, 0x5f, 0xce, 0xe4, 0x4d, 0xed, 0x40, 0x95, 0x47, 0x13, 0xc5, 0x92, 0x23, 0x45, 0x62, 0x1b, 0x9f, 0x41, 0xe5, 0xa7, 0xa9,
0xd7, 0x86, 0xaa, 0x4b, 0x0f, 0x3c, 0xe2, 0xc8, 0x9b, 0xbc, 0x86, 0x63, 0xd3, 0x98, 0x41, 0xf5, 0xbc, 0xe9, 0xda, 0x50, 0x71, 0xa2, 0xae, 0x4b, 0x6c, 0x79, 0x93, 0x57, 0x71, 0x6c, 0x1a, 0x53,
0xe5, 0xa9, 0x50, 0x87, 0xbe, 0x92, 0x77, 0x5d, 0x4c, 0x7f, 0x2b, 0xa1, 0xaf, 0x1c, 0xf6, 0xc4, 0xe6, 0x74, 0x26, 0xd4, 0xa1, 0x6f, 0xe4, 0x5d, 0x17, 0xd3, 0xdf, 0x4d, 0xe8, 0x2b, 0x87, 0x7d,
0x57, 0x6a, 0x90, 0x9e, 0x9b, 0xfb, 0x00, 0x0b, 0x10, 0xe9, 0x50, 0x7c, 0x43, 0xe6, 0x62, 0x87, 0xf1, 0x2b, 0x35, 0x48, 0xcf, 0x9d, 0x03, 0x80, 0x39, 0x88, 0x5a, 0x50, 0x7c, 0x45, 0x66, 0xe2,
0x87, 0x98, 0xff, 0x72, 0xd2, 0x33, 0xc7, 0x9b, 0xca, 0x52, 0x2c, 0x61, 0x69, 0x7c, 0x57, 0xd8, 0x84, 0x0d, 0xcc, 0x97, 0x9c, 0xf4, 0xd4, 0x76, 0x27, 0xb2, 0x15, 0x75, 0x2c, 0x8d, 0xef, 0x0b,
0xd7, 0x8c, 0x33, 0xd8, 0xe4, 0x8f, 0x69, 0xfa, 0x20, 0xff, 0xe0, 0xd0, 0xb1, 0x7a, 0x57, 0x97, 0x07, 0x1a, 0x1b, 0x21, 0x77, 0xf8, 0x63, 0x9a, 0xfe, 0x23, 0xff, 0xc8, 0x04, 0xa9, 0x77, 0x75,
0xdb, 0x22, 0xed, 0xd6, 0xb6, 0xa8, 0xb0, 0xdc, 0x16, 0xed, 0xf6, 0x00, 0x16, 0x8f, 0x10, 0x42, 0x71, 0x56, 0xd2, 0x6e, 0x9d, 0x95, 0x0a, 0x8b, 0xb3, 0xd2, 0x5e, 0x1f, 0x60, 0xfe, 0x08, 0xb1,
0xd0, 0x3a, 0xed, 0x77, 0x5f, 0x9d, 0x98, 0xf6, 0xa1, 0xf9, 0xa2, 0xf3, 0xaa, 0x6b, 0xe9, 0x0f, 0x4e, 0x6e, 0x9e, 0x0d, 0x4e, 0x9e, 0x9f, 0xf6, 0xac, 0xc3, 0xde, 0xb3, 0xce, 0xf3, 0x13, 0xb3,
0xd0, 0x3a, 0xe8, 0x0a, 0xb3, 0xfa, 0x27, 0xcf, 0x87, 0x56, 0xbf, 0x67, 0xea, 0x1a, 0xda, 0x00, 0xf5, 0x1e, 0x63, 0xd5, 0x52, 0x98, 0x39, 0x38, 0x7d, 0x3a, 0x32, 0x07, 0xfd, 0x5e, 0x4b, 0x63,
0xa4, 0xd0, 0x33, 0xfb, 0xd0, 0xec, 0x9a, 0x96, 0x69, 0x77, 0x2c, 0xbd, 0xb0, 0x8b, 0xe3, 0x4e, 0x89, 0x47, 0x0a, 0x7d, 0xc9, 0x7c, 0x4f, 0x7a, 0x66, 0xcf, 0xea, 0x98, 0xad, 0xc2, 0x1e, 0x8e,
0x4f, 0x86, 0xb2, 0x01, 0xb5, 0xa1, 0xd5, 0xb1, 0x4c, 0x1b, 0xbf, 0xd6, 0x1f, 0xa0, 0x36, 0xac, 0xc7, 0x3f, 0x99, 0xca, 0x3a, 0x54, 0x47, 0x66, 0x87, 0x6d, 0xe2, 0x17, 0x2c, 0x54, 0x1b, 0xb6,
0x4b, 0xeb, 0xa0, 0x7f, 0x32, 0xe8, 0x1c, 0x58, 0xc7, 0xfd, 0x9e, 0x3d, 0xc4, 0x07, 0xba, 0x86, 0xa4, 0xd5, 0x1d, 0x9c, 0x0e, 0x3b, 0x5d, 0xf3, 0x78, 0xd0, 0xb7, 0x46, 0xb8, 0xcb, 0xc2, 0xed,
0xb6, 0xe0, 0xfd, 0xdc, 0x88, 0xd5, 0xc1, 0x47, 0xa6, 0xa5, 0x17, 0xce, 0x2b, 0xa2, 0xf1, 0xfe, 0xc2, 0x07, 0xb9, 0x1d, 0xb3, 0x83, 0x8f, 0x7a, 0x2c, 0xe6, 0x79, 0x59, 0x4c, 0xe3, 0xdf, 0xfe,
0xfa, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6e, 0x9b, 0x48, 0x2a, 0x86, 0x0b, 0x00, 0x00, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xaa, 0x45, 0x72, 0xde, 0x9b, 0x0b, 0x00, 0x00,
} }

View File

@ -274,7 +274,7 @@ func GetVolume(s *server, ctx context.Context, pbIn *[]byte) (*[]byte, error) {
s.statsd_c.Increment("get_volume.ok") s.statsd_c.Increment("get_volume.ok")
pb_volume := pb.Volume{VolumeIndex: in.Index, VolumeType: uint32(dfType), VolumeState: uint32(state), pb_volume := pb.Volume{VolumeIndex: in.Index, VolumeType: pb.VolumeType(dfType), VolumeState: uint32(state),
Partition: uint32(partition), NextOffset: uint64(nextOffset)} Partition: uint32(partition), NextOffset: uint64(nextOffset)}
out, err := proto.Marshal(&pb_volume) out, err := proto.Marshal(&pb_volume)
if err != nil { if err != nil {
@ -325,7 +325,7 @@ func ListVolumes(s *server, ctx context.Context, pbIn *[]byte) (*[]byte, error)
} }
if uint32(partition) == in.Partition && pb.VolumeType(dfType) == in.Type { if uint32(partition) == in.Partition && pb.VolumeType(dfType) == in.Type {
response.Volumes = append(response.Volumes, &pb.Volume{VolumeIndex: idx, response.Volumes = append(response.Volumes, &pb.Volume{VolumeIndex: idx,
VolumeType: uint32(in.Type), VolumeState: uint32(state), VolumeType: pb.VolumeType(in.Type), VolumeState: uint32(state),
Partition: uint32(partition), NextOffset: uint64(nextOffset)}) Partition: uint32(partition), NextOffset: uint64(nextOffset)})
} }
} }

View File

@ -40,7 +40,7 @@ message VolumeIndex {
message Volume { message Volume {
uint32 volume_index = 1; uint32 volume_index = 1;
uint32 volume_type = 2; VolumeType volume_type = 2;
uint32 volume_state = 3; uint32 volume_state = 3;
uint32 partition = 4; uint32 partition = 4;
uint64 next_offset = 5; uint64 next_offset = 5;

View File

@ -21,7 +21,7 @@ DESCRIPTOR = _descriptor.FileDescriptor(
package='filemgr', package='filemgr',
syntax='proto3', syntax='proto3',
serialized_options=None, serialized_options=None,
serialized_pb=_b('\n\nfmgr.proto\x12\x07\x66ilemgr\",\n\x12ListPartitionsInfo\x12\x16\n\x0epartition_bits\x18\x01 \x01(\r\">\n\x11ListPartitionInfo\x12\x11\n\tpartition\x18\x01 \x01(\r\x12\x16\n\x0epartition_bits\x18\x02 \x01(\r\"K\n\x0eListSuffixInfo\x12\x11\n\tpartition\x18\x01 \x01(\r\x12\x0e\n\x06suffix\x18\x02 \x01(\x0c\x12\x16\n\x0epartition_bits\x18\x03 \x01(\r\"\x1b\n\nDirEntries\x12\r\n\x05\x65ntry\x18\x01 \x03(\t\"m\n\x0bVolumeIndex\x12\r\n\x05index\x18\x01 \x01(\r\x12\x13\n\x0bquarantined\x18\x02 \x01(\x08\x12\x12\n\npage_token\x18\x03 \x01(\x0c\x12\x11\n\tpage_size\x18\x04 \x01(\r\x12\x13\n\x0brepair_tool\x18\x05 \x01(\x08\"q\n\x06Volume\x12\x14\n\x0cvolume_index\x18\x01 \x01(\r\x12\x13\n\x0bvolume_type\x18\x02 \x01(\r\x12\x14\n\x0cvolume_state\x18\x03 \x01(\r\x12\x11\n\tpartition\x18\x04 \x01(\r\x12\x13\n\x0bnext_offset\x18\x05 \x01(\x04\"i\n\x11GetNextOffsetInfo\x12\x14\n\x0cvolume_index\x18\x01 \x01(\r\x12\x13\n\x0bvolume_type\x18\x02 \x01(\r\x12\x14\n\x0cvolume_state\x18\x03 \x01(\r\x12\x13\n\x0brepair_tool\x18\x04 \x01(\x08\"\\\n\x0fListVolumesInfo\x12\x11\n\tpartition\x18\x01 \x01(\r\x12!\n\x04type\x18\x02 \x01(\x0e\x32\x13.filemgr.VolumeType\x12\x13\n\x0brepair_tool\x18\x03 \x01(\x08\"+\n\x07Volumes\x12 \n\x07volumes\x18\x01 \x03(\x0b\x32\x0f.filemgr.Volume\"\"\n\x10VolumeNextOffset\x12\x0e\n\x06offset\x18\x01 \x01(\x04\"\xa5\x01\n\rNewVolumeInfo\x12\x11\n\tpartition\x18\x01 \x01(\r\x12!\n\x04type\x18\x02 \x01(\x0e\x32\x13.filemgr.VolumeType\x12\x14\n\x0cvolume_index\x18\x03 \x01(\r\x12\x0e\n\x06offset\x18\x04 \x01(\x04\x12#\n\x05state\x18\x05 \x01(\x0e\x32\x14.filemgr.VolumeState\x12\x13\n\x0brepair_tool\x18\x06 \x01(\x08\"`\n\x0eNewVolumeState\x12\x14\n\x0cvolume_index\x18\x01 \x01(\r\x12#\n\x05state\x18\x02 \x01(\x0e\x32\x14.filemgr.VolumeState\x12\x13\n\x0brepair_tool\x18\x03 \x01(\x08\"\x10\n\x0eNewVolumeReply\"\x10\n\x0e\x44\x65lObjectReply\"\r\n\x0bRenameReply\"m\n\rNewObjectInfo\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x14\n\x0cvolume_index\x18\x02 \x01(\r\x12\x0e\n\x06offset\x18\x03 \x01(\x04\x12\x13\n\x0bnext_offset\x18\x04 \x01(\x04\x12\x13\n\x0brepair_tool\x18\x05 \x01(\x08\"\x10\n\x0eNewObjectReply\"%\n\x15QuarantinedObjectName\x12\x0c\n\x04name\x18\x01 \x01(\x0c\"b\n\x16QuarantinedObjectNames\x12/\n\x07objects\x18\x01 \x03(\x0b\x32\x1e.filemgr.QuarantinedObjectName\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"/\n\nObjectName\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x13\n\x0brepair_tool\x18\x02 \x01(\x08\"K\n\x0eLoadObjectInfo\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x16\n\x0eis_quarantined\x18\x02 \x01(\x08\x12\x13\n\x0brepair_tool\x18\x05 \x01(\x08\"A\n\nRenameInfo\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x10\n\x08new_name\x18\x02 \x01(\x0c\x12\x13\n\x0brepair_tool\x18\x03 \x01(\x08\"<\n\x06Object\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x14\n\x0cvolume_index\x18\x02 \x01(\r\x12\x0e\n\x06offset\x18\x03 \x01(\x04\"P\n\x13LoadObjectsResponse\x12 \n\x07objects\x18\x01 \x03(\x0b\x32\x0f.filemgr.Object\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"3\n\x0cObjectPrefix\x12\x0e\n\x06prefix\x18\x01 \x01(\x0c\x12\x13\n\x0brepair_tool\x18\x02 \x01(\x08\"\x07\n\x05\x45mpty\"\x0e\n\x0cGetStatsInfo\"@\n\x10PartitionContent\x12,\n\x0c\x66ile_entries\x18\x01 \x03(\x0b\x32\x16.filemgr.FullPathEntry\"@\n\rFullPathEntry\x12\x0e\n\x06suffix\x18\x01 \x01(\x0c\x12\r\n\x05ohash\x18\x02 \x01(\x0c\x12\x10\n\x08\x66ilename\x18\x03 \x01(\x0c\"\x1a\n\x07KvState\x12\x0f\n\x07isClean\x18\x01 \x01(\x08\"c\n\x07KVStats\x12*\n\x05stats\x18\x01 \x03(\x0b\x32\x1b.filemgr.KVStats.StatsEntry\x1a,\n\nStatsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x04:\x02\x38\x01\"C\n\x1aListQuarantinedOHashesInfo\x12\x12\n\npage_token\x18\x01 \x01(\x0c\x12\x11\n\tpage_size\x18\x02 \x01(\r*N\n\nVolumeType\x12\x12\n\x0eVOLUME_DEFAULT\x10\x00\x12\x14\n\x10VOLUME_TOMBSTONE\x10\x01\x12\x16\n\x12VOLUME_X_DELETE_AT\x10\x02*R\n\x0bVolumeState\x12\x0c\n\x08STATE_RW\x10\x00\x12\x18\n\x14STATE_COMPACTION_SRC\x10\x01\x12\x1b\n\x17STATE_COMPACTION_TARGET\x10\x02\x62\x06proto3') serialized_pb=_b('\n\nfmgr.proto\x12\x07\x66ilemgr\",\n\x12ListPartitionsInfo\x12\x16\n\x0epartition_bits\x18\x01 \x01(\r\">\n\x11ListPartitionInfo\x12\x11\n\tpartition\x18\x01 \x01(\r\x12\x16\n\x0epartition_bits\x18\x02 \x01(\r\"K\n\x0eListSuffixInfo\x12\x11\n\tpartition\x18\x01 \x01(\r\x12\x0e\n\x06suffix\x18\x02 \x01(\x0c\x12\x16\n\x0epartition_bits\x18\x03 \x01(\r\"\x1b\n\nDirEntries\x12\r\n\x05\x65ntry\x18\x01 \x03(\t\"m\n\x0bVolumeIndex\x12\r\n\x05index\x18\x01 \x01(\r\x12\x13\n\x0bquarantined\x18\x02 \x01(\x08\x12\x12\n\npage_token\x18\x03 \x01(\x0c\x12\x11\n\tpage_size\x18\x04 \x01(\r\x12\x13\n\x0brepair_tool\x18\x05 \x01(\x08\"\x86\x01\n\x06Volume\x12\x14\n\x0cvolume_index\x18\x01 \x01(\r\x12(\n\x0bvolume_type\x18\x02 \x01(\x0e\x32\x13.filemgr.VolumeType\x12\x14\n\x0cvolume_state\x18\x03 \x01(\r\x12\x11\n\tpartition\x18\x04 \x01(\r\x12\x13\n\x0bnext_offset\x18\x05 \x01(\x04\"i\n\x11GetNextOffsetInfo\x12\x14\n\x0cvolume_index\x18\x01 \x01(\r\x12\x13\n\x0bvolume_type\x18\x02 \x01(\r\x12\x14\n\x0cvolume_state\x18\x03 \x01(\r\x12\x13\n\x0brepair_tool\x18\x04 \x01(\x08\"\\\n\x0fListVolumesInfo\x12\x11\n\tpartition\x18\x01 \x01(\r\x12!\n\x04type\x18\x02 \x01(\x0e\x32\x13.filemgr.VolumeType\x12\x13\n\x0brepair_tool\x18\x03 \x01(\x08\"+\n\x07Volumes\x12 \n\x07volumes\x18\x01 \x03(\x0b\x32\x0f.filemgr.Volume\"\"\n\x10VolumeNextOffset\x12\x0e\n\x06offset\x18\x01 \x01(\x04\"\xa5\x01\n\rNewVolumeInfo\x12\x11\n\tpartition\x18\x01 \x01(\r\x12!\n\x04type\x18\x02 \x01(\x0e\x32\x13.filemgr.VolumeType\x12\x14\n\x0cvolume_index\x18\x03 \x01(\r\x12\x0e\n\x06offset\x18\x04 \x01(\x04\x12#\n\x05state\x18\x05 \x01(\x0e\x32\x14.filemgr.VolumeState\x12\x13\n\x0brepair_tool\x18\x06 \x01(\x08\"`\n\x0eNewVolumeState\x12\x14\n\x0cvolume_index\x18\x01 \x01(\r\x12#\n\x05state\x18\x02 \x01(\x0e\x32\x14.filemgr.VolumeState\x12\x13\n\x0brepair_tool\x18\x03 \x01(\x08\"\x10\n\x0eNewVolumeReply\"\x10\n\x0e\x44\x65lObjectReply\"\r\n\x0bRenameReply\"m\n\rNewObjectInfo\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x14\n\x0cvolume_index\x18\x02 \x01(\r\x12\x0e\n\x06offset\x18\x03 \x01(\x04\x12\x13\n\x0bnext_offset\x18\x04 \x01(\x04\x12\x13\n\x0brepair_tool\x18\x05 \x01(\x08\"\x10\n\x0eNewObjectReply\"%\n\x15QuarantinedObjectName\x12\x0c\n\x04name\x18\x01 \x01(\x0c\"b\n\x16QuarantinedObjectNames\x12/\n\x07objects\x18\x01 \x03(\x0b\x32\x1e.filemgr.QuarantinedObjectName\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"/\n\nObjectName\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x13\n\x0brepair_tool\x18\x02 \x01(\x08\"K\n\x0eLoadObjectInfo\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x16\n\x0eis_quarantined\x18\x02 \x01(\x08\x12\x13\n\x0brepair_tool\x18\x05 \x01(\x08\"A\n\nRenameInfo\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x10\n\x08new_name\x18\x02 \x01(\x0c\x12\x13\n\x0brepair_tool\x18\x03 \x01(\x08\"<\n\x06Object\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x14\n\x0cvolume_index\x18\x02 \x01(\r\x12\x0e\n\x06offset\x18\x03 \x01(\x04\"P\n\x13LoadObjectsResponse\x12 \n\x07objects\x18\x01 \x03(\x0b\x32\x0f.filemgr.Object\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\x0c\"3\n\x0cObjectPrefix\x12\x0e\n\x06prefix\x18\x01 \x01(\x0c\x12\x13\n\x0brepair_tool\x18\x02 \x01(\x08\"\x07\n\x05\x45mpty\"\x0e\n\x0cGetStatsInfo\"@\n\x10PartitionContent\x12,\n\x0c\x66ile_entries\x18\x01 \x03(\x0b\x32\x16.filemgr.FullPathEntry\"@\n\rFullPathEntry\x12\x0e\n\x06suffix\x18\x01 \x01(\x0c\x12\r\n\x05ohash\x18\x02 \x01(\x0c\x12\x10\n\x08\x66ilename\x18\x03 \x01(\x0c\"\x1a\n\x07KvState\x12\x0f\n\x07isClean\x18\x01 \x01(\x08\"c\n\x07KVStats\x12*\n\x05stats\x18\x01 \x03(\x0b\x32\x1b.filemgr.KVStats.StatsEntry\x1a,\n\nStatsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x04:\x02\x38\x01\"C\n\x1aListQuarantinedOHashesInfo\x12\x12\n\npage_token\x18\x01 \x01(\x0c\x12\x11\n\tpage_size\x18\x02 \x01(\r*N\n\nVolumeType\x12\x12\n\x0eVOLUME_DEFAULT\x10\x00\x12\x14\n\x10VOLUME_TOMBSTONE\x10\x01\x12\x16\n\x12VOLUME_X_DELETE_AT\x10\x02*R\n\x0bVolumeState\x12\x0c\n\x08STATE_RW\x10\x00\x12\x18\n\x14STATE_COMPACTION_SRC\x10\x01\x12\x1b\n\x17STATE_COMPACTION_TARGET\x10\x02\x62\x06proto3')
) )
_VOLUMETYPE = _descriptor.EnumDescriptor( _VOLUMETYPE = _descriptor.EnumDescriptor(
@ -45,8 +45,8 @@ _VOLUMETYPE = _descriptor.EnumDescriptor(
], ],
containing_type=None, containing_type=None,
serialized_options=None, serialized_options=None,
serialized_start=2077, serialized_start=2099,
serialized_end=2155, serialized_end=2177,
) )
_sym_db.RegisterEnumDescriptor(_VOLUMETYPE) _sym_db.RegisterEnumDescriptor(_VOLUMETYPE)
@ -72,8 +72,8 @@ _VOLUMESTATE = _descriptor.EnumDescriptor(
], ],
containing_type=None, containing_type=None,
serialized_options=None, serialized_options=None,
serialized_start=2157, serialized_start=2179,
serialized_end=2239, serialized_end=2261,
) )
_sym_db.RegisterEnumDescriptor(_VOLUMESTATE) _sym_db.RegisterEnumDescriptor(_VOLUMESTATE)
@ -307,7 +307,7 @@ _VOLUME = _descriptor.Descriptor(
serialized_options=None, file=DESCRIPTOR), serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor( _descriptor.FieldDescriptor(
name='volume_type', full_name='filemgr.Volume.volume_type', index=1, name='volume_type', full_name='filemgr.Volume.volume_type', index=1,
number=2, type=13, cpp_type=3, label=1, number=2, type=14, cpp_type=8, label=1,
has_default_value=False, default_value=0, has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None, message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None, is_extension=False, extension_scope=None,
@ -345,8 +345,8 @@ _VOLUME = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=350, serialized_start=351,
serialized_end=463, serialized_end=485,
) )
@ -397,8 +397,8 @@ _GETNEXTOFFSETINFO = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=465, serialized_start=487,
serialized_end=570, serialized_end=592,
) )
@ -442,8 +442,8 @@ _LISTVOLUMESINFO = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=572, serialized_start=594,
serialized_end=664, serialized_end=686,
) )
@ -473,8 +473,8 @@ _VOLUMES = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=666, serialized_start=688,
serialized_end=709, serialized_end=731,
) )
@ -504,8 +504,8 @@ _VOLUMENEXTOFFSET = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=711, serialized_start=733,
serialized_end=745, serialized_end=767,
) )
@ -570,8 +570,8 @@ _NEWVOLUMEINFO = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=748, serialized_start=770,
serialized_end=913, serialized_end=935,
) )
@ -615,8 +615,8 @@ _NEWVOLUMESTATE = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=915, serialized_start=937,
serialized_end=1011, serialized_end=1033,
) )
@ -639,8 +639,8 @@ _NEWVOLUMEREPLY = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1013, serialized_start=1035,
serialized_end=1029, serialized_end=1051,
) )
@ -663,8 +663,8 @@ _DELOBJECTREPLY = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1031, serialized_start=1053,
serialized_end=1047, serialized_end=1069,
) )
@ -687,8 +687,8 @@ _RENAMEREPLY = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1049, serialized_start=1071,
serialized_end=1062, serialized_end=1084,
) )
@ -746,8 +746,8 @@ _NEWOBJECTINFO = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1064, serialized_start=1086,
serialized_end=1173, serialized_end=1195,
) )
@ -770,8 +770,8 @@ _NEWOBJECTREPLY = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1175, serialized_start=1197,
serialized_end=1191, serialized_end=1213,
) )
@ -801,8 +801,8 @@ _QUARANTINEDOBJECTNAME = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1193, serialized_start=1215,
serialized_end=1230, serialized_end=1252,
) )
@ -839,8 +839,8 @@ _QUARANTINEDOBJECTNAMES = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1232, serialized_start=1254,
serialized_end=1330, serialized_end=1352,
) )
@ -877,8 +877,8 @@ _OBJECTNAME = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1332, serialized_start=1354,
serialized_end=1379, serialized_end=1401,
) )
@ -922,8 +922,8 @@ _LOADOBJECTINFO = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1381, serialized_start=1403,
serialized_end=1456, serialized_end=1478,
) )
@ -967,8 +967,8 @@ _RENAMEINFO = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1458, serialized_start=1480,
serialized_end=1523, serialized_end=1545,
) )
@ -1012,8 +1012,8 @@ _OBJECT = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1525, serialized_start=1547,
serialized_end=1585, serialized_end=1607,
) )
@ -1050,8 +1050,8 @@ _LOADOBJECTSRESPONSE = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1587, serialized_start=1609,
serialized_end=1667, serialized_end=1689,
) )
@ -1088,8 +1088,8 @@ _OBJECTPREFIX = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1669, serialized_start=1691,
serialized_end=1720, serialized_end=1742,
) )
@ -1112,8 +1112,8 @@ _EMPTY = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1722, serialized_start=1744,
serialized_end=1729, serialized_end=1751,
) )
@ -1136,8 +1136,8 @@ _GETSTATSINFO = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1731, serialized_start=1753,
serialized_end=1745, serialized_end=1767,
) )
@ -1167,8 +1167,8 @@ _PARTITIONCONTENT = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1747, serialized_start=1769,
serialized_end=1811, serialized_end=1833,
) )
@ -1212,8 +1212,8 @@ _FULLPATHENTRY = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1813, serialized_start=1835,
serialized_end=1877, serialized_end=1899,
) )
@ -1243,8 +1243,8 @@ _KVSTATE = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1879, serialized_start=1901,
serialized_end=1905, serialized_end=1927,
) )
@ -1281,8 +1281,8 @@ _KVSTATS_STATSENTRY = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1962, serialized_start=1984,
serialized_end=2006, serialized_end=2028,
) )
_KVSTATS = _descriptor.Descriptor( _KVSTATS = _descriptor.Descriptor(
@ -1311,8 +1311,8 @@ _KVSTATS = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=1907, serialized_start=1929,
serialized_end=2006, serialized_end=2028,
) )
@ -1349,10 +1349,11 @@ _LISTQUARANTINEDOHASHESINFO = _descriptor.Descriptor(
extension_ranges=[], extension_ranges=[],
oneofs=[ oneofs=[
], ],
serialized_start=2008, serialized_start=2030,
serialized_end=2075, serialized_end=2097,
) )
_VOLUME.fields_by_name['volume_type'].enum_type = _VOLUMETYPE
_LISTVOLUMESINFO.fields_by_name['type'].enum_type = _VOLUMETYPE _LISTVOLUMESINFO.fields_by_name['type'].enum_type = _VOLUMETYPE
_VOLUMES.fields_by_name['volumes'].message_type = _VOLUME _VOLUMES.fields_by_name['volumes'].message_type = _VOLUME
_NEWVOLUMEINFO.fields_by_name['type'].enum_type = _VOLUMETYPE _NEWVOLUMEINFO.fields_by_name['type'].enum_type = _VOLUMETYPE
@ -1399,236 +1400,236 @@ DESCRIPTOR.enum_types_by_name['VolumeType'] = _VOLUMETYPE
DESCRIPTOR.enum_types_by_name['VolumeState'] = _VOLUMESTATE DESCRIPTOR.enum_types_by_name['VolumeState'] = _VOLUMESTATE
_sym_db.RegisterFileDescriptor(DESCRIPTOR) _sym_db.RegisterFileDescriptor(DESCRIPTOR)
ListPartitionsInfo = _reflection.GeneratedProtocolMessageType('ListPartitionsInfo', (_message.Message,), dict( ListPartitionsInfo = _reflection.GeneratedProtocolMessageType('ListPartitionsInfo', (_message.Message,), {
DESCRIPTOR = _LISTPARTITIONSINFO, 'DESCRIPTOR' : _LISTPARTITIONSINFO,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.ListPartitionsInfo) # @@protoc_insertion_point(class_scope:filemgr.ListPartitionsInfo)
)) })
_sym_db.RegisterMessage(ListPartitionsInfo) _sym_db.RegisterMessage(ListPartitionsInfo)
ListPartitionInfo = _reflection.GeneratedProtocolMessageType('ListPartitionInfo', (_message.Message,), dict( ListPartitionInfo = _reflection.GeneratedProtocolMessageType('ListPartitionInfo', (_message.Message,), {
DESCRIPTOR = _LISTPARTITIONINFO, 'DESCRIPTOR' : _LISTPARTITIONINFO,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.ListPartitionInfo) # @@protoc_insertion_point(class_scope:filemgr.ListPartitionInfo)
)) })
_sym_db.RegisterMessage(ListPartitionInfo) _sym_db.RegisterMessage(ListPartitionInfo)
ListSuffixInfo = _reflection.GeneratedProtocolMessageType('ListSuffixInfo', (_message.Message,), dict( ListSuffixInfo = _reflection.GeneratedProtocolMessageType('ListSuffixInfo', (_message.Message,), {
DESCRIPTOR = _LISTSUFFIXINFO, 'DESCRIPTOR' : _LISTSUFFIXINFO,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.ListSuffixInfo) # @@protoc_insertion_point(class_scope:filemgr.ListSuffixInfo)
)) })
_sym_db.RegisterMessage(ListSuffixInfo) _sym_db.RegisterMessage(ListSuffixInfo)
DirEntries = _reflection.GeneratedProtocolMessageType('DirEntries', (_message.Message,), dict( DirEntries = _reflection.GeneratedProtocolMessageType('DirEntries', (_message.Message,), {
DESCRIPTOR = _DIRENTRIES, 'DESCRIPTOR' : _DIRENTRIES,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.DirEntries) # @@protoc_insertion_point(class_scope:filemgr.DirEntries)
)) })
_sym_db.RegisterMessage(DirEntries) _sym_db.RegisterMessage(DirEntries)
VolumeIndex = _reflection.GeneratedProtocolMessageType('VolumeIndex', (_message.Message,), dict( VolumeIndex = _reflection.GeneratedProtocolMessageType('VolumeIndex', (_message.Message,), {
DESCRIPTOR = _VOLUMEINDEX, 'DESCRIPTOR' : _VOLUMEINDEX,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.VolumeIndex) # @@protoc_insertion_point(class_scope:filemgr.VolumeIndex)
)) })
_sym_db.RegisterMessage(VolumeIndex) _sym_db.RegisterMessage(VolumeIndex)
Volume = _reflection.GeneratedProtocolMessageType('Volume', (_message.Message,), dict( Volume = _reflection.GeneratedProtocolMessageType('Volume', (_message.Message,), {
DESCRIPTOR = _VOLUME, 'DESCRIPTOR' : _VOLUME,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.Volume) # @@protoc_insertion_point(class_scope:filemgr.Volume)
)) })
_sym_db.RegisterMessage(Volume) _sym_db.RegisterMessage(Volume)
GetNextOffsetInfo = _reflection.GeneratedProtocolMessageType('GetNextOffsetInfo', (_message.Message,), dict( GetNextOffsetInfo = _reflection.GeneratedProtocolMessageType('GetNextOffsetInfo', (_message.Message,), {
DESCRIPTOR = _GETNEXTOFFSETINFO, 'DESCRIPTOR' : _GETNEXTOFFSETINFO,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.GetNextOffsetInfo) # @@protoc_insertion_point(class_scope:filemgr.GetNextOffsetInfo)
)) })
_sym_db.RegisterMessage(GetNextOffsetInfo) _sym_db.RegisterMessage(GetNextOffsetInfo)
ListVolumesInfo = _reflection.GeneratedProtocolMessageType('ListVolumesInfo', (_message.Message,), dict( ListVolumesInfo = _reflection.GeneratedProtocolMessageType('ListVolumesInfo', (_message.Message,), {
DESCRIPTOR = _LISTVOLUMESINFO, 'DESCRIPTOR' : _LISTVOLUMESINFO,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.ListVolumesInfo) # @@protoc_insertion_point(class_scope:filemgr.ListVolumesInfo)
)) })
_sym_db.RegisterMessage(ListVolumesInfo) _sym_db.RegisterMessage(ListVolumesInfo)
Volumes = _reflection.GeneratedProtocolMessageType('Volumes', (_message.Message,), dict( Volumes = _reflection.GeneratedProtocolMessageType('Volumes', (_message.Message,), {
DESCRIPTOR = _VOLUMES, 'DESCRIPTOR' : _VOLUMES,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.Volumes) # @@protoc_insertion_point(class_scope:filemgr.Volumes)
)) })
_sym_db.RegisterMessage(Volumes) _sym_db.RegisterMessage(Volumes)
VolumeNextOffset = _reflection.GeneratedProtocolMessageType('VolumeNextOffset', (_message.Message,), dict( VolumeNextOffset = _reflection.GeneratedProtocolMessageType('VolumeNextOffset', (_message.Message,), {
DESCRIPTOR = _VOLUMENEXTOFFSET, 'DESCRIPTOR' : _VOLUMENEXTOFFSET,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.VolumeNextOffset) # @@protoc_insertion_point(class_scope:filemgr.VolumeNextOffset)
)) })
_sym_db.RegisterMessage(VolumeNextOffset) _sym_db.RegisterMessage(VolumeNextOffset)
NewVolumeInfo = _reflection.GeneratedProtocolMessageType('NewVolumeInfo', (_message.Message,), dict( NewVolumeInfo = _reflection.GeneratedProtocolMessageType('NewVolumeInfo', (_message.Message,), {
DESCRIPTOR = _NEWVOLUMEINFO, 'DESCRIPTOR' : _NEWVOLUMEINFO,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.NewVolumeInfo) # @@protoc_insertion_point(class_scope:filemgr.NewVolumeInfo)
)) })
_sym_db.RegisterMessage(NewVolumeInfo) _sym_db.RegisterMessage(NewVolumeInfo)
NewVolumeState = _reflection.GeneratedProtocolMessageType('NewVolumeState', (_message.Message,), dict( NewVolumeState = _reflection.GeneratedProtocolMessageType('NewVolumeState', (_message.Message,), {
DESCRIPTOR = _NEWVOLUMESTATE, 'DESCRIPTOR' : _NEWVOLUMESTATE,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.NewVolumeState) # @@protoc_insertion_point(class_scope:filemgr.NewVolumeState)
)) })
_sym_db.RegisterMessage(NewVolumeState) _sym_db.RegisterMessage(NewVolumeState)
NewVolumeReply = _reflection.GeneratedProtocolMessageType('NewVolumeReply', (_message.Message,), dict( NewVolumeReply = _reflection.GeneratedProtocolMessageType('NewVolumeReply', (_message.Message,), {
DESCRIPTOR = _NEWVOLUMEREPLY, 'DESCRIPTOR' : _NEWVOLUMEREPLY,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.NewVolumeReply) # @@protoc_insertion_point(class_scope:filemgr.NewVolumeReply)
)) })
_sym_db.RegisterMessage(NewVolumeReply) _sym_db.RegisterMessage(NewVolumeReply)
DelObjectReply = _reflection.GeneratedProtocolMessageType('DelObjectReply', (_message.Message,), dict( DelObjectReply = _reflection.GeneratedProtocolMessageType('DelObjectReply', (_message.Message,), {
DESCRIPTOR = _DELOBJECTREPLY, 'DESCRIPTOR' : _DELOBJECTREPLY,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.DelObjectReply) # @@protoc_insertion_point(class_scope:filemgr.DelObjectReply)
)) })
_sym_db.RegisterMessage(DelObjectReply) _sym_db.RegisterMessage(DelObjectReply)
RenameReply = _reflection.GeneratedProtocolMessageType('RenameReply', (_message.Message,), dict( RenameReply = _reflection.GeneratedProtocolMessageType('RenameReply', (_message.Message,), {
DESCRIPTOR = _RENAMEREPLY, 'DESCRIPTOR' : _RENAMEREPLY,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.RenameReply) # @@protoc_insertion_point(class_scope:filemgr.RenameReply)
)) })
_sym_db.RegisterMessage(RenameReply) _sym_db.RegisterMessage(RenameReply)
NewObjectInfo = _reflection.GeneratedProtocolMessageType('NewObjectInfo', (_message.Message,), dict( NewObjectInfo = _reflection.GeneratedProtocolMessageType('NewObjectInfo', (_message.Message,), {
DESCRIPTOR = _NEWOBJECTINFO, 'DESCRIPTOR' : _NEWOBJECTINFO,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.NewObjectInfo) # @@protoc_insertion_point(class_scope:filemgr.NewObjectInfo)
)) })
_sym_db.RegisterMessage(NewObjectInfo) _sym_db.RegisterMessage(NewObjectInfo)
NewObjectReply = _reflection.GeneratedProtocolMessageType('NewObjectReply', (_message.Message,), dict( NewObjectReply = _reflection.GeneratedProtocolMessageType('NewObjectReply', (_message.Message,), {
DESCRIPTOR = _NEWOBJECTREPLY, 'DESCRIPTOR' : _NEWOBJECTREPLY,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.NewObjectReply) # @@protoc_insertion_point(class_scope:filemgr.NewObjectReply)
)) })
_sym_db.RegisterMessage(NewObjectReply) _sym_db.RegisterMessage(NewObjectReply)
QuarantinedObjectName = _reflection.GeneratedProtocolMessageType('QuarantinedObjectName', (_message.Message,), dict( QuarantinedObjectName = _reflection.GeneratedProtocolMessageType('QuarantinedObjectName', (_message.Message,), {
DESCRIPTOR = _QUARANTINEDOBJECTNAME, 'DESCRIPTOR' : _QUARANTINEDOBJECTNAME,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.QuarantinedObjectName) # @@protoc_insertion_point(class_scope:filemgr.QuarantinedObjectName)
)) })
_sym_db.RegisterMessage(QuarantinedObjectName) _sym_db.RegisterMessage(QuarantinedObjectName)
QuarantinedObjectNames = _reflection.GeneratedProtocolMessageType('QuarantinedObjectNames', (_message.Message,), dict( QuarantinedObjectNames = _reflection.GeneratedProtocolMessageType('QuarantinedObjectNames', (_message.Message,), {
DESCRIPTOR = _QUARANTINEDOBJECTNAMES, 'DESCRIPTOR' : _QUARANTINEDOBJECTNAMES,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.QuarantinedObjectNames) # @@protoc_insertion_point(class_scope:filemgr.QuarantinedObjectNames)
)) })
_sym_db.RegisterMessage(QuarantinedObjectNames) _sym_db.RegisterMessage(QuarantinedObjectNames)
ObjectName = _reflection.GeneratedProtocolMessageType('ObjectName', (_message.Message,), dict( ObjectName = _reflection.GeneratedProtocolMessageType('ObjectName', (_message.Message,), {
DESCRIPTOR = _OBJECTNAME, 'DESCRIPTOR' : _OBJECTNAME,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.ObjectName) # @@protoc_insertion_point(class_scope:filemgr.ObjectName)
)) })
_sym_db.RegisterMessage(ObjectName) _sym_db.RegisterMessage(ObjectName)
LoadObjectInfo = _reflection.GeneratedProtocolMessageType('LoadObjectInfo', (_message.Message,), dict( LoadObjectInfo = _reflection.GeneratedProtocolMessageType('LoadObjectInfo', (_message.Message,), {
DESCRIPTOR = _LOADOBJECTINFO, 'DESCRIPTOR' : _LOADOBJECTINFO,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.LoadObjectInfo) # @@protoc_insertion_point(class_scope:filemgr.LoadObjectInfo)
)) })
_sym_db.RegisterMessage(LoadObjectInfo) _sym_db.RegisterMessage(LoadObjectInfo)
RenameInfo = _reflection.GeneratedProtocolMessageType('RenameInfo', (_message.Message,), dict( RenameInfo = _reflection.GeneratedProtocolMessageType('RenameInfo', (_message.Message,), {
DESCRIPTOR = _RENAMEINFO, 'DESCRIPTOR' : _RENAMEINFO,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.RenameInfo) # @@protoc_insertion_point(class_scope:filemgr.RenameInfo)
)) })
_sym_db.RegisterMessage(RenameInfo) _sym_db.RegisterMessage(RenameInfo)
Object = _reflection.GeneratedProtocolMessageType('Object', (_message.Message,), dict( Object = _reflection.GeneratedProtocolMessageType('Object', (_message.Message,), {
DESCRIPTOR = _OBJECT, 'DESCRIPTOR' : _OBJECT,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.Object) # @@protoc_insertion_point(class_scope:filemgr.Object)
)) })
_sym_db.RegisterMessage(Object) _sym_db.RegisterMessage(Object)
LoadObjectsResponse = _reflection.GeneratedProtocolMessageType('LoadObjectsResponse', (_message.Message,), dict( LoadObjectsResponse = _reflection.GeneratedProtocolMessageType('LoadObjectsResponse', (_message.Message,), {
DESCRIPTOR = _LOADOBJECTSRESPONSE, 'DESCRIPTOR' : _LOADOBJECTSRESPONSE,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.LoadObjectsResponse) # @@protoc_insertion_point(class_scope:filemgr.LoadObjectsResponse)
)) })
_sym_db.RegisterMessage(LoadObjectsResponse) _sym_db.RegisterMessage(LoadObjectsResponse)
ObjectPrefix = _reflection.GeneratedProtocolMessageType('ObjectPrefix', (_message.Message,), dict( ObjectPrefix = _reflection.GeneratedProtocolMessageType('ObjectPrefix', (_message.Message,), {
DESCRIPTOR = _OBJECTPREFIX, 'DESCRIPTOR' : _OBJECTPREFIX,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.ObjectPrefix) # @@protoc_insertion_point(class_scope:filemgr.ObjectPrefix)
)) })
_sym_db.RegisterMessage(ObjectPrefix) _sym_db.RegisterMessage(ObjectPrefix)
Empty = _reflection.GeneratedProtocolMessageType('Empty', (_message.Message,), dict( Empty = _reflection.GeneratedProtocolMessageType('Empty', (_message.Message,), {
DESCRIPTOR = _EMPTY, 'DESCRIPTOR' : _EMPTY,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.Empty) # @@protoc_insertion_point(class_scope:filemgr.Empty)
)) })
_sym_db.RegisterMessage(Empty) _sym_db.RegisterMessage(Empty)
GetStatsInfo = _reflection.GeneratedProtocolMessageType('GetStatsInfo', (_message.Message,), dict( GetStatsInfo = _reflection.GeneratedProtocolMessageType('GetStatsInfo', (_message.Message,), {
DESCRIPTOR = _GETSTATSINFO, 'DESCRIPTOR' : _GETSTATSINFO,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.GetStatsInfo) # @@protoc_insertion_point(class_scope:filemgr.GetStatsInfo)
)) })
_sym_db.RegisterMessage(GetStatsInfo) _sym_db.RegisterMessage(GetStatsInfo)
PartitionContent = _reflection.GeneratedProtocolMessageType('PartitionContent', (_message.Message,), dict( PartitionContent = _reflection.GeneratedProtocolMessageType('PartitionContent', (_message.Message,), {
DESCRIPTOR = _PARTITIONCONTENT, 'DESCRIPTOR' : _PARTITIONCONTENT,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.PartitionContent) # @@protoc_insertion_point(class_scope:filemgr.PartitionContent)
)) })
_sym_db.RegisterMessage(PartitionContent) _sym_db.RegisterMessage(PartitionContent)
FullPathEntry = _reflection.GeneratedProtocolMessageType('FullPathEntry', (_message.Message,), dict( FullPathEntry = _reflection.GeneratedProtocolMessageType('FullPathEntry', (_message.Message,), {
DESCRIPTOR = _FULLPATHENTRY, 'DESCRIPTOR' : _FULLPATHENTRY,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.FullPathEntry) # @@protoc_insertion_point(class_scope:filemgr.FullPathEntry)
)) })
_sym_db.RegisterMessage(FullPathEntry) _sym_db.RegisterMessage(FullPathEntry)
KvState = _reflection.GeneratedProtocolMessageType('KvState', (_message.Message,), dict( KvState = _reflection.GeneratedProtocolMessageType('KvState', (_message.Message,), {
DESCRIPTOR = _KVSTATE, 'DESCRIPTOR' : _KVSTATE,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.KvState) # @@protoc_insertion_point(class_scope:filemgr.KvState)
)) })
_sym_db.RegisterMessage(KvState) _sym_db.RegisterMessage(KvState)
KVStats = _reflection.GeneratedProtocolMessageType('KVStats', (_message.Message,), dict( KVStats = _reflection.GeneratedProtocolMessageType('KVStats', (_message.Message,), {
StatsEntry = _reflection.GeneratedProtocolMessageType('StatsEntry', (_message.Message,), dict( 'StatsEntry' : _reflection.GeneratedProtocolMessageType('StatsEntry', (_message.Message,), {
DESCRIPTOR = _KVSTATS_STATSENTRY, 'DESCRIPTOR' : _KVSTATS_STATSENTRY,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.KVStats.StatsEntry) # @@protoc_insertion_point(class_scope:filemgr.KVStats.StatsEntry)
)) })
, ,
DESCRIPTOR = _KVSTATS, 'DESCRIPTOR' : _KVSTATS,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.KVStats) # @@protoc_insertion_point(class_scope:filemgr.KVStats)
)) })
_sym_db.RegisterMessage(KVStats) _sym_db.RegisterMessage(KVStats)
_sym_db.RegisterMessage(KVStats.StatsEntry) _sym_db.RegisterMessage(KVStats.StatsEntry)
ListQuarantinedOHashesInfo = _reflection.GeneratedProtocolMessageType('ListQuarantinedOHashesInfo', (_message.Message,), dict( ListQuarantinedOHashesInfo = _reflection.GeneratedProtocolMessageType('ListQuarantinedOHashesInfo', (_message.Message,), {
DESCRIPTOR = _LISTQUARANTINEDOHASHESINFO, 'DESCRIPTOR' : _LISTQUARANTINEDOHASHESINFO,
__module__ = 'fmgr_pb2' '__module__' : 'fmgr_pb2'
# @@protoc_insertion_point(class_scope:filemgr.ListQuarantinedOHashesInfo) # @@protoc_insertion_point(class_scope:filemgr.ListQuarantinedOHashesInfo)
)) })
_sym_db.RegisterMessage(ListQuarantinedOHashesInfo) _sym_db.RegisterMessage(ListQuarantinedOHashesInfo)

View File

@ -12,6 +12,7 @@
# implied. # implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import six
import os import os
import struct import struct
@ -23,8 +24,8 @@ PICKLE_PROTOCOL = 2
OBJECT_HEADER_VERSION = 4 OBJECT_HEADER_VERSION = 4
VOLUME_HEADER_VERSION = 1 VOLUME_HEADER_VERSION = 1
OBJECT_START_MARKER = "SWIFTOBJ" OBJECT_START_MARKER = b"SWIFTOBJ"
VOLUME_START_MARKER = "SWIFTVOL" VOLUME_START_MARKER = b"SWIFTVOL"
# object alignment within a volume. # object alignment within a volume.
# this is needed so that FALLOC_FL_PUNCH_HOLE can actually return space back # this is needed so that FALLOC_FL_PUNCH_HOLE can actually return space back
@ -74,16 +75,12 @@ class ObjectHeader(object):
def __init__(self, version=OBJECT_HEADER_VERSION): def __init__(self, version=OBJECT_HEADER_VERSION):
if version not in object_header_formats.keys(): if version not in object_header_formats.keys():
raise HeaderException('Unsupported object header version') raise HeaderException('Unsupported object header version')
self.magic_string = bytes(OBJECT_START_MARKER) self.magic_string = OBJECT_START_MARKER
self.version = version self.version = version
def __eq__(self, other): def __eq__(self, other):
return self.__dict__ == other.__dict__ return self.__dict__ == other.__dict__
def __repr__(self):
return "<ObjectHeader ohash: {} filename: {}>".format(self.ohash,
self.filename)
def __len__(self): def __len__(self):
try: try:
fmt = object_header_formats[self.version] fmt = object_header_formats[self.version]
@ -107,7 +104,7 @@ class ObjectHeader(object):
args = (self.magic_string, self.version, args = (self.magic_string, self.version,
self.policy_idx, ohash_h, ohash_l, self.policy_idx, ohash_h, ohash_l,
str(self.filename), str(self.filename).encode('ascii'),
self.metadata_offset, self.metadata_size, self.metadata_offset, self.metadata_size,
self.data_offset, self.data_size, self.total_size) self.data_offset, self.data_size, self.total_size)
@ -120,7 +117,7 @@ class ObjectHeader(object):
args = (self.magic_string, self.version, args = (self.magic_string, self.version,
self.policy_idx, ohash_h, ohash_l, self.policy_idx, ohash_h, ohash_l,
str(self.filename), str(self.filename).encode('ascii'),
self.metadata_offset, self.metadata_size, self.metadata_offset, self.metadata_size,
self.data_offset, self.data_size, self.total_size) self.data_offset, self.data_size, self.total_size)
@ -133,7 +130,7 @@ class ObjectHeader(object):
args = (self.magic_string, self.version, args = (self.magic_string, self.version,
self.policy_idx, ohash_h, ohash_l, self.policy_idx, ohash_h, ohash_l,
str(self.filename), str(self.filename).encode('ascii'),
self.metadata_offset, self.metadata_size, self.metadata_offset, self.metadata_size,
self.data_offset, self.data_size, self.total_size, self.state) self.data_offset, self.data_size, self.total_size, self.state)
@ -146,7 +143,7 @@ class ObjectHeader(object):
args = (self.magic_string, self.version, args = (self.magic_string, self.version,
self.policy_idx, ohash_h, ohash_l, self.policy_idx, ohash_h, ohash_l,
str(self.filename), str(self.filename).encode('ascii'),
self.metadata_offset, self.metadata_size, self.metadata_offset, self.metadata_size,
self.data_offset, self.data_size, self.total_size, self.state, self.data_offset, self.data_size, self.total_size, self.state,
self.metastr_md5) self.metastr_md5)
@ -164,7 +161,7 @@ class ObjectHeader(object):
if buf[0:8] != OBJECT_START_MARKER: if buf[0:8] != OBJECT_START_MARKER:
raise HeaderException('Not a header') raise HeaderException('Not a header')
version = struct.unpack('<B', buf[8])[0] version = struct.unpack('<B', buf[8:9])[0]
if version not in object_header_formats.keys(): if version not in object_header_formats.keys():
raise HeaderException('Unsupported header version') raise HeaderException('Unsupported header version')
@ -179,7 +176,10 @@ class ObjectHeader(object):
header.version = raw_header[1] header.version = raw_header[1]
header.policy_idx = raw_header[2] header.policy_idx = raw_header[2]
header.ohash = "{:032x}".format((raw_header[3] << 64) + raw_header[4]) header.ohash = "{:032x}".format((raw_header[3] << 64) + raw_header[4])
header.filename = raw_header[5].rstrip('\0') if six.PY2:
header.filename = raw_header[5].rstrip(b'\0')
else:
header.filename = raw_header[5].rstrip(b'\0').decode('ascii')
header.metadata_offset = raw_header[6] header.metadata_offset = raw_header[6]
header.metadata_size = raw_header[7] header.metadata_size = raw_header[7]
header.data_offset = raw_header[8] header.data_offset = raw_header[8]
@ -199,7 +199,10 @@ class ObjectHeader(object):
header.version = raw_header[1] header.version = raw_header[1]
header.policy_idx = raw_header[2] header.policy_idx = raw_header[2]
header.ohash = "{:032x}".format((raw_header[3] << 64) + raw_header[4]) header.ohash = "{:032x}".format((raw_header[3] << 64) + raw_header[4])
header.filename = raw_header[5].rstrip('\0') if six.PY2:
header.filename = raw_header[5].rstrip(b'\0')
else:
header.filename = raw_header[5].rstrip(b'\0').decode('ascii')
header.metadata_offset = raw_header[6] header.metadata_offset = raw_header[6]
header.metadata_size = raw_header[7] header.metadata_size = raw_header[7]
header.data_offset = raw_header[8] header.data_offset = raw_header[8]
@ -219,7 +222,10 @@ class ObjectHeader(object):
header.version = raw_header[1] header.version = raw_header[1]
header.policy_idx = raw_header[2] header.policy_idx = raw_header[2]
header.ohash = "{:032x}".format((raw_header[3] << 64) + raw_header[4]) header.ohash = "{:032x}".format((raw_header[3] << 64) + raw_header[4])
header.filename = raw_header[5].rstrip('\0') if six.PY2:
header.filename = raw_header[5].rstrip(b'\0')
else:
header.filename = raw_header[5].rstrip(b'\0').decode('ascii')
header.metadata_offset = raw_header[6] header.metadata_offset = raw_header[6]
header.metadata_size = raw_header[7] header.metadata_size = raw_header[7]
header.data_offset = raw_header[8] header.data_offset = raw_header[8]
@ -240,7 +246,10 @@ class ObjectHeader(object):
header.version = raw_header[1] header.version = raw_header[1]
header.policy_idx = raw_header[2] header.policy_idx = raw_header[2]
header.ohash = "{:032x}".format((raw_header[3] << 64) + raw_header[4]) header.ohash = "{:032x}".format((raw_header[3] << 64) + raw_header[4])
header.filename = raw_header[5].rstrip('\0') if six.PY2:
header.filename = raw_header[5].rstrip(b'\0')
else:
header.filename = raw_header[5].rstrip(b'\0').decode('ascii')
header.metadata_offset = raw_header[6] header.metadata_offset = raw_header[6]
header.metadata_size = raw_header[7] header.metadata_size = raw_header[7]
header.data_offset = raw_header[8] header.data_offset = raw_header[8]
@ -273,7 +282,7 @@ class VolumeHeader(object):
(only valid if state is STATE_COMPACTION_SRC) (only valid if state is STATE_COMPACTION_SRC)
""" """
def __init__(self, version=VOLUME_HEADER_VERSION): def __init__(self, version=VOLUME_HEADER_VERSION):
self.magic_string = bytes(VOLUME_START_MARKER) self.magic_string = VOLUME_START_MARKER
self.version = version self.version = version
self.state = 0 self.state = 0
self.compaction_target = 0 self.compaction_target = 0
@ -316,7 +325,7 @@ class VolumeHeader(object):
} }
if buf[0:8] != VOLUME_START_MARKER: if buf[0:8] != VOLUME_START_MARKER:
raise HeaderException('Not a header') raise HeaderException('Not a header')
version = struct.unpack('<B', buf[8])[0] version = struct.unpack('<B', buf[8:9])[0]
if version not in volume_header_formats.keys(): if version not in volume_header_formats.keys():
raise HeaderException('Unsupported header version') raise HeaderException('Unsupported header version')

View File

@ -603,7 +603,7 @@ class BaseKVFileWriter(BaseDiskFileWriter):
except OSError as err: except OSError as err:
if err.errno in (errno.ENOSPC, errno.EDQUOT): if err.errno in (errno.ENOSPC, errno.EDQUOT):
# No more inodes in filesystem # No more inodes in filesystem
raise DiskFileNoSpace() raise DiskFileNoSpace(err.strerror)
raise raise
return self return self

View File

@ -21,6 +21,7 @@ vfile names and metadata (xattr) are also stored in the volume.
import errno import errno
import fcntl import fcntl
import six
import hashlib import hashlib
import re import re
from collections import defaultdict from collections import defaultdict
@ -40,13 +41,15 @@ from swift.obj.fmgr_pb2 import STATE_RW
from swift.obj.meta_pb2 import Metadata from swift.obj.meta_pb2 import Metadata
from swift.obj.diskfile import _encode_metadata from swift.obj.diskfile import _encode_metadata
from swift.common import utils from swift.common import utils
from swift.obj.vfile_utils import SwiftPathInfo, get_volume_index, get_volume_type, \ from swift.obj.vfile_utils import SwiftPathInfo, get_volume_index, \
next_aligned_offset, SwiftQuarantinedPathInfo get_volume_type, next_aligned_offset, SwiftQuarantinedPathInfo, VOSError, \
VIOError, VFileException
vcreation_lock_name = "volume_creation.lock" VCREATION_LOCK_NAME = "volume_creation.lock"
PICKLE_PROTOCOL = 2 PICKLE_PROTOCOL = 2
METADATA_RESERVE = 500 METADATA_RESERVE = 500
VOL_AND_LOCKS_RE = re.compile(r'v\d{7}(.writelock)?')
def increment(logger, counter, count=1): def increment(logger, counter, count=1):
@ -57,28 +60,6 @@ def increment(logger, counter, count=1):
pass pass
class VIOError(IOError):
"""
Exceptions are part of the interface, subclass IOError to make it easier
to interface with diskfile.py
"""
def __init__(self, *args, **kwargs):
super(VIOError, self).__init__(*args, **kwargs)
class VOSError(OSError):
"""
Exceptions are part of the interface, subclass OSError to make it easier
to interface with diskfile.py
"""
def __init__(self, *args, **kwargs):
super(VOSError, self).__init__(*args, **kwargs)
class VFileException(Exception):
pass
class VFileReader(object): class VFileReader(object):
""" """
Represents a vfile stored in a volume. Represents a vfile stored in a volume.
@ -264,6 +245,13 @@ class VFileWriter(object):
# parse datadir # parse datadir
si = SwiftPathInfo.from_path(datadir) si = SwiftPathInfo.from_path(datadir)
if si.type != "ohash":
raise VOSError("not a valid object hash path")
if obj_size is not None:
if obj_size < 0:
raise VOSError("obj size may not be negative")
socket_path = os.path.normpath(si.socket_path) socket_path = os.path.normpath(si.socket_path)
volume_dir = os.path.normpath(si.volume_dir) volume_dir = os.path.normpath(si.volume_dir)
@ -277,6 +265,7 @@ class VFileWriter(object):
# create object header # create object header
header = ObjectHeader(version=OBJECT_HEADER_VERSION) header = ObjectHeader(version=OBJECT_HEADER_VERSION)
# TODO: this is unused, always set to zero.
header.ohash = si.ohash header.ohash = si.ohash
header.policy_idx = 0 header.policy_idx = 0
header.data_offset = len(header) + conf['metadata_reserve'] header.data_offset = len(header) + conf['metadata_reserve']
@ -284,18 +273,21 @@ class VFileWriter(object):
# requires header v3 # requires header v3
header.state = STATE_OBJ_FILE header.state = STATE_OBJ_FILE
# get offset at which to start writing try:
offset = rpc.get_next_offset(socket_path, volume_index) # get offset at which to start writing
# FIXME: this is unused message, please fix as expected offset = rpc.get_next_offset(socket_path, volume_index)
# txt = "datadir {} seek to offset {} where data will start"
# pre-allocate space if needed # pre-allocate space if needed
_may_grow_volume(volume_file, offset, obj_size, conf, logger) _may_grow_volume(volume_file, offset, obj_size, conf, logger)
# seek to absolute object offset + relative data offset # seek to absolute object offset + relative data offset
# (we leave space for the header and some metadata) # (we leave space for the header and some metadata)
os.lseek(volume_file, offset + header.data_offset, os.lseek(volume_file, offset + header.data_offset,
os.SEEK_SET) os.SEEK_SET)
except Exception:
os.close(volume_file)
os.close(lock_file)
raise
return cls(datadir, volume_file, lock_file, volume_dir, return cls(datadir, volume_file, lock_file, volume_dir,
volume_index, header, offset, logger) volume_index, header, offset, logger)
@ -307,6 +299,9 @@ class VFileWriter(object):
if self.fd < 0: if self.fd < 0:
raise VIOError(errno.EBADF, "Bad file descriptor") raise VIOError(errno.EBADF, "Bad file descriptor")
if not filename:
raise VIOError("filename cannot be empty")
# how much data has been written ? # how much data has been written ?
# header.data_offset is relative to the object's offset # header.data_offset is relative to the object's offset
data_offset = self.offset + self.header.data_offset data_offset = self.offset + self.header.data_offset
@ -343,13 +338,8 @@ class VFileWriter(object):
object_end = data_end + metadata_remainder object_end = data_end + metadata_remainder
# TODO: use next_aligned_offset() object_end = next_aligned_offset(object_end, ALIGNMENT)
# keep unaligned obj_end to log how much space is lost to padding
# FIXME: this line is unused so that we should check the algorithms
# unaligned_obj_end = object_end
# align
if object_end % ALIGNMENT != 0:
object_end = object_end + (ALIGNMENT - object_end % ALIGNMENT)
self.header.total_size = object_end - self.offset self.header.total_size = object_end - self.offset
# write header # write header
@ -375,7 +365,8 @@ class VFileWriter(object):
errtxt = "BUG: wrote past object_end! curpos: {} object_end: {}" errtxt = "BUG: wrote past object_end! curpos: {} object_end: {}"
raise Exception(errtxt.format(curpos, object_end)) raise Exception(errtxt.format(curpos, object_end))
# sync # sync data. fdatasync() is enough, if the volume was just created,
# it has been fsync()'ed previously, along with its parent directory.
fdatasync(self.fd) fdatasync(self.fd)
# register object # register object
@ -394,7 +385,12 @@ class VFileWriter(object):
def open_or_create_volume(socket_path, partition, extension, volume_dir, def open_or_create_volume(socket_path, partition, extension, volume_dir,
conf, logger, size=0): conf, logger, size=0):
# try to find an available volume """
Tries to open or create a volume for writing. If a volume cannot be
opened or created, a VOSError exception is raised.
:return: volume file descriptor, lock file descriptor, absolute path
to volume.
"""
volume_file, lock_file, volume_path = open_writable_volume(socket_path, volume_file, lock_file, volume_path = open_writable_volume(socket_path,
partition, partition,
extension, extension,
@ -402,42 +398,49 @@ def open_or_create_volume(socket_path, partition, extension, volume_dir,
conf, conf,
logger) logger)
if not volume_file: if not volume_file:
# attempt to create new volume for partition
try: try:
os.makedirs(volume_dir)
except OSError as err:
if err.errno == errno.EEXIST:
pass
else:
raise
try:
# attempt to create new volume for partition
volume_type = get_volume_type(extension)
volume_file, lock_file, volume_path = create_writable_volume( volume_file, lock_file, volume_path = create_writable_volume(
socket_path, partition, volume_type, volume_dir, socket_path, partition, extension, volume_dir,
conf, logger, size=size) conf, logger, size=size)
except (OSError, IOError): except Exception as err:
if err.errno in (errno.EDQUOT, errno.EACCES, errno.EAGAIN): error_msg = "Failed to open or create a volume for writing: "
# failed to create a volume, try again to open an existing one error_msg += getattr(err, "strerror", "Unknown error")
volume_type = get_volume_type(extension) raise VOSError(errno.ENOSPC, error_msg)
volume_file, lock_file, volume_path = open_writable_volume(
socket_path, partition, volume_type, volume_dir, conf,
logger)
else:
raise
if not volume_file:
# TODO: make sure this ends in DiskFileNoSpace in caller
raise VIOError(errno.EIO, "Failed to open a volume for writing")
if not volume_file:
# TODO: make sure this ends in DiskFileNoSpace in caller
raise VIOError(errno.EIO, "Failed to open a volume for writing")
return volume_file, lock_file, volume_path return volume_file, lock_file, volume_path
def _create_new_lock_file(volume_dir, logger):
creation_lock_path = os.path.join(volume_dir, VCREATION_LOCK_NAME)
with open(creation_lock_path, 'w') as creation_lock_file:
# this may block
fcntl.flock(creation_lock_file, fcntl.LOCK_EX)
index = get_next_volume_index(volume_dir)
next_lock_name = get_lock_file_name(index)
next_lock_path = os.path.join(volume_dir, next_lock_name)
try:
lock_file = os.open(next_lock_path,
os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o600)
except OSError:
increment(logger, 'vfile.volume_creation.fail_other')
raise
try:
fcntl.flock(lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
increment(logger, 'vfile.volume_creation.fail_other')
os.close(lock_file)
os.unlink(next_lock_path)
raise
return index, next_lock_path, lock_file
# create a new volume # create a new volume
def create_writable_volume(socket_path, partition, volume_type, volume_dir, def create_writable_volume(socket_path, partition, extension, volume_dir,
conf, logger, state=STATE_RW, size=0): conf, logger, state=STATE_RW, size=0):
""" """
Creates a new writable volume, and associated lock file. Creates a new writable volume, and associated lock file.
@ -456,47 +459,32 @@ def create_writable_volume(socket_path, partition, volume_type, volume_dir,
if size is None: if size is None:
size = 0 size = 0
# lock the volume creation lock file
creation_lock_path = os.path.join(volume_dir, vcreation_lock_name)
# Check if we have exceeded the allowed volume count for this partition # Check if we have exceeded the allowed volume count for this partition
# Move this check below with the lock held ? (now, we may have # Move this check below with the lock held ? (now, we may have
# a few extra volumes) # a few extra volumes)
volume_type = get_volume_type(extension)
volumes = rpc.list_volumes(socket_path, partition, volume_type) volumes = rpc.list_volumes(socket_path, partition, volume_type)
max_volume_count = conf['max_volume_count'] max_volume_count = conf['max_volume_count']
if len(volumes) >= max_volume_count: if len(volumes) >= max_volume_count:
err_txt = "Maximum count of volumes reached for partition: {} type:\ err_txt = ("Maximum count of volumes reached for partition:"
{}".format(partition, volume_type) " {} type: {}".format(partition, volume_type))
increment(logger, 'vfile.volume_creation.fail_count_exceeded') increment(logger, 'vfile.volume_creation.fail_count_exceeded')
raise VOSError(errno.EDQUOT, err_txt) raise VOSError(errno.EDQUOT, err_txt)
with open(creation_lock_path, 'w') as creation_lock_file: try:
# this may block os.makedirs(volume_dir)
fcntl.flock(creation_lock_file, fcntl.LOCK_EX) except OSError as err:
if err.errno == errno.EEXIST:
index = get_next_volume_index(volume_dir) pass
next_lock_name = get_lock_file_name(index) else:
next_lock_path = os.path.join(volume_dir, next_lock_name)
lock_file = None
try:
lock_file = os.open(next_lock_path,
os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o600)
except OSError:
increment(logger, 'vfile.volume_creation.fail_other')
raise raise
try: index, next_lock_path, lock_file = _create_new_lock_file(
fcntl.flock(lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB) volume_dir, logger)
except IOError:
increment(logger, 'vfile.volume_creation.fail_other')
raise
# create the volume # create the volume
next_volume_name = get_volume_name(index) next_volume_name = get_volume_name(index)
next_volume_path = os.path.join(volume_dir, next_volume_name) next_volume_path = os.path.join(volume_dir, next_volume_name)
volume_file = os.open(next_volume_path,
os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o600)
vol_header = VolumeHeader() vol_header = VolumeHeader()
vol_header.volume_idx = index vol_header.volume_idx = index
@ -511,22 +499,26 @@ def create_writable_volume(socket_path, partition, volume_type, volume_dir,
# reserved space, but we cannot know this in advance) # reserved space, but we cannot know this in advance)
alloc_size = vol_header.first_obj_offset + size alloc_size = vol_header.first_obj_offset + size
volume_alloc_chunk_size = conf['volume_alloc_chunk_size'] volume_alloc_chunk_size = conf['volume_alloc_chunk_size']
_allocate_volume_space(volume_file, 0, alloc_size, volume_alloc_chunk_size,
logger)
# Write volume header
write_volume_header(vol_header, volume_file)
# If the uploader is slow to send data to the object server, a crash may
# occur before the object is received and a call to fsync() is issued.
# We end up with volumes without a header.
# Issue a fsync() here, at the cost of performance early on, until
# volumes have been created for all partitions.
fsync(volume_file)
fsync_dir(volume_dir)
# Register volume
try: try:
volume_file = os.open(next_volume_path,
os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o600)
_allocate_volume_space(volume_file, 0, alloc_size,
volume_alloc_chunk_size, logger)
# Write volume header
write_volume_header(vol_header, volume_file)
# If the uploader is slow to send data to the object server, a crash
# may occur before the object is received and a call to fsync() is
# issued. We end up with volumes without a header.
# Issue a fsync() here, at the cost of performance early on. As
# partitions get volumes we switch to open_writable_volume, avoiding
# the fsync.
fsync(volume_file)
fsync_dir(volume_dir)
# Register volume
rpc.register_volume(socket_path, partition, vol_header.type, index, rpc.register_volume(socket_path, partition, vol_header.type, index,
vol_header.first_obj_offset, vol_header.state) vol_header.first_obj_offset, vol_header.state)
except Exception: except Exception:
@ -613,8 +605,23 @@ def open_writable_volume(socket_path, partition, extension, volume_dir, conf,
def open_volume(volume_path): def open_volume(volume_path):
"""Locks the volume, and returns a fd to the volume and a fd to its lock
file. Returns None, None, if it cannot be locked. Raises for any other
error.
:param volume_path: full path to volume
:return: (volume fd, lock fd)
"""
lock_file_path = "{}.writelock".format(volume_path) lock_file_path = "{}.writelock".format(volume_path)
lock_file = os.open(lock_file_path, os.O_WRONLY)
try:
lock_file = os.open(lock_file_path, os.O_WRONLY)
except OSError as e:
if e.errno != errno.ENOENT:
raise
# if the volume lock file as been removed, create it
lock_file = os.open(lock_file_path,
os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o600)
try: try:
fcntl.flock(lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB) fcntl.flock(lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError as err: except IOError as err:
@ -623,8 +630,18 @@ def open_volume(volume_path):
os.close(lock_file) os.close(lock_file)
return None, None return None, None
else: else:
os.close(lock_file) try:
os.close(lock_file)
except Exception:
pass
raise raise
except Exception:
try:
os.close(lock_file)
except Exception:
pass
raise
volume_file = os.open(volume_path, os.O_WRONLY) volume_file = os.open(volume_path, os.O_WRONLY)
return volume_file, lock_file return volume_file, lock_file
@ -651,32 +668,41 @@ def change_volume_state(volume_file_path, state, compaction_target=None):
def get_next_volume_index(volume_dir): def get_next_volume_index(volume_dir):
""" """
Returns the next volume index to use for the given dir. Returns the next volume index to use for the given dir.
Caller must hold the volume creation lock.
:param volume_dir: volume directory
:return: the next volume index to use
""" """
dir_entries = os.listdir(volume_dir) dir_entries = os.listdir(volume_dir)
lock_file_idxs = [int(f[1:8]) for f in dir_entries if # Get all volumes and their lock: a volume should always have a lock,
f.endswith(".writelock")] # but a fsck may have removed either. If we find such a case, skip the
if len(lock_file_idxs) < 1: # index.
volumes_and_locks_idxs = set([name[1:8] for name in dir_entries if
VOL_AND_LOCKS_RE.match(name)])
if len(volumes_and_locks_idxs) < 1:
return 1 return 1
lock_file_idxs.sort() # This is about 30% faster than calling int() in the list comprehension
# above.
idxs = sorted(int(i) for i in volumes_and_locks_idxs)
# find the first "hole" in the indexes # find the first "hole" in the indexes
for i in xrange(1, len(lock_file_idxs) + 1): for pos, idx in enumerate(idxs, start=1):
if lock_file_idxs[i - 1] != i: if pos != idx:
return i return pos
# no hole found # no hole found
return i + 1 return idx + 1
def get_lock_file_name(index): def get_lock_file_name(index):
if index < 0 or index > 9999999: if index <= 0 or index > 9999999:
raise VFileException("invalid lock file index") raise VFileException("invalid lock file index")
lock_file_name = "v{0:07d}.writelock".format(index) lock_file_name = "v{0:07d}.writelock".format(index)
return lock_file_name return lock_file_name
def get_volume_name(index): def get_volume_name(index):
if index < 0 or index > 9999999: if index <= 0 or index > 9999999:
raise VFileException("invalid volume file index") raise VFileException("invalid volume file index")
volume_file_name = "v{0:07d}".format(index) volume_file_name = "v{0:07d}".format(index)
return volume_file_name return volume_file_name
@ -1122,7 +1148,11 @@ def read_metadata(fp, offset, header):
metadata = {} metadata = {}
for attr in meta.attrs: for attr in meta.attrs:
if attr.key: if attr.key:
metadata[attr.key] = attr.value if six.PY2:
metadata[attr.key] = attr.value
else:
metadata[attr.key.decode('utf8', 'surrogateescape')] = \
attr.value.decode('utf8', 'surrogateescape')
return metadata return metadata

View File

@ -28,7 +28,21 @@ volume_name_re = re.compile(r"^v\d{7}$")
losf_name_re = re.compile(r"^losf(-\d+)?$") losf_name_re = re.compile(r"^losf(-\d+)?$")
class VFileUtilException(Exception): class VIOError(IOError):
"""
Exceptions are part of the interface, subclass IOError to make it easier
to interface with diskfile.py
"""
class VOSError(OSError):
"""
Exceptions are part of the interface, subclass OSError to make it easier
to interface with diskfile.py
"""
class VFileException(Exception):
pass pass
@ -112,13 +126,13 @@ class SwiftPathInfo(object):
obj_idx = [i for i, elem in enumerate(ldir) obj_idx = [i for i, elem in enumerate(ldir)
if elem.startswith("objects")][0] if elem.startswith("objects")][0]
except IndexError: except IndexError:
raise VFileUtilException("cannot parse object directory") raise VOSError("cannot parse object directory")
elements = ldir[(obj_idx + 1):] elements = ldir[(obj_idx + 1):]
count = len(elements) count = len(elements)
if count > 4: if count > 4:
raise VFileUtilException("cannot parse swift file path") raise VOSError("cannot parse swift file path")
_, policy = split_policy_string(ldir[obj_idx]) _, policy = split_policy_string(ldir[obj_idx])
policy_idx = policy.idx policy_idx = policy.idx
@ -126,7 +140,7 @@ class SwiftPathInfo(object):
prefix = os.path.join("/", *ldir[0:obj_idx]) prefix = os.path.join("/", *ldir[0:obj_idx])
m = policy_re.match(ldir[obj_idx]) m = policy_re.match(ldir[obj_idx])
if not m: if not m:
raise VFileUtilException( raise VOSError(
"cannot parse object element of directory") "cannot parse object element of directory")
if m.group(1): if m.group(1):
sofsdir = "losf{}".format(m.group(1)) sofsdir = "losf{}".format(m.group(1))
@ -165,15 +179,15 @@ class SwiftQuarantinedPathInfo(object):
try: try:
quar_idx = ldir.index("quarantined") quar_idx = ldir.index("quarantined")
except ValueError: except ValueError:
raise VFileUtilException("cannot parse quarantined path %s" % raise VOSError("cannot parse quarantined path %s" %
path) path)
elements = ldir[(quar_idx + 1):] elements = ldir[(quar_idx + 1):]
count = len(elements) count = len(elements)
if count < 1 or count > 3 or "objects" not in elements[0]: if count < 1 or count > 3 or "objects" not in elements[0]:
raise VFileUtilException("cannot parse quarantined path %s" % raise VOSError("cannot parse quarantined path %s" %
path) path)
_, policy = split_policy_string(elements[0]) _, policy = split_policy_string(elements[0])
policy_idx = policy.idx policy_idx = policy.idx

File diff suppressed because it is too large Load Diff

View File

@ -233,11 +233,11 @@ class TestSwiftPathInfo(unittest.TestCase):
self.assertEqual(si.filename, test["filename"]) self.assertEqual(si.filename, test["filename"])
def test_swift_path_info_error(self): def test_swift_path_info_error(self):
with self.assertRaises(vfile_utils.VFileUtilException): with self.assertRaises(vfile_utils.VOSError):
vfile_utils.SwiftPathInfo.from_path("/invalid") vfile_utils.SwiftPathInfo.from_path("/invalid")
with self.assertRaises(vfile_utils.VFileUtilException): with self.assertRaises(vfile_utils.VOSError):
vfile_utils.SwiftPathInfo.from_path("/srv/node/sda2") vfile_utils.SwiftPathInfo.from_path("/srv/node/sda2")
with self.assertRaises(vfile_utils.VFileUtilException): with self.assertRaises(vfile_utils.VOSError):
invalid_path = "/sda/objects/1234/def" \ invalid_path = "/sda/objects/1234/def" \
"/d41d8cd98f00b204e9800998ecf8427e/" \ "/d41d8cd98f00b204e9800998ecf8427e/" \
"1522913866.16520#12#d.data/extra_dir" "1522913866.16520#12#d.data/extra_dir"
@ -317,11 +317,11 @@ class TestSwiftQuarantinedPathInfo(unittest.TestCase):
self.assertEqual(si.filename, test["filename"]) self.assertEqual(si.filename, test["filename"])
def test_swift_path_info_error(self): def test_swift_path_info_error(self):
with self.assertRaises(vfile_utils.VFileUtilException): with self.assertRaises(vfile_utils.VOSError):
vfile_utils.SwiftPathInfo.from_path("/invalid") vfile_utils.SwiftPathInfo.from_path("/invalid")
with self.assertRaises(vfile_utils.VFileUtilException): with self.assertRaises(vfile_utils.VOSError):
vfile_utils.SwiftPathInfo.from_path("/srv/node/sda2") vfile_utils.SwiftPathInfo.from_path("/srv/node/sda2")
with self.assertRaises(vfile_utils.VFileUtilException): with self.assertRaises(vfile_utils.VOSError):
invalid_path = "/sdb/objects/1234/def" \ invalid_path = "/sdb/objects/1234/def" \
"/d41d8cd98f00b204e9800998ecf8427e/" \ "/d41d8cd98f00b204e9800998ecf8427e/" \
"1522913866.16520#12#d.data/extra_dir" "1522913866.16520#12#d.data/extra_dir"