s3: implemented DeleteMultipleObjects

This commit is contained in:
Chris Lu 2020-02-25 14:38:36 -08:00
parent 35dde56711
commit bc38b72a20
7 changed files with 366 additions and 109 deletions

View file

@ -24,6 +24,9 @@ service SeaweedFiler {
rpc DeleteEntry (DeleteEntryRequest) returns (DeleteEntryResponse) {
}
rpc StreamDeleteEntries (stream DeleteEntryRequest) returns (stream DeleteEntryResponse) {
}
rpc AtomicRenameEntry (AtomicRenameEntryRequest) returns (AtomicRenameEntryResponse) {
}
@ -147,6 +150,7 @@ message DeleteEntryRequest {
}
message DeleteEntryResponse {
string error = 1;
}
message AtomicRenameEntryRequest {

View file

@ -24,6 +24,9 @@ service SeaweedFiler {
rpc DeleteEntry (DeleteEntryRequest) returns (DeleteEntryResponse) {
}
rpc StreamDeleteEntries (stream DeleteEntryRequest) returns (stream DeleteEntryResponse) {
}
rpc AtomicRenameEntry (AtomicRenameEntryRequest) returns (AtomicRenameEntryResponse) {
}
@ -147,6 +150,7 @@ message DeleteEntryRequest {
}
message DeleteEntryResponse {
string error = 1;
}
message AtomicRenameEntryRequest {

View file

@ -624,6 +624,7 @@ func (m *DeleteEntryRequest) GetIgnoreRecursiveError() bool {
}
type DeleteEntryResponse struct {
Error string `protobuf:"bytes,1,opt,name=error" json:"error,omitempty"`
}
func (m *DeleteEntryResponse) Reset() { *m = DeleteEntryResponse{} }
@ -631,6 +632,13 @@ func (m *DeleteEntryResponse) String() string { return proto.CompactT
func (*DeleteEntryResponse) ProtoMessage() {}
func (*DeleteEntryResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
func (m *DeleteEntryResponse) GetError() string {
if m != nil {
return m.Error
}
return ""
}
type AtomicRenameEntryRequest struct {
OldDirectory string `protobuf:"bytes,1,opt,name=old_directory,json=oldDirectory" json:"old_directory,omitempty"`
OldName string `protobuf:"bytes,2,opt,name=old_name,json=oldName" json:"old_name,omitempty"`
@ -1088,6 +1096,7 @@ type SeaweedFilerClient interface {
CreateEntry(ctx context.Context, in *CreateEntryRequest, opts ...grpc.CallOption) (*CreateEntryResponse, error)
UpdateEntry(ctx context.Context, in *UpdateEntryRequest, opts ...grpc.CallOption) (*UpdateEntryResponse, error)
DeleteEntry(ctx context.Context, in *DeleteEntryRequest, opts ...grpc.CallOption) (*DeleteEntryResponse, error)
StreamDeleteEntries(ctx context.Context, opts ...grpc.CallOption) (SeaweedFiler_StreamDeleteEntriesClient, error)
AtomicRenameEntry(ctx context.Context, in *AtomicRenameEntryRequest, opts ...grpc.CallOption) (*AtomicRenameEntryResponse, error)
AssignVolume(ctx context.Context, in *AssignVolumeRequest, opts ...grpc.CallOption) (*AssignVolumeResponse, error)
LookupVolume(ctx context.Context, in *LookupVolumeRequest, opts ...grpc.CallOption) (*LookupVolumeResponse, error)
@ -1172,6 +1181,37 @@ func (c *seaweedFilerClient) DeleteEntry(ctx context.Context, in *DeleteEntryReq
return out, nil
}
func (c *seaweedFilerClient) StreamDeleteEntries(ctx context.Context, opts ...grpc.CallOption) (SeaweedFiler_StreamDeleteEntriesClient, error) {
stream, err := grpc.NewClientStream(ctx, &_SeaweedFiler_serviceDesc.Streams[1], c.cc, "/filer_pb.SeaweedFiler/StreamDeleteEntries", opts...)
if err != nil {
return nil, err
}
x := &seaweedFilerStreamDeleteEntriesClient{stream}
return x, nil
}
type SeaweedFiler_StreamDeleteEntriesClient interface {
Send(*DeleteEntryRequest) error
Recv() (*DeleteEntryResponse, error)
grpc.ClientStream
}
type seaweedFilerStreamDeleteEntriesClient struct {
grpc.ClientStream
}
func (x *seaweedFilerStreamDeleteEntriesClient) Send(m *DeleteEntryRequest) error {
return x.ClientStream.SendMsg(m)
}
func (x *seaweedFilerStreamDeleteEntriesClient) Recv() (*DeleteEntryResponse, error) {
m := new(DeleteEntryResponse)
if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
func (c *seaweedFilerClient) AtomicRenameEntry(ctx context.Context, in *AtomicRenameEntryRequest, opts ...grpc.CallOption) (*AtomicRenameEntryResponse, error) {
out := new(AtomicRenameEntryResponse)
err := grpc.Invoke(ctx, "/filer_pb.SeaweedFiler/AtomicRenameEntry", in, out, c.cc, opts...)
@ -1234,6 +1274,7 @@ type SeaweedFilerServer interface {
CreateEntry(context.Context, *CreateEntryRequest) (*CreateEntryResponse, error)
UpdateEntry(context.Context, *UpdateEntryRequest) (*UpdateEntryResponse, error)
DeleteEntry(context.Context, *DeleteEntryRequest) (*DeleteEntryResponse, error)
StreamDeleteEntries(SeaweedFiler_StreamDeleteEntriesServer) error
AtomicRenameEntry(context.Context, *AtomicRenameEntryRequest) (*AtomicRenameEntryResponse, error)
AssignVolume(context.Context, *AssignVolumeRequest) (*AssignVolumeResponse, error)
LookupVolume(context.Context, *LookupVolumeRequest) (*LookupVolumeResponse, error)
@ -1339,6 +1380,32 @@ func _SeaweedFiler_DeleteEntry_Handler(srv interface{}, ctx context.Context, dec
return interceptor(ctx, in, info, handler)
}
func _SeaweedFiler_StreamDeleteEntries_Handler(srv interface{}, stream grpc.ServerStream) error {
return srv.(SeaweedFilerServer).StreamDeleteEntries(&seaweedFilerStreamDeleteEntriesServer{stream})
}
type SeaweedFiler_StreamDeleteEntriesServer interface {
Send(*DeleteEntryResponse) error
Recv() (*DeleteEntryRequest, error)
grpc.ServerStream
}
type seaweedFilerStreamDeleteEntriesServer struct {
grpc.ServerStream
}
func (x *seaweedFilerStreamDeleteEntriesServer) Send(m *DeleteEntryResponse) error {
return x.ServerStream.SendMsg(m)
}
func (x *seaweedFilerStreamDeleteEntriesServer) Recv() (*DeleteEntryRequest, error) {
m := new(DeleteEntryRequest)
if err := x.ServerStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
func _SeaweedFiler_AtomicRenameEntry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(AtomicRenameEntryRequest)
if err := dec(in); err != nil {
@ -1498,6 +1565,12 @@ var _SeaweedFiler_serviceDesc = grpc.ServiceDesc{
Handler: _SeaweedFiler_ListEntries_Handler,
ServerStreams: true,
},
{
StreamName: "StreamDeleteEntries",
Handler: _SeaweedFiler_StreamDeleteEntries_Handler,
ServerStreams: true,
ClientStreams: true,
},
},
Metadata: "filer.proto",
}
@ -1505,110 +1578,111 @@ var _SeaweedFiler_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("filer.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 1671 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x58, 0xcb, 0x6f, 0xdb, 0x46,
0x1a, 0x37, 0xf5, 0xe6, 0x27, 0x29, 0xb1, 0x47, 0x76, 0xa2, 0xc8, 0x8f, 0x75, 0xe8, 0x4d, 0xd6,
0x8b, 0x04, 0xde, 0xc0, 0x9b, 0x43, 0xb2, 0xd9, 0x3d, 0x24, 0x7e, 0x2c, 0x8c, 0x75, 0x1e, 0xa0,
0x93, 0xc5, 0x2e, 0x0a, 0x94, 0xa0, 0xc9, 0x91, 0x3c, 0x35, 0xc5, 0x61, 0x87, 0x43, 0xdb, 0xe9,
0x9f, 0x52, 0xa0, 0x7f, 0x45, 0xaf, 0x45, 0x2f, 0x45, 0xd1, 0x1e, 0xfa, 0xb7, 0xf4, 0xd8, 0x73,
0x31, 0x33, 0x24, 0x35, 0x14, 0x65, 0x3b, 0x41, 0x91, 0x1b, 0xe7, 0x7b, 0xcd, 0x37, 0xbf, 0xef,
0x29, 0x41, 0x7b, 0x48, 0x02, 0xcc, 0xb6, 0x22, 0x46, 0x39, 0x45, 0x2d, 0x79, 0x70, 0xa2, 0x63,
0xeb, 0x35, 0x2c, 0x1f, 0x52, 0x7a, 0x9a, 0x44, 0xbb, 0x84, 0x61, 0x8f, 0x53, 0xf6, 0x7e, 0x2f,
0xe4, 0xec, 0xbd, 0x8d, 0xbf, 0x4c, 0x70, 0xcc, 0xd1, 0x0a, 0x98, 0x7e, 0xc6, 0xe8, 0x1b, 0xeb,
0xc6, 0xa6, 0x69, 0x4f, 0x08, 0x08, 0x41, 0x2d, 0x74, 0xc7, 0xb8, 0x5f, 0x91, 0x0c, 0xf9, 0x6d,
0xed, 0xc1, 0xca, 0x6c, 0x83, 0x71, 0x44, 0xc3, 0x18, 0xa3, 0x7b, 0x50, 0xc7, 0x82, 0x20, 0xad,
0xb5, 0xb7, 0x6f, 0x6e, 0x65, 0xae, 0x6c, 0x29, 0x39, 0xc5, 0xb5, 0xbe, 0x37, 0x00, 0x1d, 0x92,
0x98, 0x0b, 0x22, 0xc1, 0xf1, 0x87, 0xf9, 0x73, 0x0b, 0x1a, 0x11, 0xc3, 0x43, 0x72, 0x91, 0x7a,
0x94, 0x9e, 0xd0, 0x43, 0x58, 0x88, 0xb9, 0xcb, 0xf8, 0x3e, 0xa3, 0xe3, 0x7d, 0x12, 0xe0, 0x57,
0xc2, 0xe9, 0xaa, 0x14, 0x29, 0x33, 0xd0, 0x16, 0x20, 0x12, 0x7a, 0x41, 0x12, 0x93, 0x33, 0x7c,
0x94, 0x71, 0xfb, 0xb5, 0x75, 0x63, 0xb3, 0x65, 0xcf, 0xe0, 0xa0, 0x45, 0xa8, 0x07, 0x64, 0x4c,
0x78, 0xbf, 0xbe, 0x6e, 0x6c, 0x76, 0x6d, 0x75, 0xb0, 0xfe, 0x09, 0xbd, 0x82, 0xff, 0x1f, 0xf7,
0xfc, 0x6f, 0x2a, 0x50, 0x97, 0x84, 0x1c, 0x63, 0x63, 0x82, 0x31, 0xba, 0x0b, 0x1d, 0x12, 0x3b,
0x13, 0x20, 0x2a, 0xd2, 0xb7, 0x36, 0x89, 0x73, 0xcc, 0xd1, 0x03, 0x68, 0x78, 0x27, 0x49, 0x78,
0x1a, 0xf7, 0xab, 0xeb, 0xd5, 0xcd, 0xf6, 0x76, 0x6f, 0x72, 0x91, 0x78, 0xe8, 0x8e, 0xe0, 0xd9,
0xa9, 0x08, 0x7a, 0x02, 0xe0, 0x72, 0xce, 0xc8, 0x71, 0xc2, 0x71, 0x2c, 0x5f, 0xda, 0xde, 0xee,
0x6b, 0x0a, 0x49, 0x8c, 0x9f, 0xe7, 0x7c, 0x5b, 0x93, 0x45, 0x4f, 0xa1, 0x85, 0x2f, 0x38, 0x0e,
0x7d, 0xec, 0xf7, 0xeb, 0xf2, 0xa2, 0xd5, 0xa9, 0x17, 0x6d, 0xed, 0xa5, 0x7c, 0xf5, 0xbe, 0x5c,
0x7c, 0xf0, 0x0c, 0xba, 0x05, 0x16, 0x9a, 0x87, 0xea, 0x29, 0xce, 0xa2, 0x2a, 0x3e, 0x05, 0xb2,
0x67, 0x6e, 0x90, 0xa8, 0x04, 0xeb, 0xd8, 0xea, 0xf0, 0x8f, 0xca, 0x13, 0xc3, 0xda, 0x05, 0x73,
0x3f, 0x09, 0x82, 0x5c, 0xd1, 0x27, 0x2c, 0x53, 0xf4, 0x09, 0x9b, 0xa0, 0x5c, 0xb9, 0x12, 0xe5,
0xef, 0x0c, 0x58, 0xd8, 0x3b, 0xc3, 0x21, 0x7f, 0x45, 0x39, 0x19, 0x12, 0xcf, 0xe5, 0x84, 0x86,
0xe8, 0x21, 0x98, 0x34, 0xf0, 0x9d, 0x2b, 0xc3, 0xd4, 0xa2, 0x41, 0xea, 0xf5, 0x43, 0x30, 0x43,
0x7c, 0xee, 0x5c, 0x79, 0x5d, 0x2b, 0xc4, 0xe7, 0x4a, 0x7a, 0x03, 0xba, 0x3e, 0x0e, 0x30, 0xc7,
0x4e, 0x1e, 0x1d, 0x11, 0xba, 0x8e, 0x22, 0xee, 0xa8, 0x70, 0xdc, 0x87, 0x9b, 0xc2, 0x64, 0xe4,
0x32, 0x1c, 0x72, 0x27, 0x72, 0xf9, 0x89, 0x8c, 0x89, 0x69, 0x77, 0x43, 0x7c, 0xfe, 0x46, 0x52,
0xdf, 0xb8, 0xfc, 0xc4, 0xfa, 0xcd, 0x00, 0x33, 0x0f, 0x26, 0xba, 0x0d, 0x4d, 0x71, 0xad, 0x43,
0xfc, 0x14, 0x89, 0x86, 0x38, 0x1e, 0xf8, 0xa2, 0x2a, 0xe8, 0x70, 0x18, 0x63, 0x2e, 0xdd, 0xab,
0xda, 0xe9, 0x49, 0x64, 0x56, 0x4c, 0xbe, 0x52, 0x85, 0x50, 0xb3, 0xe5, 0xb7, 0x40, 0x7c, 0xcc,
0xc9, 0x18, 0xcb, 0x0b, 0xab, 0xb6, 0x3a, 0xa0, 0x1e, 0xd4, 0xb1, 0xc3, 0xdd, 0x91, 0xcc, 0x70,
0xd3, 0xae, 0xe1, 0xb7, 0xee, 0x08, 0xfd, 0x19, 0x6e, 0xc4, 0x34, 0x61, 0x1e, 0x76, 0xb2, 0x6b,
0x1b, 0x92, 0xdb, 0x51, 0xd4, 0x7d, 0x75, 0xb9, 0x05, 0xd5, 0x21, 0xf1, 0xfb, 0x4d, 0x09, 0xcc,
0x7c, 0x31, 0x09, 0x0f, 0x7c, 0x5b, 0x30, 0xd1, 0xdf, 0x00, 0x72, 0x4b, 0x7e, 0xbf, 0x75, 0x89,
0xa8, 0x99, 0xd9, 0xf5, 0xad, 0xff, 0x41, 0x23, 0x35, 0xbf, 0x0c, 0xe6, 0x19, 0x0d, 0x92, 0x71,
0xfe, 0xec, 0xae, 0xdd, 0x52, 0x84, 0x03, 0x1f, 0xdd, 0x01, 0xd9, 0xe7, 0x1c, 0x91, 0x55, 0x15,
0xf9, 0x48, 0x89, 0xd0, 0x7f, 0xb0, 0xec, 0x14, 0x1e, 0xa5, 0xa7, 0x44, 0xbd, 0xbe, 0x69, 0xa7,
0x27, 0xeb, 0xd7, 0x0a, 0xdc, 0x28, 0xa6, 0xbb, 0xb8, 0x42, 0x5a, 0x91, 0x58, 0x19, 0xd2, 0x8c,
0x34, 0x7b, 0x54, 0xc0, 0xab, 0xa2, 0xe3, 0x95, 0xa9, 0x8c, 0xa9, 0xaf, 0x2e, 0xe8, 0x2a, 0x95,
0x97, 0xd4, 0xc7, 0x22, 0x5b, 0x13, 0xe2, 0x4b, 0x80, 0xbb, 0xb6, 0xf8, 0x14, 0x94, 0x11, 0xf1,
0xd3, 0xf6, 0x21, 0x3e, 0xa5, 0x7b, 0x4c, 0xda, 0x6d, 0xa8, 0x90, 0xa9, 0x93, 0x08, 0xd9, 0x58,
0x50, 0x9b, 0x2a, 0x0e, 0xe2, 0x1b, 0xad, 0x43, 0x9b, 0xe1, 0x28, 0x48, 0xb3, 0x57, 0xc2, 0x67,
0xda, 0x3a, 0x09, 0xad, 0x01, 0x78, 0x34, 0x08, 0xb0, 0x27, 0x05, 0x4c, 0x29, 0xa0, 0x51, 0x44,
0xe6, 0x70, 0x1e, 0x38, 0x31, 0xf6, 0xfa, 0xb0, 0x6e, 0x6c, 0xd6, 0xed, 0x06, 0xe7, 0xc1, 0x11,
0xf6, 0xc4, 0x3b, 0x92, 0x18, 0x33, 0x47, 0x36, 0xa0, 0xb6, 0xd4, 0x6b, 0x09, 0x82, 0x6c, 0x93,
0xab, 0x00, 0x23, 0x46, 0x93, 0x48, 0x71, 0x3b, 0xeb, 0x55, 0xd1, 0x8b, 0x25, 0x45, 0xb2, 0xef,
0xc1, 0x8d, 0xf8, 0xfd, 0x38, 0x20, 0xe1, 0xa9, 0xc3, 0x5d, 0x36, 0xc2, 0xbc, 0xdf, 0x55, 0x39,
0x9c, 0x52, 0xdf, 0x4a, 0xa2, 0x15, 0x01, 0xda, 0x61, 0xd8, 0xe5, 0xf8, 0x23, 0xc6, 0xce, 0x87,
0x55, 0x37, 0x5a, 0x82, 0x06, 0x75, 0xf0, 0x85, 0x17, 0xa4, 0x45, 0x56, 0xa7, 0x7b, 0x17, 0x5e,
0x60, 0x3d, 0x80, 0x5e, 0xe1, 0xc6, 0xb4, 0x31, 0x2f, 0x42, 0x1d, 0x33, 0x46, 0xb3, 0x36, 0xa2,
0x0e, 0xd6, 0xff, 0x01, 0xbd, 0x8b, 0xfc, 0x4f, 0xe1, 0x9e, 0xb5, 0x04, 0xbd, 0x82, 0x69, 0xe5,
0x87, 0xf5, 0xa3, 0x01, 0x68, 0x57, 0x76, 0x83, 0x3f, 0x36, 0x88, 0x45, 0x7d, 0x8a, 0x21, 0xa1,
0xba, 0x8d, 0xef, 0x72, 0x37, 0x1d, 0x61, 0x1d, 0x12, 0x2b, 0xfb, 0xbb, 0x2e, 0x77, 0xd3, 0x51,
0xc2, 0xb0, 0x97, 0x30, 0x31, 0xd5, 0x64, 0x12, 0xca, 0x51, 0x62, 0x67, 0x24, 0xf4, 0x18, 0x6e,
0x91, 0x51, 0x48, 0x19, 0x9e, 0x88, 0x39, 0x0a, 0xaa, 0x86, 0x14, 0x5e, 0x54, 0xdc, 0x5c, 0x61,
0x4f, 0x22, 0xb7, 0x04, 0xbd, 0xc2, 0x33, 0xd2, 0xe7, 0x7d, 0x6d, 0x40, 0xff, 0x39, 0xa7, 0x63,
0xe2, 0xd9, 0x58, 0xb8, 0x59, 0x78, 0xe4, 0x06, 0x74, 0x45, 0xe7, 0x9d, 0x7e, 0x68, 0x87, 0x06,
0xfe, 0x64, 0xb2, 0xdd, 0x01, 0xd1, 0x7c, 0x1d, 0xed, 0xbd, 0x4d, 0x1a, 0xf8, 0x32, 0xe7, 0x36,
0x40, 0x74, 0x48, 0x4d, 0x5f, 0xcd, 0xf8, 0x4e, 0x88, 0xcf, 0x0b, 0xfa, 0x42, 0x48, 0xea, 0xab,
0xb6, 0xda, 0x0c, 0xf1, 0xb9, 0xd0, 0xb7, 0x96, 0xe1, 0xce, 0x0c, 0xdf, 0x52, 0xcf, 0x7f, 0x36,
0xa0, 0xf7, 0x3c, 0x8e, 0xc9, 0x28, 0xfc, 0xaf, 0x6c, 0x30, 0x99, 0xd3, 0x8b, 0x50, 0xf7, 0x68,
0x12, 0x72, 0xe9, 0x6c, 0xdd, 0x56, 0x87, 0xa9, 0x9a, 0xab, 0x94, 0x6a, 0x6e, 0xaa, 0x6a, 0xab,
0xe5, 0xaa, 0xd5, 0xaa, 0xb2, 0x56, 0xa8, 0xca, 0x3f, 0x41, 0x5b, 0x84, 0xd3, 0xf1, 0x70, 0xc8,
0x31, 0x4b, 0x7b, 0x32, 0x08, 0xd2, 0x8e, 0xa4, 0x08, 0x01, 0x7d, 0x76, 0xa8, 0xb6, 0x0c, 0xd1,
0x64, 0x70, 0xfc, 0x62, 0xc0, 0x62, 0xf1, 0x29, 0x69, 0x11, 0x5c, 0x3a, 0x43, 0x44, 0xd3, 0x62,
0x41, 0xfa, 0x0e, 0xf1, 0x29, 0xca, 0x3f, 0x4a, 0x8e, 0x03, 0xe2, 0x39, 0x82, 0xa1, 0xfc, 0x37,
0x15, 0xe5, 0x1d, 0x0b, 0x26, 0xa8, 0xd4, 0x74, 0x54, 0x10, 0xd4, 0xdc, 0x84, 0x9f, 0x64, 0x73,
0x44, 0x7c, 0x4f, 0x21, 0xd5, 0xb8, 0x0e, 0xa9, 0x66, 0x09, 0x29, 0xeb, 0x31, 0xf4, 0xd4, 0xca,
0x59, 0x0c, 0xcc, 0x2a, 0x40, 0x3e, 0x1b, 0xe2, 0xbe, 0xa1, 0x1a, 0x54, 0x36, 0x1c, 0x62, 0xeb,
0x5f, 0x60, 0x1e, 0x52, 0x65, 0x21, 0x46, 0x8f, 0xc0, 0x0c, 0xb2, 0x83, 0x14, 0x6d, 0x6f, 0xa3,
0x49, 0xdd, 0x66, 0x72, 0xf6, 0x44, 0xc8, 0x7a, 0x06, 0xad, 0x8c, 0x9c, 0xa1, 0x63, 0x5c, 0x86,
0x4e, 0x65, 0x0a, 0x1d, 0xeb, 0x07, 0x03, 0x16, 0x8b, 0x2e, 0xa7, 0x01, 0x78, 0x07, 0xdd, 0xfc,
0x0a, 0x67, 0xec, 0x46, 0xa9, 0x2f, 0x8f, 0x74, 0x5f, 0xca, 0x6a, 0xb9, 0x83, 0xf1, 0x4b, 0x37,
0x52, 0x59, 0xdb, 0x09, 0x34, 0xd2, 0xe0, 0x2d, 0x2c, 0x94, 0x44, 0x66, 0xec, 0x5b, 0x7f, 0xd5,
0xf7, 0xad, 0xc2, 0xce, 0x98, 0x6b, 0xeb, 0x4b, 0xd8, 0x53, 0xb8, 0xad, 0x4a, 0x7c, 0x27, 0x8f,
0x56, 0x86, 0x7d, 0x31, 0xa8, 0xc6, 0x74, 0x50, 0xad, 0x01, 0xf4, 0xcb, 0xaa, 0x69, 0xa1, 0x8d,
0x60, 0xe1, 0x88, 0xbb, 0x9c, 0xc4, 0x9c, 0x78, 0xf9, 0xe2, 0x3f, 0x95, 0x05, 0xc6, 0x75, 0x53,
0xae, 0x5c, 0x71, 0xf3, 0x50, 0xe5, 0x3c, 0xcb, 0x54, 0xf1, 0x29, 0xa2, 0x80, 0xf4, 0x9b, 0xd2,
0x18, 0x7c, 0x82, 0xab, 0x44, 0x3e, 0x70, 0xca, 0xdd, 0x40, 0x6d, 0x11, 0x35, 0xb9, 0x45, 0x98,
0x92, 0x22, 0xd7, 0x08, 0x35, 0x68, 0x7d, 0xc5, 0xad, 0xab, 0x1d, 0x43, 0x10, 0x24, 0x73, 0x15,
0x40, 0x16, 0xa5, 0xaa, 0xa7, 0x86, 0xd2, 0x15, 0x94, 0x1d, 0x41, 0xb0, 0xd6, 0x60, 0xe5, 0xdf,
0x98, 0x8b, 0x7d, 0x88, 0xed, 0xd0, 0x70, 0x48, 0x46, 0x09, 0x73, 0xb5, 0x50, 0x58, 0xdf, 0x1a,
0xb0, 0x7a, 0x89, 0x40, 0xfa, 0xe0, 0x3e, 0x34, 0xc7, 0x6e, 0xcc, 0x31, 0xcb, 0xaa, 0x24, 0x3b,
0x4e, 0x43, 0x51, 0xb9, 0x0e, 0x8a, 0x6a, 0x09, 0x8a, 0x25, 0x68, 0x8c, 0xdd, 0x0b, 0x67, 0x7c,
0x9c, 0x2e, 0x3c, 0xf5, 0xb1, 0x7b, 0xf1, 0xf2, 0x58, 0xf6, 0x30, 0xc2, 0x9c, 0xe3, 0xc4, 0x3b,
0xc5, 0x3c, 0xce, 0x7b, 0x18, 0x61, 0x2f, 0x14, 0x65, 0xfb, 0xa7, 0x26, 0x74, 0x8e, 0xb0, 0x7b,
0x8e, 0xb1, 0x2f, 0x3d, 0x47, 0xa3, 0xac, 0x62, 0x8a, 0xbf, 0x2b, 0xd1, 0xbd, 0xe9, 0xd2, 0x98,
0xf9, 0x43, 0x76, 0x70, 0xff, 0x3a, 0xb1, 0x34, 0xf9, 0xe6, 0xd0, 0x2b, 0x68, 0x6b, 0x3f, 0xdc,
0xd0, 0x8a, 0xa6, 0x58, 0xfa, 0x3d, 0x3a, 0x58, 0xbd, 0x84, 0x9b, 0x59, 0x7b, 0x64, 0xa0, 0x43,
0x68, 0x6b, 0xfb, 0x86, 0x6e, 0xaf, 0xbc, 0xf8, 0xe8, 0xf6, 0x66, 0x2c, 0x29, 0xd6, 0x9c, 0xb0,
0xa6, 0x6d, 0x0d, 0xba, 0xb5, 0xf2, 0x9e, 0xa2, 0x5b, 0x9b, 0xb5, 0x6a, 0x48, 0x6b, 0xda, 0x90,
0xd6, 0xad, 0x95, 0x57, 0x10, 0xdd, 0xda, 0xac, 0xc9, 0x3e, 0x87, 0x3e, 0x87, 0x85, 0xd2, 0xf8,
0x44, 0xd6, 0x44, 0xeb, 0xb2, 0xb9, 0x3f, 0xd8, 0xb8, 0x52, 0x26, 0xb7, 0xff, 0x1a, 0x3a, 0xfa,
0xd4, 0x42, 0x9a, 0x43, 0x33, 0x06, 0xf3, 0x60, 0xed, 0x32, 0xb6, 0x6e, 0x50, 0x6f, 0xa7, 0xba,
0xc1, 0x19, 0x03, 0x45, 0x37, 0x38, 0xab, 0x0b, 0x5b, 0x73, 0xe8, 0x33, 0x98, 0x9f, 0x6e, 0x6b,
0xe8, 0xee, 0x34, 0x6c, 0xa5, 0x6e, 0x39, 0xb0, 0xae, 0x12, 0xc9, 0x8d, 0x1f, 0x00, 0x4c, 0xba,
0x15, 0x5a, 0x9e, 0xe8, 0x94, 0xba, 0xe5, 0x60, 0x65, 0x36, 0x33, 0x37, 0xf5, 0x05, 0x2c, 0xcd,
0x6c, 0x09, 0x48, 0x2b, 0x93, 0xab, 0x9a, 0xca, 0xe0, 0x2f, 0xd7, 0xca, 0x65, 0x77, 0xbd, 0x58,
0x83, 0xf9, 0x58, 0x15, 0xf2, 0x30, 0xde, 0xf2, 0x02, 0x82, 0x43, 0xfe, 0x02, 0xa4, 0xc6, 0x1b,
0x46, 0x39, 0x3d, 0x6e, 0xc8, 0xbf, 0xa4, 0xfe, 0xfe, 0x7b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xaa,
0x2b, 0xd6, 0xf6, 0xa1, 0x12, 0x00, 0x00,
// 1692 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x58, 0xcb, 0x6f, 0xdb, 0xc8,
0x19, 0x37, 0xf5, 0xe6, 0x27, 0x29, 0xb1, 0x47, 0x76, 0xa2, 0xc8, 0x8f, 0x3a, 0x74, 0x93, 0xba,
0x48, 0xe0, 0x1a, 0x6e, 0x0e, 0x49, 0xd3, 0x1e, 0x12, 0x3f, 0x0a, 0xa3, 0xce, 0x03, 0x74, 0x52,
0xa4, 0x28, 0x50, 0x82, 0x26, 0x47, 0xf2, 0xd4, 0x24, 0x47, 0x1d, 0x0e, 0x6d, 0xa7, 0x7f, 0x4a,
0x81, 0x1e, 0xfa, 0x37, 0xf4, 0xba, 0xd8, 0xcb, 0x62, 0x81, 0x3d, 0xec, 0xdf, 0xb2, 0xc7, 0x3d,
0x2f, 0x66, 0x86, 0xa4, 0x86, 0xa2, 0x6c, 0x27, 0xbb, 0xc8, 0x8d, 0xf3, 0xbd, 0xe6, 0x9b, 0xdf,
0xf7, 0x94, 0xa0, 0x3d, 0x24, 0x01, 0x66, 0x5b, 0x63, 0x46, 0x39, 0x45, 0x2d, 0x79, 0x70, 0xc6,
0x27, 0xd6, 0x1b, 0x58, 0x3e, 0xa2, 0xf4, 0x2c, 0x19, 0xef, 0x11, 0x86, 0x3d, 0x4e, 0xd9, 0xc7,
0xfd, 0x88, 0xb3, 0x8f, 0x36, 0xfe, 0x57, 0x82, 0x63, 0x8e, 0x56, 0xc0, 0xf4, 0x33, 0x46, 0xdf,
0x58, 0x37, 0x36, 0x4d, 0x7b, 0x42, 0x40, 0x08, 0x6a, 0x91, 0x1b, 0xe2, 0x7e, 0x45, 0x32, 0xe4,
0xb7, 0xb5, 0x0f, 0x2b, 0xb3, 0x0d, 0xc6, 0x63, 0x1a, 0xc5, 0x18, 0x3d, 0x80, 0x3a, 0x16, 0x04,
0x69, 0xad, 0xbd, 0x73, 0x7b, 0x2b, 0x73, 0x65, 0x4b, 0xc9, 0x29, 0xae, 0xf5, 0xb5, 0x01, 0xe8,
0x88, 0xc4, 0x5c, 0x10, 0x09, 0x8e, 0x3f, 0xcd, 0x9f, 0x3b, 0xd0, 0x18, 0x33, 0x3c, 0x24, 0x97,
0xa9, 0x47, 0xe9, 0x09, 0x3d, 0x86, 0x85, 0x98, 0xbb, 0x8c, 0x1f, 0x30, 0x1a, 0x1e, 0x90, 0x00,
0xbf, 0x16, 0x4e, 0x57, 0xa5, 0x48, 0x99, 0x81, 0xb6, 0x00, 0x91, 0xc8, 0x0b, 0x92, 0x98, 0x9c,
0xe3, 0xe3, 0x8c, 0xdb, 0xaf, 0xad, 0x1b, 0x9b, 0x2d, 0x7b, 0x06, 0x07, 0x2d, 0x42, 0x3d, 0x20,
0x21, 0xe1, 0xfd, 0xfa, 0xba, 0xb1, 0xd9, 0xb5, 0xd5, 0xc1, 0xfa, 0x23, 0xf4, 0x0a, 0xfe, 0x7f,
0xde, 0xf3, 0xff, 0x5b, 0x81, 0xba, 0x24, 0xe4, 0x18, 0x1b, 0x13, 0x8c, 0xd1, 0x7d, 0xe8, 0x90,
0xd8, 0x99, 0x00, 0x51, 0x91, 0xbe, 0xb5, 0x49, 0x9c, 0x63, 0x8e, 0x1e, 0x41, 0xc3, 0x3b, 0x4d,
0xa2, 0xb3, 0xb8, 0x5f, 0x5d, 0xaf, 0x6e, 0xb6, 0x77, 0x7a, 0x93, 0x8b, 0xc4, 0x43, 0x77, 0x05,
0xcf, 0x4e, 0x45, 0xd0, 0x53, 0x00, 0x97, 0x73, 0x46, 0x4e, 0x12, 0x8e, 0x63, 0xf9, 0xd2, 0xf6,
0x4e, 0x5f, 0x53, 0x48, 0x62, 0xfc, 0x22, 0xe7, 0xdb, 0x9a, 0x2c, 0x7a, 0x06, 0x2d, 0x7c, 0xc9,
0x71, 0xe4, 0x63, 0xbf, 0x5f, 0x97, 0x17, 0xad, 0x4e, 0xbd, 0x68, 0x6b, 0x3f, 0xe5, 0xab, 0xf7,
0xe5, 0xe2, 0x83, 0xe7, 0xd0, 0x2d, 0xb0, 0xd0, 0x3c, 0x54, 0xcf, 0x70, 0x16, 0x55, 0xf1, 0x29,
0x90, 0x3d, 0x77, 0x83, 0x44, 0x25, 0x58, 0xc7, 0x56, 0x87, 0x3f, 0x54, 0x9e, 0x1a, 0xd6, 0x1e,
0x98, 0x07, 0x49, 0x10, 0xe4, 0x8a, 0x3e, 0x61, 0x99, 0xa2, 0x4f, 0xd8, 0x04, 0xe5, 0xca, 0xb5,
0x28, 0x7f, 0x65, 0xc0, 0xc2, 0xfe, 0x39, 0x8e, 0xf8, 0x6b, 0xca, 0xc9, 0x90, 0x78, 0x2e, 0x27,
0x34, 0x42, 0x8f, 0xc1, 0xa4, 0x81, 0xef, 0x5c, 0x1b, 0xa6, 0x16, 0x0d, 0x52, 0xaf, 0x1f, 0x83,
0x19, 0xe1, 0x0b, 0xe7, 0xda, 0xeb, 0x5a, 0x11, 0xbe, 0x50, 0xd2, 0x1b, 0xd0, 0xf5, 0x71, 0x80,
0x39, 0x76, 0xf2, 0xe8, 0x88, 0xd0, 0x75, 0x14, 0x71, 0x57, 0x85, 0xe3, 0x21, 0xdc, 0x16, 0x26,
0xc7, 0x2e, 0xc3, 0x11, 0x77, 0xc6, 0x2e, 0x3f, 0x95, 0x31, 0x31, 0xed, 0x6e, 0x84, 0x2f, 0xde,
0x4a, 0xea, 0x5b, 0x97, 0x9f, 0x5a, 0x3f, 0x1a, 0x60, 0xe6, 0xc1, 0x44, 0x77, 0xa1, 0x29, 0xae,
0x75, 0x88, 0x9f, 0x22, 0xd1, 0x10, 0xc7, 0x43, 0x5f, 0x54, 0x05, 0x1d, 0x0e, 0x63, 0xcc, 0xa5,
0x7b, 0x55, 0x3b, 0x3d, 0x89, 0xcc, 0x8a, 0xc9, 0xbf, 0x55, 0x21, 0xd4, 0x6c, 0xf9, 0x2d, 0x10,
0x0f, 0x39, 0x09, 0xb1, 0xbc, 0xb0, 0x6a, 0xab, 0x03, 0xea, 0x41, 0x1d, 0x3b, 0xdc, 0x1d, 0xc9,
0x0c, 0x37, 0xed, 0x1a, 0x7e, 0xe7, 0x8e, 0xd0, 0xaf, 0xe1, 0x56, 0x4c, 0x13, 0xe6, 0x61, 0x27,
0xbb, 0xb6, 0x21, 0xb9, 0x1d, 0x45, 0x3d, 0x50, 0x97, 0x5b, 0x50, 0x1d, 0x12, 0xbf, 0xdf, 0x94,
0xc0, 0xcc, 0x17, 0x93, 0xf0, 0xd0, 0xb7, 0x05, 0x13, 0xfd, 0x0e, 0x20, 0xb7, 0xe4, 0xf7, 0x5b,
0x57, 0x88, 0x9a, 0x99, 0x5d, 0xdf, 0xfa, 0x00, 0x8d, 0xd4, 0xfc, 0x32, 0x98, 0xe7, 0x34, 0x48,
0xc2, 0xfc, 0xd9, 0x5d, 0xbb, 0xa5, 0x08, 0x87, 0x3e, 0xba, 0x07, 0xb2, 0xcf, 0x39, 0x22, 0xab,
0x2a, 0xf2, 0x91, 0x12, 0xa1, 0xbf, 0x60, 0xd9, 0x29, 0x3c, 0x4a, 0xcf, 0x88, 0x7a, 0x7d, 0xd3,
0x4e, 0x4f, 0xd6, 0x0f, 0x15, 0xb8, 0x55, 0x4c, 0x77, 0x71, 0x85, 0xb4, 0x22, 0xb1, 0x32, 0xa4,
0x19, 0x69, 0xf6, 0xb8, 0x80, 0x57, 0x45, 0xc7, 0x2b, 0x53, 0x09, 0xa9, 0xaf, 0x2e, 0xe8, 0x2a,
0x95, 0x57, 0xd4, 0xc7, 0x22, 0x5b, 0x13, 0xe2, 0x4b, 0x80, 0xbb, 0xb6, 0xf8, 0x14, 0x94, 0x11,
0xf1, 0xd3, 0xf6, 0x21, 0x3e, 0xa5, 0x7b, 0x4c, 0xda, 0x6d, 0xa8, 0x90, 0xa9, 0x93, 0x08, 0x59,
0x28, 0xa8, 0x4d, 0x15, 0x07, 0xf1, 0x8d, 0xd6, 0xa1, 0xcd, 0xf0, 0x38, 0x48, 0xb3, 0x57, 0xc2,
0x67, 0xda, 0x3a, 0x09, 0xad, 0x01, 0x78, 0x34, 0x08, 0xb0, 0x27, 0x05, 0x4c, 0x29, 0xa0, 0x51,
0x44, 0xe6, 0x70, 0x1e, 0x38, 0x31, 0xf6, 0xfa, 0xb0, 0x6e, 0x6c, 0xd6, 0xed, 0x06, 0xe7, 0xc1,
0x31, 0xf6, 0xc4, 0x3b, 0x92, 0x18, 0x33, 0x47, 0x36, 0xa0, 0xb6, 0xd4, 0x6b, 0x09, 0x82, 0x6c,
0x93, 0xab, 0x00, 0x23, 0x46, 0x93, 0xb1, 0xe2, 0x76, 0xd6, 0xab, 0xa2, 0x17, 0x4b, 0x8a, 0x64,
0x3f, 0x80, 0x5b, 0xf1, 0xc7, 0x30, 0x20, 0xd1, 0x99, 0xc3, 0x5d, 0x36, 0xc2, 0xbc, 0xdf, 0x55,
0x39, 0x9c, 0x52, 0xdf, 0x49, 0xa2, 0x35, 0x06, 0xb4, 0xcb, 0xb0, 0xcb, 0xf1, 0x67, 0x8c, 0x9d,
0x4f, 0xab, 0x6e, 0xb4, 0x04, 0x0d, 0xea, 0xe0, 0x4b, 0x2f, 0x48, 0x8b, 0xac, 0x4e, 0xf7, 0x2f,
0xbd, 0xc0, 0x7a, 0x04, 0xbd, 0xc2, 0x8d, 0x69, 0x63, 0x5e, 0x84, 0x3a, 0x66, 0x8c, 0x66, 0x6d,
0x44, 0x1d, 0xac, 0xbf, 0x01, 0x7a, 0x3f, 0xf6, 0xbf, 0x84, 0x7b, 0xd6, 0x12, 0xf4, 0x0a, 0xa6,
0x95, 0x1f, 0xd6, 0xb7, 0x06, 0xa0, 0x3d, 0xd9, 0x0d, 0x7e, 0xd9, 0x20, 0x16, 0xf5, 0x29, 0x86,
0x84, 0xea, 0x36, 0xbe, 0xcb, 0xdd, 0x74, 0x84, 0x75, 0x48, 0xac, 0xec, 0xef, 0xb9, 0xdc, 0x4d,
0x47, 0x09, 0xc3, 0x5e, 0xc2, 0xc4, 0x54, 0x93, 0x49, 0x28, 0x47, 0x89, 0x9d, 0x91, 0xd0, 0x13,
0xb8, 0x43, 0x46, 0x11, 0x65, 0x78, 0x22, 0xe6, 0x28, 0xa8, 0x1a, 0x52, 0x78, 0x51, 0x71, 0x73,
0x85, 0x7d, 0x89, 0xdc, 0x23, 0xe8, 0x15, 0x9e, 0x71, 0x2d, 0xcc, 0xff, 0x31, 0xa0, 0xff, 0x82,
0xd3, 0x90, 0x78, 0x36, 0x16, 0xce, 0x17, 0x9e, 0xbe, 0x01, 0x5d, 0xd1, 0x8f, 0xa7, 0x9f, 0xdf,
0xa1, 0x81, 0x3f, 0x99, 0x77, 0xf7, 0x40, 0xb4, 0x64, 0x47, 0x43, 0xa1, 0x49, 0x03, 0x5f, 0x66,
0xe2, 0x06, 0x88, 0xbe, 0xa9, 0xe9, 0xab, 0xc9, 0xdf, 0x89, 0xf0, 0x45, 0x41, 0x5f, 0x08, 0x49,
0x7d, 0xd5, 0x6c, 0x9b, 0x11, 0xbe, 0x10, 0xfa, 0xd6, 0x32, 0xdc, 0x9b, 0xe1, 0x5b, 0x1a, 0xae,
0xef, 0x0c, 0xe8, 0xbd, 0x88, 0x63, 0x32, 0x8a, 0xfe, 0x2a, 0xdb, 0x4e, 0xe6, 0xf4, 0x22, 0xd4,
0x3d, 0x9a, 0x44, 0x5c, 0x3a, 0x5b, 0xb7, 0xd5, 0x61, 0xaa, 0x12, 0x2b, 0xa5, 0x4a, 0x9c, 0xaa,
0xe5, 0x6a, 0xb9, 0x96, 0xb5, 0x5a, 0xad, 0x15, 0x6a, 0xf5, 0x57, 0xd0, 0x16, 0x41, 0x76, 0x3c,
0x1c, 0x71, 0xcc, 0xd2, 0x4e, 0x0d, 0x82, 0xb4, 0x2b, 0x29, 0x42, 0x40, 0x9f, 0x28, 0xaa, 0x59,
0xc3, 0x78, 0x32, 0x4e, 0xbe, 0x37, 0x60, 0xb1, 0xf8, 0x94, 0x34, 0x66, 0x57, 0x4e, 0x16, 0xd1,
0xca, 0x58, 0x90, 0xbe, 0x43, 0x7c, 0x8a, 0xa6, 0x30, 0x4e, 0x4e, 0x02, 0xe2, 0x39, 0x82, 0xa1,
0xfc, 0x37, 0x15, 0xe5, 0x3d, 0x0b, 0x26, 0xa8, 0xd4, 0x74, 0x54, 0x10, 0xd4, 0xdc, 0x84, 0x9f,
0x66, 0xd3, 0x45, 0x7c, 0x4f, 0x21, 0xd5, 0xb8, 0x09, 0xa9, 0x66, 0x09, 0x29, 0xeb, 0x09, 0xf4,
0xd4, 0x22, 0x5a, 0x0c, 0xcc, 0x2a, 0x40, 0x3e, 0x31, 0xe2, 0xbe, 0xa1, 0xda, 0x56, 0x36, 0x32,
0x62, 0xeb, 0x4f, 0x60, 0x1e, 0x51, 0x65, 0x21, 0x46, 0xdb, 0x60, 0x06, 0xd9, 0x41, 0x8a, 0xb6,
0x77, 0xd0, 0xa4, 0x9a, 0x33, 0x39, 0x7b, 0x22, 0x64, 0x3d, 0x87, 0x56, 0x46, 0xce, 0xd0, 0x31,
0xae, 0x42, 0xa7, 0x32, 0x85, 0x8e, 0xf5, 0x8d, 0x01, 0x8b, 0x45, 0x97, 0xd3, 0x00, 0xbc, 0x87,
0x6e, 0x7e, 0x85, 0x13, 0xba, 0xe3, 0xd4, 0x97, 0x6d, 0xdd, 0x97, 0xb2, 0x5a, 0xee, 0x60, 0xfc,
0xca, 0x1d, 0xab, 0xac, 0xed, 0x04, 0x1a, 0x69, 0xf0, 0x0e, 0x16, 0x4a, 0x22, 0x33, 0xb6, 0xb0,
0xdf, 0xea, 0x5b, 0x58, 0x61, 0x93, 0xcc, 0xb5, 0xf5, 0xd5, 0xec, 0x19, 0xdc, 0x55, 0x85, 0xbf,
0x9b, 0x47, 0x2b, 0xc3, 0xbe, 0x18, 0x54, 0x63, 0x3a, 0xa8, 0xd6, 0x00, 0xfa, 0x65, 0xd5, 0xb4,
0xd0, 0x46, 0xb0, 0x70, 0xcc, 0x5d, 0x4e, 0x62, 0x4e, 0xbc, 0xfc, 0xe7, 0xc0, 0x54, 0x16, 0x18,
0x37, 0xcd, 0xbe, 0x72, 0xc5, 0xcd, 0x43, 0x95, 0xf3, 0x2c, 0x53, 0xc5, 0xa7, 0x88, 0x02, 0xd2,
0x6f, 0x4a, 0x63, 0xf0, 0x05, 0xae, 0x12, 0xf9, 0xc0, 0x29, 0x77, 0x03, 0xb5, 0x5b, 0xd4, 0xe4,
0x6e, 0x61, 0x4a, 0x8a, 0x5c, 0x2e, 0xd4, 0xf8, 0xf5, 0x15, 0xb7, 0xae, 0x36, 0x0f, 0x41, 0x90,
0xcc, 0x55, 0x00, 0x59, 0x94, 0xaa, 0x9e, 0x1a, 0x4a, 0x57, 0x50, 0x76, 0x05, 0xc1, 0x5a, 0x83,
0x95, 0x3f, 0x63, 0x2e, 0xb6, 0x24, 0xb6, 0x4b, 0xa3, 0x21, 0x19, 0x25, 0xcc, 0xd5, 0x42, 0x61,
0xfd, 0xdf, 0x80, 0xd5, 0x2b, 0x04, 0xd2, 0x07, 0xf7, 0xa1, 0x19, 0xba, 0x31, 0xc7, 0x2c, 0xab,
0x92, 0xec, 0x38, 0x0d, 0x45, 0xe5, 0x26, 0x28, 0xaa, 0x25, 0x28, 0x96, 0xa0, 0x11, 0xba, 0x97,
0x4e, 0x78, 0x92, 0xae, 0x41, 0xf5, 0xd0, 0xbd, 0x7c, 0x75, 0x22, 0x7b, 0x18, 0x61, 0xce, 0x49,
0xe2, 0x9d, 0x61, 0x1e, 0xe7, 0x3d, 0x8c, 0xb0, 0x97, 0x8a, 0xb2, 0xf3, 0xbf, 0x16, 0x74, 0x8e,
0xb1, 0x7b, 0x81, 0xb1, 0x2f, 0x3d, 0x47, 0xa3, 0xac, 0x62, 0x8a, 0xbf, 0x36, 0xd1, 0x83, 0xe9,
0xd2, 0x98, 0xf9, 0xf3, 0x76, 0xf0, 0xf0, 0x26, 0xb1, 0x34, 0xf9, 0xe6, 0xd0, 0x6b, 0x68, 0x6b,
0x3f, 0xe7, 0xd0, 0x8a, 0xa6, 0x58, 0xfa, 0x95, 0x3a, 0x58, 0xbd, 0x82, 0x9b, 0x59, 0xdb, 0x36,
0xd0, 0x11, 0xb4, 0xb5, 0x2d, 0x44, 0xb7, 0x57, 0x5e, 0x87, 0x74, 0x7b, 0x33, 0x56, 0x17, 0x6b,
0x4e, 0x58, 0xd3, 0x76, 0x09, 0xdd, 0x5a, 0x79, 0x7b, 0xd1, 0xad, 0xcd, 0x5a, 0x40, 0xa4, 0x35,
0x6d, 0x74, 0xeb, 0xd6, 0xca, 0x8b, 0x89, 0x6e, 0x6d, 0xc6, 0xbc, 0xb7, 0xe6, 0xd0, 0x07, 0xe8,
0x1d, 0x73, 0x86, 0xdd, 0x70, 0xc2, 0x9e, 0x42, 0xf0, 0x67, 0x58, 0xdd, 0x34, 0xb6, 0x0d, 0xf4,
0x0f, 0x58, 0x28, 0x0d, 0x66, 0x64, 0x4d, 0x34, 0xaf, 0xda, 0x28, 0x06, 0x1b, 0xd7, 0xca, 0xe4,
0x9e, 0xbf, 0x81, 0x8e, 0x3e, 0x0f, 0x91, 0xe6, 0xd4, 0x8c, 0x91, 0x3f, 0x58, 0xbb, 0x8a, 0xad,
0x1b, 0xd4, 0x1b, 0xb5, 0x6e, 0x70, 0xc6, 0xa8, 0xd2, 0x0d, 0xce, 0xea, 0xef, 0xd6, 0x1c, 0xfa,
0x3b, 0xcc, 0x4f, 0x37, 0x4c, 0x74, 0x7f, 0x1a, 0xba, 0x52, 0x1f, 0x1e, 0x58, 0xd7, 0x89, 0xe4,
0xc6, 0x0f, 0x01, 0x26, 0x7d, 0x10, 0x2d, 0x4f, 0x74, 0x4a, 0x7d, 0x78, 0xb0, 0x32, 0x9b, 0x99,
0x9b, 0xfa, 0x27, 0x2c, 0xcd, 0x6c, 0x36, 0x48, 0x2b, 0xc0, 0xeb, 0xda, 0xd5, 0xe0, 0x37, 0x37,
0xca, 0x65, 0x77, 0xbd, 0x5c, 0x83, 0xf9, 0x58, 0xb5, 0x88, 0x61, 0xbc, 0xe5, 0x05, 0x04, 0x47,
0xfc, 0x25, 0x48, 0x8d, 0xb7, 0x8c, 0x72, 0x7a, 0xd2, 0x90, 0x7f, 0x81, 0xfd, 0xfe, 0xa7, 0x00,
0x00, 0x00, 0xff, 0xff, 0x84, 0x9c, 0x05, 0x4d, 0x11, 0x13, 0x00, 0x00,
}

View file

@ -139,6 +139,61 @@ func (s3a *S3ApiServer) rm(ctx context.Context, parentDirectoryPath string, entr
}
func (s3a *S3ApiServer) streamRemove(ctx context.Context, quiet bool,
fn func() (finished bool, parentDirectoryPath string, entryName string, isDeleteData, isRecursive bool),
respFn func(err string)) error {
return s3a.withFilerClient(ctx, func(client filer_pb.SeaweedFilerClient) error {
stream, err := client.StreamDeleteEntries(ctx)
if err != nil {
glog.V(0).Infof("stream delete entry: %v", err)
return fmt.Errorf("stream delete entry: %v", err)
}
waitc := make(chan struct{})
go func() {
for {
resp, err := stream.Recv()
if err == io.EOF {
// read done.
close(waitc)
return
}
if err != nil {
glog.V(0).Infof("streamRemove: %v", err)
return
}
respFn(resp.Error)
}
}()
for {
finished, parentDirectoryPath, entryName, isDeleteData, isRecursive := fn()
if finished {
break
}
err = stream.Send(&filer_pb.DeleteEntryRequest{
Directory: parentDirectoryPath,
Name: entryName,
IsDeleteData: isDeleteData,
IsRecursive: isRecursive,
IgnoreRecursiveError: quiet,
})
if err != nil {
glog.V(0).Infof("streamRemove: %v", err)
break
}
}
stream.CloseSend()
<-waitc
return err
})
}
func (s3a *S3ApiServer) exists(ctx context.Context, parentDirectoryPath string, entryName string, isDirectory bool) (exists bool, err error) {
err = s3a.withFilerClient(ctx, func(client filer_pb.SeaweedFilerClient) error {

View file

@ -49,6 +49,7 @@ const (
ErrMissingFields
ErrMissingCredTag
ErrCredMalformed
ErrMalformedXML
ErrMalformedDate
ErrMalformedPresignedDate
ErrMalformedCredentialDate
@ -161,6 +162,12 @@ var errorCodeResponse = map[ErrorCode]APIError{
HTTPStatusCode: http.StatusBadRequest,
},
ErrMalformedXML: {
Code: "MalformedXML",
Description: "The XML you provided was not well-formed or did not validate against our published schema.",
HTTPStatusCode: http.StatusBadRequest,
},
ErrAuthHeaderEmpty: {
Code: "InvalidArgument",
Description: "Authorization header is invalid -- one and only one ' ' (space) required.",

View file

@ -1,8 +1,10 @@
package s3api
import (
"context"
"crypto/md5"
"encoding/json"
"encoding/xml"
"fmt"
"io"
"io/ioutil"
@ -115,10 +117,97 @@ func (s3a *S3ApiServer) DeleteObjectHandler(w http.ResponseWriter, r *http.Reque
}
/// ObjectIdentifier carries key name for the object to delete.
type ObjectIdentifier struct {
ObjectName string `xml:"Key"`
}
// DeleteObjectsRequest - xml carrying the object key names which needs to be deleted.
type DeleteObjectsRequest struct {
// Element to enable quiet mode for the request
Quiet bool
// List of objects to be deleted
Objects []ObjectIdentifier `xml:"Object"`
}
// DeleteError structure.
type DeleteError struct {
Code string
Message string
Key string
}
// DeleteObjectsResponse container for multiple object deletes.
type DeleteObjectsResponse struct {
XMLName xml.Name `xml:"http://s3.amazonaws.com/doc/2006-03-01/ DeleteResult" json:"-"`
// Collection of all deleted objects
DeletedObjects []ObjectIdentifier `xml:"Deleted,omitempty"`
// Collection of errors deleting certain objects.
Errors []DeleteError `xml:"Error,omitempty"`
}
// DeleteMultipleObjectsHandler - Delete multiple objects
func (s3a *S3ApiServer) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *http.Request) {
// TODO
writeErrorResponse(w, ErrNotImplemented, r.URL)
vars := mux.Vars(r)
bucket := vars["bucket"]
deleteXMLBytes, err := ioutil.ReadAll(r.Body)
if err != nil {
writeErrorResponse(w, ErrInternalError, r.URL)
return
}
deleteObjects := &DeleteObjectsRequest{}
if err := xml.Unmarshal(deleteXMLBytes, deleteObjects); err != nil {
writeErrorResponse(w, ErrMalformedXML, r.URL)
return
}
var index int
var deletedObjects []ObjectIdentifier
var deleteErrors []DeleteError
s3a.streamRemove(context.Background(), deleteObjects.Quiet, func() (finished bool, parentDirectoryPath string, entryName string, isDeleteData, isRecursive bool) {
if index >= len(deleteObjects.Objects) {
finished = true
return
}
object := deleteObjects.Objects[index]
lastSeparator := strings.LastIndex(object.ObjectName, "/")
parentDirectoryPath, entryName, isDeleteData, isRecursive = "/", object.ObjectName, true, false
if lastSeparator > 0 && lastSeparator+1 < len(object.ObjectName) {
entryName = object.ObjectName[lastSeparator+1:]
parentDirectoryPath = "/" + object.ObjectName[:lastSeparator]
}
parentDirectoryPath = fmt.Sprintf("%s/%s%s", s3a.option.BucketsPath, bucket, parentDirectoryPath)
return
}, func(err string) {
object := deleteObjects.Objects[index]
if err == "" {
deletedObjects = append(deletedObjects, object)
} else {
deleteErrors = append(deleteErrors, DeleteError{
Code: "",
Message: err,
Key: object.ObjectName,
})
}
index++
})
deleteResp := DeleteObjectsResponse{}
if !deleteObjects.Quiet {
deleteResp.DeletedObjects = deletedObjects
}
deleteResp.Errors = deleteErrors
writeSuccessResponseXML(w, encodeResponse(deleteResp))
}
func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, destUrl string, responseFn func(proxyResonse *http.Response, w http.ResponseWriter)) {

View file

@ -219,7 +219,31 @@ func (fs *FilerServer) UpdateEntry(ctx context.Context, req *filer_pb.UpdateEntr
func (fs *FilerServer) DeleteEntry(ctx context.Context, req *filer_pb.DeleteEntryRequest) (resp *filer_pb.DeleteEntryResponse, err error) {
err = fs.filer.DeleteEntryMetaAndData(ctx, filer2.FullPath(filepath.ToSlash(filepath.Join(req.Directory, req.Name))), req.IsRecursive, req.IgnoreRecursiveError, req.IsDeleteData)
return &filer_pb.DeleteEntryResponse{}, err
resp = &filer_pb.DeleteEntryResponse{}
if err != nil {
resp.Error = err.Error()
}
return resp, nil
}
func (fs *FilerServer) StreamDeleteEntries(stream filer_pb.SeaweedFiler_StreamDeleteEntriesServer) error {
for {
req, err := stream.Recv()
if err != nil {
return fmt.Errorf("receive delete entry request: %v", err)
}
ctx := context.Background()
fullpath := filer2.FullPath(filepath.ToSlash(filepath.Join(req.Directory, req.Name)))
err = fs.filer.DeleteEntryMetaAndData(ctx, fullpath, req.IsRecursive, req.IgnoreRecursiveError, req.IsDeleteData)
resp := &filer_pb.DeleteEntryResponse{}
if err != nil {
resp.Error = err.Error()
}
if err := stream.Send(resp); err != nil {
return err
}
}
return nil
}
func (fs *FilerServer) AssignVolume(ctx context.Context, req *filer_pb.AssignVolumeRequest) (resp *filer_pb.AssignVolumeResponse, err error) {