Browse Source

s3: implemented DeleteMultipleObjects

pull/1213/head
Chris Lu 5 years ago
parent
commit
bc38b72a20
  1. 4
      other/java/client/src/main/proto/filer.proto
  2. 4
      weed/pb/filer.proto
  3. 286
      weed/pb/filer_pb/filer.pb.go
  4. 55
      weed/s3api/filer_util.go
  5. 7
      weed/s3api/s3api_errors.go
  6. 93
      weed/s3api/s3api_object_handlers.go
  7. 26
      weed/server/filer_grpc_server.go

4
other/java/client/src/main/proto/filer.proto

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

4
weed/pb/filer.proto

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

286
weed/pb/filer_pb/filer.pb.go

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

55
weed/s3api/filer_util.go

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

7
weed/s3api/s3api_errors.go

@ -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.",

93
weed/s3api/s3api_object_handlers.go

@ -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)) {

26
weed/server/filer_grpc_server.go

@ -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) {

Loading…
Cancel
Save