From 21ad9a4ac29fad0794369cc05d1f29fa91340c34 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 6 Jun 2021 13:12:01 -0700 Subject: [PATCH 001/265] filer: mongodb avoids E11000 duplicate key error collection: seaweedfs.filemeta index: directory_1_name_1 dup key --- weed/filer/mongodb/mongodb_store_kv.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/weed/filer/mongodb/mongodb_store_kv.go b/weed/filer/mongodb/mongodb_store_kv.go index 4aa9c3a33..59b8f1d93 100644 --- a/weed/filer/mongodb/mongodb_store_kv.go +++ b/weed/filer/mongodb/mongodb_store_kv.go @@ -7,6 +7,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/glog" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" ) func (store *MongodbStore) KvPut(ctx context.Context, key []byte, value []byte) (err error) { @@ -15,11 +16,11 @@ func (store *MongodbStore) KvPut(ctx context.Context, key []byte, value []byte) c := store.connect.Database(store.database).Collection(store.collectionName) - _, err = c.InsertOne(ctx, Model{ - Directory: dir, - Name: name, - Meta: value, - }) + opts := options.Update().SetUpsert(true) + filter := bson.D{{"directory", dir}, {"name", name}} + update := bson.D{{"$set", bson.D{{"meta", value}}}} + + _, err = c.UpdateOne(ctx, filter, update, opts) if err != nil { return fmt.Errorf("kv put: %v", err) From 9cba5cca0be43553f7aae1ab5477a0366765ff02 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 6 Jun 2021 13:13:33 -0700 Subject: [PATCH 002/265] optionally disable concurrent upload limit --- weed/server/filer_server_handlers.go | 4 +++- weed/server/volume_server_handlers.go | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/weed/server/filer_server_handlers.go b/weed/server/filer_server_handlers.go index ed6bbb6f6..56a47c860 100644 --- a/weed/server/filer_server_handlers.go +++ b/weed/server/filer_server_handlers.go @@ -1,6 +1,7 @@ package weed_server import ( + "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/util" "net/http" "strings" @@ -53,7 +54,8 @@ func (fs *FilerServer) filerHandler(w http.ResponseWriter, r *http.Request) { // wait until in flight data is less than the limit contentLength := getContentLength(r) fs.inFlightDataLimitCond.L.Lock() - for atomic.LoadInt64(&fs.inFlightDataSize) > fs.option.ConcurrentUploadLimit { + for fs.option.ConcurrentUploadLimit != 0 && atomic.LoadInt64(&fs.inFlightDataSize) > fs.option.ConcurrentUploadLimit { + glog.V(4).Infof("wait because inflight data %d > %d", fs.inFlightDataSize, fs.option.ConcurrentUploadLimit) fs.inFlightDataLimitCond.Wait() } atomic.AddInt64(&fs.inFlightDataSize, contentLength) diff --git a/weed/server/volume_server_handlers.go b/weed/server/volume_server_handlers.go index 4527add44..8ac3c0d90 100644 --- a/weed/server/volume_server_handlers.go +++ b/weed/server/volume_server_handlers.go @@ -46,7 +46,8 @@ func (vs *VolumeServer) privateStoreHandler(w http.ResponseWriter, r *http.Reque // wait until in flight data is less than the limit contentLength := getContentLength(r) vs.inFlightDataLimitCond.L.Lock() - for atomic.LoadInt64(&vs.inFlightDataSize) > vs.concurrentUploadLimit { + for vs.concurrentUploadLimit != 0 && atomic.LoadInt64(&vs.inFlightDataSize) > vs.concurrentUploadLimit { + glog.V(4).Infof("wait because inflight data %d > %d", vs.inFlightDataSize, vs.concurrentUploadLimit) vs.inFlightDataLimitCond.Wait() } atomic.AddInt64(&vs.inFlightDataSize, contentLength) From 6c82326575028b23003e371dbe69de1eae206f81 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 6 Jun 2021 13:42:36 -0700 Subject: [PATCH 003/265] use bytes.Buffer to reduce memory allocation and gc --- weed/operation/needle_parse_test.go | 2 +- weed/server/common.go | 5 +- .../filer_server_handlers_write_cipher.go | 6 +- .../filer_server_handlers_write_upload.go | 24 ++++++-- weed/server/volume_server_handlers_write.go | 6 +- weed/storage/needle/needle.go | 5 +- weed/storage/needle/needle_parse_upload.go | 53 ++++++++++------- weed/storage/needle/needle_read_write.go | 59 +++++++++++-------- 8 files changed, 102 insertions(+), 58 deletions(-) diff --git a/weed/operation/needle_parse_test.go b/weed/operation/needle_parse_test.go index 202374e1b..d7e8a4162 100644 --- a/weed/operation/needle_parse_test.go +++ b/weed/operation/needle_parse_test.go @@ -18,7 +18,7 @@ type MockClient struct { } func (m *MockClient) Do(req *http.Request) (*http.Response, error) { - n, originalSize, _, err := needle.CreateNeedleFromRequest(req, false, 1024*1024) + n, originalSize, _, err := needle.CreateNeedleFromRequest(req, false, 1024*1024, &bytes.Buffer{}) if m.needleHandling != nil { m.needleHandling(n, originalSize, err) } diff --git a/weed/server/common.go b/weed/server/common.go index 571944c10..2e0ae4058 100644 --- a/weed/server/common.go +++ b/weed/server/common.go @@ -1,6 +1,7 @@ package weed_server import ( + "bytes" "encoding/json" "errors" "fmt" @@ -104,7 +105,9 @@ func submitForClientHandler(w http.ResponseWriter, r *http.Request, masterFn ope } debug("parsing upload file...") - pu, pe := needle.ParseUpload(r, 256*1024*1024) + bytesBuffer := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(bytesBuffer) + pu, pe := needle.ParseUpload(r, 256*1024*1024, bytesBuffer) if pe != nil { writeJsonError(w, r, http.StatusBadRequest, pe) return diff --git a/weed/server/filer_server_handlers_write_cipher.go b/weed/server/filer_server_handlers_write_cipher.go index 8334d1618..acaa8f5ab 100644 --- a/weed/server/filer_server_handlers_write_cipher.go +++ b/weed/server/filer_server_handlers_write_cipher.go @@ -1,6 +1,7 @@ package weed_server import ( + "bytes" "context" "fmt" "net/http" @@ -30,7 +31,10 @@ func (fs *FilerServer) encrypt(ctx context.Context, w http.ResponseWriter, r *ht sizeLimit := int64(fs.option.MaxMB) * 1024 * 1024 - pu, err := needle.ParseUpload(r, sizeLimit) + bytesBuffer := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(bytesBuffer) + + pu, err := needle.ParseUpload(r, sizeLimit, bytesBuffer) uncompressedData := pu.Data if pu.IsGzipped { uncompressedData = pu.UncompressedData diff --git a/weed/server/filer_server_handlers_write_upload.go b/weed/server/filer_server_handlers_write_upload.go index 540def563..7082ab0f8 100644 --- a/weed/server/filer_server_handlers_write_upload.go +++ b/weed/server/filer_server_handlers_write_upload.go @@ -8,6 +8,7 @@ import ( "io/ioutil" "net/http" "strings" + "sync" "time" "github.com/chrislusf/seaweedfs/weed/filer" @@ -19,6 +20,12 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" ) +var bufPool = sync.Pool{ + New: func() interface{} { + return new(bytes.Buffer) + }, +} + func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Request, reader io.Reader, chunkSize int32, fileName, contentType string, contentLength int64, so *operation.StorageOption) ([]*filer_pb.FileChunk, hash.Hash, int64, error, []byte) { var fileChunks []*filer_pb.FileChunk @@ -28,21 +35,28 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque chunkOffset := int64(0) var smallContent []byte + bytesBuffer := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(bytesBuffer) for { limitedReader := io.LimitReader(partReader, int64(chunkSize)) - data, err := ioutil.ReadAll(limitedReader) + bytesBuffer.Reset() + + dataSize, err := bytesBuffer.ReadFrom(limitedReader) + + // data, err := ioutil.ReadAll(limitedReader) if err != nil { return nil, nil, 0, err, nil } if chunkOffset == 0 && !isAppend(r) { - if len(data) < int(fs.option.SaveToFilerLimit) || strings.HasPrefix(r.URL.Path, filer.DirectoryEtcRoot) && len(data) < 4*1024 { - smallContent = data - chunkOffset += int64(len(data)) + if dataSize < fs.option.SaveToFilerLimit || strings.HasPrefix(r.URL.Path, filer.DirectoryEtcRoot) && dataSize < 4*1024 { + chunkOffset += dataSize + smallContent = make([]byte, dataSize) + bytesBuffer.Write(smallContent) break } } - dataReader := util.NewBytesReader(data) + dataReader := util.NewBytesReader(bytesBuffer.Bytes()) // retry to assign a different file id var fileId, urlLocation string diff --git a/weed/server/volume_server_handlers_write.go b/weed/server/volume_server_handlers_write.go index 3d752eda6..58212e8ff 100644 --- a/weed/server/volume_server_handlers_write.go +++ b/weed/server/volume_server_handlers_write.go @@ -1,6 +1,7 @@ package weed_server import ( + "bytes" "errors" "fmt" "net/http" @@ -42,7 +43,10 @@ func (vs *VolumeServer) PostHandler(w http.ResponseWriter, r *http.Request) { return } - reqNeedle, originalSize, contentMd5, ne := needle.CreateNeedleFromRequest(r, vs.FixJpgOrientation, vs.fileSizeLimitBytes) + bytesBuffer := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(bytesBuffer) + + reqNeedle, originalSize, contentMd5, ne := needle.CreateNeedleFromRequest(r, vs.FixJpgOrientation, vs.fileSizeLimitBytes, bytesBuffer) if ne != nil { writeJsonError(w, r, http.StatusBadRequest, ne) return diff --git a/weed/storage/needle/needle.go b/weed/storage/needle/needle.go index 34d29ab6e..845ffdb24 100644 --- a/weed/storage/needle/needle.go +++ b/weed/storage/needle/needle.go @@ -1,6 +1,7 @@ package needle import ( + "bytes" "encoding/json" "fmt" "net/http" @@ -48,9 +49,9 @@ func (n *Needle) String() (str string) { return } -func CreateNeedleFromRequest(r *http.Request, fixJpgOrientation bool, sizeLimit int64) (n *Needle, originalSize int, contentMd5 string, e error) { +func CreateNeedleFromRequest(r *http.Request, fixJpgOrientation bool, sizeLimit int64, bytesBuffer *bytes.Buffer) (n *Needle, originalSize int, contentMd5 string, e error) { n = new(Needle) - pu, e := ParseUpload(r, sizeLimit) + pu, e := ParseUpload(r, sizeLimit, bytesBuffer) if e != nil { return } diff --git a/weed/storage/needle/needle_parse_upload.go b/weed/storage/needle/needle_parse_upload.go index 7201503f1..0888c6b7a 100644 --- a/weed/storage/needle/needle_parse_upload.go +++ b/weed/storage/needle/needle_parse_upload.go @@ -1,6 +1,7 @@ package needle import ( + "bytes" "crypto/md5" "encoding/base64" "fmt" @@ -18,11 +19,12 @@ import ( ) type ParsedUpload struct { - FileName string - Data []byte - MimeType string - PairMap map[string]string - IsGzipped bool + FileName string + Data []byte + bytesBuffer *bytes.Buffer + MimeType string + PairMap map[string]string + IsGzipped bool // IsZstd bool OriginalDataSize int ModifiedTime uint64 @@ -32,8 +34,9 @@ type ParsedUpload struct { ContentMd5 string } -func ParseUpload(r *http.Request, sizeLimit int64) (pu *ParsedUpload, e error) { - pu = &ParsedUpload{} +func ParseUpload(r *http.Request, sizeLimit int64, bytesBuffer *bytes.Buffer) (pu *ParsedUpload, e error) { + bytesBuffer.Reset() + pu = &ParsedUpload{bytesBuffer: bytesBuffer} pu.PairMap = make(map[string]string) for k, v := range r.Header { if len(v) > 0 && strings.HasPrefix(k, PairNamePrefix) { @@ -72,14 +75,16 @@ func ParseUpload(r *http.Request, sizeLimit int64) (pu *ParsedUpload, e error) { if mimeType == "application/octet-stream" { mimeType = "" } - if shouldBeCompressed, iAmSure := util.IsCompressableFileType(ext, mimeType); mimeType == "" && !iAmSure || shouldBeCompressed && iAmSure { - // println("ext", ext, "iAmSure", iAmSure, "shouldBeCompressed", shouldBeCompressed, "mimeType", pu.MimeType) - if compressedData, err := util.GzipData(pu.Data); err == nil { - if len(compressedData)*10 < len(pu.Data)*9 { - pu.Data = compressedData - pu.IsGzipped = true + if false { + if shouldBeCompressed, iAmSure := util.IsCompressableFileType(ext, mimeType); mimeType == "" && !iAmSure || shouldBeCompressed && iAmSure { + // println("ext", ext, "iAmSure", iAmSure, "shouldBeCompressed", shouldBeCompressed, "mimeType", pu.MimeType) + if compressedData, err := util.GzipData(pu.Data); err == nil { + if len(compressedData)*10 < len(pu.Data)*9 { + pu.Data = compressedData + pu.IsGzipped = true + } + // println("gzipped data size", len(compressedData)) } - // println("gzipped data size", len(compressedData)) } } } @@ -98,15 +103,16 @@ func ParseUpload(r *http.Request, sizeLimit int64) (pu *ParsedUpload, e error) { return } -func parsePut(r *http.Request, sizeLimit int64, pu *ParsedUpload) (e error) { +func parsePut(r *http.Request, sizeLimit int64, pu *ParsedUpload) error { pu.IsGzipped = r.Header.Get("Content-Encoding") == "gzip" // pu.IsZstd = r.Header.Get("Content-Encoding") == "zstd" pu.MimeType = r.Header.Get("Content-Type") pu.FileName = "" - pu.Data, e = ioutil.ReadAll(io.LimitReader(r.Body, sizeLimit+1)) - if e == io.EOF || int64(pu.OriginalDataSize) == sizeLimit+1 { + dataSize, err := pu.bytesBuffer.ReadFrom(io.LimitReader(r.Body, sizeLimit+1)) + if err == io.EOF || dataSize == sizeLimit+1 { io.Copy(ioutil.Discard, r.Body) } + pu.Data = pu.bytesBuffer.Bytes() r.Body.Close() return nil } @@ -138,15 +144,17 @@ func parseMultipart(r *http.Request, sizeLimit int64, pu *ParsedUpload) (e error pu.FileName = path.Base(pu.FileName) } - pu.Data, e = ioutil.ReadAll(io.LimitReader(part, sizeLimit+1)) + var dataSize int64 + dataSize, e = pu.bytesBuffer.ReadFrom(io.LimitReader(part, sizeLimit+1)) if e != nil { glog.V(0).Infoln("Reading Content [ERROR]", e) return } - if len(pu.Data) == int(sizeLimit)+1 { + if dataSize == sizeLimit+1 { e = fmt.Errorf("file over the limited %d bytes", sizeLimit) return } + pu.Data = pu.bytesBuffer.Bytes() // if the filename is empty string, do a search on the other multi-part items for pu.FileName == "" { @@ -159,19 +167,20 @@ func parseMultipart(r *http.Request, sizeLimit int64, pu *ParsedUpload) (e error // found the first multi-part has filename if fName != "" { - data2, fe2 := ioutil.ReadAll(io.LimitReader(part2, sizeLimit+1)) + pu.bytesBuffer.Reset() + dataSize2, fe2 := pu.bytesBuffer.ReadFrom(io.LimitReader(part2, sizeLimit+1)) if fe2 != nil { glog.V(0).Infoln("Reading Content [ERROR]", fe2) e = fe2 return } - if len(data2) == int(sizeLimit)+1 { + if dataSize2 == sizeLimit+1 { e = fmt.Errorf("file over the limited %d bytes", sizeLimit) return } // update - pu.Data = data2 + pu.Data = pu.bytesBuffer.Bytes() pu.FileName = path.Base(fName) break } diff --git a/weed/storage/needle/needle_read_write.go b/weed/storage/needle/needle_read_write.go index 16c2fd06b..d208404a8 100644 --- a/weed/storage/needle/needle_read_write.go +++ b/weed/storage/needle/needle_read_write.go @@ -1,6 +1,7 @@ package needle import ( + "bytes" "errors" "fmt" "github.com/chrislusf/seaweedfs/weed/glog" @@ -9,6 +10,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" "io" "math" + "sync" ) const ( @@ -29,10 +31,14 @@ func (n *Needle) DiskSize(version Version) int64 { return GetActualSize(n.Size, version) } -func (n *Needle) prepareWriteBuffer(version Version) ([]byte, Size, int64, error) { - - writeBytes := make([]byte, 0) +var bufPool = sync.Pool{ + New: func() interface{} { + return new(bytes.Buffer) + }, +} +func (n *Needle) prepareWriteBuffer(version Version, writeBytes *bytes.Buffer) (Size, int64, error) { + writeBytes.Reset() switch version { case Version1: header := make([]byte, NeedleHeaderSize) @@ -42,12 +48,12 @@ func (n *Needle) prepareWriteBuffer(version Version) ([]byte, Size, int64, error SizeToBytes(header[CookieSize+NeedleIdSize:CookieSize+NeedleIdSize+SizeSize], n.Size) size := n.Size actualSize := NeedleHeaderSize + int64(n.Size) - writeBytes = append(writeBytes, header...) - writeBytes = append(writeBytes, n.Data...) + writeBytes.Write(header) + writeBytes.Write(n.Data) padding := PaddingLength(n.Size, version) util.Uint32toBytes(header[0:NeedleChecksumSize], n.Checksum.Value()) - writeBytes = append(writeBytes, header[0:NeedleChecksumSize+padding]...) - return writeBytes, size, actualSize, nil + writeBytes.Write(header[0:NeedleChecksumSize+padding]) + return size, actualSize, nil case Version2, Version3: header := make([]byte, NeedleHeaderSize+TimestampSize) // adding timestamp to reuse it and avoid extra allocation CookieToBytes(header[0:CookieSize], n.Cookie) @@ -79,51 +85,51 @@ func (n *Needle) prepareWriteBuffer(version Version) ([]byte, Size, int64, error n.Size = 0 } SizeToBytes(header[CookieSize+NeedleIdSize:CookieSize+NeedleIdSize+SizeSize], n.Size) - writeBytes = append(writeBytes, header[0:NeedleHeaderSize]...) + writeBytes.Write(header[0:NeedleHeaderSize]) if n.DataSize > 0 { util.Uint32toBytes(header[0:4], n.DataSize) - writeBytes = append(writeBytes, header[0:4]...) - writeBytes = append(writeBytes, n.Data...) + writeBytes.Write(header[0:4]) + writeBytes.Write(n.Data) util.Uint8toBytes(header[0:1], n.Flags) - writeBytes = append(writeBytes, header[0:1]...) + writeBytes.Write(header[0:1]) if n.HasName() { util.Uint8toBytes(header[0:1], n.NameSize) - writeBytes = append(writeBytes, header[0:1]...) - writeBytes = append(writeBytes, n.Name[:n.NameSize]...) + writeBytes.Write(header[0:1]) + writeBytes.Write(n.Name[:n.NameSize]) } if n.HasMime() { util.Uint8toBytes(header[0:1], n.MimeSize) - writeBytes = append(writeBytes, header[0:1]...) - writeBytes = append(writeBytes, n.Mime...) + writeBytes.Write(header[0:1]) + writeBytes.Write(n.Mime) } if n.HasLastModifiedDate() { util.Uint64toBytes(header[0:8], n.LastModified) - writeBytes = append(writeBytes, header[8-LastModifiedBytesLength:8]...) + writeBytes.Write(header[8-LastModifiedBytesLength:8]) } if n.HasTtl() && n.Ttl != nil { n.Ttl.ToBytes(header[0:TtlBytesLength]) - writeBytes = append(writeBytes, header[0:TtlBytesLength]...) + writeBytes.Write(header[0:TtlBytesLength]) } if n.HasPairs() { util.Uint16toBytes(header[0:2], n.PairsSize) - writeBytes = append(writeBytes, header[0:2]...) - writeBytes = append(writeBytes, n.Pairs...) + writeBytes.Write(header[0:2]) + writeBytes.Write(n.Pairs) } } padding := PaddingLength(n.Size, version) util.Uint32toBytes(header[0:NeedleChecksumSize], n.Checksum.Value()) if version == Version2 { - writeBytes = append(writeBytes, header[0:NeedleChecksumSize+padding]...) + writeBytes.Write(header[0:NeedleChecksumSize+padding]) } else { // version3 util.Uint64toBytes(header[NeedleChecksumSize:NeedleChecksumSize+TimestampSize], n.AppendAtNs) - writeBytes = append(writeBytes, header[0:NeedleChecksumSize+TimestampSize+padding]...) + writeBytes.Write(header[0:NeedleChecksumSize+TimestampSize+padding]) } - return writeBytes, Size(n.DataSize), GetActualSize(n.Size, version), nil + return Size(n.DataSize), GetActualSize(n.Size, version), nil } - return writeBytes, 0, 0, fmt.Errorf("Unsupported Version! (%d)", version) + return 0, 0, fmt.Errorf("Unsupported Version! (%d)", version) } func (n *Needle) Append(w backend.BackendStorageFile, version Version) (offset uint64, size Size, actualSize int64, err error) { @@ -146,10 +152,13 @@ func (n *Needle) Append(w backend.BackendStorageFile, version Version) (offset u return } - bytesToWrite, size, actualSize, err := n.prepareWriteBuffer(version) + bytesBuffer := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(bytesBuffer) + + size, actualSize, err = n.prepareWriteBuffer(version, bytesBuffer) if err == nil { - _, err = w.WriteAt(bytesToWrite, int64(offset)) + _, err = w.WriteAt(bytesBuffer.Bytes(), int64(offset)) } return offset, size, actualSize, err From 44f1ba68944ed9ff79324317902e1a768d7e92bb Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 6 Jun 2021 18:43:04 -0700 Subject: [PATCH 004/265] refactor --- .../filer_server_handlers_write_upload.go | 87 +++++++++++-------- 1 file changed, 53 insertions(+), 34 deletions(-) diff --git a/weed/server/filer_server_handlers_write_upload.go b/weed/server/filer_server_handlers_write_upload.go index 7082ab0f8..d093676bc 100644 --- a/weed/server/filer_server_handlers_write_upload.go +++ b/weed/server/filer_server_handlers_write_upload.go @@ -56,54 +56,27 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque break } } - dataReader := util.NewBytesReader(bytesBuffer.Bytes()) - // retry to assign a different file id - var fileId, urlLocation string - var auth security.EncodedJwt - var assignErr, uploadErr error - var uploadResult *operation.UploadResult - for i := 0; i < 3; i++ { - // assign one file id for one chunk - fileId, urlLocation, auth, assignErr = fs.assignNewFileInfo(so) - if assignErr != nil { - return nil, nil, 0, assignErr, nil - } + chunk, uploadErr := fs.dataToChunk(fileName, contentType, bytesBuffer.Bytes(), chunkOffset, so, md5Hash) - // upload the chunk to the volume server - uploadResult, uploadErr, _ = fs.doUpload(urlLocation, w, r, dataReader, fileName, contentType, nil, auth) - if uploadErr != nil { - time.Sleep(251 * time.Millisecond) - continue - } - break - } if uploadErr != nil { return nil, nil, 0, uploadErr, nil } // if last chunk exhausted the reader exactly at the border - if uploadResult.Size == 0 { + if chunk == nil { break } - if chunkOffset == 0 { - uploadedMd5 := util.Base64Md5ToBytes(uploadResult.ContentMd5) - readedMd5 := md5Hash.Sum(nil) - if !bytes.Equal(uploadedMd5, readedMd5) { - glog.Errorf("md5 %x does not match %x uploaded chunk %s to the volume server", readedMd5, uploadedMd5, uploadResult.Name) - } - } - // Save to chunk manifest structure - fileChunks = append(fileChunks, uploadResult.ToPbFileChunk(fileId, chunkOffset)) + fileChunks = append(fileChunks, chunk) - glog.V(4).Infof("uploaded %s chunk %d to %s [%d,%d)", fileName, len(fileChunks), fileId, chunkOffset, chunkOffset+int64(uploadResult.Size)) + glog.V(4).Infof("uploaded %s chunk %d to %s [%d,%d)", fileName, len(fileChunks), chunk.FileId, chunkOffset, chunkOffset+int64(chunk.Size)) // reset variables for the next chunk - chunkOffset = chunkOffset + int64(uploadResult.Size) + chunkOffset = chunkOffset + int64(chunk.Size) // if last chunk was not at full chunk size, but already exhausted the reader - if int64(uploadResult.Size) < int64(chunkSize) { + if int64(chunk.Size) < int64(chunkSize) { break } } @@ -111,7 +84,7 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque return fileChunks, md5Hash, chunkOffset, nil, smallContent } -func (fs *FilerServer) doUpload(urlLocation string, w http.ResponseWriter, r *http.Request, limitedReader io.Reader, fileName string, contentType string, pairMap map[string]string, auth security.EncodedJwt) (*operation.UploadResult, error, []byte) { +func (fs *FilerServer) doUpload(urlLocation string, limitedReader io.Reader, fileName string, contentType string, pairMap map[string]string, auth security.EncodedJwt) (*operation.UploadResult, error, []byte) { stats.FilerRequestCounter.WithLabelValues("chunkUpload").Inc() start := time.Now() @@ -125,3 +98,49 @@ func (fs *FilerServer) doUpload(urlLocation string, w http.ResponseWriter, r *ht } return uploadResult, err, data } + +func (fs *FilerServer) dataToChunk(fileName, contentType string, data []byte, chunkOffset int64, so *operation.StorageOption, md5Hash hash.Hash) (*filer_pb.FileChunk, error) { + dataReader := util.NewBytesReader(data) + + // retry to assign a different file id + var fileId, urlLocation string + var auth security.EncodedJwt + var uploadErr error + var uploadResult *operation.UploadResult + for i := 0; i < 3; i++ { + // assign one file id for one chunk + fileId, urlLocation, auth, uploadErr = fs.assignNewFileInfo(so) + if uploadErr != nil { + glog.V(4).Infof("retry later due to assign error: %v", uploadErr) + time.Sleep(time.Duration(i+1) * 251 * time.Millisecond) + continue + } + + // upload the chunk to the volume server + uploadResult, uploadErr, _ = fs.doUpload(urlLocation, dataReader, fileName, contentType, nil, auth) + if uploadErr != nil { + glog.V(4).Infof("retry later due to upload error: %v", uploadErr) + time.Sleep(time.Duration(i+1) * 251 * time.Millisecond) + continue + } + break + } + if uploadErr != nil { + glog.Errorf("upload error: %v", uploadErr) + return nil, uploadErr + } + + // if last chunk exhausted the reader exactly at the border + if uploadResult.Size == 0 { + return nil, nil + } + if chunkOffset == 0 { + uploadedMd5 := util.Base64Md5ToBytes(uploadResult.ContentMd5) + readedMd5 := md5Hash.Sum(nil) + if !bytes.Equal(uploadedMd5, readedMd5) { + glog.Errorf("md5 %x does not match %x uploaded chunk %s to the volume server", readedMd5, uploadedMd5, uploadResult.Name) + } + } + + return uploadResult.ToPbFileChunk(fileId, chunkOffset), nil +} From e00443a940db81b195575309b9ff9128678de896 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 6 Jun 2021 20:22:42 -0700 Subject: [PATCH 005/265] mount: adjust starting order avoid possible nil wfs.Server --- weed/command/mount_std.go | 1 + weed/filesys/wfs.go | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/weed/command/mount_std.go b/weed/command/mount_std.go index dce2197d6..cdf340067 100644 --- a/weed/command/mount_std.go +++ b/weed/command/mount_std.go @@ -246,6 +246,7 @@ func RunMount(option *MountOptions, umask os.FileMode) bool { glog.V(0).Infof("mounted %s%s to %v", *option.filer, mountRoot, dir) server := fs.New(c, nil) seaweedFileSystem.Server = server + seaweedFileSystem.StartBackgroundTasks() err = server.Serve(seaweedFileSystem) // check if the mount process has an error to report diff --git a/weed/filesys/wfs.go b/weed/filesys/wfs.go index 178e4e497..0e0050964 100644 --- a/weed/filesys/wfs.go +++ b/weed/filesys/wfs.go @@ -125,8 +125,6 @@ func NewSeaweedFileSystem(option *Option) *WFS { glog.V(4).Infof("InvalidateEntry %s : %v", filePath, err) } }) - startTime := time.Now() - go meta_cache.SubscribeMetaEvents(wfs.metaCache, wfs.signature, wfs, wfs.option.FilerMountRootPath, startTime.UnixNano()) grace.OnInterrupt(func() { wfs.metaCache.Shutdown() }) @@ -141,6 +139,11 @@ func NewSeaweedFileSystem(option *Option) *WFS { return wfs } +func (wfs *WFS) StartBackgroundTasks() { + startTime := time.Now() + go meta_cache.SubscribeMetaEvents(wfs.metaCache, wfs.signature, wfs, wfs.option.FilerMountRootPath, startTime.UnixNano()) +} + func (wfs *WFS) Root() (fs.Node, error) { return wfs.root, nil } From bb45dea15aeba35c031743dd12ed8ed1a4afec77 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 6 Jun 2021 20:23:36 -0700 Subject: [PATCH 006/265] filer: parallel data upload --- .../filer_server_handlers_write_upload.go | 53 ++++++++++++------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/weed/server/filer_server_handlers_write_upload.go b/weed/server/filer_server_handlers_write_upload.go index d093676bc..f2b996ec5 100644 --- a/weed/server/filer_server_handlers_write_upload.go +++ b/weed/server/filer_server_handlers_write_upload.go @@ -7,6 +7,7 @@ import ( "io" "io/ioutil" "net/http" + "sort" "strings" "sync" "time" @@ -34,10 +35,15 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque chunkOffset := int64(0) var smallContent []byte + var uploadErr error - bytesBuffer := bufPool.Get().(*bytes.Buffer) - defer bufPool.Put(bytesBuffer) + var wg sync.WaitGroup for { + + // need to throttle this for large files + bytesBuffer := bufPool.Get().(*bytes.Buffer) + defer bufPool.Put(bytesBuffer) + limitedReader := io.LimitReader(partReader, int64(chunkSize)) bytesBuffer.Reset() @@ -45,8 +51,8 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque dataSize, err := bytesBuffer.ReadFrom(limitedReader) // data, err := ioutil.ReadAll(limitedReader) - if err != nil { - return nil, nil, 0, err, nil + if err != nil || dataSize == 0 { + return nil, md5Hash, 0, err, nil } if chunkOffset == 0 && !isAppend(r) { if dataSize < fs.option.SaveToFilerLimit || strings.HasPrefix(r.URL.Path, filer.DirectoryEtcRoot) && dataSize < 4*1024 { @@ -57,30 +63,39 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque } } - chunk, uploadErr := fs.dataToChunk(fileName, contentType, bytesBuffer.Bytes(), chunkOffset, so, md5Hash) + wg.Add(1) + go func(offset int64) { + defer wg.Done() - if uploadErr != nil { - return nil, nil, 0, uploadErr, nil - } - - // if last chunk exhausted the reader exactly at the border - if chunk == nil { - break - } - // Save to chunk manifest structure - fileChunks = append(fileChunks, chunk) - - glog.V(4).Infof("uploaded %s chunk %d to %s [%d,%d)", fileName, len(fileChunks), chunk.FileId, chunkOffset, chunkOffset+int64(chunk.Size)) + chunk, toChunkErr := fs.dataToChunk(fileName, contentType, bytesBuffer.Bytes(), offset, so, md5Hash) + if toChunkErr != nil { + uploadErr = toChunkErr + } + if chunk != nil { + fileChunks = append(fileChunks, chunk) + glog.V(4).Infof("uploaded %s chunk %d to %s [%d,%d)", fileName, len(fileChunks), chunk.FileId, offset, offset+int64(chunk.Size)) + } + }(chunkOffset) // reset variables for the next chunk - chunkOffset = chunkOffset + int64(chunk.Size) + chunkOffset = chunkOffset + dataSize // if last chunk was not at full chunk size, but already exhausted the reader - if int64(chunk.Size) < int64(chunkSize) { + if dataSize < int64(chunkSize) { break } } + wg.Wait() + + if uploadErr != nil { + return nil, md5Hash, 0, uploadErr, nil + } + + sort.Slice(fileChunks, func(i, j int) bool { + return fileChunks[i].Offset < fileChunks[j].Offset + }) + return fileChunks, md5Hash, chunkOffset, nil, smallContent } From 19caeb7b02307017ca19e26540ec95bf85b71d91 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 6 Jun 2021 20:57:03 -0700 Subject: [PATCH 007/265] fix writing the small file --- weed/server/filer_server_handlers_write_upload.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/server/filer_server_handlers_write_upload.go b/weed/server/filer_server_handlers_write_upload.go index f2b996ec5..cc351d718 100644 --- a/weed/server/filer_server_handlers_write_upload.go +++ b/weed/server/filer_server_handlers_write_upload.go @@ -58,7 +58,7 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque if dataSize < fs.option.SaveToFilerLimit || strings.HasPrefix(r.URL.Path, filer.DirectoryEtcRoot) && dataSize < 4*1024 { chunkOffset += dataSize smallContent = make([]byte, dataSize) - bytesBuffer.Write(smallContent) + bytesBuffer.Read(smallContent) break } } From c8dea3dd897b66e393c78eb81ab14b6c5ff9a84e Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 6 Jun 2021 21:54:00 -0700 Subject: [PATCH 008/265] 2.51 --- k8s/seaweedfs/Chart.yaml | 4 ++-- k8s/seaweedfs/values.yaml | 2 +- weed/util/constants.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/k8s/seaweedfs/Chart.yaml b/k8s/seaweedfs/Chart.yaml index f7699fcb8..02628b368 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.50" -version: "2.50" +appVersion: "2.51" +version: "2.51" diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index 5ca4789ab..cef0f523b 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.50" - started using {.Chart.appVersion} + # imageTag: "2.51" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index e909319eb..603433c70 100644 --- a/weed/util/constants.go +++ b/weed/util/constants.go @@ -5,7 +5,7 @@ import ( ) var ( - VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 50) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 51) COMMIT = "" ) From 8295e2feb680f383d1d28c51052168fe549ef375 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 6 Jun 2021 22:16:32 -0700 Subject: [PATCH 009/265] skip md5 checking for now because of race condition --- weed/server/filer_server_handlers_write_upload.go | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/weed/server/filer_server_handlers_write_upload.go b/weed/server/filer_server_handlers_write_upload.go index cc351d718..cc9bb0dc0 100644 --- a/weed/server/filer_server_handlers_write_upload.go +++ b/weed/server/filer_server_handlers_write_upload.go @@ -67,7 +67,7 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque go func(offset int64) { defer wg.Done() - chunk, toChunkErr := fs.dataToChunk(fileName, contentType, bytesBuffer.Bytes(), offset, so, md5Hash) + chunk, toChunkErr := fs.dataToChunk(fileName, contentType, bytesBuffer.Bytes(), offset, so) if toChunkErr != nil { uploadErr = toChunkErr } @@ -114,7 +114,7 @@ func (fs *FilerServer) doUpload(urlLocation string, limitedReader io.Reader, fil return uploadResult, err, data } -func (fs *FilerServer) dataToChunk(fileName, contentType string, data []byte, chunkOffset int64, so *operation.StorageOption, md5Hash hash.Hash) (*filer_pb.FileChunk, error) { +func (fs *FilerServer) dataToChunk(fileName, contentType string, data []byte, chunkOffset int64, so *operation.StorageOption) (*filer_pb.FileChunk, error) { dataReader := util.NewBytesReader(data) // retry to assign a different file id @@ -149,13 +149,6 @@ func (fs *FilerServer) dataToChunk(fileName, contentType string, data []byte, ch if uploadResult.Size == 0 { return nil, nil } - if chunkOffset == 0 { - uploadedMd5 := util.Base64Md5ToBytes(uploadResult.ContentMd5) - readedMd5 := md5Hash.Sum(nil) - if !bytes.Equal(uploadedMd5, readedMd5) { - glog.Errorf("md5 %x does not match %x uploaded chunk %s to the volume server", readedMd5, uploadedMd5, uploadResult.Name) - } - } return uploadResult.ToPbFileChunk(fileId, chunkOffset), nil } From 452c6ef18313bbf9655c133e5b5ed9456b983006 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 6 Jun 2021 23:05:17 -0700 Subject: [PATCH 010/265] limits concurrent uploads for one file --- .../filer_server_handlers_write_upload.go | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/weed/server/filer_server_handlers_write_upload.go b/weed/server/filer_server_handlers_write_upload.go index cc9bb0dc0..32a722507 100644 --- a/weed/server/filer_server_handlers_write_upload.go +++ b/weed/server/filer_server_handlers_write_upload.go @@ -10,6 +10,7 @@ import ( "sort" "strings" "sync" + "sync/atomic" "time" "github.com/chrislusf/seaweedfs/weed/filer" @@ -38,11 +39,21 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque var uploadErr error var wg sync.WaitGroup + var bytesBufferCounter int64 + bytesBufferLimitCond := sync.NewCond(new(sync.Mutex)) for { - // need to throttle this for large files + // need to throttle used byte buffer + bytesBufferLimitCond.L.Lock() + for atomic.LoadInt64(&bytesBufferCounter) >= 4 { + glog.V(4).Infof("waiting for byte buffer %d", bytesBufferCounter) + bytesBufferLimitCond.Wait() + } + atomic.AddInt64(&bytesBufferCounter, 1) + bytesBufferLimitCond.L.Unlock() + bytesBuffer := bufPool.Get().(*bytes.Buffer) - defer bufPool.Put(bytesBuffer) + glog.V(4).Infof("received byte buffer %d", bytesBufferCounter) limitedReader := io.LimitReader(partReader, int64(chunkSize)) @@ -52,6 +63,9 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque // data, err := ioutil.ReadAll(limitedReader) if err != nil || dataSize == 0 { + bufPool.Put(bytesBuffer) + atomic.AddInt64(&bytesBufferCounter, -1) + bytesBufferLimitCond.Signal() return nil, md5Hash, 0, err, nil } if chunkOffset == 0 && !isAppend(r) { @@ -59,13 +73,21 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque chunkOffset += dataSize smallContent = make([]byte, dataSize) bytesBuffer.Read(smallContent) + bufPool.Put(bytesBuffer) + atomic.AddInt64(&bytesBufferCounter, -1) + bytesBufferLimitCond.Signal() break } } wg.Add(1) go func(offset int64) { - defer wg.Done() + defer func() { + bufPool.Put(bytesBuffer) + atomic.AddInt64(&bytesBufferCounter, -1) + bytesBufferLimitCond.Signal() + wg.Done() + }() chunk, toChunkErr := fs.dataToChunk(fileName, contentType, bytesBuffer.Bytes(), offset, so) if toChunkErr != nil { From 5e6dfbc25fab4957d1851f026d25bee6c4d7b59a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 7 Jun 2021 12:04:50 -0700 Subject: [PATCH 011/265] locks for data racing --- weed/server/filer_server_handlers_write_upload.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/weed/server/filer_server_handlers_write_upload.go b/weed/server/filer_server_handlers_write_upload.go index 32a722507..e28309c6a 100644 --- a/weed/server/filer_server_handlers_write_upload.go +++ b/weed/server/filer_server_handlers_write_upload.go @@ -29,7 +29,6 @@ var bufPool = sync.Pool{ } func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Request, reader io.Reader, chunkSize int32, fileName, contentType string, contentLength int64, so *operation.StorageOption) ([]*filer_pb.FileChunk, hash.Hash, int64, error, []byte) { - var fileChunks []*filer_pb.FileChunk md5Hash := md5.New() var partReader = ioutil.NopCloser(io.TeeReader(reader, md5Hash)) @@ -41,6 +40,8 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque var wg sync.WaitGroup var bytesBufferCounter int64 bytesBufferLimitCond := sync.NewCond(new(sync.Mutex)) + var fileChunks []*filer_pb.FileChunk + var fileChunksLock sync.Mutex for { // need to throttle used byte buffer @@ -94,7 +95,9 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque uploadErr = toChunkErr } if chunk != nil { + fileChunksLock.Lock() fileChunks = append(fileChunks, chunk) + fileChunksLock.Unlock() glog.V(4).Infof("uploaded %s chunk %d to %s [%d,%d)", fileName, len(fileChunks), chunk.FileId, offset, offset+int64(chunk.Size)) } }(chunkOffset) From 76f24af79add7c282de3ce420c136bfe29cf7fa5 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 7 Jun 2021 12:13:23 -0700 Subject: [PATCH 012/265] 2.52 --- k8s/seaweedfs/Chart.yaml | 4 ++-- k8s/seaweedfs/values.yaml | 2 +- weed/util/constants.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/k8s/seaweedfs/Chart.yaml b/k8s/seaweedfs/Chart.yaml index 02628b368..851557e59 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.51" -version: "2.51" +appVersion: "2.52" +version: "2.52" diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index cef0f523b..48d36f1e9 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.51" - started using {.Chart.appVersion} + # imageTag: "2.52" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index 603433c70..aadc09741 100644 --- a/weed/util/constants.go +++ b/weed/util/constants.go @@ -5,7 +5,7 @@ import ( ) var ( - VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 51) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 52) COMMIT = "" ) From 0e3adde47fec0ed4914d222050e7da6d695d8c84 Mon Sep 17 00:00:00 2001 From: Daniel Nagy Date: Mon, 7 Jun 2021 18:17:16 +0200 Subject: [PATCH 013/265] Return correct exitcode when `wheed upload` fails --- weed/command/upload.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/weed/command/upload.go b/weed/command/upload.go index 0f9361b40..a102796b4 100644 --- a/weed/command/upload.go +++ b/weed/command/upload.go @@ -84,7 +84,7 @@ func runUpload(cmd *Command, args []string) bool { if *upload.dir == "" { return false } - filepath.Walk(util.ResolvePath(*upload.dir), func(path string, info os.FileInfo, err error) error { + err = filepath.Walk(util.ResolvePath(*upload.dir), func(path string, info os.FileInfo, err error) error { if err == nil { if !info.IsDir() { if *upload.include != "" { @@ -108,12 +108,21 @@ func runUpload(cmd *Command, args []string) bool { } return err }) + if err != nil { + fmt.Println(err.Error()) + return false; + } } else { parts, e := operation.NewFileParts(args) if e != nil { fmt.Println(e.Error()) + return false + } + results, err := operation.SubmitFiles(func() string { return *upload.master }, grpcDialOption, parts, *upload.replication, *upload.collection, *upload.dataCenter, *upload.ttl, *upload.diskType, *upload.maxMB, *upload.usePublicUrl) + if err != nil { + fmt.Println(err.Error()) + return false } - results, _ := operation.SubmitFiles(func() string { return *upload.master }, grpcDialOption, parts, *upload.replication, *upload.collection, *upload.dataCenter, *upload.ttl, *upload.diskType, *upload.maxMB, *upload.usePublicUrl) bytes, _ := json.Marshal(results) fmt.Println(string(bytes)) } From 7ce3bee0c005081dd158ad237c69e9883bf11a3a Mon Sep 17 00:00:00 2001 From: Daniel Nagy Date: Tue, 8 Jun 2021 11:01:23 +0200 Subject: [PATCH 014/265] Check for history file errors as well --- weed/shell/shell_liner.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/weed/shell/shell_liner.go b/weed/shell/shell_liner.go index 38b74bc54..765b0efda 100644 --- a/weed/shell/shell_liner.go +++ b/weed/shell/shell_liner.go @@ -148,9 +148,11 @@ func loadHistory() { func saveHistory() { if f, err := os.Create(historyPath); err != nil { - fmt.Printf("Error writing history file: %v\n", err) + fmt.Printf("Error creating history file: %v\n", err) } else { - line.WriteHistory(f) + if _, err = line.WriteHistory(f); err != nil { + fmt.Printf("Error writing history file: %v\n", err) + } f.Close() } } From 40a8cb9b0a10c91fc69a35fac4c9154a4842aa4a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 9 Jun 2021 13:14:54 -0700 Subject: [PATCH 015/265] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 43f59af75..f2e4eaa9b 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Slack](https://img.shields.io/badge/slack-purple)](https://join.slack.com/t/seaweedfs/shared_invite/enQtMzI4MTMwMjU2MzA3LTEyYzZmZWYzOGQ3MDJlZWMzYmI0OTE4OTJiZjJjODBmMzUxNmYwODg0YjY3MTNlMjBmZDQ1NzQ5NDJhZWI2ZmY) [![Twitter](https://img.shields.io/twitter/follow/seaweedfs.svg?style=social&label=Follow)](https://twitter.com/intent/follow?screen_name=seaweedfs) -[![Build Status](https://travis-ci.org/chrislusf/seaweedfs.svg?branch=master)](https://travis-ci.org/chrislusf/seaweedfs) +[![Build Status](https://travis-ci.com/chrislusf/seaweedfs.svg?branch=master)](https://travis-ci.org/chrislusf/seaweedfs) [![GoDoc](https://godoc.org/github.com/chrislusf/seaweedfs/weed?status.svg)](https://godoc.org/github.com/chrislusf/seaweedfs/weed) [![Wiki](https://img.shields.io/badge/docs-wiki-blue.svg)](https://github.com/chrislusf/seaweedfs/wiki) [![Docker Pulls](https://img.shields.io/docker/pulls/chrislusf/seaweedfs?maxAge=4800)](https://hub.docker.com/r/chrislusf/seaweedfs/) From 33b87244ef99a9651e6564b6cd517e824e35ed70 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 10 Jun 2021 16:54:36 -0700 Subject: [PATCH 016/265] refactoring --- weed/iamapi/iamapi_handlers.go | 7 ++--- weed/iamapi/iamapi_management_handlers.go | 8 +++--- weed/s3api/auth_credentials.go | 2 +- weed/s3api/s3api_bucket_handlers.go | 16 +++++------ weed/s3api/s3api_handlers.go | 7 ++--- weed/s3api/s3api_object_copy_handlers.go | 22 +++++++-------- weed/s3api/s3api_object_handlers.go | 28 +++++++++---------- .../s3api/s3api_object_handlers_postpolicy.go | 22 +++++++-------- weed/s3api/s3api_object_multipart_handlers.go | 28 +++++++++---------- weed/s3api/s3api_object_tagging_handlers.go | 22 +++++++-------- weed/s3api/s3api_objects_list_handlers.go | 16 +++++------ 11 files changed, 88 insertions(+), 90 deletions(-) diff --git a/weed/iamapi/iamapi_handlers.go b/weed/iamapi/iamapi_handlers.go index 2e5f709f3..02da5a699 100644 --- a/weed/iamapi/iamapi_handlers.go +++ b/weed/iamapi/iamapi_handlers.go @@ -7,7 +7,6 @@ import ( "strconv" "net/http" - "net/url" "time" "github.com/chrislusf/seaweedfs/weed/glog" @@ -40,12 +39,12 @@ func encodeResponse(response interface{}) []byte { // If none of the http routes match respond with MethodNotAllowed func notFoundHandler(w http.ResponseWriter, r *http.Request) { glog.V(0).Infof("unsupported %s %s", r.Method, r.RequestURI) - writeErrorResponse(w, s3err.ErrMethodNotAllowed, r.URL) + writeErrorResponse(w, s3err.ErrMethodNotAllowed, r) } -func writeErrorResponse(w http.ResponseWriter, errorCode s3err.ErrorCode, reqURL *url.URL) { +func writeErrorResponse(w http.ResponseWriter, errorCode s3err.ErrorCode, r *http.Request) { apiError := s3err.GetAPIError(errorCode) - errorResponse := getRESTErrorResponse(apiError, reqURL.Path) + errorResponse := getRESTErrorResponse(apiError, r.URL.Path) encodedErrorResponse := encodeResponse(errorResponse) writeResponse(w, apiError.HTTPStatusCode, encodedErrorResponse, mimeXML) } diff --git a/weed/iamapi/iamapi_management_handlers.go b/weed/iamapi/iamapi_management_handlers.go index 89d283138..b39ca0492 100644 --- a/weed/iamapi/iamapi_management_handlers.go +++ b/weed/iamapi/iamapi_management_handlers.go @@ -362,7 +362,7 @@ func (iama *IamApiServer) DeleteAccessKey(s3cfg *iam_pb.S3ApiConfiguration, valu func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { if err := r.ParseForm(); err != nil { - writeErrorResponse(w, s3err.ErrInvalidRequest, r.URL) + writeErrorResponse(w, s3err.ErrInvalidRequest, r) return } values := r.PostForm @@ -370,7 +370,7 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { s3cfgLock.RLock() s3cfg := &iam_pb.S3ApiConfiguration{} if err := iama.s3ApiConfig.GetS3ApiConfiguration(s3cfg); err != nil { - writeErrorResponse(w, s3err.ErrInternalError, r.URL) + writeErrorResponse(w, s3err.ErrInternalError, r) return } s3cfgLock.RUnlock() @@ -411,14 +411,14 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { response, err = iama.CreatePolicy(s3cfg, values) if err != nil { glog.Errorf("CreatePolicy: %+v", err) - writeErrorResponse(w, s3err.ErrInvalidRequest, r.URL) + writeErrorResponse(w, s3err.ErrInvalidRequest, r) return } case "PutUserPolicy": response, err = iama.PutUserPolicy(s3cfg, values) if err != nil { glog.Errorf("PutUserPolicy: %+v", err) - writeErrorResponse(w, s3err.ErrInvalidRequest, r.URL) + writeErrorResponse(w, s3err.ErrInvalidRequest, r) return } case "GetUserPolicy": diff --git a/weed/s3api/auth_credentials.go b/weed/s3api/auth_credentials.go index d9d26756f..995a98acf 100644 --- a/weed/s3api/auth_credentials.go +++ b/weed/s3api/auth_credentials.go @@ -150,7 +150,7 @@ func (iam *IdentityAccessManagement) Auth(f http.HandlerFunc, action Action) htt f(w, r) return } - writeErrorResponse(w, errCode, r.URL) + writeErrorResponse(w, errCode, r) } } diff --git a/weed/s3api/s3api_bucket_handlers.go b/weed/s3api/s3api_bucket_handlers.go index 48e8cb047..6733a853c 100644 --- a/weed/s3api/s3api_bucket_handlers.go +++ b/weed/s3api/s3api_bucket_handlers.go @@ -32,7 +32,7 @@ func (s3a *S3ApiServer) ListBucketsHandler(w http.ResponseWriter, r *http.Reques if s3a.iam.isEnabled() { identity, s3Err = s3a.iam.authUser(r) if s3Err != s3err.ErrNone { - writeErrorResponse(w, s3Err, r.URL) + writeErrorResponse(w, s3Err, r) return } } @@ -42,7 +42,7 @@ func (s3a *S3ApiServer) ListBucketsHandler(w http.ResponseWriter, r *http.Reques entries, _, err := s3a.list(s3a.option.BucketsPath, "", "", false, math.MaxInt32) if err != nil { - writeErrorResponse(w, s3err.ErrInternalError, r.URL) + writeErrorResponse(w, s3err.ErrInternalError, r) return } @@ -95,14 +95,14 @@ func (s3a *S3ApiServer) PutBucketHandler(w http.ResponseWriter, r *http.Request) } return nil }); err != nil { - writeErrorResponse(w, s3err.ErrInternalError, r.URL) + writeErrorResponse(w, s3err.ErrInternalError, r) return } if exist, err := s3a.exists(s3a.option.BucketsPath, bucket, true); err == nil && exist { errCode = s3err.ErrBucketAlreadyExists } if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r.URL) + writeErrorResponse(w, errCode, r) return } @@ -118,7 +118,7 @@ func (s3a *S3ApiServer) PutBucketHandler(w http.ResponseWriter, r *http.Request) // create the folder for bucket, but lazily create actual collection if err := s3a.mkdir(s3a.option.BucketsPath, bucket, fn); err != nil { glog.Errorf("PutBucketHandler mkdir: %v", err) - writeErrorResponse(w, s3err.ErrInternalError, r.URL) + writeErrorResponse(w, s3err.ErrInternalError, r) return } @@ -130,7 +130,7 @@ func (s3a *S3ApiServer) DeleteBucketHandler(w http.ResponseWriter, r *http.Reque bucket, _ := getBucketAndObject(r) if err := s3a.checkBucket(r, bucket); err != s3err.ErrNone { - writeErrorResponse(w, err, r.URL) + writeErrorResponse(w, err, r) return } @@ -152,7 +152,7 @@ func (s3a *S3ApiServer) DeleteBucketHandler(w http.ResponseWriter, r *http.Reque err = s3a.rm(s3a.option.BucketsPath, bucket, false, true) if err != nil { - writeErrorResponse(w, s3err.ErrInternalError, r.URL) + writeErrorResponse(w, s3err.ErrInternalError, r) return } @@ -164,7 +164,7 @@ func (s3a *S3ApiServer) HeadBucketHandler(w http.ResponseWriter, r *http.Request bucket, _ := getBucketAndObject(r) if err := s3a.checkBucket(r, bucket); err != s3err.ErrNone { - writeErrorResponse(w, err, r.URL) + writeErrorResponse(w, err, r) return } diff --git a/weed/s3api/s3api_handlers.go b/weed/s3api/s3api_handlers.go index 6935c75bd..3df30ae22 100644 --- a/weed/s3api/s3api_handlers.go +++ b/weed/s3api/s3api_handlers.go @@ -7,7 +7,6 @@ import ( "fmt" "github.com/chrislusf/seaweedfs/weed/s3api/s3err" "net/http" - "net/url" "strconv" "time" @@ -57,12 +56,12 @@ func (s3a *S3ApiServer) AdjustedUrl(location *filer_pb.Location) string { // If none of the http routes match respond with MethodNotAllowed func notFoundHandler(w http.ResponseWriter, r *http.Request) { glog.V(0).Infof("unsupported %s %s", r.Method, r.RequestURI) - writeErrorResponse(w, s3err.ErrMethodNotAllowed, r.URL) + writeErrorResponse(w, s3err.ErrMethodNotAllowed, r) } -func writeErrorResponse(w http.ResponseWriter, errorCode s3err.ErrorCode, reqURL *url.URL) { +func writeErrorResponse(w http.ResponseWriter, errorCode s3err.ErrorCode, r *http.Request) { apiError := s3err.GetAPIError(errorCode) - errorResponse := getRESTErrorResponse(apiError, reqURL.Path) + errorResponse := getRESTErrorResponse(apiError, r.URL.Path) encodedErrorResponse := encodeResponse(errorResponse) writeResponse(w, apiError.HTTPStatusCode, encodedErrorResponse, mimeXML) } diff --git a/weed/s3api/s3api_object_copy_handlers.go b/weed/s3api/s3api_object_copy_handlers.go index 84a85fd78..b393fdb1f 100644 --- a/weed/s3api/s3api_object_copy_handlers.go +++ b/weed/s3api/s3api_object_copy_handlers.go @@ -32,12 +32,12 @@ func (s3a *S3ApiServer) CopyObjectHandler(w http.ResponseWriter, r *http.Request dir, name := fullPath.DirAndName() entry, err := s3a.getEntry(dir, name) if err != nil { - writeErrorResponse(w, s3err.ErrInvalidCopySource, r.URL) + writeErrorResponse(w, s3err.ErrInvalidCopySource, r) } entry.Extended = weed_server.SaveAmzMetaData(r, entry.Extended, isReplace(r)) err = s3a.touch(dir, name, entry) if err != nil { - writeErrorResponse(w, s3err.ErrInvalidCopySource, r.URL) + writeErrorResponse(w, s3err.ErrInvalidCopySource, r) } writeSuccessResponseXML(w, encodeResponse(CopyObjectResult{ ETag: fmt.Sprintf("%x", entry.Attributes.Md5), @@ -48,12 +48,12 @@ func (s3a *S3ApiServer) CopyObjectHandler(w http.ResponseWriter, r *http.Request // If source object is empty or bucket is empty, reply back invalid copy source. if srcObject == "" || srcBucket == "" { - writeErrorResponse(w, s3err.ErrInvalidCopySource, r.URL) + writeErrorResponse(w, s3err.ErrInvalidCopySource, r) return } if srcBucket == dstBucket && srcObject == dstObject { - writeErrorResponse(w, s3err.ErrInvalidCopyDest, r.URL) + writeErrorResponse(w, s3err.ErrInvalidCopyDest, r) return } @@ -64,7 +64,7 @@ func (s3a *S3ApiServer) CopyObjectHandler(w http.ResponseWriter, r *http.Request _, _, resp, err := util.DownloadFile(srcUrl) if err != nil { - writeErrorResponse(w, s3err.ErrInvalidCopySource, r.URL) + writeErrorResponse(w, s3err.ErrInvalidCopySource, r) return } defer util.CloseResponse(resp) @@ -73,7 +73,7 @@ func (s3a *S3ApiServer) CopyObjectHandler(w http.ResponseWriter, r *http.Request etag, errCode := s3a.putToFiler(r, dstUrl, resp.Body) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r.URL) + writeErrorResponse(w, errCode, r) return } @@ -117,7 +117,7 @@ func (s3a *S3ApiServer) CopyObjectPartHandler(w http.ResponseWriter, r *http.Req srcBucket, srcObject := pathToBucketAndObject(cpSrcPath) // If source object is empty or bucket is empty, reply back invalid copy source. if srcObject == "" || srcBucket == "" { - writeErrorResponse(w, s3err.ErrInvalidCopySource, r.URL) + writeErrorResponse(w, s3err.ErrInvalidCopySource, r) return } @@ -126,13 +126,13 @@ func (s3a *S3ApiServer) CopyObjectPartHandler(w http.ResponseWriter, r *http.Req partID, err := strconv.Atoi(partIDString) if err != nil { - writeErrorResponse(w, s3err.ErrInvalidPart, r.URL) + writeErrorResponse(w, s3err.ErrInvalidPart, r) return } // check partID with maximum part ID for multipart objects if partID > globalMaxPartID { - writeErrorResponse(w, s3err.ErrInvalidMaxParts, r.URL) + writeErrorResponse(w, s3err.ErrInvalidMaxParts, r) return } @@ -145,7 +145,7 @@ func (s3a *S3ApiServer) CopyObjectPartHandler(w http.ResponseWriter, r *http.Req dataReader, err := util.ReadUrlAsReaderCloser(srcUrl, rangeHeader) if err != nil { - writeErrorResponse(w, s3err.ErrInvalidCopySource, r.URL) + writeErrorResponse(w, s3err.ErrInvalidCopySource, r) return } defer dataReader.Close() @@ -154,7 +154,7 @@ func (s3a *S3ApiServer) CopyObjectPartHandler(w http.ResponseWriter, r *http.Req etag, errCode := s3a.putToFiler(r, dstUrl, dataReader) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r.URL) + writeErrorResponse(w, errCode, r) return } diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index 17ead05a0..ce4594e67 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -44,20 +44,20 @@ func (s3a *S3ApiServer) PutObjectHandler(w http.ResponseWriter, r *http.Request) _, err := validateContentMd5(r.Header) if err != nil { - writeErrorResponse(w, s3err.ErrInvalidDigest, r.URL) + writeErrorResponse(w, s3err.ErrInvalidDigest, r) return } if r.Header.Get("Cache-Control") != "" { if _, err = cacheobject.ParseRequestCacheControl(r.Header.Get("Cache-Control")); err != nil { - writeErrorResponse(w, s3err.ErrInvalidDigest, r.URL) + writeErrorResponse(w, s3err.ErrInvalidDigest, r) return } } if r.Header.Get("Expires") != "" { if _, err = time.Parse(http.TimeFormat, r.Header.Get("Expires")); err != nil { - writeErrorResponse(w, s3err.ErrInvalidDigest, r.URL) + writeErrorResponse(w, s3err.ErrInvalidDigest, r) return } } @@ -75,12 +75,12 @@ func (s3a *S3ApiServer) PutObjectHandler(w http.ResponseWriter, r *http.Request) _, s3ErrCode = s3a.iam.reqSignatureV4Verify(r) } if s3ErrCode != s3err.ErrNone { - writeErrorResponse(w, s3ErrCode, r.URL) + writeErrorResponse(w, s3ErrCode, r) return } } else { if authTypeStreamingSigned == rAuthType { - writeErrorResponse(w, s3err.ErrAuthNotSetup, r.URL) + writeErrorResponse(w, s3err.ErrAuthNotSetup, r) return } } @@ -88,7 +88,7 @@ func (s3a *S3ApiServer) PutObjectHandler(w http.ResponseWriter, r *http.Request) if strings.HasSuffix(object, "/") { if err := s3a.mkdir(s3a.option.BucketsPath, bucket+object, nil); err != nil { - writeErrorResponse(w, s3err.ErrInternalError, r.URL) + writeErrorResponse(w, s3err.ErrInternalError, r) return } } else { @@ -97,7 +97,7 @@ func (s3a *S3ApiServer) PutObjectHandler(w http.ResponseWriter, r *http.Request) etag, errCode := s3a.putToFiler(r, uploadUrl, dataReader) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r.URL) + writeErrorResponse(w, errCode, r) return } @@ -120,7 +120,7 @@ func (s3a *S3ApiServer) GetObjectHandler(w http.ResponseWriter, r *http.Request) bucket, object := getBucketAndObject(r) if strings.HasSuffix(r.URL.Path, "/") { - writeErrorResponse(w, s3err.ErrNotImplemented, r.URL) + writeErrorResponse(w, s3err.ErrNotImplemented, r) return } @@ -195,13 +195,13 @@ func (s3a *S3ApiServer) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *h deleteXMLBytes, err := ioutil.ReadAll(r.Body) if err != nil { - writeErrorResponse(w, s3err.ErrInternalError, r.URL) + writeErrorResponse(w, s3err.ErrInternalError, r) return } deleteObjects := &DeleteObjectsRequest{} if err := xml.Unmarshal(deleteXMLBytes, deleteObjects); err != nil { - writeErrorResponse(w, s3err.ErrMalformedXML, r.URL) + writeErrorResponse(w, s3err.ErrMalformedXML, r) return } @@ -297,7 +297,7 @@ func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, des if err != nil { glog.Errorf("NewRequest %s: %v", destUrl, err) - writeErrorResponse(w, s3err.ErrInternalError, r.URL) + writeErrorResponse(w, s3err.ErrInternalError, r) return } @@ -327,19 +327,19 @@ func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, des if postErr != nil { glog.Errorf("post to filer: %v", postErr) - writeErrorResponse(w, s3err.ErrInternalError, r.URL) + writeErrorResponse(w, s3err.ErrInternalError, r) return } defer util.CloseResponse(resp) if resp.StatusCode == http.StatusPreconditionFailed { - writeErrorResponse(w, s3err.ErrPreconditionFailed, r.URL) + writeErrorResponse(w, s3err.ErrPreconditionFailed, r) return } if (resp.ContentLength == -1 || resp.StatusCode == 404) && resp.StatusCode != 304 { if r.Method != "DELETE" { - writeErrorResponse(w, s3err.ErrNoSuchKey, r.URL) + writeErrorResponse(w, s3err.ErrNoSuchKey, r) return } } diff --git a/weed/s3api/s3api_object_handlers_postpolicy.go b/weed/s3api/s3api_object_handlers_postpolicy.go index 035302ae6..3a979413a 100644 --- a/weed/s3api/s3api_object_handlers_postpolicy.go +++ b/weed/s3api/s3api_object_handlers_postpolicy.go @@ -26,23 +26,23 @@ func (s3a *S3ApiServer) PostPolicyBucketHandler(w http.ResponseWriter, r *http.R reader, err := r.MultipartReader() if err != nil { - writeErrorResponse(w, s3err.ErrMalformedPOSTRequest, r.URL) + writeErrorResponse(w, s3err.ErrMalformedPOSTRequest, r) return } form, err := reader.ReadForm(int64(5 * humanize.MiByte)) if err != nil { - writeErrorResponse(w, s3err.ErrMalformedPOSTRequest, r.URL) + writeErrorResponse(w, s3err.ErrMalformedPOSTRequest, r) return } defer form.RemoveAll() fileBody, fileName, fileSize, formValues, err := extractPostPolicyFormValues(form) if err != nil { - writeErrorResponse(w, s3err.ErrMalformedPOSTRequest, r.URL) + writeErrorResponse(w, s3err.ErrMalformedPOSTRequest, r) return } if fileBody == nil { - writeErrorResponse(w, s3err.ErrPOSTFileRequired, r.URL) + writeErrorResponse(w, s3err.ErrPOSTFileRequired, r) return } defer fileBody.Close() @@ -60,7 +60,7 @@ func (s3a *S3ApiServer) PostPolicyBucketHandler(w http.ResponseWriter, r *http.R if successRedirect != "" { redirectURL, err = url.Parse(successRedirect) if err != nil { - writeErrorResponse(w, s3err.ErrMalformedPOSTRequest, r.URL) + writeErrorResponse(w, s3err.ErrMalformedPOSTRequest, r) return } } @@ -68,13 +68,13 @@ func (s3a *S3ApiServer) PostPolicyBucketHandler(w http.ResponseWriter, r *http.R // Verify policy signature. errCode := s3a.iam.doesPolicySignatureMatch(formValues) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r.URL) + writeErrorResponse(w, errCode, r) return } policyBytes, err := base64.StdEncoding.DecodeString(formValues.Get("Policy")) if err != nil { - writeErrorResponse(w, s3err.ErrMalformedPOSTRequest, r.URL) + writeErrorResponse(w, s3err.ErrMalformedPOSTRequest, r) return } @@ -83,7 +83,7 @@ func (s3a *S3ApiServer) PostPolicyBucketHandler(w http.ResponseWriter, r *http.R postPolicyForm, err := policy.ParsePostPolicyForm(string(policyBytes)) if err != nil { - writeErrorResponse(w, s3err.ErrPostPolicyConditionInvalidFormat, r.URL) + writeErrorResponse(w, s3err.ErrPostPolicyConditionInvalidFormat, r) return } @@ -99,12 +99,12 @@ func (s3a *S3ApiServer) PostPolicyBucketHandler(w http.ResponseWriter, r *http.R lengthRange := postPolicyForm.Conditions.ContentLengthRange if lengthRange.Valid { if fileSize < lengthRange.Min { - writeErrorResponse(w, s3err.ErrEntityTooSmall, r.URL) + writeErrorResponse(w, s3err.ErrEntityTooSmall, r) return } if fileSize > lengthRange.Max { - writeErrorResponse(w, s3err.ErrEntityTooLarge, r.URL) + writeErrorResponse(w, s3err.ErrEntityTooLarge, r) return } } @@ -115,7 +115,7 @@ func (s3a *S3ApiServer) PostPolicyBucketHandler(w http.ResponseWriter, r *http.R etag, errCode := s3a.putToFiler(r, uploadUrl, fileBody) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r.URL) + writeErrorResponse(w, errCode, r) return } diff --git a/weed/s3api/s3api_object_multipart_handlers.go b/weed/s3api/s3api_object_multipart_handlers.go index 4ddb24e31..9020ef507 100644 --- a/weed/s3api/s3api_object_multipart_handlers.go +++ b/weed/s3api/s3api_object_multipart_handlers.go @@ -32,7 +32,7 @@ func (s3a *S3ApiServer) NewMultipartUploadHandler(w http.ResponseWriter, r *http glog.V(2).Info("NewMultipartUploadHandler", string(encodeResponse(response)), errCode) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r.URL) + writeErrorResponse(w, errCode, r) return } @@ -56,7 +56,7 @@ func (s3a *S3ApiServer) CompleteMultipartUploadHandler(w http.ResponseWriter, r glog.V(2).Info("CompleteMultipartUploadHandler", string(encodeResponse(response)), errCode) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r.URL) + writeErrorResponse(w, errCode, r) return } @@ -78,7 +78,7 @@ func (s3a *S3ApiServer) AbortMultipartUploadHandler(w http.ResponseWriter, r *ht }) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r.URL) + writeErrorResponse(w, errCode, r) return } @@ -94,13 +94,13 @@ func (s3a *S3ApiServer) ListMultipartUploadsHandler(w http.ResponseWriter, r *ht prefix, keyMarker, uploadIDMarker, delimiter, maxUploads, encodingType := getBucketMultipartResources(r.URL.Query()) if maxUploads < 0 { - writeErrorResponse(w, s3err.ErrInvalidMaxUploads, r.URL) + writeErrorResponse(w, s3err.ErrInvalidMaxUploads, r) return } if keyMarker != "" { // Marker not common with prefix is not implemented. if !strings.HasPrefix(keyMarker, prefix) { - writeErrorResponse(w, s3err.ErrNotImplemented, r.URL) + writeErrorResponse(w, s3err.ErrNotImplemented, r) return } } @@ -118,7 +118,7 @@ func (s3a *S3ApiServer) ListMultipartUploadsHandler(w http.ResponseWriter, r *ht glog.V(2).Info("ListMultipartUploadsHandler", string(encodeResponse(response)), errCode) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r.URL) + writeErrorResponse(w, errCode, r) return } @@ -133,11 +133,11 @@ func (s3a *S3ApiServer) ListObjectPartsHandler(w http.ResponseWriter, r *http.Re uploadID, partNumberMarker, maxParts, _ := getObjectResources(r.URL.Query()) if partNumberMarker < 0 { - writeErrorResponse(w, s3err.ErrInvalidPartNumberMarker, r.URL) + writeErrorResponse(w, s3err.ErrInvalidPartNumberMarker, r) return } if maxParts < 0 { - writeErrorResponse(w, s3err.ErrInvalidMaxParts, r.URL) + writeErrorResponse(w, s3err.ErrInvalidMaxParts, r) return } @@ -152,7 +152,7 @@ func (s3a *S3ApiServer) ListObjectPartsHandler(w http.ResponseWriter, r *http.Re glog.V(2).Info("ListObjectPartsHandler", string(encodeResponse(response)), errCode) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r.URL) + writeErrorResponse(w, errCode, r) return } @@ -167,18 +167,18 @@ func (s3a *S3ApiServer) PutObjectPartHandler(w http.ResponseWriter, r *http.Requ uploadID := r.URL.Query().Get("uploadId") exists, err := s3a.exists(s3a.genUploadsFolder(bucket), uploadID, true) if !exists { - writeErrorResponse(w, s3err.ErrNoSuchUpload, r.URL) + writeErrorResponse(w, s3err.ErrNoSuchUpload, r) return } partIDString := r.URL.Query().Get("partNumber") partID, err := strconv.Atoi(partIDString) if err != nil { - writeErrorResponse(w, s3err.ErrInvalidPart, r.URL) + writeErrorResponse(w, s3err.ErrInvalidPart, r) return } if partID > globalMaxPartID { - writeErrorResponse(w, s3err.ErrInvalidMaxParts, r.URL) + writeErrorResponse(w, s3err.ErrInvalidMaxParts, r) return } @@ -195,7 +195,7 @@ func (s3a *S3ApiServer) PutObjectPartHandler(w http.ResponseWriter, r *http.Requ _, s3ErrCode = s3a.iam.reqSignatureV4Verify(r) } if s3ErrCode != s3err.ErrNone { - writeErrorResponse(w, s3ErrCode, r.URL) + writeErrorResponse(w, s3ErrCode, r) return } } @@ -207,7 +207,7 @@ func (s3a *S3ApiServer) PutObjectPartHandler(w http.ResponseWriter, r *http.Requ etag, errCode := s3a.putToFiler(r, uploadUrl, dataReader) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r.URL) + writeErrorResponse(w, errCode, r) return } diff --git a/weed/s3api/s3api_object_tagging_handlers.go b/weed/s3api/s3api_object_tagging_handlers.go index 94719834c..d4cc9854c 100644 --- a/weed/s3api/s3api_object_tagging_handlers.go +++ b/weed/s3api/s3api_object_tagging_handlers.go @@ -25,10 +25,10 @@ func (s3a *S3ApiServer) GetObjectTaggingHandler(w http.ResponseWriter, r *http.R if err != nil { if err == filer_pb.ErrNotFound { glog.Errorf("GetObjectTaggingHandler %s: %v", r.URL, err) - writeErrorResponse(w, s3err.ErrNoSuchKey, r.URL) + writeErrorResponse(w, s3err.ErrNoSuchKey, r) } else { glog.Errorf("GetObjectTaggingHandler %s: %v", r.URL, err) - writeErrorResponse(w, s3err.ErrInternalError, r.URL) + writeErrorResponse(w, s3err.ErrInternalError, r) } return } @@ -50,29 +50,29 @@ func (s3a *S3ApiServer) PutObjectTaggingHandler(w http.ResponseWriter, r *http.R input, err := ioutil.ReadAll(io.LimitReader(r.Body, r.ContentLength)) if err != nil { glog.Errorf("PutObjectTaggingHandler read input %s: %v", r.URL, err) - writeErrorResponse(w, s3err.ErrInternalError, r.URL) + writeErrorResponse(w, s3err.ErrInternalError, r) return } if err = xml.Unmarshal(input, tagging); err != nil { glog.Errorf("PutObjectTaggingHandler Unmarshal %s: %v", r.URL, err) - writeErrorResponse(w, s3err.ErrMalformedXML, r.URL) + writeErrorResponse(w, s3err.ErrMalformedXML, r) return } tags := tagging.ToTags() if len(tags) > 10 { glog.Errorf("PutObjectTaggingHandler tags %s: %d tags more than 10", r.URL, len(tags)) - writeErrorResponse(w, s3err.ErrInvalidTag, r.URL) + writeErrorResponse(w, s3err.ErrInvalidTag, r) return } for k, v := range tags { if len(k) > 128 { glog.Errorf("PutObjectTaggingHandler tags %s: tag key %s longer than 128", r.URL, k) - writeErrorResponse(w, s3err.ErrInvalidTag, r.URL) + writeErrorResponse(w, s3err.ErrInvalidTag, r) return } if len(v) > 256 { glog.Errorf("PutObjectTaggingHandler tags %s: tag value %s longer than 256", r.URL, v) - writeErrorResponse(w, s3err.ErrInvalidTag, r.URL) + writeErrorResponse(w, s3err.ErrInvalidTag, r) return } } @@ -80,10 +80,10 @@ func (s3a *S3ApiServer) PutObjectTaggingHandler(w http.ResponseWriter, r *http.R if err = s3a.setTags(dir, name, tagging.ToTags()); err != nil { if err == filer_pb.ErrNotFound { glog.Errorf("PutObjectTaggingHandler setTags %s: %v", r.URL, err) - writeErrorResponse(w, s3err.ErrNoSuchKey, r.URL) + writeErrorResponse(w, s3err.ErrNoSuchKey, r) } else { glog.Errorf("PutObjectTaggingHandler setTags %s: %v", r.URL, err) - writeErrorResponse(w, s3err.ErrInternalError, r.URL) + writeErrorResponse(w, s3err.ErrInternalError, r) } return } @@ -105,10 +105,10 @@ func (s3a *S3ApiServer) DeleteObjectTaggingHandler(w http.ResponseWriter, r *htt if err != nil { if err == filer_pb.ErrNotFound { glog.Errorf("DeleteObjectTaggingHandler %s: %v", r.URL, err) - writeErrorResponse(w, s3err.ErrNoSuchKey, r.URL) + writeErrorResponse(w, s3err.ErrNoSuchKey, r) } else { glog.Errorf("DeleteObjectTaggingHandler %s: %v", r.URL, err) - writeErrorResponse(w, s3err.ErrInternalError, r.URL) + writeErrorResponse(w, s3err.ErrInternalError, r) } return } diff --git a/weed/s3api/s3api_objects_list_handlers.go b/weed/s3api/s3api_objects_list_handlers.go index 66c66d280..ab92ced43 100644 --- a/weed/s3api/s3api_objects_list_handlers.go +++ b/weed/s3api/s3api_objects_list_handlers.go @@ -44,11 +44,11 @@ func (s3a *S3ApiServer) ListObjectsV2Handler(w http.ResponseWriter, r *http.Requ originalPrefix, continuationToken, startAfter, delimiter, _, maxKeys := getListObjectsV2Args(r.URL.Query()) if maxKeys < 0 { - writeErrorResponse(w, s3err.ErrInvalidMaxKeys, r.URL) + writeErrorResponse(w, s3err.ErrInvalidMaxKeys, r) return } if delimiter != "" && delimiter != "/" { - writeErrorResponse(w, s3err.ErrNotImplemented, r.URL) + writeErrorResponse(w, s3err.ErrNotImplemented, r) return } @@ -60,13 +60,13 @@ func (s3a *S3ApiServer) ListObjectsV2Handler(w http.ResponseWriter, r *http.Requ response, err := s3a.listFilerEntries(bucket, originalPrefix, maxKeys, marker, delimiter) if err != nil { - writeErrorResponse(w, s3err.ErrInternalError, r.URL) + writeErrorResponse(w, s3err.ErrInternalError, r) return } if len(response.Contents) == 0 { if exists, existErr := s3a.exists(s3a.option.BucketsPath, bucket, true); existErr == nil && !exists { - writeErrorResponse(w, s3err.ErrNoSuchBucket, r.URL) + writeErrorResponse(w, s3err.ErrNoSuchBucket, r) return } } @@ -99,24 +99,24 @@ func (s3a *S3ApiServer) ListObjectsV1Handler(w http.ResponseWriter, r *http.Requ originalPrefix, marker, delimiter, maxKeys := getListObjectsV1Args(r.URL.Query()) if maxKeys < 0 { - writeErrorResponse(w, s3err.ErrInvalidMaxKeys, r.URL) + writeErrorResponse(w, s3err.ErrInvalidMaxKeys, r) return } if delimiter != "" && delimiter != "/" { - writeErrorResponse(w, s3err.ErrNotImplemented, r.URL) + writeErrorResponse(w, s3err.ErrNotImplemented, r) return } response, err := s3a.listFilerEntries(bucket, originalPrefix, maxKeys, marker, delimiter) if err != nil { - writeErrorResponse(w, s3err.ErrInternalError, r.URL) + writeErrorResponse(w, s3err.ErrInternalError, r) return } if len(response.Contents) == 0 { if exists, existErr := s3a.exists(s3a.option.BucketsPath, bucket, true); existErr == nil && !exists { - writeErrorResponse(w, s3err.ErrNoSuchBucket, r.URL) + writeErrorResponse(w, s3err.ErrNoSuchBucket, r) return } } From 8b382a82097d6fb0f6addb4095a5a090a0ba09d9 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 10 Jun 2021 21:50:21 -0700 Subject: [PATCH 017/265] refactor --- weed/iamapi/iamapi_handlers.go | 83 ++----------------- weed/iamapi/iamapi_management_handlers.go | 12 +-- weed/iamapi/iamapi_server.go | 3 +- weed/s3api/auth_credentials.go | 2 +- weed/s3api/filer_multipart_test.go | 5 +- weed/s3api/s3api_bucket_handlers.go | 20 ++--- weed/s3api/s3api_bucket_handlers_test.go | 3 +- weed/s3api/s3api_handlers.go | 77 +---------------- weed/s3api/s3api_object_copy_handlers.go | 30 +++---- weed/s3api/s3api_object_handlers.go | 30 +++---- .../s3api/s3api_object_handlers_postpolicy.go | 32 +++---- weed/s3api/s3api_object_multipart_handlers.go | 48 +++++------ weed/s3api/s3api_object_tagging_handlers.go | 24 +++--- weed/s3api/s3api_objects_list_handlers.go | 20 ++--- .../s3api/s3api_objects_list_handlers_test.go | 3 +- weed/s3api/s3api_server.go | 3 +- weed/s3api/s3api_test.go | 5 +- weed/s3api/s3err/error_handler.go | 81 ++++++++++++++++++ weed/s3api/tags_test.go | 3 +- 19 files changed, 215 insertions(+), 269 deletions(-) create mode 100644 weed/s3api/s3err/error_handler.go diff --git a/weed/iamapi/iamapi_handlers.go b/weed/iamapi/iamapi_handlers.go index 02da5a699..7765d9e95 100644 --- a/weed/iamapi/iamapi_handlers.go +++ b/weed/iamapi/iamapi_handlers.go @@ -1,54 +1,13 @@ package iamapi import ( - "bytes" - "encoding/xml" "fmt" - "strconv" - - "net/http" - "time" - + "github.com/aws/aws-sdk-go/service/iam" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/s3api/s3err" - - "github.com/aws/aws-sdk-go/service/iam" + "net/http" ) -type mimeType string - -const ( - mimeNone mimeType = "" - mimeXML mimeType = "application/xml" -) - -func setCommonHeaders(w http.ResponseWriter) { - w.Header().Set("x-amz-request-id", fmt.Sprintf("%d", time.Now().UnixNano())) - w.Header().Set("Accept-Ranges", "bytes") -} - -// Encodes the response headers into XML format. -func encodeResponse(response interface{}) []byte { - var bytesBuffer bytes.Buffer - bytesBuffer.WriteString(xml.Header) - e := xml.NewEncoder(&bytesBuffer) - e.Encode(response) - return bytesBuffer.Bytes() -} - -// If none of the http routes match respond with MethodNotAllowed -func notFoundHandler(w http.ResponseWriter, r *http.Request) { - glog.V(0).Infof("unsupported %s %s", r.Method, r.RequestURI) - writeErrorResponse(w, s3err.ErrMethodNotAllowed, r) -} - -func writeErrorResponse(w http.ResponseWriter, errorCode s3err.ErrorCode, r *http.Request) { - apiError := s3err.GetAPIError(errorCode) - errorResponse := getRESTErrorResponse(apiError, r.URL.Path) - encodedErrorResponse := encodeResponse(errorResponse) - writeResponse(w, apiError.HTTPStatusCode, encodedErrorResponse, mimeXML) -} - func writeIamErrorResponse(w http.ResponseWriter, err error, object string, value string, msg error) { errCode := err.Error() errorResp := ErrorResponse{} @@ -63,42 +22,10 @@ func writeIamErrorResponse(w http.ResponseWriter, err error, object string, valu case iam.ErrCodeNoSuchEntityException: msg := fmt.Sprintf("The %s with name %s cannot be found.", object, value) errorResp.Error.Message = &msg - writeResponse(w, http.StatusNotFound, encodeResponse(errorResp), mimeXML) + s3err.WriteXMLResponse(w, http.StatusNotFound, errorResp) case iam.ErrCodeServiceFailureException: - writeResponse(w, http.StatusInternalServerError, encodeResponse(errorResp), mimeXML) + s3err.WriteXMLResponse(w, http.StatusInternalServerError, errorResp) default: - writeResponse(w, http.StatusInternalServerError, encodeResponse(errorResp), mimeXML) + s3err.WriteXMLResponse(w, http.StatusInternalServerError, errorResp) } } - -func getRESTErrorResponse(err s3err.APIError, resource string) s3err.RESTErrorResponse { - return s3err.RESTErrorResponse{ - Code: err.Code, - Message: err.Description, - Resource: resource, - RequestID: fmt.Sprintf("%d", time.Now().UnixNano()), - } -} - -func writeResponse(w http.ResponseWriter, statusCode int, response []byte, mType mimeType) { - setCommonHeaders(w) - if response != nil { - w.Header().Set("Content-Length", strconv.Itoa(len(response))) - } - if mType != mimeNone { - w.Header().Set("Content-Type", string(mType)) - } - w.WriteHeader(statusCode) - if response != nil { - glog.V(4).Infof("status %d %s: %s", statusCode, mType, string(response)) - _, err := w.Write(response) - if err != nil { - glog.V(0).Infof("write err: %v", err) - } - w.(http.Flusher).Flush() - } -} - -func writeSuccessResponseXML(w http.ResponseWriter, response []byte) { - writeResponse(w, http.StatusOK, response, mimeXML) -} diff --git a/weed/iamapi/iamapi_management_handlers.go b/weed/iamapi/iamapi_management_handlers.go index b39ca0492..0826ce336 100644 --- a/weed/iamapi/iamapi_management_handlers.go +++ b/weed/iamapi/iamapi_management_handlers.go @@ -362,7 +362,7 @@ func (iama *IamApiServer) DeleteAccessKey(s3cfg *iam_pb.S3ApiConfiguration, valu func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { if err := r.ParseForm(); err != nil { - writeErrorResponse(w, s3err.ErrInvalidRequest, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidRequest, r) return } values := r.PostForm @@ -370,7 +370,7 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { s3cfgLock.RLock() s3cfg := &iam_pb.S3ApiConfiguration{} if err := iama.s3ApiConfig.GetS3ApiConfiguration(s3cfg); err != nil { - writeErrorResponse(w, s3err.ErrInternalError, r) + s3err.WriteErrorResponse(w, s3err.ErrInternalError, r) return } s3cfgLock.RUnlock() @@ -411,14 +411,14 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { response, err = iama.CreatePolicy(s3cfg, values) if err != nil { glog.Errorf("CreatePolicy: %+v", err) - writeErrorResponse(w, s3err.ErrInvalidRequest, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidRequest, r) return } case "PutUserPolicy": response, err = iama.PutUserPolicy(s3cfg, values) if err != nil { glog.Errorf("PutUserPolicy: %+v", err) - writeErrorResponse(w, s3err.ErrInvalidRequest, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidRequest, r) return } case "GetUserPolicy": @@ -437,7 +437,7 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { errorResponse := ErrorResponse{} errorResponse.Error.Code = &errNotImplemented.Code errorResponse.Error.Message = &errNotImplemented.Description - writeResponse(w, errNotImplemented.HTTPStatusCode, encodeResponse(errorResponse), mimeXML) + s3err.WriteXMLResponse(w, errNotImplemented.HTTPStatusCode, errorResponse) return } if changed { @@ -449,5 +449,5 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { return } } - writeSuccessResponseXML(w, encodeResponse(response)) + s3err.WriteXMLResponse(w, http.StatusOK, response) } diff --git a/weed/iamapi/iamapi_server.go b/weed/iamapi/iamapi_server.go index 18af1a919..eb18e996d 100644 --- a/weed/iamapi/iamapi_server.go +++ b/weed/iamapi/iamapi_server.go @@ -12,6 +12,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/pb/iam_pb" "github.com/chrislusf/seaweedfs/weed/s3api" . "github.com/chrislusf/seaweedfs/weed/s3api/s3_constants" + "github.com/chrislusf/seaweedfs/weed/s3api/s3err" "github.com/chrislusf/seaweedfs/weed/wdclient" "github.com/gorilla/mux" "google.golang.org/grpc" @@ -71,7 +72,7 @@ func (iama *IamApiServer) registerRouter(router *mux.Router) { apiRouter.Methods("POST").Path("/").HandlerFunc(iama.iam.Auth(iama.DoActions, ACTION_ADMIN)) // // NotFound - apiRouter.NotFoundHandler = http.HandlerFunc(notFoundHandler) + apiRouter.NotFoundHandler = http.HandlerFunc(s3err.NotFoundHandler) } func (iam IamS3ApiConfigure) GetS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfiguration) (err error) { diff --git a/weed/s3api/auth_credentials.go b/weed/s3api/auth_credentials.go index 995a98acf..22df04dc0 100644 --- a/weed/s3api/auth_credentials.go +++ b/weed/s3api/auth_credentials.go @@ -150,7 +150,7 @@ func (iam *IdentityAccessManagement) Auth(f http.HandlerFunc, action Action) htt f(w, r) return } - writeErrorResponse(w, errCode, r) + s3err.WriteErrorResponse(w, errCode, r) } } diff --git a/weed/s3api/filer_multipart_test.go b/weed/s3api/filer_multipart_test.go index f2568b6bc..9e1d2307b 100644 --- a/weed/s3api/filer_multipart_test.go +++ b/weed/s3api/filer_multipart_test.go @@ -3,6 +3,7 @@ package s3api import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/s3" + "github.com/chrislusf/seaweedfs/weed/s3api/s3err" "testing" "time" ) @@ -19,7 +20,7 @@ func TestInitiateMultipartUploadResult(t *testing.T) { }, } - encoded := string(encodeResponse(response)) + encoded := string(s3err.EncodeXMLResponse(response)) if encoded != expected { t.Errorf("unexpected output: %s\nexpecting:%s", encoded, expected) } @@ -41,7 +42,7 @@ func TestListPartsResult(t *testing.T) { }, } - encoded := string(encodeResponse(response)) + encoded := string(s3err.EncodeXMLResponse(response)) if encoded != expected { t.Errorf("unexpected output: %s\nexpecting:%s", encoded, expected) } diff --git a/weed/s3api/s3api_bucket_handlers.go b/weed/s3api/s3api_bucket_handlers.go index 6733a853c..8beb954aa 100644 --- a/weed/s3api/s3api_bucket_handlers.go +++ b/weed/s3api/s3api_bucket_handlers.go @@ -32,7 +32,7 @@ func (s3a *S3ApiServer) ListBucketsHandler(w http.ResponseWriter, r *http.Reques if s3a.iam.isEnabled() { identity, s3Err = s3a.iam.authUser(r) if s3Err != s3err.ErrNone { - writeErrorResponse(w, s3Err, r) + s3err.WriteErrorResponse(w, s3Err, r) return } } @@ -42,7 +42,7 @@ func (s3a *S3ApiServer) ListBucketsHandler(w http.ResponseWriter, r *http.Reques entries, _, err := s3a.list(s3a.option.BucketsPath, "", "", false, math.MaxInt32) if err != nil { - writeErrorResponse(w, s3err.ErrInternalError, r) + s3err.WriteErrorResponse(w, s3err.ErrInternalError, r) return } @@ -69,7 +69,7 @@ func (s3a *S3ApiServer) ListBucketsHandler(w http.ResponseWriter, r *http.Reques Buckets: buckets, } - writeSuccessResponseXML(w, encodeResponse(response)) + writeSuccessResponseXML(w, response) } func (s3a *S3ApiServer) PutBucketHandler(w http.ResponseWriter, r *http.Request) { @@ -95,14 +95,14 @@ func (s3a *S3ApiServer) PutBucketHandler(w http.ResponseWriter, r *http.Request) } return nil }); err != nil { - writeErrorResponse(w, s3err.ErrInternalError, r) + s3err.WriteErrorResponse(w, s3err.ErrInternalError, r) return } if exist, err := s3a.exists(s3a.option.BucketsPath, bucket, true); err == nil && exist { errCode = s3err.ErrBucketAlreadyExists } if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r) + s3err.WriteErrorResponse(w, errCode, r) return } @@ -118,7 +118,7 @@ func (s3a *S3ApiServer) PutBucketHandler(w http.ResponseWriter, r *http.Request) // create the folder for bucket, but lazily create actual collection if err := s3a.mkdir(s3a.option.BucketsPath, bucket, fn); err != nil { glog.Errorf("PutBucketHandler mkdir: %v", err) - writeErrorResponse(w, s3err.ErrInternalError, r) + s3err.WriteErrorResponse(w, s3err.ErrInternalError, r) return } @@ -130,7 +130,7 @@ func (s3a *S3ApiServer) DeleteBucketHandler(w http.ResponseWriter, r *http.Reque bucket, _ := getBucketAndObject(r) if err := s3a.checkBucket(r, bucket); err != s3err.ErrNone { - writeErrorResponse(w, err, r) + s3err.WriteErrorResponse(w, err, r) return } @@ -152,11 +152,11 @@ func (s3a *S3ApiServer) DeleteBucketHandler(w http.ResponseWriter, r *http.Reque err = s3a.rm(s3a.option.BucketsPath, bucket, false, true) if err != nil { - writeErrorResponse(w, s3err.ErrInternalError, r) + s3err.WriteErrorResponse(w, s3err.ErrInternalError, r) return } - writeResponse(w, http.StatusNoContent, nil, mimeNone) + s3err.WriteEmptyResponse(w, http.StatusNoContent) } func (s3a *S3ApiServer) HeadBucketHandler(w http.ResponseWriter, r *http.Request) { @@ -164,7 +164,7 @@ func (s3a *S3ApiServer) HeadBucketHandler(w http.ResponseWriter, r *http.Request bucket, _ := getBucketAndObject(r) if err := s3a.checkBucket(r, bucket); err != s3err.ErrNone { - writeErrorResponse(w, err, r) + s3err.WriteErrorResponse(w, err, r) return } diff --git a/weed/s3api/s3api_bucket_handlers_test.go b/weed/s3api/s3api_bucket_handlers_test.go index 7ab04830b..d5622c51c 100644 --- a/weed/s3api/s3api_bucket_handlers_test.go +++ b/weed/s3api/s3api_bucket_handlers_test.go @@ -1,6 +1,7 @@ package s3api import ( + "github.com/chrislusf/seaweedfs/weed/s3api/s3err" "testing" "time" @@ -32,7 +33,7 @@ func TestListBucketsHandler(t *testing.T) { Buckets: buckets, } - encoded := string(encodeResponse(response)) + encoded := string(s3err.EncodeXMLResponse(response)) if encoded != expected { t.Errorf("unexpected output: %s\nexpecting:%s", encoded, expected) } diff --git a/weed/s3api/s3api_handlers.go b/weed/s3api/s3api_handlers.go index 3df30ae22..b4d2c22e7 100644 --- a/weed/s3api/s3api_handlers.go +++ b/weed/s3api/s3api_handlers.go @@ -1,44 +1,16 @@ package s3api import ( - "bytes" "encoding/base64" - "encoding/xml" "fmt" "github.com/chrislusf/seaweedfs/weed/s3api/s3err" - "net/http" - "strconv" - "time" - "google.golang.org/grpc" + "net/http" - "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" ) -type mimeType string - -const ( - mimeNone mimeType = "" - mimeJSON mimeType = "application/json" - mimeXML mimeType = "application/xml" -) - -func setCommonHeaders(w http.ResponseWriter) { - w.Header().Set("x-amz-request-id", fmt.Sprintf("%d", time.Now().UnixNano())) - w.Header().Set("Accept-Ranges", "bytes") -} - -// Encodes the response headers into XML format. -func encodeResponse(response interface{}) []byte { - var bytesBuffer bytes.Buffer - bytesBuffer.WriteString(xml.Header) - e := xml.NewEncoder(&bytesBuffer) - e.Encode(response) - return bytesBuffer.Bytes() -} - var _ = filer_pb.FilerClient(&S3ApiServer{}) func (s3a *S3ApiServer) WithFilerClient(fn func(filer_pb.SeaweedFilerClient) error) error { @@ -53,53 +25,12 @@ func (s3a *S3ApiServer) AdjustedUrl(location *filer_pb.Location) string { return location.Url } -// If none of the http routes match respond with MethodNotAllowed -func notFoundHandler(w http.ResponseWriter, r *http.Request) { - glog.V(0).Infof("unsupported %s %s", r.Method, r.RequestURI) - writeErrorResponse(w, s3err.ErrMethodNotAllowed, r) -} - -func writeErrorResponse(w http.ResponseWriter, errorCode s3err.ErrorCode, r *http.Request) { - apiError := s3err.GetAPIError(errorCode) - errorResponse := getRESTErrorResponse(apiError, r.URL.Path) - encodedErrorResponse := encodeResponse(errorResponse) - writeResponse(w, apiError.HTTPStatusCode, encodedErrorResponse, mimeXML) -} - -func getRESTErrorResponse(err s3err.APIError, resource string) s3err.RESTErrorResponse { - return s3err.RESTErrorResponse{ - Code: err.Code, - Message: err.Description, - Resource: resource, - RequestID: fmt.Sprintf("%d", time.Now().UnixNano()), - } -} - -func writeResponse(w http.ResponseWriter, statusCode int, response []byte, mType mimeType) { - setCommonHeaders(w) - if response != nil { - w.Header().Set("Content-Length", strconv.Itoa(len(response))) - } - if mType != mimeNone { - w.Header().Set("Content-Type", string(mType)) - } - w.WriteHeader(statusCode) - if response != nil { - glog.V(4).Infof("status %d %s: %s", statusCode, mType, string(response)) - _, err := w.Write(response) - if err != nil { - glog.V(0).Infof("write err: %v", err) - } - w.(http.Flusher).Flush() - } -} - -func writeSuccessResponseXML(w http.ResponseWriter, response []byte) { - writeResponse(w, http.StatusOK, response, mimeXML) +func writeSuccessResponseXML(w http.ResponseWriter, response interface{}) { + s3err.WriteXMLResponse(w, http.StatusOK, response) } func writeSuccessResponseEmpty(w http.ResponseWriter) { - writeResponse(w, http.StatusOK, nil, mimeNone) + s3err.WriteEmptyResponse(w, http.StatusOK) } func validateContentMd5(h http.Header) ([]byte, error) { diff --git a/weed/s3api/s3api_object_copy_handlers.go b/weed/s3api/s3api_object_copy_handlers.go index b393fdb1f..799483a18 100644 --- a/weed/s3api/s3api_object_copy_handlers.go +++ b/weed/s3api/s3api_object_copy_handlers.go @@ -32,28 +32,28 @@ func (s3a *S3ApiServer) CopyObjectHandler(w http.ResponseWriter, r *http.Request dir, name := fullPath.DirAndName() entry, err := s3a.getEntry(dir, name) if err != nil { - writeErrorResponse(w, s3err.ErrInvalidCopySource, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidCopySource, r) } entry.Extended = weed_server.SaveAmzMetaData(r, entry.Extended, isReplace(r)) err = s3a.touch(dir, name, entry) if err != nil { - writeErrorResponse(w, s3err.ErrInvalidCopySource, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidCopySource, r) } - writeSuccessResponseXML(w, encodeResponse(CopyObjectResult{ + writeSuccessResponseXML(w, CopyObjectResult{ ETag: fmt.Sprintf("%x", entry.Attributes.Md5), LastModified: time.Now().UTC(), - })) + }) return } // If source object is empty or bucket is empty, reply back invalid copy source. if srcObject == "" || srcBucket == "" { - writeErrorResponse(w, s3err.ErrInvalidCopySource, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidCopySource, r) return } if srcBucket == dstBucket && srcObject == dstObject { - writeErrorResponse(w, s3err.ErrInvalidCopyDest, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidCopyDest, r) return } @@ -64,7 +64,7 @@ func (s3a *S3ApiServer) CopyObjectHandler(w http.ResponseWriter, r *http.Request _, _, resp, err := util.DownloadFile(srcUrl) if err != nil { - writeErrorResponse(w, s3err.ErrInvalidCopySource, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidCopySource, r) return } defer util.CloseResponse(resp) @@ -73,7 +73,7 @@ func (s3a *S3ApiServer) CopyObjectHandler(w http.ResponseWriter, r *http.Request etag, errCode := s3a.putToFiler(r, dstUrl, resp.Body) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r) + s3err.WriteErrorResponse(w, errCode, r) return } @@ -84,7 +84,7 @@ func (s3a *S3ApiServer) CopyObjectHandler(w http.ResponseWriter, r *http.Request LastModified: time.Now().UTC(), } - writeSuccessResponseXML(w, encodeResponse(response)) + writeSuccessResponseXML(w, response) } @@ -117,7 +117,7 @@ func (s3a *S3ApiServer) CopyObjectPartHandler(w http.ResponseWriter, r *http.Req srcBucket, srcObject := pathToBucketAndObject(cpSrcPath) // If source object is empty or bucket is empty, reply back invalid copy source. if srcObject == "" || srcBucket == "" { - writeErrorResponse(w, s3err.ErrInvalidCopySource, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidCopySource, r) return } @@ -126,13 +126,13 @@ func (s3a *S3ApiServer) CopyObjectPartHandler(w http.ResponseWriter, r *http.Req partID, err := strconv.Atoi(partIDString) if err != nil { - writeErrorResponse(w, s3err.ErrInvalidPart, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidPart, r) return } // check partID with maximum part ID for multipart objects if partID > globalMaxPartID { - writeErrorResponse(w, s3err.ErrInvalidMaxParts, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidMaxParts, r) return } @@ -145,7 +145,7 @@ func (s3a *S3ApiServer) CopyObjectPartHandler(w http.ResponseWriter, r *http.Req dataReader, err := util.ReadUrlAsReaderCloser(srcUrl, rangeHeader) if err != nil { - writeErrorResponse(w, s3err.ErrInvalidCopySource, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidCopySource, r) return } defer dataReader.Close() @@ -154,7 +154,7 @@ func (s3a *S3ApiServer) CopyObjectPartHandler(w http.ResponseWriter, r *http.Req etag, errCode := s3a.putToFiler(r, dstUrl, dataReader) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r) + s3err.WriteErrorResponse(w, errCode, r) return } @@ -165,7 +165,7 @@ func (s3a *S3ApiServer) CopyObjectPartHandler(w http.ResponseWriter, r *http.Req LastModified: time.Now().UTC(), } - writeSuccessResponseXML(w, encodeResponse(response)) + writeSuccessResponseXML(w, response) } diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index ce4594e67..845c9a577 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -44,20 +44,20 @@ func (s3a *S3ApiServer) PutObjectHandler(w http.ResponseWriter, r *http.Request) _, err := validateContentMd5(r.Header) if err != nil { - writeErrorResponse(w, s3err.ErrInvalidDigest, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidDigest, r) return } if r.Header.Get("Cache-Control") != "" { if _, err = cacheobject.ParseRequestCacheControl(r.Header.Get("Cache-Control")); err != nil { - writeErrorResponse(w, s3err.ErrInvalidDigest, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidDigest, r) return } } if r.Header.Get("Expires") != "" { if _, err = time.Parse(http.TimeFormat, r.Header.Get("Expires")); err != nil { - writeErrorResponse(w, s3err.ErrInvalidDigest, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidDigest, r) return } } @@ -75,12 +75,12 @@ func (s3a *S3ApiServer) PutObjectHandler(w http.ResponseWriter, r *http.Request) _, s3ErrCode = s3a.iam.reqSignatureV4Verify(r) } if s3ErrCode != s3err.ErrNone { - writeErrorResponse(w, s3ErrCode, r) + s3err.WriteErrorResponse(w, s3ErrCode, r) return } } else { if authTypeStreamingSigned == rAuthType { - writeErrorResponse(w, s3err.ErrAuthNotSetup, r) + s3err.WriteErrorResponse(w, s3err.ErrAuthNotSetup, r) return } } @@ -88,7 +88,7 @@ func (s3a *S3ApiServer) PutObjectHandler(w http.ResponseWriter, r *http.Request) if strings.HasSuffix(object, "/") { if err := s3a.mkdir(s3a.option.BucketsPath, bucket+object, nil); err != nil { - writeErrorResponse(w, s3err.ErrInternalError, r) + s3err.WriteErrorResponse(w, s3err.ErrInternalError, r) return } } else { @@ -97,7 +97,7 @@ func (s3a *S3ApiServer) PutObjectHandler(w http.ResponseWriter, r *http.Request) etag, errCode := s3a.putToFiler(r, uploadUrl, dataReader) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r) + s3err.WriteErrorResponse(w, errCode, r) return } @@ -120,7 +120,7 @@ func (s3a *S3ApiServer) GetObjectHandler(w http.ResponseWriter, r *http.Request) bucket, object := getBucketAndObject(r) if strings.HasSuffix(r.URL.Path, "/") { - writeErrorResponse(w, s3err.ErrNotImplemented, r) + s3err.WriteErrorResponse(w, s3err.ErrNotImplemented, r) return } @@ -195,13 +195,13 @@ func (s3a *S3ApiServer) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *h deleteXMLBytes, err := ioutil.ReadAll(r.Body) if err != nil { - writeErrorResponse(w, s3err.ErrInternalError, r) + s3err.WriteErrorResponse(w, s3err.ErrInternalError, r) return } deleteObjects := &DeleteObjectsRequest{} if err := xml.Unmarshal(deleteXMLBytes, deleteObjects); err != nil { - writeErrorResponse(w, s3err.ErrMalformedXML, r) + s3err.WriteErrorResponse(w, s3err.ErrMalformedXML, r) return } @@ -253,7 +253,7 @@ func (s3a *S3ApiServer) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *h } deleteResp.Errors = deleteErrors - writeSuccessResponseXML(w, encodeResponse(deleteResp)) + writeSuccessResponseXML(w, deleteResp) } @@ -297,7 +297,7 @@ func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, des if err != nil { glog.Errorf("NewRequest %s: %v", destUrl, err) - writeErrorResponse(w, s3err.ErrInternalError, r) + s3err.WriteErrorResponse(w, s3err.ErrInternalError, r) return } @@ -327,19 +327,19 @@ func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, des if postErr != nil { glog.Errorf("post to filer: %v", postErr) - writeErrorResponse(w, s3err.ErrInternalError, r) + s3err.WriteErrorResponse(w, s3err.ErrInternalError, r) return } defer util.CloseResponse(resp) if resp.StatusCode == http.StatusPreconditionFailed { - writeErrorResponse(w, s3err.ErrPreconditionFailed, r) + s3err.WriteErrorResponse(w, s3err.ErrPreconditionFailed, r) return } if (resp.ContentLength == -1 || resp.StatusCode == 404) && resp.StatusCode != 304 { if r.Method != "DELETE" { - writeErrorResponse(w, s3err.ErrNoSuchKey, r) + s3err.WriteErrorResponse(w, s3err.ErrNoSuchKey, r) return } } diff --git a/weed/s3api/s3api_object_handlers_postpolicy.go b/weed/s3api/s3api_object_handlers_postpolicy.go index 3a979413a..e1125689f 100644 --- a/weed/s3api/s3api_object_handlers_postpolicy.go +++ b/weed/s3api/s3api_object_handlers_postpolicy.go @@ -26,23 +26,23 @@ func (s3a *S3ApiServer) PostPolicyBucketHandler(w http.ResponseWriter, r *http.R reader, err := r.MultipartReader() if err != nil { - writeErrorResponse(w, s3err.ErrMalformedPOSTRequest, r) + s3err.WriteErrorResponse(w, s3err.ErrMalformedPOSTRequest, r) return } form, err := reader.ReadForm(int64(5 * humanize.MiByte)) if err != nil { - writeErrorResponse(w, s3err.ErrMalformedPOSTRequest, r) + s3err.WriteErrorResponse(w, s3err.ErrMalformedPOSTRequest, r) return } defer form.RemoveAll() fileBody, fileName, fileSize, formValues, err := extractPostPolicyFormValues(form) if err != nil { - writeErrorResponse(w, s3err.ErrMalformedPOSTRequest, r) + s3err.WriteErrorResponse(w, s3err.ErrMalformedPOSTRequest, r) return } if fileBody == nil { - writeErrorResponse(w, s3err.ErrPOSTFileRequired, r) + s3err.WriteErrorResponse(w, s3err.ErrPOSTFileRequired, r) return } defer fileBody.Close() @@ -60,7 +60,7 @@ func (s3a *S3ApiServer) PostPolicyBucketHandler(w http.ResponseWriter, r *http.R if successRedirect != "" { redirectURL, err = url.Parse(successRedirect) if err != nil { - writeErrorResponse(w, s3err.ErrMalformedPOSTRequest, r) + s3err.WriteErrorResponse(w, s3err.ErrMalformedPOSTRequest, r) return } } @@ -68,13 +68,13 @@ func (s3a *S3ApiServer) PostPolicyBucketHandler(w http.ResponseWriter, r *http.R // Verify policy signature. errCode := s3a.iam.doesPolicySignatureMatch(formValues) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r) + s3err.WriteErrorResponse(w, errCode, r) return } policyBytes, err := base64.StdEncoding.DecodeString(formValues.Get("Policy")) if err != nil { - writeErrorResponse(w, s3err.ErrMalformedPOSTRequest, r) + s3err.WriteErrorResponse(w, s3err.ErrMalformedPOSTRequest, r) return } @@ -83,7 +83,7 @@ func (s3a *S3ApiServer) PostPolicyBucketHandler(w http.ResponseWriter, r *http.R postPolicyForm, err := policy.ParsePostPolicyForm(string(policyBytes)) if err != nil { - writeErrorResponse(w, s3err.ErrPostPolicyConditionInvalidFormat, r) + s3err.WriteErrorResponse(w, s3err.ErrPostPolicyConditionInvalidFormat, r) return } @@ -99,12 +99,12 @@ func (s3a *S3ApiServer) PostPolicyBucketHandler(w http.ResponseWriter, r *http.R lengthRange := postPolicyForm.Conditions.ContentLengthRange if lengthRange.Valid { if fileSize < lengthRange.Min { - writeErrorResponse(w, s3err.ErrEntityTooSmall, r) + s3err.WriteErrorResponse(w, s3err.ErrEntityTooSmall, r) return } if fileSize > lengthRange.Max { - writeErrorResponse(w, s3err.ErrEntityTooLarge, r) + s3err.WriteErrorResponse(w, s3err.ErrEntityTooLarge, r) return } } @@ -115,7 +115,7 @@ func (s3a *S3ApiServer) PostPolicyBucketHandler(w http.ResponseWriter, r *http.R etag, errCode := s3a.putToFiler(r, uploadUrl, fileBody) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r) + s3err.WriteErrorResponse(w, errCode, r) return } @@ -123,7 +123,7 @@ func (s3a *S3ApiServer) PostPolicyBucketHandler(w http.ResponseWriter, r *http.R // Replace raw query params.. redirectURL.RawQuery = getRedirectPostRawQuery(bucket, object, etag) w.Header().Set("Location", redirectURL.String()) - writeResponse(w, http.StatusSeeOther, nil, mimeNone) + s3err.WriteEmptyResponse(w, http.StatusSeeOther) return } @@ -132,15 +132,15 @@ func (s3a *S3ApiServer) PostPolicyBucketHandler(w http.ResponseWriter, r *http.R // Decide what http response to send depending on success_action_status parameter switch successStatus { case "201": - resp := encodeResponse(PostResponse{ + resp := PostResponse{ Bucket: bucket, Key: object, ETag: `"` + etag + `"`, Location: w.Header().Get("Location"), - }) - writeResponse(w, http.StatusCreated, resp, mimeXML) + } + s3err.WriteXMLResponse(w, http.StatusCreated, resp) case "200": - writeResponse(w, http.StatusOK, nil, mimeNone) + s3err.WriteEmptyResponse(w, http.StatusOK) default: writeSuccessResponseEmpty(w) } diff --git a/weed/s3api/s3api_object_multipart_handlers.go b/weed/s3api/s3api_object_multipart_handlers.go index 9020ef507..de3faaaaa 100644 --- a/weed/s3api/s3api_object_multipart_handlers.go +++ b/weed/s3api/s3api_object_multipart_handlers.go @@ -29,14 +29,14 @@ func (s3a *S3ApiServer) NewMultipartUploadHandler(w http.ResponseWriter, r *http Key: objectKey(aws.String(object)), }) - glog.V(2).Info("NewMultipartUploadHandler", string(encodeResponse(response)), errCode) + glog.V(2).Info("NewMultipartUploadHandler", s3err.EncodeXMLResponse(response), errCode) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r) + s3err.WriteErrorResponse(w, errCode, r) return } - writeSuccessResponseXML(w, encodeResponse(response)) + writeSuccessResponseXML(w, response) } @@ -53,14 +53,14 @@ func (s3a *S3ApiServer) CompleteMultipartUploadHandler(w http.ResponseWriter, r UploadId: aws.String(uploadID), }) - glog.V(2).Info("CompleteMultipartUploadHandler", string(encodeResponse(response)), errCode) + glog.V(2).Info("CompleteMultipartUploadHandler", s3err.EncodeXMLResponse(response), errCode) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r) + s3err.WriteErrorResponse(w, errCode, r) return } - writeSuccessResponseXML(w, encodeResponse(response)) + writeSuccessResponseXML(w, response) } @@ -78,13 +78,13 @@ func (s3a *S3ApiServer) AbortMultipartUploadHandler(w http.ResponseWriter, r *ht }) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r) + s3err.WriteErrorResponse(w, errCode, r) return } - glog.V(2).Info("AbortMultipartUploadHandler", string(encodeResponse(response))) + glog.V(2).Info("AbortMultipartUploadHandler", s3err.EncodeXMLResponse(response)) - writeSuccessResponseXML(w, encodeResponse(response)) + writeSuccessResponseXML(w, response) } @@ -94,13 +94,13 @@ func (s3a *S3ApiServer) ListMultipartUploadsHandler(w http.ResponseWriter, r *ht prefix, keyMarker, uploadIDMarker, delimiter, maxUploads, encodingType := getBucketMultipartResources(r.URL.Query()) if maxUploads < 0 { - writeErrorResponse(w, s3err.ErrInvalidMaxUploads, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidMaxUploads, r) return } if keyMarker != "" { // Marker not common with prefix is not implemented. if !strings.HasPrefix(keyMarker, prefix) { - writeErrorResponse(w, s3err.ErrNotImplemented, r) + s3err.WriteErrorResponse(w, s3err.ErrNotImplemented, r) return } } @@ -115,16 +115,16 @@ func (s3a *S3ApiServer) ListMultipartUploadsHandler(w http.ResponseWriter, r *ht UploadIdMarker: aws.String(uploadIDMarker), }) - glog.V(2).Info("ListMultipartUploadsHandler", string(encodeResponse(response)), errCode) + glog.V(2).Info("ListMultipartUploadsHandler", s3err.EncodeXMLResponse(response), errCode) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r) + s3err.WriteErrorResponse(w, errCode, r) return } // TODO handle encodingType - writeSuccessResponseXML(w, encodeResponse(response)) + writeSuccessResponseXML(w, response) } // ListObjectPartsHandler - Lists object parts in a multipart upload. @@ -133,11 +133,11 @@ func (s3a *S3ApiServer) ListObjectPartsHandler(w http.ResponseWriter, r *http.Re uploadID, partNumberMarker, maxParts, _ := getObjectResources(r.URL.Query()) if partNumberMarker < 0 { - writeErrorResponse(w, s3err.ErrInvalidPartNumberMarker, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidPartNumberMarker, r) return } if maxParts < 0 { - writeErrorResponse(w, s3err.ErrInvalidMaxParts, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidMaxParts, r) return } @@ -149,14 +149,14 @@ func (s3a *S3ApiServer) ListObjectPartsHandler(w http.ResponseWriter, r *http.Re UploadId: aws.String(uploadID), }) - glog.V(2).Info("ListObjectPartsHandler", string(encodeResponse(response)), errCode) + glog.V(2).Info("ListObjectPartsHandler", s3err.EncodeXMLResponse(response), errCode) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r) + s3err.WriteErrorResponse(w, errCode, r) return } - writeSuccessResponseXML(w, encodeResponse(response)) + writeSuccessResponseXML(w, response) } @@ -167,18 +167,18 @@ func (s3a *S3ApiServer) PutObjectPartHandler(w http.ResponseWriter, r *http.Requ uploadID := r.URL.Query().Get("uploadId") exists, err := s3a.exists(s3a.genUploadsFolder(bucket), uploadID, true) if !exists { - writeErrorResponse(w, s3err.ErrNoSuchUpload, r) + s3err.WriteErrorResponse(w, s3err.ErrNoSuchUpload, r) return } partIDString := r.URL.Query().Get("partNumber") partID, err := strconv.Atoi(partIDString) if err != nil { - writeErrorResponse(w, s3err.ErrInvalidPart, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidPart, r) return } if partID > globalMaxPartID { - writeErrorResponse(w, s3err.ErrInvalidMaxParts, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidMaxParts, r) return } @@ -195,7 +195,7 @@ func (s3a *S3ApiServer) PutObjectPartHandler(w http.ResponseWriter, r *http.Requ _, s3ErrCode = s3a.iam.reqSignatureV4Verify(r) } if s3ErrCode != s3err.ErrNone { - writeErrorResponse(w, s3ErrCode, r) + s3err.WriteErrorResponse(w, s3ErrCode, r) return } } @@ -207,7 +207,7 @@ func (s3a *S3ApiServer) PutObjectPartHandler(w http.ResponseWriter, r *http.Requ etag, errCode := s3a.putToFiler(r, uploadUrl, dataReader) if errCode != s3err.ErrNone { - writeErrorResponse(w, errCode, r) + s3err.WriteErrorResponse(w, errCode, r) return } diff --git a/weed/s3api/s3api_object_tagging_handlers.go b/weed/s3api/s3api_object_tagging_handlers.go index d4cc9854c..fd3ec2ff7 100644 --- a/weed/s3api/s3api_object_tagging_handlers.go +++ b/weed/s3api/s3api_object_tagging_handlers.go @@ -25,15 +25,15 @@ func (s3a *S3ApiServer) GetObjectTaggingHandler(w http.ResponseWriter, r *http.R if err != nil { if err == filer_pb.ErrNotFound { glog.Errorf("GetObjectTaggingHandler %s: %v", r.URL, err) - writeErrorResponse(w, s3err.ErrNoSuchKey, r) + s3err.WriteErrorResponse(w, s3err.ErrNoSuchKey, r) } else { glog.Errorf("GetObjectTaggingHandler %s: %v", r.URL, err) - writeErrorResponse(w, s3err.ErrInternalError, r) + s3err.WriteErrorResponse(w, s3err.ErrInternalError, r) } return } - writeSuccessResponseXML(w, encodeResponse(FromTags(tags))) + writeSuccessResponseXML(w, FromTags(tags)) } @@ -50,29 +50,29 @@ func (s3a *S3ApiServer) PutObjectTaggingHandler(w http.ResponseWriter, r *http.R input, err := ioutil.ReadAll(io.LimitReader(r.Body, r.ContentLength)) if err != nil { glog.Errorf("PutObjectTaggingHandler read input %s: %v", r.URL, err) - writeErrorResponse(w, s3err.ErrInternalError, r) + s3err.WriteErrorResponse(w, s3err.ErrInternalError, r) return } if err = xml.Unmarshal(input, tagging); err != nil { glog.Errorf("PutObjectTaggingHandler Unmarshal %s: %v", r.URL, err) - writeErrorResponse(w, s3err.ErrMalformedXML, r) + s3err.WriteErrorResponse(w, s3err.ErrMalformedXML, r) return } tags := tagging.ToTags() if len(tags) > 10 { glog.Errorf("PutObjectTaggingHandler tags %s: %d tags more than 10", r.URL, len(tags)) - writeErrorResponse(w, s3err.ErrInvalidTag, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidTag, r) return } for k, v := range tags { if len(k) > 128 { glog.Errorf("PutObjectTaggingHandler tags %s: tag key %s longer than 128", r.URL, k) - writeErrorResponse(w, s3err.ErrInvalidTag, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidTag, r) return } if len(v) > 256 { glog.Errorf("PutObjectTaggingHandler tags %s: tag value %s longer than 256", r.URL, v) - writeErrorResponse(w, s3err.ErrInvalidTag, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidTag, r) return } } @@ -80,10 +80,10 @@ func (s3a *S3ApiServer) PutObjectTaggingHandler(w http.ResponseWriter, r *http.R if err = s3a.setTags(dir, name, tagging.ToTags()); err != nil { if err == filer_pb.ErrNotFound { glog.Errorf("PutObjectTaggingHandler setTags %s: %v", r.URL, err) - writeErrorResponse(w, s3err.ErrNoSuchKey, r) + s3err.WriteErrorResponse(w, s3err.ErrNoSuchKey, r) } else { glog.Errorf("PutObjectTaggingHandler setTags %s: %v", r.URL, err) - writeErrorResponse(w, s3err.ErrInternalError, r) + s3err.WriteErrorResponse(w, s3err.ErrInternalError, r) } return } @@ -105,10 +105,10 @@ func (s3a *S3ApiServer) DeleteObjectTaggingHandler(w http.ResponseWriter, r *htt if err != nil { if err == filer_pb.ErrNotFound { glog.Errorf("DeleteObjectTaggingHandler %s: %v", r.URL, err) - writeErrorResponse(w, s3err.ErrNoSuchKey, r) + s3err.WriteErrorResponse(w, s3err.ErrNoSuchKey, r) } else { glog.Errorf("DeleteObjectTaggingHandler %s: %v", r.URL, err) - writeErrorResponse(w, s3err.ErrInternalError, r) + s3err.WriteErrorResponse(w, s3err.ErrInternalError, r) } return } diff --git a/weed/s3api/s3api_objects_list_handlers.go b/weed/s3api/s3api_objects_list_handlers.go index ab92ced43..51a58af6a 100644 --- a/weed/s3api/s3api_objects_list_handlers.go +++ b/weed/s3api/s3api_objects_list_handlers.go @@ -44,11 +44,11 @@ func (s3a *S3ApiServer) ListObjectsV2Handler(w http.ResponseWriter, r *http.Requ originalPrefix, continuationToken, startAfter, delimiter, _, maxKeys := getListObjectsV2Args(r.URL.Query()) if maxKeys < 0 { - writeErrorResponse(w, s3err.ErrInvalidMaxKeys, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidMaxKeys, r) return } if delimiter != "" && delimiter != "/" { - writeErrorResponse(w, s3err.ErrNotImplemented, r) + s3err.WriteErrorResponse(w, s3err.ErrNotImplemented, r) return } @@ -60,13 +60,13 @@ func (s3a *S3ApiServer) ListObjectsV2Handler(w http.ResponseWriter, r *http.Requ response, err := s3a.listFilerEntries(bucket, originalPrefix, maxKeys, marker, delimiter) if err != nil { - writeErrorResponse(w, s3err.ErrInternalError, r) + s3err.WriteErrorResponse(w, s3err.ErrInternalError, r) return } if len(response.Contents) == 0 { if exists, existErr := s3a.exists(s3a.option.BucketsPath, bucket, true); existErr == nil && !exists { - writeErrorResponse(w, s3err.ErrNoSuchBucket, r) + s3err.WriteErrorResponse(w, s3err.ErrNoSuchBucket, r) return } } @@ -86,7 +86,7 @@ func (s3a *S3ApiServer) ListObjectsV2Handler(w http.ResponseWriter, r *http.Requ StartAfter: startAfter, } - writeSuccessResponseXML(w, encodeResponse(responseV2)) + writeSuccessResponseXML(w, responseV2) } func (s3a *S3ApiServer) ListObjectsV1Handler(w http.ResponseWriter, r *http.Request) { @@ -99,29 +99,29 @@ func (s3a *S3ApiServer) ListObjectsV1Handler(w http.ResponseWriter, r *http.Requ originalPrefix, marker, delimiter, maxKeys := getListObjectsV1Args(r.URL.Query()) if maxKeys < 0 { - writeErrorResponse(w, s3err.ErrInvalidMaxKeys, r) + s3err.WriteErrorResponse(w, s3err.ErrInvalidMaxKeys, r) return } if delimiter != "" && delimiter != "/" { - writeErrorResponse(w, s3err.ErrNotImplemented, r) + s3err.WriteErrorResponse(w, s3err.ErrNotImplemented, r) return } response, err := s3a.listFilerEntries(bucket, originalPrefix, maxKeys, marker, delimiter) if err != nil { - writeErrorResponse(w, s3err.ErrInternalError, r) + s3err.WriteErrorResponse(w, s3err.ErrInternalError, r) return } if len(response.Contents) == 0 { if exists, existErr := s3a.exists(s3a.option.BucketsPath, bucket, true); existErr == nil && !exists { - writeErrorResponse(w, s3err.ErrNoSuchBucket, r) + s3err.WriteErrorResponse(w, s3err.ErrNoSuchBucket, r) return } } - writeSuccessResponseXML(w, encodeResponse(response)) + writeSuccessResponseXML(w, response) } func (s3a *S3ApiServer) listFilerEntries(bucket string, originalPrefix string, maxKeys int, marker string, delimiter string) (response ListBucketResult, err error) { diff --git a/weed/s3api/s3api_objects_list_handlers_test.go b/weed/s3api/s3api_objects_list_handlers_test.go index 7b87b32fb..641f995b7 100644 --- a/weed/s3api/s3api_objects_list_handlers_test.go +++ b/weed/s3api/s3api_objects_list_handlers_test.go @@ -1,6 +1,7 @@ package s3api import ( + "github.com/chrislusf/seaweedfs/weed/s3api/s3err" "testing" "time" ) @@ -31,7 +32,7 @@ func TestListObjectsHandler(t *testing.T) { }}, } - encoded := string(encodeResponse(response)) + encoded := string(s3err.EncodeXMLResponse(response)) if encoded != expected { t.Errorf("unexpected output: %s\nexpecting:%s", encoded, expected) } diff --git a/weed/s3api/s3api_server.go b/weed/s3api/s3api_server.go index 54df29492..57f4ba917 100644 --- a/weed/s3api/s3api_server.go +++ b/weed/s3api/s3api_server.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/chrislusf/seaweedfs/weed/filer" . "github.com/chrislusf/seaweedfs/weed/s3api/s3_constants" + "github.com/chrislusf/seaweedfs/weed/s3api/s3err" "net/http" "strings" "time" @@ -132,6 +133,6 @@ func (s3a *S3ApiServer) registerRouter(router *mux.Router) { apiRouter.Methods("GET").Path("/").HandlerFunc(track(s3a.ListBucketsHandler, "LIST")) // NotFound - apiRouter.NotFoundHandler = http.HandlerFunc(notFoundHandler) + apiRouter.NotFoundHandler = http.HandlerFunc(s3err.NotFoundHandler) } diff --git a/weed/s3api/s3api_test.go b/weed/s3api/s3api_test.go index 026766beb..6fcf8b165 100644 --- a/weed/s3api/s3api_test.go +++ b/weed/s3api/s3api_test.go @@ -1,6 +1,7 @@ package s3api import ( + "github.com/chrislusf/seaweedfs/weed/s3api/s3err" "testing" "time" ) @@ -14,7 +15,7 @@ func TestCopyObjectResponse(t *testing.T) { LastModified: time.Now(), } - println(string(encodeResponse(response))) + println(string(s3err.EncodeXMLResponse(response))) } @@ -27,6 +28,6 @@ func TestCopyPartResponse(t *testing.T) { LastModified: time.Now(), } - println(string(encodeResponse(response))) + println(string(s3err.EncodeXMLResponse(response))) } diff --git a/weed/s3api/s3err/error_handler.go b/weed/s3api/s3err/error_handler.go new file mode 100644 index 000000000..f176d4b6c --- /dev/null +++ b/weed/s3api/s3err/error_handler.go @@ -0,0 +1,81 @@ +package s3err + +import ( + "bytes" + "encoding/xml" + "fmt" + "github.com/chrislusf/seaweedfs/weed/glog" + "net/http" + "strconv" + "time" +) + +type mimeType string + +const ( + mimeNone mimeType = "" + MimeXML mimeType = "application/xml" +) + +func WriteXMLResponse(w http.ResponseWriter, statusCode int, response interface{}) { + WriteResponse(w, statusCode, EncodeXMLResponse(response), MimeXML) +} + +func WriteEmptyResponse(w http.ResponseWriter, statusCode int) { + WriteResponse(w, statusCode, []byte{}, mimeNone) +} + +func WriteErrorResponse(w http.ResponseWriter, errorCode ErrorCode, r *http.Request) { + apiError := GetAPIError(errorCode) + errorResponse := getRESTErrorResponse(apiError, r.URL.Path) + encodedErrorResponse := EncodeXMLResponse(errorResponse) + WriteResponse(w, apiError.HTTPStatusCode, encodedErrorResponse, MimeXML) +} + +func getRESTErrorResponse(err APIError, resource string) RESTErrorResponse { + return RESTErrorResponse{ + Code: err.Code, + Message: err.Description, + Resource: resource, + RequestID: fmt.Sprintf("%d", time.Now().UnixNano()), + } +} + +// Encodes the response headers into XML format. +func EncodeXMLResponse(response interface{}) []byte { + var bytesBuffer bytes.Buffer + bytesBuffer.WriteString(xml.Header) + e := xml.NewEncoder(&bytesBuffer) + e.Encode(response) + return bytesBuffer.Bytes() +} + +func setCommonHeaders(w http.ResponseWriter) { + w.Header().Set("x-amz-request-id", fmt.Sprintf("%d", time.Now().UnixNano())) + w.Header().Set("Accept-Ranges", "bytes") +} + +func WriteResponse(w http.ResponseWriter, statusCode int, response []byte, mType mimeType) { + setCommonHeaders(w) + if response != nil { + w.Header().Set("Content-Length", strconv.Itoa(len(response))) + } + if mType != mimeNone { + w.Header().Set("Content-Type", string(mType)) + } + w.WriteHeader(statusCode) + if response != nil { + glog.V(4).Infof("status %d %s: %s", statusCode, mType, string(response)) + _, err := w.Write(response) + if err != nil { + glog.V(0).Infof("write err: %v", err) + } + w.(http.Flusher).Flush() + } +} + +// If none of the http routes match respond with MethodNotAllowed +func NotFoundHandler(w http.ResponseWriter, r *http.Request) { + glog.V(0).Infof("unsupported %s %s", r.Method, r.RequestURI) + WriteErrorResponse(w, ErrMethodNotAllowed, r) +} diff --git a/weed/s3api/tags_test.go b/weed/s3api/tags_test.go index 887843d6f..52adb36c1 100644 --- a/weed/s3api/tags_test.go +++ b/weed/s3api/tags_test.go @@ -2,6 +2,7 @@ package s3api import ( "encoding/xml" + "github.com/chrislusf/seaweedfs/weed/s3api/s3err" "github.com/stretchr/testify/assert" "testing" ) @@ -41,7 +42,7 @@ func TestXMLMarshall(t *testing.T) { }, } - actual := string(encodeResponse(tags)) + actual := string(s3err.EncodeXMLResponse(tags)) expected := ` key1value1` From 310e31424e37c16dd73d911e79f31159d1b367a3 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 10 Jun 2021 21:55:13 -0700 Subject: [PATCH 018/265] adjust the error output fix https://github.com/chrislusf/seaweedfs/issues/2123 --- weed/s3api/s3err/error_handler.go | 23 +++++++++++++++++------ weed/s3api/s3err/s3api_errors.go | 12 +++++++----- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/weed/s3api/s3err/error_handler.go b/weed/s3api/s3err/error_handler.go index f176d4b6c..09b83065f 100644 --- a/weed/s3api/s3err/error_handler.go +++ b/weed/s3api/s3err/error_handler.go @@ -5,8 +5,10 @@ import ( "encoding/xml" "fmt" "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/gorilla/mux" "net/http" "strconv" + "strings" "time" ) @@ -26,18 +28,27 @@ func WriteEmptyResponse(w http.ResponseWriter, statusCode int) { } func WriteErrorResponse(w http.ResponseWriter, errorCode ErrorCode, r *http.Request) { + vars := mux.Vars(r) + bucket := vars["bucket"] + object := vars["object"] + if !strings.HasPrefix(object, "/") { + object = "/" + object + } + apiError := GetAPIError(errorCode) - errorResponse := getRESTErrorResponse(apiError, r.URL.Path) + errorResponse := getRESTErrorResponse(apiError, r.URL.Path, bucket, object) encodedErrorResponse := EncodeXMLResponse(errorResponse) WriteResponse(w, apiError.HTTPStatusCode, encodedErrorResponse, MimeXML) } -func getRESTErrorResponse(err APIError, resource string) RESTErrorResponse { +func getRESTErrorResponse(err APIError, resource string, bucket, object string) RESTErrorResponse { return RESTErrorResponse{ - Code: err.Code, - Message: err.Description, - Resource: resource, - RequestID: fmt.Sprintf("%d", time.Now().UnixNano()), + Code: err.Code, + BucketName: bucket, + Key: object[1:], + Message: err.Description, + Resource: resource, + RequestID: fmt.Sprintf("%d", time.Now().UnixNano()), } } diff --git a/weed/s3api/s3err/s3api_errors.go b/weed/s3api/s3err/s3api_errors.go index 7f0ffdf86..a46bd0f04 100644 --- a/weed/s3api/s3err/s3api_errors.go +++ b/weed/s3api/s3err/s3api_errors.go @@ -15,11 +15,13 @@ type APIError struct { // RESTErrorResponse - error response format type RESTErrorResponse struct { - XMLName xml.Name `xml:"Error" json:"-"` - Code string `xml:"Code" json:"Code"` - Message string `xml:"Message" json:"Message"` - Resource string `xml:"Resource" json:"Resource"` - RequestID string `xml:"RequestId" json:"RequestId"` + XMLName xml.Name `xml:"Error" json:"-"` + Code string `xml:"Code" json:"Code"` + Message string `xml:"Message" json:"Message"` + Resource string `xml:"Resource" json:"Resource"` + RequestID string `xml:"RequestId" json:"RequestId"` + Key string `xml:"Key,omitempty" json:"Key,omitempty"` + BucketName string `xml:"BucketName,omitempty" json:"BucketName,omitempty"` // Underlying HTTP status code for the returned error StatusCode int `xml:"-" json:"-"` From b71c3cfba48452170919c9e321ba44be9d4443d1 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 10 Jun 2021 22:17:53 -0700 Subject: [PATCH 019/265] avoid possible empty object --- weed/s3api/s3err/error_handler.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/weed/s3api/s3err/error_handler.go b/weed/s3api/s3err/error_handler.go index 09b83065f..c1065fffc 100644 --- a/weed/s3api/s3err/error_handler.go +++ b/weed/s3api/s3err/error_handler.go @@ -31,8 +31,8 @@ func WriteErrorResponse(w http.ResponseWriter, errorCode ErrorCode, r *http.Requ vars := mux.Vars(r) bucket := vars["bucket"] object := vars["object"] - if !strings.HasPrefix(object, "/") { - object = "/" + object + if strings.HasPrefix(object, "/") { + object = object[1:] } apiError := GetAPIError(errorCode) @@ -45,7 +45,7 @@ func getRESTErrorResponse(err APIError, resource string, bucket, object string) return RESTErrorResponse{ Code: err.Code, BucketName: bucket, - Key: object[1:], + Key: object, Message: err.Description, Resource: resource, RequestID: fmt.Sprintf("%d", time.Now().UnixNano()), From 9357911a9513dce09461b632b2ea2ba674555b9d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 10 Jun 2021 23:37:54 -0700 Subject: [PATCH 020/265] remove all bucket metadata fix https://github.com/chrislusf/seaweedfs/issues/2118 --- weed/filer/abstract_sql/abstract_sql_store.go | 3 +++ weed/filer/filer_delete_entry.go | 2 +- weed/filer/filerstore.go | 1 + weed/filer/filerstore_wrapper.go | 8 ++++++++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/weed/filer/abstract_sql/abstract_sql_store.go b/weed/filer/abstract_sql/abstract_sql_store.go index ab8f6bcbd..bb8ced81a 100644 --- a/weed/filer/abstract_sql/abstract_sql_store.go +++ b/weed/filer/abstract_sql/abstract_sql_store.go @@ -32,6 +32,9 @@ type AbstractSqlStore struct { dbsLock sync.Mutex } +func (store *AbstractSqlStore) CanDropWholeBucket() bool { + return store.SupportBucketTable +} func (store *AbstractSqlStore) OnBucketCreation(bucket string) { store.dbsLock.Lock() defer store.dbsLock.Unlock() diff --git a/weed/filer/filer_delete_entry.go b/weed/filer/filer_delete_entry.go index 3ef3cfff9..35187d034 100644 --- a/weed/filer/filer_delete_entry.go +++ b/weed/filer/filer_delete_entry.go @@ -71,7 +71,7 @@ func (f *Filer) doBatchDeleteFolderMetaAndData(ctx context.Context, entry *Entry lastFileName := "" includeLastFile := false - if !isDeletingBucket { + if !isDeletingBucket || !f.Store.CanDropWholeBucket() { for { entries, _, err := f.ListDirectoryEntries(ctx, entry.FullPath, lastFileName, includeLastFile, PaginationSize, "", "", "") if err != nil { diff --git a/weed/filer/filerstore.go b/weed/filer/filerstore.go index a5b2f25de..1ded11b4a 100644 --- a/weed/filer/filerstore.go +++ b/weed/filer/filerstore.go @@ -43,4 +43,5 @@ type FilerStore interface { type BucketAware interface { OnBucketCreation(bucket string) OnBucketDeletion(bucket string) + IsDropBucketAltogether() bool } diff --git a/weed/filer/filerstore_wrapper.go b/weed/filer/filerstore_wrapper.go index 5175a87a1..e4761f565 100644 --- a/weed/filer/filerstore_wrapper.go +++ b/weed/filer/filerstore_wrapper.go @@ -23,6 +23,7 @@ type VirtualFilerStore interface { AddPathSpecificStore(path string, storeId string, store FilerStore) OnBucketCreation(bucket string) OnBucketDeletion(bucket string) + CanDropWholeBucket() bool } type FilerStoreWrapper struct { @@ -42,6 +43,13 @@ func NewFilerStoreWrapper(store FilerStore) *FilerStoreWrapper { } } +func (fsw *FilerStoreWrapper) CanDropWholeBucket() bool { + if ba, ok := fsw.defaultStore.(BucketAware); ok { + return ba.IsDropBucketAltogether() + } + return false +} + func (fsw *FilerStoreWrapper) OnBucketCreation(bucket string) { for _, store := range fsw.storeIdToStore { if ba, ok := store.(BucketAware); ok { From ee6c67682c875ad884cbd53cf820275358b6ddc3 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 12 Jun 2021 02:52:41 -0700 Subject: [PATCH 021/265] minor --- weed/server/master_grpc_server.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/weed/server/master_grpc_server.go b/weed/server/master_grpc_server.go index 3e6d9bb9e..50c9dbfdf 100644 --- a/weed/server/master_grpc_server.go +++ b/weed/server/master_grpc_server.go @@ -205,8 +205,8 @@ func (ms *MasterServer) KeepConnected(stream master_pb.Seaweed_KeepConnectedServ _, err := stream.Recv() if err != nil { glog.V(2).Infof("- client %v: %v", clientName, err) - stopChan <- true - break + close(stopChan) + return } } }() From ed6aa13520873eb873be21529f1c4e1870bddad2 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 12 Jun 2021 18:36:25 -0700 Subject: [PATCH 022/265] minor --- weed/server/filer_grpc_server_rename.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/weed/server/filer_grpc_server_rename.go b/weed/server/filer_grpc_server_rename.go index eadb970d5..ba9f15370 100644 --- a/weed/server/filer_grpc_server_rename.go +++ b/weed/server/filer_grpc_server_rename.go @@ -115,8 +115,7 @@ func (fs *FilerServer) moveSelfEntry(ctx context.Context, oldParent util.FullPat Extended: entry.Extended, Content: entry.Content, } - createErr := fs.filer.CreateEntry(ctx, newEntry, false, false, nil) - if createErr != nil { + if createErr := fs.filer.CreateEntry(ctx, newEntry, false, false, nil); createErr != nil { return createErr } From 1e76fc994a44fab94d835970a4181943227fda30 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 13 Jun 2021 07:09:06 -0700 Subject: [PATCH 023/265] filer.copy: zero fileSize for directories --- weed/command/filer_copy.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/weed/command/filer_copy.go b/weed/command/filer_copy.go index a5d29c451..9d21c40ef 100644 --- a/weed/command/filer_copy.go +++ b/weed/command/filer_copy.go @@ -213,11 +213,15 @@ func genFileCopyTask(fileOrDir string, destPath string, fileCopyTaskChan chan Fi mode := fi.Mode() uid, gid := util.GetFileUidGid(fi) + fileSize := fi.Size() + if mode.IsDir() { + fileSize = 0 + } fileCopyTaskChan <- FileCopyTask{ sourceLocation: fileOrDir, destinationUrlPath: destPath, - fileSize: fi.Size(), + fileSize: fileSize, fileMode: fi.Mode(), uid: uid, gid: gid, From 28a4a1f8d68e2cc826d8ed4c9bd2d4f25e7c0b10 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 13 Jun 2021 07:31:56 -0700 Subject: [PATCH 024/265] fix for mysql2 postgres2 on fast dropping buckets --- weed/filer/filerstore.go | 2 +- weed/filer/filerstore_wrapper.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/weed/filer/filerstore.go b/weed/filer/filerstore.go index 1ded11b4a..38927d6fb 100644 --- a/weed/filer/filerstore.go +++ b/weed/filer/filerstore.go @@ -43,5 +43,5 @@ type FilerStore interface { type BucketAware interface { OnBucketCreation(bucket string) OnBucketDeletion(bucket string) - IsDropBucketAltogether() bool + CanDropWholeBucket() bool } diff --git a/weed/filer/filerstore_wrapper.go b/weed/filer/filerstore_wrapper.go index e4761f565..2470f340c 100644 --- a/weed/filer/filerstore_wrapper.go +++ b/weed/filer/filerstore_wrapper.go @@ -45,7 +45,7 @@ func NewFilerStoreWrapper(store FilerStore) *FilerStoreWrapper { func (fsw *FilerStoreWrapper) CanDropWholeBucket() bool { if ba, ok := fsw.defaultStore.(BucketAware); ok { - return ba.IsDropBucketAltogether() + return ba.CanDropWholeBucket() } return false } From 7225cb4ac541ebd4a77338b5053b9dbd177a8ecd Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 13 Jun 2021 16:15:54 -0700 Subject: [PATCH 025/265] add block and mutex profiling --- weed/util/grace/pprof.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/weed/util/grace/pprof.go b/weed/util/grace/pprof.go index 14686bfc8..0406b762c 100644 --- a/weed/util/grace/pprof.go +++ b/weed/util/grace/pprof.go @@ -14,9 +14,30 @@ func SetupProfiling(cpuProfile, memProfile string) { if err != nil { glog.Fatal(err) } + runtime.SetBlockProfileRate(1) + runtime.SetMutexProfileFraction(1) pprof.StartCPUProfile(f) OnInterrupt(func() { pprof.StopCPUProfile() + + // write block pprof + blockF, err := os.Create(cpuProfile+".block") + if err != nil { + return + } + p := pprof.Lookup("block") + p.WriteTo(blockF,0) + blockF.Close() + + // write mutex pprof + mutexF, err := os.Create(cpuProfile+".mutex") + if err != nil { + return + } + p = pprof.Lookup("mutex") + p.WriteTo(mutexF,0) + mutexF.Close() + }) } if memProfile != "" { From 4d0cbd2700655e17f26817297fd3e9fa57e78876 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 13 Jun 2021 16:16:11 -0700 Subject: [PATCH 026/265] skip cookie checking if from grpc api --- weed/operation/delete_content.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/operation/delete_content.go b/weed/operation/delete_content.go index 8f87882b1..868cb5694 100644 --- a/weed/operation/delete_content.go +++ b/weed/operation/delete_content.go @@ -100,7 +100,7 @@ func DeleteFilesWithLookupVolumeId(grpcDialOption grpc.DialOption, fileIds []str go func(server string, fidList []string) { defer wg.Done() - if deleteResults, deleteErr := DeleteFilesAtOneVolumeServer(server, grpcDialOption, fidList, true); deleteErr != nil { + if deleteResults, deleteErr := DeleteFilesAtOneVolumeServer(server, grpcDialOption, fidList, false); deleteErr != nil { err = deleteErr } else if deleteResults != nil { resultChan <- deleteResults From 7a81caa31e4627e33c51aa1aae5971c76077cedb Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 13 Jun 2021 17:12:34 -0700 Subject: [PATCH 027/265] 2.53 --- k8s/seaweedfs/Chart.yaml | 4 ++-- k8s/seaweedfs/values.yaml | 2 +- weed/util/constants.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/k8s/seaweedfs/Chart.yaml b/k8s/seaweedfs/Chart.yaml index 851557e59..ef46c1bc4 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.52" -version: "2.52" +appVersion: "2.53" +version: "2.53" diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index 48d36f1e9..e89e8c0f2 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.52" - started using {.Chart.appVersion} + # imageTag: "2.53" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index aadc09741..3dfe702ed 100644 --- a/weed/util/constants.go +++ b/weed/util/constants.go @@ -5,7 +5,7 @@ import ( ) var ( - VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 52) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 53) COMMIT = "" ) From 6aa1a56ec87ca63f7a072eb6c9599e06fbb5ca9a Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Tue, 15 Jun 2021 18:12:39 +0500 Subject: [PATCH 028/265] avoid crashes Galera Cluster https://github.com/chrislusf/seaweedfs/issues/2125 --- weed/filer/abstract_sql/abstract_sql_store.go | 28 +++++++++++-------- weed/filer/cassandra/cassandra_store.go | 2 +- weed/filer/elastic/v7/elastic_store.go | 2 +- weed/filer/etcd/etcd_store.go | 2 +- weed/filer/filer.go | 1 + weed/filer/filer_delete_entry.go | 2 +- weed/filer/filerstore.go | 2 +- weed/filer/filerstore_translate_path.go | 4 +-- weed/filer/filerstore_wrapper.go | 4 +-- weed/filer/hbase/hbase_store.go | 2 +- weed/filer/leveldb/leveldb_store.go | 2 +- weed/filer/leveldb2/leveldb2_store.go | 2 +- weed/filer/leveldb3/leveldb3_store.go | 2 +- weed/filer/mongodb/mongodb_store.go | 2 +- weed/filer/mysql/mysql_sql_gen.go | 2 +- weed/filer/redis/universal_redis_store.go | 2 +- weed/filer/redis2/universal_redis_store.go | 2 +- weed/filer/rocksdb/rocksdb_store.go | 2 +- 18 files changed, 36 insertions(+), 29 deletions(-) diff --git a/weed/filer/abstract_sql/abstract_sql_store.go b/weed/filer/abstract_sql/abstract_sql_store.go index bb8ced81a..26dff7fe7 100644 --- a/weed/filer/abstract_sql/abstract_sql_store.go +++ b/weed/filer/abstract_sql/abstract_sql_store.go @@ -10,6 +10,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" "strings" "sync" + "time" ) type SqlGenerator interface { @@ -261,7 +262,7 @@ func (store *AbstractSqlStore) DeleteEntry(ctx context.Context, fullpath util.Fu return nil } -func (store *AbstractSqlStore) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath) error { +func (store *AbstractSqlStore) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath, limit int64) error { db, bucket, shortPath, err := store.getTxOrDB(ctx, fullpath, true) if err != nil { @@ -279,18 +280,23 @@ func (store *AbstractSqlStore) DeleteFolderChildren(ctx context.Context, fullpat } } - glog.V(4).Infof("delete %s SQL %s %d", string(shortPath), store.GetSqlDeleteFolderChildren(bucket), util.HashStringToLong(string(shortPath))) + for { + glog.V(4).Infof("delete %s SQL %s %d", string(shortPath), store.GetSqlDeleteFolderChildren(bucket), util.HashStringToLong(string(shortPath))) + res, err := db.ExecContext(ctx, store.GetSqlDeleteFolderChildren(bucket), util.HashStringToLong(string(shortPath)), string(shortPath), limit) + if err != nil { + return fmt.Errorf("deleteFolderChildren %s: %s", fullpath, err) + } - res, err := db.ExecContext(ctx, store.GetSqlDeleteFolderChildren(bucket), util.HashStringToLong(string(shortPath)), string(shortPath)) - if err != nil { - return fmt.Errorf("deleteFolderChildren %s: %s", fullpath, err) + rowCount, err := res.RowsAffected() + if err != nil { + return fmt.Errorf("deleteFolderChildren %s but no rows affected: %s", fullpath, err) + } + if rowCount < limit { + break + } + // to give the Galera Cluster a chance to breath + time.Sleep(time.Second) } - - _, err = res.RowsAffected() - if err != nil { - return fmt.Errorf("deleteFolderChildren %s but no rows affected: %s", fullpath, err) - } - return nil } diff --git a/weed/filer/cassandra/cassandra_store.go b/weed/filer/cassandra/cassandra_store.go index fd2ce91a6..0398f5117 100644 --- a/weed/filer/cassandra/cassandra_store.go +++ b/weed/filer/cassandra/cassandra_store.go @@ -154,7 +154,7 @@ func (store *CassandraStore) DeleteEntry(ctx context.Context, fullpath util.Full return nil } -func (store *CassandraStore) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath) error { +func (store *CassandraStore) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath, limit int64) error { if _, ok := store.isSuperLargeDirectory(string(fullpath)); ok { return nil // filer.ErrUnsupportedSuperLargeDirectoryListing } diff --git a/weed/filer/elastic/v7/elastic_store.go b/weed/filer/elastic/v7/elastic_store.go index a16e5ebca..986c55b38 100644 --- a/weed/filer/elastic/v7/elastic_store.go +++ b/weed/filer/elastic/v7/elastic_store.go @@ -186,7 +186,7 @@ func (store *ElasticStore) deleteEntry(ctx context.Context, index, id string) (e return fmt.Errorf("delete entry %v.", err) } -func (store *ElasticStore) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath) (err error) { +func (store *ElasticStore) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath, limit int64) (err error) { _, err = store.ListDirectoryEntries(ctx, fullpath, "", false, math.MaxInt32, func(entry *filer.Entry) bool { if err := store.DeleteEntry(ctx, entry.FullPath); err != nil { glog.Errorf("elastic delete %s: %v.", entry.FullPath, err) diff --git a/weed/filer/etcd/etcd_store.go b/weed/filer/etcd/etcd_store.go index 71ed738f9..96322081a 100644 --- a/weed/filer/etcd/etcd_store.go +++ b/weed/filer/etcd/etcd_store.go @@ -130,7 +130,7 @@ func (store *EtcdStore) DeleteEntry(ctx context.Context, fullpath weed_util.Full return nil } -func (store *EtcdStore) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath) (err error) { +func (store *EtcdStore) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath, limit int64) (err error) { directoryPrefix := genDirectoryKeyPrefix(fullpath, "") if _, err := store.client.Delete(ctx, string(directoryPrefix), clientv3.WithPrefix()); err != nil { diff --git a/weed/filer/filer.go b/weed/filer/filer.go index effdc0e4e..1bcf57fe7 100644 --- a/weed/filer/filer.go +++ b/weed/filer/filer.go @@ -19,6 +19,7 @@ import ( const ( LogFlushInterval = time.Minute PaginationSize = 1024 + DeleteMaxRows = 10000 FilerStoreId = "filer.store.id" ) diff --git a/weed/filer/filer_delete_entry.go b/weed/filer/filer_delete_entry.go index 35187d034..be21801dc 100644 --- a/weed/filer/filer_delete_entry.go +++ b/weed/filer/filer_delete_entry.go @@ -115,7 +115,7 @@ func (f *Filer) doBatchDeleteFolderMetaAndData(ctx context.Context, entry *Entry glog.V(3).Infof("deleting directory %v delete %d chunks: %v", entry.FullPath, len(chunks), shouldDeleteChunks) - if storeDeletionErr := f.Store.DeleteFolderChildren(ctx, entry.FullPath); storeDeletionErr != nil { + if storeDeletionErr := f.Store.DeleteFolderChildren(ctx, entry.FullPath, DeleteMaxRows); storeDeletionErr != nil { return nil, nil, fmt.Errorf("filer store delete: %v", storeDeletionErr) } diff --git a/weed/filer/filerstore.go b/weed/filer/filerstore.go index 38927d6fb..63e2e7817 100644 --- a/weed/filer/filerstore.go +++ b/weed/filer/filerstore.go @@ -25,7 +25,7 @@ type FilerStore interface { // err == filer_pb.ErrNotFound if not found FindEntry(context.Context, util.FullPath) (entry *Entry, err error) DeleteEntry(context.Context, util.FullPath) (err error) - DeleteFolderChildren(context.Context, util.FullPath) (err error) + DeleteFolderChildren(context.Context, util.FullPath, int64) (err error) ListDirectoryEntries(ctx context.Context, dirPath util.FullPath, startFileName string, includeStartFile bool, limit int64, eachEntryFunc ListEachEntryFunc) (lastFileName string, err error) ListDirectoryPrefixedEntries(ctx context.Context, dirPath util.FullPath, startFileName string, includeStartFile bool, limit int64, prefix string, eachEntryFunc ListEachEntryFunc) (lastFileName string, err error) diff --git a/weed/filer/filerstore_translate_path.go b/weed/filer/filerstore_translate_path.go index 00bf82ed4..cb9fabfc0 100644 --- a/weed/filer/filerstore_translate_path.go +++ b/weed/filer/filerstore_translate_path.go @@ -100,10 +100,10 @@ func (t *FilerStorePathTranlator) DeleteOneEntry(ctx context.Context, existingEn return t.actualStore.DeleteEntry(ctx, existingEntry.FullPath) } -func (t *FilerStorePathTranlator) DeleteFolderChildren(ctx context.Context, fp util.FullPath) (err error) { +func (t *FilerStorePathTranlator) DeleteFolderChildren(ctx context.Context, fp util.FullPath, limit int64) (err error) { newFullPath := t.translatePath(fp) - return t.actualStore.DeleteFolderChildren(ctx, newFullPath) + return t.actualStore.DeleteFolderChildren(ctx, newFullPath, limit) } func (t *FilerStorePathTranlator) ListDirectoryEntries(ctx context.Context, dirPath util.FullPath, startFileName string, includeStartFile bool, limit int64, eachEntryFunc ListEachEntryFunc) (string, error) { diff --git a/weed/filer/filerstore_wrapper.go b/weed/filer/filerstore_wrapper.go index 2470f340c..997d70a80 100644 --- a/weed/filer/filerstore_wrapper.go +++ b/weed/filer/filerstore_wrapper.go @@ -213,7 +213,7 @@ func (fsw *FilerStoreWrapper) DeleteOneEntry(ctx context.Context, existingEntry return actualStore.DeleteEntry(ctx, existingEntry.FullPath) } -func (fsw *FilerStoreWrapper) DeleteFolderChildren(ctx context.Context, fp util.FullPath) (err error) { +func (fsw *FilerStoreWrapper) DeleteFolderChildren(ctx context.Context, fp util.FullPath, limit int64) (err error) { actualStore := fsw.getActualStore(fp + "/") stats.FilerStoreCounter.WithLabelValues(actualStore.GetName(), "deleteFolderChildren").Inc() start := time.Now() @@ -222,7 +222,7 @@ func (fsw *FilerStoreWrapper) DeleteFolderChildren(ctx context.Context, fp util. }() glog.V(4).Infof("DeleteFolderChildren %s", fp) - return actualStore.DeleteFolderChildren(ctx, fp) + return actualStore.DeleteFolderChildren(ctx, fp, limit) } func (fsw *FilerStoreWrapper) ListDirectoryEntries(ctx context.Context, dirPath util.FullPath, startFileName string, includeStartFile bool, limit int64, eachEntryFunc ListEachEntryFunc) (string, error) { diff --git a/weed/filer/hbase/hbase_store.go b/weed/filer/hbase/hbase_store.go index e0d878ca7..43c14cc15 100644 --- a/weed/filer/hbase/hbase_store.go +++ b/weed/filer/hbase/hbase_store.go @@ -109,7 +109,7 @@ func (store *HbaseStore) DeleteEntry(ctx context.Context, path util.FullPath) (e return store.doDelete(ctx, store.cfMetaDir, []byte(path)) } -func (store *HbaseStore) DeleteFolderChildren(ctx context.Context, path util.FullPath) (err error) { +func (store *HbaseStore) DeleteFolderChildren(ctx context.Context, path util.FullPath, limit int64) (err error) { family := map[string][]string{store.cfMetaDir: {COLUMN_NAME}} expectedPrefix := []byte(path.Child("")) diff --git a/weed/filer/leveldb/leveldb_store.go b/weed/filer/leveldb/leveldb_store.go index ce454f36a..50367c87b 100644 --- a/weed/filer/leveldb/leveldb_store.go +++ b/weed/filer/leveldb/leveldb_store.go @@ -136,7 +136,7 @@ func (store *LevelDBStore) DeleteEntry(ctx context.Context, fullpath weed_util.F return nil } -func (store *LevelDBStore) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath) (err error) { +func (store *LevelDBStore) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath, limit int64) (err error) { batch := new(leveldb.Batch) diff --git a/weed/filer/leveldb2/leveldb2_store.go b/weed/filer/leveldb2/leveldb2_store.go index 124d61c1c..59e831598 100644 --- a/weed/filer/leveldb2/leveldb2_store.go +++ b/weed/filer/leveldb2/leveldb2_store.go @@ -144,7 +144,7 @@ func (store *LevelDB2Store) DeleteEntry(ctx context.Context, fullpath weed_util. return nil } -func (store *LevelDB2Store) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath) (err error) { +func (store *LevelDB2Store) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath, limit int64) (err error) { directoryPrefix, partitionId := genDirectoryKeyPrefix(fullpath, "", store.dbCount) batch := new(leveldb.Batch) diff --git a/weed/filer/leveldb3/leveldb3_store.go b/weed/filer/leveldb3/leveldb3_store.go index d1cdfbbf6..3db7722b7 100644 --- a/weed/filer/leveldb3/leveldb3_store.go +++ b/weed/filer/leveldb3/leveldb3_store.go @@ -245,7 +245,7 @@ func (store *LevelDB3Store) DeleteEntry(ctx context.Context, fullpath weed_util. return nil } -func (store *LevelDB3Store) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath) (err error) { +func (store *LevelDB3Store) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath, limit int64) (err error) { db, bucket, shortPath, err := store.findDB(fullpath, true) if err != nil { diff --git a/weed/filer/mongodb/mongodb_store.go b/weed/filer/mongodb/mongodb_store.go index 1ef5056f4..5861d86b0 100644 --- a/weed/filer/mongodb/mongodb_store.go +++ b/weed/filer/mongodb/mongodb_store.go @@ -167,7 +167,7 @@ func (store *MongodbStore) DeleteEntry(ctx context.Context, fullpath util.FullPa return nil } -func (store *MongodbStore) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath) error { +func (store *MongodbStore) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath, limit int64) error { where := bson.M{"directory": fullpath} _, err := store.connect.Database(store.database).Collection(store.collectionName).DeleteMany(ctx, where) diff --git a/weed/filer/mysql/mysql_sql_gen.go b/weed/filer/mysql/mysql_sql_gen.go index 93d3e3f9e..477baf66b 100644 --- a/weed/filer/mysql/mysql_sql_gen.go +++ b/weed/filer/mysql/mysql_sql_gen.go @@ -38,7 +38,7 @@ func (gen *SqlGenMysql) GetSqlDelete(tableName string) string { } func (gen *SqlGenMysql) GetSqlDeleteFolderChildren(tableName string) string { - return fmt.Sprintf("DELETE FROM `%s` WHERE dirhash=? AND directory=?", tableName) + return fmt.Sprintf("DELETE FROM `%s` WHERE dirhash=? AND directory=? LIMIT ?", tableName) } func (gen *SqlGenMysql) GetSqlListExclusive(tableName string) string { diff --git a/weed/filer/redis/universal_redis_store.go b/weed/filer/redis/universal_redis_store.go index 30d11a7f4..fb49740cd 100644 --- a/weed/filer/redis/universal_redis_store.go +++ b/weed/filer/redis/universal_redis_store.go @@ -107,7 +107,7 @@ func (store *UniversalRedisStore) DeleteEntry(ctx context.Context, fullpath util return nil } -func (store *UniversalRedisStore) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath) (err error) { +func (store *UniversalRedisStore) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath, limit int64) (err error) { members, err := store.Client.SMembers(ctx, genDirectoryListKey(string(fullpath))).Result() if err != nil { diff --git a/weed/filer/redis2/universal_redis_store.go b/weed/filer/redis2/universal_redis_store.go index aab3d1f4a..6bb56f5f8 100644 --- a/weed/filer/redis2/universal_redis_store.go +++ b/weed/filer/redis2/universal_redis_store.go @@ -127,7 +127,7 @@ func (store *UniversalRedis2Store) DeleteEntry(ctx context.Context, fullpath uti return nil } -func (store *UniversalRedis2Store) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath) (err error) { +func (store *UniversalRedis2Store) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath, limit int64) (err error) { if store.isSuperLargeDirectory(string(fullpath)) { return nil diff --git a/weed/filer/rocksdb/rocksdb_store.go b/weed/filer/rocksdb/rocksdb_store.go index 379a18c62..face5963e 100644 --- a/weed/filer/rocksdb/rocksdb_store.go +++ b/weed/filer/rocksdb/rocksdb_store.go @@ -148,7 +148,7 @@ func (store *RocksDBStore) DeleteEntry(ctx context.Context, fullpath weed_util.F return nil } -func (store *RocksDBStore) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath) (err error) { +func (store *RocksDBStore) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath, limit int64) (err error) { directoryPrefix := genDirectoryKeyPrefix(fullpath, "") batch := gorocksdb.NewWriteBatch() From 055374a50bc3cfe78be6d73514182decb8531666 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 15 Jun 2021 12:45:20 -0700 Subject: [PATCH 029/265] FUSE: skip flushing if file is deleted related to https://github.com/chrislusf/seaweedfs/issues/2110 --- weed/filesys/dir.go | 5 ++++- weed/filesys/filehandle.go | 8 +++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index 904999c43..1af868d58 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -443,7 +443,10 @@ func (dir *Dir) removeOneFile(req *fuse.RemoveRequest) error { dir.wfs.handlesLock.Lock() defer dir.wfs.handlesLock.Unlock() inodeId := filePath.AsInode() - delete(dir.wfs.handles, inodeId) + if fh, ok := dir.wfs.handles[inodeId]; ok { + delete(dir.wfs.handles, inodeId) + fh.isDeleted = true + } return nil diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index 88cfe45f0..f95051f65 100644 --- a/weed/filesys/filehandle.go +++ b/weed/filesys/filehandle.go @@ -33,11 +33,12 @@ type FileHandle struct { Uid uint32 // user ID of process making request Gid uint32 // group ID of process making request writeOnly bool + isDeleted bool } func newFileHandle(file *File, uid, gid uint32, writeOnly bool) *FileHandle { fh := &FileHandle{ - f: file, + f: file, // dirtyPages: newContinuousDirtyPages(file, writeOnly), dirtyPages: newTempFileDirtyPages(file, writeOnly), Uid: uid, @@ -222,6 +223,11 @@ func (fh *FileHandle) Flush(ctx context.Context, req *fuse.FlushRequest) error { glog.V(4).Infof("Flush %v fh %d", fh.f.fullpath(), fh.handle) + if fh.isDeleted { + glog.V(4).Infof("Flush %v fh %d skip deleted", fh.f.fullpath(), fh.handle) + return nil + } + fh.Lock() defer fh.Unlock() From 56eb522b136966d38b257ade7da07479092ce12c Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 15 Jun 2021 21:11:31 -0700 Subject: [PATCH 030/265] fix stats when a collection is deleted --- weed/storage/store.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/weed/storage/store.go b/weed/storage/store.go index f27f2412f..6ff996a3c 100644 --- a/weed/storage/store.go +++ b/weed/storage/store.go @@ -250,6 +250,11 @@ func (s *Store) CollectHeartbeat() *master_pb.Heartbeat { } if !deleteVolume { collectionVolumeSize[v.Collection] += volumeMessage.Size + } else { + collectionVolumeSize[v.Collection] -= volumeMessage.Size + if collectionVolumeSize[v.Collection] <= 0 { + delete(collectionVolumeSize, v.Collection) + } } if _, exist := collectionVolumeReadOnlyCount[v.Collection]; !exist { From 88d52adfdd4e645de7a691d633778b3af746d899 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 18 Jun 2021 15:35:22 -0700 Subject: [PATCH 031/265] remove unused fields --- weed/server/filer_server_handlers_write.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/weed/server/filer_server_handlers_write.go b/weed/server/filer_server_handlers_write.go index 0567143fe..8d11e664a 100644 --- a/weed/server/filer_server_handlers_write.go +++ b/weed/server/filer_server_handlers_write.go @@ -28,8 +28,6 @@ type FilerPostResult struct { Name string `json:"name,omitempty"` Size int64 `json:"size,omitempty"` Error string `json:"error,omitempty"` - Fid string `json:"fid,omitempty"` - Url string `json:"url,omitempty"` } func (fs *FilerServer) assignNewFileInfo(so *operation.StorageOption) (fileId, urlLocation string, auth security.EncodedJwt, err error) { From f24bb9e68806c97ccd449dbec2ce8c476c5efef9 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 19 Jun 2021 03:46:39 -0700 Subject: [PATCH 032/265] mount: fix for deletion stopped working since 2.53 fix https://github.com/chrislusf/seaweedfs/issues/2138 due to 4d0cbd2700655e17f26817297fd3e9fa57e78876 --- weed/server/volume_grpc_batch_delete.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/weed/server/volume_grpc_batch_delete.go b/weed/server/volume_grpc_batch_delete.go index 8e84dc2a8..2c445f996 100644 --- a/weed/server/volume_grpc_batch_delete.go +++ b/weed/server/volume_grpc_batch_delete.go @@ -8,7 +8,6 @@ import ( "github.com/chrislusf/seaweedfs/weed/operation" "github.com/chrislusf/seaweedfs/weed/pb/volume_server_pb" "github.com/chrislusf/seaweedfs/weed/storage/needle" - "github.com/chrislusf/seaweedfs/weed/storage/types" ) func (vs *VolumeServer) BatchDelete(ctx context.Context, req *volume_server_pb.BatchDeleteRequest) (*volume_server_pb.BatchDeleteResponse, error) { @@ -30,7 +29,7 @@ func (vs *VolumeServer) BatchDelete(ctx context.Context, req *volume_server_pb.B n := new(needle.Needle) volumeId, _ := needle.NewVolumeId(vid) if req.SkipCookieCheck { - n.Id, err = types.ParseNeedleId(id_cookie) + n.Id, _, err = needle.ParseNeedleIdCookie(id_cookie) if err != nil { resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ FileId: fid, From b3eb4fecc7cdad0388e05fe54ab38b68df00c65c Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 19 Jun 2021 03:48:15 -0700 Subject: [PATCH 033/265] 2.54 --- k8s/seaweedfs/Chart.yaml | 4 ++-- k8s/seaweedfs/values.yaml | 2 +- weed/util/constants.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/k8s/seaweedfs/Chart.yaml b/k8s/seaweedfs/Chart.yaml index ef46c1bc4..19e30edb1 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.53" -version: "2.53" +appVersion: "2.54" +version: "2.54" diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index e89e8c0f2..e53fedb57 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.53" - started using {.Chart.appVersion} + # imageTag: "2.54" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index 3dfe702ed..8192130e4 100644 --- a/weed/util/constants.go +++ b/weed/util/constants.go @@ -5,7 +5,7 @@ import ( ) var ( - VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 53) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 54) COMMIT = "" ) From f1d207a0fe9b567c2b8f899d2cabe655673ddb16 Mon Sep 17 00:00:00 2001 From: danielflira Date: Sun, 20 Jun 2021 02:48:46 -0300 Subject: [PATCH 034/265] start weed with mount in background --- weed/command/fuse.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/weed/command/fuse.go b/weed/command/fuse.go index 74cf2bb70..b66487bdf 100644 --- a/weed/command/fuse.go +++ b/weed/command/fuse.go @@ -22,6 +22,7 @@ func runFuse(cmd *Command, args []string) bool { rawArgsLen := len(rawArgs) option := strings.Builder{} options := []parameter{} + masterProcess := true // first parameter i := 0 @@ -98,6 +99,8 @@ func runFuse(cmd *Command, args []string) bool { parameter := options[i] switch parameter.name { + case "child": + masterProcess = false case "arg0": mountOptions.dir = ¶meter.value case "filer": @@ -187,6 +190,27 @@ func runFuse(cmd *Command, args []string) bool { } } + // the master start the child, release it then finish himself + if masterProcess { + arg0 := os.Args[0] + argv := append(os.Args, "-o", "child") + + attr := os.ProcAttr{} + child, err := os.StartProcess(arg0, argv, &attr) + + if err != nil { + panic(fmt.Errorf("master process can not start child process: %s", err)) + } + + err = child.Release() + + if err != nil { + panic(fmt.Errorf("master process can not release child process: %s", err)) + } + + return true + } + // I don't know why PATH environment variable is lost if err := os.Setenv("PATH", "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"); err != nil { panic(fmt.Errorf("setenv: %s", err)) From d474ce6fe304446b242f95e4013462045114b757 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 21 Jun 2021 22:56:07 -0700 Subject: [PATCH 035/265] master: avoid repeated leader redirection fix https://github.com/chrislusf/seaweedfs/issues/2146 --- weed/topology/topology.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/weed/topology/topology.go b/weed/topology/topology.go index d704a5636..4cbe22a42 100644 --- a/weed/topology/topology.go +++ b/weed/topology/topology.go @@ -37,7 +37,7 @@ type Topology struct { chanFullVolumes chan storage.VolumeInfo chanCrowdedVolumes chan storage.VolumeInfo - Configuration *Configuration + Configuration *Configuration RaftServer raft.Server } @@ -70,6 +70,11 @@ func (t *Topology) IsLeader() bool { if t.RaftServer.State() == raft.Leader { return true } + if leader, err := t.Leader(); err == nil { + if t.RaftServer.Name() == leader { + return true + } + } } return false } From 829b195084274309bd10c5d87ecf31513db7176e Mon Sep 17 00:00:00 2001 From: Jonas Falck Date: Tue, 22 Jun 2021 09:54:13 +0200 Subject: [PATCH 036/265] Add process metrics of weed itself --- go.mod | 10 +- go.sum | 37 +++ other/metrics/grafana_seaweedfs.json | 330 +++++++++++++++++++++++++++ weed/stats/metrics.go | 10 +- 4 files changed, 376 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 4fccf19d2..3d92d95a4 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/gocql/gocql v0.0.0-20190829130954-e163eff7a8c6 github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48 // indirect github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e - github.com/golang/protobuf v1.4.2 + github.com/golang/protobuf v1.4.3 github.com/google/btree v1.0.0 github.com/google/uuid v1.1.1 github.com/gorilla/mux v1.7.4 @@ -42,7 +42,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.11.0 // indirect github.com/jcmturner/gofork v1.0.0 // indirect github.com/jinzhu/copier v0.2.8 - github.com/json-iterator/go v1.1.10 + github.com/json-iterator/go v1.1.11 github.com/karlseguin/ccache v2.0.3+incompatible // indirect github.com/karlseguin/ccache/v2 v2.0.7 github.com/klauspost/compress v1.10.9 // indirect @@ -59,7 +59,7 @@ require ( github.com/peterh/liner v1.1.0 github.com/pierrec/lz4 v2.2.7+incompatible // indirect github.com/pquerna/cachecontrol v0.1.0 - github.com/prometheus/client_golang v1.3.0 + github.com/prometheus/client_golang v1.11.0 github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563 // indirect github.com/seaweedfs/fuse v1.1.7 github.com/seaweedfs/goexif v1.0.2 @@ -88,11 +88,11 @@ require ( gocloud.dev/pubsub/rabbitpubsub v0.20.0 golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb - golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c + golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40 golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78 google.golang.org/api v0.26.0 google.golang.org/grpc v1.29.1 - google.golang.org/protobuf v1.24.0 + google.golang.org/protobuf v1.26.0-rc.1 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/jcmturner/goidentity.v3 v3.0.0 // indirect gopkg.in/jcmturner/gokrb5.v7 v7.3.0 // indirect diff --git a/go.sum b/go.sum index 4bff566eb..985b1357a 100644 --- a/go.sum +++ b/go.sum @@ -109,6 +109,7 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/andybalholm/brotli v1.0.0 h1:7UCwP93aiSfvWpapti8g88vVVGp2qqtGyePsSuDafo4= github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -251,6 +252,7 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= @@ -333,6 +335,8 @@ github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0 github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= @@ -353,6 +357,8 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-replayers/grpcreplay v0.1.0 h1:eNb1y9rZFmY4ax45uEEECSa8fsxGRU+8Bil52ASAwic= github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= github.com/google/go-replayers/httpreplay v0.1.0 h1:AX7FUb4BjrrzNvblr/OlgwrmFiep6soj5K2QSDW7BGk= @@ -456,17 +462,21 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfC github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/karlseguin/ccache v2.0.3+incompatible h1:j68C9tWOROiOLWTS/kCGg9IcJG+ACqn5+0+t8Oh83UU= github.com/karlseguin/ccache v2.0.3+incompatible/go.mod h1:CM9tNPzT6EdRh14+jiW8mEF9mkNZuuE51qmgGYUB93w= github.com/karlseguin/ccache/v2 v2.0.7 h1:y5Pfi4eiyYCOD6LS/Kj+o6Nb4M5Ngpw9qFQs+v44ZYM= @@ -497,6 +507,8 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGi github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= @@ -564,6 +576,7 @@ github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nats-io/jwt v0.2.6/go.mod h1:mQxQ0uHQ9FhEVPIcTSKwx2lqZEpXWWcCgA7R6NrWvvY= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2 h1:+RB5hMpXUUA2dfxuhBTEkMOrYmM+gKIZYS1KjSostMI= @@ -654,6 +667,9 @@ github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0 h1:miYCvYqFXtl/J9FIy8eNpBfYthAEFg+Ys0XyUVEcDsc= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= @@ -662,6 +678,8 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCb github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0 h1:ElTg5tNp4DqfV7UQjDqv2+RJlNzsDtvNAWccbItceIE= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -669,6 +687,9 @@ github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -676,6 +697,9 @@ github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNG github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= @@ -724,6 +748,8 @@ github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q= github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= +github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= @@ -964,6 +990,7 @@ golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201016165138-7b1cca2348c0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U= @@ -989,6 +1016,8 @@ golang.org/x/sync v0.0.0-20200930132711-30421366ff76 h1:JnxiSYT3Nm0BT2a8CyvYyM6c golang.org/x/sync v0.0.0-20200930132711-30421366ff76/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1020,6 +1049,7 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1038,12 +1068,16 @@ golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201022201747-fb209a7c41cd h1:WgqgiQvkiZWz7XLhphjt2GI2GcGCTIZs9jqXMWmH+oc= golang.org/x/sys v0.0.0-20201022201747-fb209a7c41cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40 h1:JWgyZ1qgdTaF3N3oxC+MdTV7qvEEgHo3otj+HB5CM7Q= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1217,6 +1251,8 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.26.0-rc.1 h1:7QnIQpGRHE5RnLKnESfDoxm2dTapTZua5a0kS0A+VXQ= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1256,6 +1292,7 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= diff --git a/other/metrics/grafana_seaweedfs.json b/other/metrics/grafana_seaweedfs.json index 074a3531f..8fbd5989a 100644 --- a/other/metrics/grafana_seaweedfs.json +++ b/other/metrics/grafana_seaweedfs.json @@ -1805,6 +1805,336 @@ "show": true } ] + }, + { + "type": "graph", + "title": "Process memory", + "gridPos": { + "x": 0, + "y": 40, + "w": 24, + "h": 7 + }, + "aliasColors": {}, + "dashLength": 10, + "datasource": "${DS_PROMETHEUS-DEV}", + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "id": 66, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "paceLength": 10, + "pluginVersion": "7.4.5", + "pointradius": 5, + "renderer": "flot", + "seriesOverrides": [ + { + "$$hashKey": "object:258", + "alias": "max limit", + "color": "#890f02" + } + ], + "spaceLength": 10, + "targets": [ + { + "expr": "process_resident_memory_bytes{exported_job=\"filer\"}", + "legendFormat": "resident {{exported_instance}}", + "interval": "", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "step": 120, + "tags": [] + }, + { + "expr": "process_virtual_memory_bytes{exported_job=\"filer\"}", + "legendFormat": "virtual {{exported_instance}}", + "interval": "", + "format": "time_series", + "intervalFactor": 2, + "refId": "B", + "step": 120 + } + ], + "thresholds": [], + "timeRegions": [], + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:265", + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:266", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + }, + "bars": false, + "dashes": false, + "fillGradient": 0, + "hiddenSeries": false, + "percentage": false, + "points": false, + "stack": false, + "steppedLine": false, + "timeFrom": null, + "timeShift": null + }, + { + "type": "graph", + "title": "Open File Descriptor", + "gridPos": { + "x": 0, + "y": 47, + "w": 24, + "h": 7 + }, + "aliasColors": {}, + "dashLength": 10, + "datasource": "${DS_PROMETHEUS-DEV}", + "editable": true, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "id": 68, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "paceLength": 10, + "pluginVersion": "7.4.5", + "pointradius": 5, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "targets": [ + { + "expr": "process_open_fds{exported_job=\"filer\"}", + "legendFormat": "{{exported_instance}}", + "interval": "", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "metric": "", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "step": 240, + "tags": [] + }, + { + "expr": "process_max_fds{exported_job=\"filer\"}", + "legendFormat": "{{exported_instance}}", + "interval": "", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "metric": "", + "policy": "default", + "refId": "B", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "step": 240, + "tags": [], + "hide": false + } + ], + "thresholds": [], + "timeRegions": [], + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:1087", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:1088", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + }, + "bars": false, + "dashes": false, + "error": false, + "fillGradient": 0, + "hiddenSeries": false, + "percentage": false, + "points": false, + "stack": false, + "steppedLine": false, + "timeFrom": null, + "timeShift": null } ], "repeat": null, diff --git a/weed/stats/metrics.go b/weed/stats/metrics.go index 3f5d851a4..48d964418 100644 --- a/weed/stats/metrics.go +++ b/weed/stats/metrics.go @@ -8,11 +8,11 @@ import ( "strings" "time" + "github.com/chrislusf/seaweedfs/weed/glog" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/collectors" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/client_golang/prometheus/push" - - "github.com/chrislusf/seaweedfs/weed/glog" ) var ( @@ -127,12 +127,12 @@ var ( ) func init() { - Gather.MustRegister(FilerRequestCounter) Gather.MustRegister(FilerRequestHistogram) Gather.MustRegister(FilerStoreCounter) Gather.MustRegister(FilerStoreHistogram) - Gather.MustRegister(prometheus.NewGoCollector()) + Gather.MustRegister(collectors.NewGoCollector()) + Gather.MustRegister(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{})) Gather.MustRegister(VolumeServerRequestCounter) Gather.MustRegister(VolumeServerRequestHistogram) @@ -147,7 +147,6 @@ func init() { } func LoopPushingMetric(name, instance, addr string, intervalSeconds int) { - if addr == "" || intervalSeconds == 0 { return } @@ -165,7 +164,6 @@ func LoopPushingMetric(name, instance, addr string, intervalSeconds int) { intervalSeconds = 15 } time.Sleep(time.Duration(intervalSeconds) * time.Second) - } } From d5bc87a5da27d1acd0a5b46eca8894f21a611808 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 23 Jun 2021 00:26:09 -0700 Subject: [PATCH 037/265] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f2e4eaa9b..fac4806bb 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Slack](https://img.shields.io/badge/slack-purple)](https://join.slack.com/t/seaweedfs/shared_invite/enQtMzI4MTMwMjU2MzA3LTEyYzZmZWYzOGQ3MDJlZWMzYmI0OTE4OTJiZjJjODBmMzUxNmYwODg0YjY3MTNlMjBmZDQ1NzQ5NDJhZWI2ZmY) [![Twitter](https://img.shields.io/twitter/follow/seaweedfs.svg?style=social&label=Follow)](https://twitter.com/intent/follow?screen_name=seaweedfs) -[![Build Status](https://travis-ci.com/chrislusf/seaweedfs.svg?branch=master)](https://travis-ci.org/chrislusf/seaweedfs) +[![Build Status](https://travis-ci.com/chrislusf/seaweedfs.svg?branch=master)](https://travis-ci.com/chrislusf/seaweedfs) [![GoDoc](https://godoc.org/github.com/chrislusf/seaweedfs/weed?status.svg)](https://godoc.org/github.com/chrislusf/seaweedfs/weed) [![Wiki](https://img.shields.io/badge/docs-wiki-blue.svg)](https://github.com/chrislusf/seaweedfs/wiki) [![Docker Pulls](https://img.shields.io/docker/pulls/chrislusf/seaweedfs?maxAge=4800)](https://hub.docker.com/r/chrislusf/seaweedfs/) From 05af54ad103f0a166681cda45d9303870fb7dcc7 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 23 Jun 2021 00:41:01 -0700 Subject: [PATCH 038/265] 2.55 trigger migrated travis build --- k8s/seaweedfs/Chart.yaml | 4 ++-- k8s/seaweedfs/values.yaml | 2 +- weed/util/constants.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/k8s/seaweedfs/Chart.yaml b/k8s/seaweedfs/Chart.yaml index 19e30edb1..0aebc1c84 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.54" -version: "2.54" +appVersion: "2.55" +version: "2.55" diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index e53fedb57..072280f07 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.54" - started using {.Chart.appVersion} + # imageTag: "2.55" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index 8192130e4..ac80b1737 100644 --- a/weed/util/constants.go +++ b/weed/util/constants.go @@ -5,7 +5,7 @@ import ( ) var ( - VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 54) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 55) COMMIT = "" ) From 78b1fb921c41a0dc7aaff55027624eba10f3c568 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 23 Jun 2021 20:59:54 -0700 Subject: [PATCH 039/265] adjust log level --- go.mod | 8 - go.sum | 206 +--------------------- weed/server/filer_server_handlers_read.go | 2 +- 3 files changed, 8 insertions(+), 208 deletions(-) diff --git a/go.mod b/go.mod index 3d92d95a4..5510eee8e 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,8 @@ module github.com/chrislusf/seaweedfs go 1.16 require ( - cloud.google.com/go v0.58.0 // indirect cloud.google.com/go/pubsub v1.3.1 cloud.google.com/go/storage v1.9.0 - github.com/Azure/azure-pipeline-go v0.2.2 // indirect github.com/Azure/azure-storage-blob-go v0.9.0 github.com/OneOfOne/xxhash v1.2.2 github.com/Shopify/sarama v1.23.1 @@ -43,7 +41,6 @@ require ( github.com/jcmturner/gofork v1.0.0 // indirect github.com/jinzhu/copier v0.2.8 github.com/json-iterator/go v1.1.11 - github.com/karlseguin/ccache v2.0.3+incompatible // indirect github.com/karlseguin/ccache/v2 v2.0.7 github.com/klauspost/compress v1.10.9 // indirect github.com/klauspost/cpuid v1.2.1 // indirect @@ -51,9 +48,7 @@ require ( github.com/klauspost/reedsolomon v1.9.2 github.com/kurin/blazer v0.5.3 github.com/lib/pq v1.10.0 - github.com/lunixbochs/vtclean v1.0.0 // indirect github.com/magiconair/properties v1.8.1 // indirect - github.com/mattn/go-colorable v0.1.2 // indirect github.com/mattn/go-runewidth v0.0.4 // indirect github.com/olivere/elastic/v7 v7.0.19 github.com/peterh/liner v1.1.0 @@ -80,7 +75,6 @@ require ( github.com/viant/toolbox v0.33.2 // indirect github.com/willf/bitset v1.1.10 // indirect github.com/willf/bloom v2.0.3+incompatible - github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0 // indirect go.etcd.io/etcd v3.3.15+incompatible go.mongodb.org/mongo-driver v1.3.2 gocloud.dev v0.20.0 @@ -93,10 +87,8 @@ require ( google.golang.org/api v0.26.0 google.golang.org/grpc v1.29.1 google.golang.org/protobuf v1.26.0-rc.1 - gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/jcmturner/goidentity.v3 v3.0.0 // indirect gopkg.in/jcmturner/gokrb5.v7 v7.3.0 // indirect - gopkg.in/karlseguin/expect.v1 v1.0.1 // indirect modernc.org/sqlite v1.10.7 ) diff --git a/go.sum b/go.sum index 985b1357a..e0587fd9c 100644 --- a/go.sum +++ b/go.sum @@ -5,7 +5,6 @@ cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSR cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3 h1:0sMegbmn/8uTwpNkB0q9cLEpZ2W5a6kl+wtBQgPWBJQ= cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= @@ -41,34 +40,20 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.9.0 h1:oXnZyBjHB6hC8TnSle0AWW6pGJ29EuSo5ww+SFmdNBg= cloud.google.com/go/storage v1.9.0/go.mod h1:m+/etGaqZbylxaNT876QGXqEHp4PR2Rq5GMqICWb9bU= contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/ocagent v0.5.0 h1:TKXjQSRS0/cCDrP7KvkgU6SmILtF/yV2TOs/02K/WZQ= -contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrLVhN+qmP8BTVvdH2YLs7Gl0= contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU= github.com/Azure/azure-amqp-common-go/v3 v3.0.0/go.mod h1:SY08giD/XbhTz07tJdpw1SoxQXHPN30+DI3Z04SYqyg= -github.com/Azure/azure-pipeline-go v0.1.8/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= -github.com/Azure/azure-pipeline-go v0.1.9/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= -github.com/Azure/azure-pipeline-go v0.2.1 h1:OLBdZJ3yvOn2MezlWvbrBMTEUQC72zAftRZOMdj5HYo= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2 h1:6oiIS9yaG6XCCzhgAgKFfIWyo4LLCiDhZot6ltoThhY= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= -github.com/Azure/azure-sdk-for-go v29.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v30.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v37.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-service-bus-go v0.9.1/go.mod h1:yzBx6/BUGfjfeqbRZny9AQIbIe3AcV9WZbAdpkoXOa0= github.com/Azure/azure-service-bus-go v0.10.1/go.mod h1:E/FOceuKAFUfpbIJDKWz/May6guE+eGibfGT6q+n1to= -github.com/Azure/azure-storage-blob-go v0.6.0/go.mod h1:oGfmITT1V6x//CswqY2gtAHND+xIP64/qL7a5QJix0Y= -github.com/Azure/azure-storage-blob-go v0.8.0 h1:53qhf0Oxa0nOjgbDeeYPUeyiNmafAFEY95rZLK0Tj6o= -github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= github.com/Azure/azure-storage-blob-go v0.9.0 h1:kORqvzXP8ORhKbW13FflGUaSE5CMyDWun9UwMxY8gPs= github.com/Azure/azure-storage-blob-go v0.9.0/go.mod h1:8UBPbiOhrMQ4pLPi3gA1tXnpjrS76UYE/fo5A40vf4g= github.com/Azure/go-amqp v0.12.6/go.mod h1:qApuH6OFTSKZFmCOxccvAv5rLizBQf4v8pRmG138DPo= github.com/Azure/go-amqp v0.12.7/go.mod h1:qApuH6OFTSKZFmCOxccvAv5rLizBQf4v8pRmG138DPo= -github.com/Azure/go-autorest v12.0.0+incompatible h1:N+VqClcomLGD/sHb3smbSYYtNMgKpVV3Cd5r5i8z6bQ= -github.com/Azure/go-autorest v12.0.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3 h1:OZEIaBbMdUE/Js+BQKlpO81XlISgipr6yDJ+PSwsgi4= github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= @@ -80,20 +65,22 @@ github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMl github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= +github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798 h1:2T/jmrHeTezcCM58lvEQXs0UpQJCo5SoGAcg+mbSTIg= github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190605020000-c4ba1fdf4d36/go.mod h1:aJ4qN3TfrelA6NZ6AXsXRfmEVaYin3EDbSPJrKS8OXo= github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= @@ -110,8 +97,6 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/andybalholm/brotli v1.0.0 h1:7UCwP93aiSfvWpapti8g88vVVGp2qqtGyePsSuDafo4= -github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -122,16 +107,13 @@ github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6l github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.19.45/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.31.13/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.33.5 h1:p2fr1ryvNTU6avUWLI+/H7FGv0TBIjzVM5WDgXBBv4U= github.com/aws/aws-sdk-go v1.33.5/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.34.30 h1:izATc/E0+HcT5YHmaQVjn7GHCoqaBxn0PGo6Zq5UNFA= github.com/aws/aws-sdk-go v1.34.30/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -146,20 +128,12 @@ github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgIS github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/census-instrumentation/opencensus-proto v0.2.0 h1:LzQXZOgg4CQfE6bFvXGM30YZL1WW/M337pXml+GrcZ4= github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chrislusf/raft v1.0.4 h1:THhbsVik2hxdE0/VXX834f64Wn9RzgVPp+E+XCWZdKM= -github.com/chrislusf/raft v1.0.4/go.mod h1:Ep5DP+mJSosjfKiix1uU7Lc2Df/SX4oGJEpZlXH5l68= -github.com/chrislusf/raft v1.0.5 h1:g8GxKCSStfm0/bGBDpNEbmEXL6MJkpXX+NI0ksbX5D4= -github.com/chrislusf/raft v1.0.5/go.mod h1:Ep5DP+mJSosjfKiix1uU7Lc2Df/SX4oGJEpZlXH5l68= -github.com/chrislusf/raft v1.0.6 h1:wunb85WWhMKhNRn7EmdIw35D4Lmew0ZJv8oYDizR/+Y= -github.com/chrislusf/raft v1.0.6/go.mod h1:Ep5DP+mJSosjfKiix1uU7Lc2Df/SX4oGJEpZlXH5l68= github.com/chrislusf/raft v1.0.7 h1:reybAIwnQOTSgTj1YgflbJFWLSN0KVQSxe8gDZYa04o= github.com/chrislusf/raft v1.0.7/go.mod h1:Ep5DP+mJSosjfKiix1uU7Lc2Df/SX4oGJEpZlXH5l68= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -171,11 +145,8 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -183,7 +154,6 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0 h1:XJIw/+VlJ+87J+doOxznsAWIdmWuViOVhkQamW5YV28= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= @@ -202,7 +172,6 @@ github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44am github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q= github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= @@ -229,18 +198,15 @@ github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+ne github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fclairamb/ftpserverlib v0.8.0 h1:ZsWUQ8Vg3Y8LIWRUAzVnFXY982Yztz2odDdK/UVJtik= github.com/fclairamb/ftpserverlib v0.8.0/go.mod h1:xF4cy07oCHA9ZorKehsFGqA/1UHYaonmqHK2g3P1X8U= -github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.7.2 h1:2QxQoC1TS09S7fhCPsrvqYdvP1H5M1P1ih5ABm3BTYk= github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-errors/errors v1.1.1 h1:ljK/pL5ltg3qoN+OtN6yCv9HWSfMwxSx90GJCZQxYNg= github.com/go-errors/errors v1.1.1/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs= @@ -260,8 +226,6 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-redis/redis/v8 v8.4.4 h1:fGqgxCTR1sydaKI00oQf3OmkU/DIe/I/fYXvGklCIuc= github.com/go-redis/redis/v8 v8.4.4/go.mod h1:nA0bQuF0i5JFx4Ta9RZxGKXFrQ8cRWntra97f0196iY= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= @@ -298,16 +262,12 @@ github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48 h1:X+zN6RZXsvnrSJaAIQhZezPfAfvsqihKKR8oiLHid34= github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= @@ -321,7 +281,6 @@ github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= @@ -331,9 +290,7 @@ github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:x github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= @@ -345,17 +302,12 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -379,8 +331,6 @@ github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.3.0 h1:imGQZGEVEHpje5056+K+cgdO72p0LQv2xIIFXNGUf60= -github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s= github.com/google/wire v0.4.0 h1:kXcsA/rIGzJImVqPdhfnr6q0xsS9gU0515q1EPpJ9fE= github.com/google/wire v0.4.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww= @@ -395,20 +345,15 @@ github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 h1:Iju5GlWwrvL6UBg4zJJt3btmonfrMlCDdsejg4CZE7c= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 h1:z53tR0945TRRQO/fLEVPI6SMv7ZflF0TEaTAoU7tOzg= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.0 h1:bM6ZAFZmc/wPFaRDi0d5L7hGEZEx/2u+Tmr2evNHDiI= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.11.0 h1:aT5ISUniaOTErogCQ+4pGoYNBB6rm6Fq3g1v8QwYGas= github.com/grpc-ecosystem/grpc-gateway v1.11.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= @@ -430,7 +375,6 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= @@ -438,22 +382,18 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03 h1:FUwcHNlEqkqLjLBdCp5PRlCFijNjvcYANOZXzCfXwCM= github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem8= github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jinzhu/copier v0.2.8 h1:N8MbL5niMwE3P4dOwurJixz5rMkKfujmMRFmAanSzWE= github.com/jinzhu/copier v0.2.8/go.mod h1:24xnZezI2Yqac9J61UC6/dG/k76ttpq0DdJI3QmUvro= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= @@ -464,10 +404,8 @@ github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -477,12 +415,8 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/karlseguin/ccache v2.0.3+incompatible h1:j68C9tWOROiOLWTS/kCGg9IcJG+ACqn5+0+t8Oh83UU= -github.com/karlseguin/ccache v2.0.3+incompatible/go.mod h1:CM9tNPzT6EdRh14+jiW8mEF9mkNZuuE51qmgGYUB93w= github.com/karlseguin/ccache/v2 v2.0.7 h1:y5Pfi4eiyYCOD6LS/Kj+o6Nb4M5Ngpw9qFQs+v44ZYM= github.com/karlseguin/ccache/v2 v2.0.7/go.mod h1:2BDThcfQMf/c0jnZowt16eW405XIqZPavt+HoYEtcxQ= -github.com/karlseguin/expect v1.0.1 h1:z4wy4npwwHSWKjGWH85WNJO42VQhovxTCZDSzhjo8hY= -github.com/karlseguin/expect v1.0.1/go.mod h1:zNBxMY8P21owkeogJELCLeHIt+voOSduHYTFUbwRAV8= github.com/karlseguin/expect v1.0.2-0.20190806010014-778a5f0c6003 h1:vJ0Snvo+SLMY72r5J4sEfkuE7AFbixEP2qRbEcum/wA= github.com/karlseguin/expect v1.0.2-0.20190806010014-778a5f0c6003/go.mod h1:zNBxMY8P21owkeogJELCLeHIt+voOSduHYTFUbwRAV8= github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= @@ -492,9 +426,7 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:C github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.9.5 h1:U+CaK85mrNNb4k8BNOfgJtJ/gr6kswUCFj6miSzVC6M= github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.10.9 h1:pPRt1Z78crspaHISkpSSHjDlx+Tt9suHe519dsI0vF4= github.com/klauspost/compress v1.10.9/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= @@ -503,9 +435,7 @@ github.com/klauspost/crc32 v1.2.0 h1:0VuyqOCruD33/lJ/ojXNvzVyl8Zr5zdTmj9l9qLZ86I github.com/klauspost/crc32 v1.2.0/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/reedsolomon v1.9.2 h1:E9CMS2Pqbv+C7tsrYad4YC9MfhnMVWhMRsTi7U0UB18= github.com/klauspost/reedsolomon v1.9.2/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4= -github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -519,16 +449,11 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kurin/blazer v0.5.3 h1:SAgYv0TKU0kN/ETfO5ExjNAPyMt2FocO2s/UlCHfjAk= github.com/kurin/blazer v0.5.3/go.mod h1:4FCXMUWo9DllR2Do4TtBd377ezyAJ51vB5uTBjt0pGU= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.0 h1:Zx5DJFEYQXio93kgXnQ09fXNiUKsqv4OUEu2UtGcB1E= github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lunixbochs/vtclean v1.0.0 h1:xu2sLAri4lGiovBDQKxl5mrXyESr3gUr5m5SM5+LVb8= -github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -537,24 +462,19 @@ github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7 github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149 h1:HfxbT6/JcvIljmERptWhwa8XzP7H3T+Z2N26gTsaDaA= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.0-20190805055040-f9202b1cfdeb h1:hXqqXzQtJbENrsb+rsIqkVqcg4FUJL0SQFGw08Dgivw= -github.com/mattn/go-ieproxy v0.0.0-20190805055040-f9202b1cfdeb/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI= github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -579,24 +499,18 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nats-io/jwt v0.2.6/go.mod h1:mQxQ0uHQ9FhEVPIcTSKwx2lqZEpXWWcCgA7R6NrWvvY= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2 h1:+RB5hMpXUUA2dfxuhBTEkMOrYmM+gKIZYS1KjSostMI= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= github.com/nats-io/jwt v1.0.1 h1:71ivoESdfT2K/qDiw5YwX/3W9/dR7c+m83xiGOj/EZ4= github.com/nats-io/jwt v1.0.1/go.mod h1:n3cvmLfBfnpV4JJRN7lRYCyZnw48ksGsbThGXEk4w9M= github.com/nats-io/nats-server/v2 v2.0.0/go.mod h1:RyVdsHHvY4B6c9pWG+uRLpZ0h0XsqiuKp2XCTurP5LI= github.com/nats-io/nats-server/v2 v2.1.2 h1:i2Ly0B+1+rzNZHHWtD4ZwKi+OU5l+uQo1iDHZ2PmiIc= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.8.1 h1:6lF/f1/NN6kzUDBz6pyvQDEXO39jqXcWRLu/tKjtOUQ= github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= -github.com/nats-io/nats.go v1.9.1 h1:ik3HbLhZ0YABLto7iX80pZLPw/6dx3T+++MZJwLnMrQ= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nats.go v1.10.0 h1:L8qnKaofSfNFbXg0C5F71LdjPRnmQwSsA4ukmkt1TvY= github.com/nats-io/nats.go v1.10.0/go.mod h1:AjGArbfyR50+afOUotNX2Xs5SYHf+CoOa5HH1eEl2HE= -github.com/nats-io/nkeys v0.0.2 h1:+qM7QpgXnvDDixitZtQUBDY9w/s9mu1ghS+JIbsrx6M= github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= -github.com/nats-io/nkeys v0.1.0 h1:qMd4+pRHgdr1nAClu+2h/2a5F2TmKcCzjCDazVgRoX4= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3 h1:6JrEfig+HzTH85yxzhSVbjHRJv9cn0p6n3IngIcM5/k= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.4/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= github.com/nats-io/nkeys v0.2.0 h1:WXKF7diOaPU9cJdLD7nuzwasQy9vT1tBqzXZZf3AMJM= @@ -612,12 +526,10 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v github.com/olivere/elastic/v7 v7.0.19 h1:w4F6JpqOISadhYf/n0NR1cNj73xHqh4pzPwD1Gkidts= github.com/olivere/elastic/v7 v7.0.19/go.mod h1:4Jqt5xvjqpjCqgnTcHwl3j8TLs8mvoOK8NYgo/qEOu4= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= @@ -636,7 +548,6 @@ github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.4.0 h1:u3Z1r+oOXJIkxqw34zVhyPgjBsm6X2wn21NWs/HfSeg= github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= @@ -649,7 +560,6 @@ github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi github.com/pierrec/lz4 v2.2.7+incompatible h1:Eerk9aiqeZo2QzsbWOAsELUf9ddvAxEdMY9LYze/DEc= github.com/pierrec/lz4 v2.2.7+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -663,29 +573,22 @@ github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0 h1:miYCvYqFXtl/J9FIy8eNpBfYthAEFg+Ys0XyUVEcDsc= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0 h1:ElTg5tNp4DqfV7UQjDqv2+RJlNzsDtvNAWccbItceIE= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= @@ -693,17 +596,12 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= -github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a h1:9ZKAASQSHhDYGoxY8uLVpewe1GDZ2vu2Tr/vTdVAkFQ= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563 h1:dY6ETXrvDG7Sa4vE8ZQG4yqWg6UnOcbqTAahkV813vQ= github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -717,22 +615,6 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seaweedfs/fuse v1.0.8 h1:HBPJTC77OlxwSd2JiTwvLPn8bWTElqQp3xs9vf3C15s= -github.com/seaweedfs/fuse v1.0.8/go.mod h1:W7ubwr1l7KQsMeUpxFFOFOSxUL/ucTRMAlVYs4xdfQ8= -github.com/seaweedfs/fuse v1.0.9 h1:3JZoGsW7cmmrd/U5KYcIGR2+EqyBvCYCoCpEdZAz/Dc= -github.com/seaweedfs/fuse v1.0.9/go.mod h1:+PP6WlkrRUG6KPE+Th2EX5To/PjHaFsvqg/UgQ39aj8= -github.com/seaweedfs/fuse v1.1.0 h1:cL1qPHFNtFv0UuJTLjKKgWDzfJ4iZzTa4Y7ipc2acGw= -github.com/seaweedfs/fuse v1.1.0/go.mod h1:+PP6WlkrRUG6KPE+Th2EX5To/PjHaFsvqg/UgQ39aj8= -github.com/seaweedfs/fuse v1.1.1 h1:WD51YFJcBViOx8I89jeqPD+vAKl4EowzBy9GUw0plb0= -github.com/seaweedfs/fuse v1.1.1/go.mod h1:+PP6WlkrRUG6KPE+Th2EX5To/PjHaFsvqg/UgQ39aj8= -github.com/seaweedfs/fuse v1.1.3 h1:0DddotXwSRGbYG2kynoJyr8GHCy30Z2SpdhP3vdyijY= -github.com/seaweedfs/fuse v1.1.3/go.mod h1:+PP6WlkrRUG6KPE+Th2EX5To/PjHaFsvqg/UgQ39aj8= -github.com/seaweedfs/fuse v1.1.4 h1:YYqkK86agMhXRSwR+wFbRI8ikMgk3kL6PNTna1MAHyQ= -github.com/seaweedfs/fuse v1.1.4/go.mod h1:+PP6WlkrRUG6KPE+Th2EX5To/PjHaFsvqg/UgQ39aj8= -github.com/seaweedfs/fuse v1.1.5 h1:wyuRh/mDvrvt8ZLDS7YdPSe6nczniSx4sQFs/Jonveo= -github.com/seaweedfs/fuse v1.1.5/go.mod h1:+PP6WlkrRUG6KPE+Th2EX5To/PjHaFsvqg/UgQ39aj8= -github.com/seaweedfs/fuse v1.1.6 h1:kvCqaIsCEaYOBw5r8kJPUs9GcbwlIKcScnkPLT7HLuQ= -github.com/seaweedfs/fuse v1.1.6/go.mod h1:+PP6WlkrRUG6KPE+Th2EX5To/PjHaFsvqg/UgQ39aj8= github.com/seaweedfs/fuse v1.1.7 h1:T4L5c/Sn+q8lE+0zCmH2MWvIO+B5TttWOSqK5KQPRMQ= github.com/seaweedfs/fuse v1.1.7/go.mod h1:+PP6WlkrRUG6KPE+Th2EX5To/PjHaFsvqg/UgQ39aj8= github.com/seaweedfs/goexif v1.0.2 h1:p+rTXYdQ2mgxd+1JaTrQ9N8DvYuw9UH9xgYmJ+Bb29E= @@ -740,13 +622,10 @@ github.com/seaweedfs/goexif v1.0.2/go.mod h1:MrKs5LK0HXdffrdCZrW3OIMegL2xXpC6ThL github.com/secsy/goftp v0.0.0-20190720192957-f31499d7c79a h1:C6IhVTxNkhlb0tlCB6JfHOUv1f0xHPK7V8X4HlJZEJw= github.com/secsy/goftp v0.0.0-20190720192957-f31499d7c79a/go.mod h1:MnkX001NG75g3p8bhFycnyIjeQoOjGL6CEIsdE/nKSY= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q= github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -763,14 +642,12 @@ github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.3.1 h1:GPTpEAuNr98px18yNQ66JllNil98wfRZ/5Ukny8FeQA= github.com/spf13/afero v1.3.1/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -779,24 +656,18 @@ github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94 h1:0ngsPmuP6XIjiFRNFYlvKwSr5zff2v+uPHaffZ6/M4k= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271 h1:WhxRHzgeVGETMlmVfqhRn8RIeeNoPr2Czh33I4Zdccw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20200108173154-1c71cc93ed71 h1:2MR0pKUzlP3SGgj5NYJe/zRYDwOu9ku6YHy+Iw7l5DM= github.com/streadway/amqp v0.0.0-20200108173154-1c71cc93ed71/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -815,15 +686,11 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tsuna/gohbase v0.0.0-20201125011725-348991136365 h1:6iRwZdrFUzbcVYZwa8dXTIILGIxmmhjyUPJEcwzPGaU= github.com/tsuna/gohbase v0.0.0-20201125011725-348991136365/go.mod h1:zj0GJHGvyf1ed3Jm/Tb4830c/ZKDq+YoLsCt2rGQuT0= -github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.20.0 h1:olTmcnLQeZrkBc4TVgE/BatTo1NE/IvW050AuD8SW+U= -github.com/valyala/fasthttp v1.20.0/go.mod h1:jjraHZVbKOXftJfsOYoAjaeygpj5hr8ermTRJNroD7A= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/viant/assertly v0.5.4 h1:5Hh4U3pLZa6uhCFAGpYOxck/8l9TZczEzoHNfJAhHEQ= github.com/viant/assertly v0.5.4/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/ptrie v0.3.0 h1:SDaRd7Gqr1+ItCNz0GpTxRdK21nOfqjV6YtBm9jGlMY= @@ -847,7 +714,6 @@ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1: github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= @@ -859,7 +725,6 @@ go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -867,33 +732,24 @@ go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opentelemetry.io/otel v0.15.0 h1:CZFy2lPhxd4HlhZnYK8gRyDotksO3Ip9rBweY1vVYJw= go.opentelemetry.io/otel v0.15.0/go.mod h1:e4GKElweB8W2gWUqbghw0B8t5MCTccc9212eNHnOHwA= -go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -gocloud.dev v0.16.0 h1:hWeaQWxamGerwsU7B9xSWvUjx0p7TwG8fcHro2TzbbM= -gocloud.dev v0.16.0/go.mod h1:xWGXD8t7bEhqPIuyAUFyXV9qHn+PvEY2F2GKPh7i/O0= gocloud.dev v0.20.0 h1:mbEKMfnyPV7W1Rj35R1xXfjszs9dXkwSOq2KoFr25g8= gocloud.dev v0.20.0/go.mod h1:+Y/RpSXrJthIOM8uFNzWp6MRu9pFPNFEEZrQMxpkfIc= -gocloud.dev/pubsub/natspubsub v0.16.0 h1:MoBGXULDzb1fVaZsGWO5cUCgr6yoI/DHhau8OPGaGEI= -gocloud.dev/pubsub/natspubsub v0.16.0/go.mod h1:0n7pT7PkLMClBUHDrOkHfOFVr/o/6kawNMwsyAbwadI= gocloud.dev/pubsub/natspubsub v0.20.0 h1:DsOXYKfcSTh0SHKwuhpQAJmPLDj3+ARvYgBIupVPClE= gocloud.dev/pubsub/natspubsub v0.20.0/go.mod h1:Zh7v7Q1DZjAoBwsavZLdvinMIO1eYE0PJTllMuX3VGA= -gocloud.dev/pubsub/rabbitpubsub v0.16.0 h1:Bkv2njMSl2tmT3tGbvbwpiIDAXBIpqzP9dmts+rhD4E= -gocloud.dev/pubsub/rabbitpubsub v0.16.0/go.mod h1:JJVdUUIqwgaaMJg/1xHQza0g4sI/4KHHSNiGE+pn4JM= gocloud.dev/pubsub/rabbitpubsub v0.20.0 h1:hwupxLvWG8jTPNQ+9Q/YWZzyMagL9blTwWYYhoW4pco= gocloud.dev/pubsub/rabbitpubsub v0.20.0/go.mod h1:xYCXmI3ixWuCW4s1KqyZpgKT90MMjdXdMlb0Kgmd7TM= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -904,13 +760,10 @@ golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaE golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5 h1:58fnuSXlxZmFdJyvtTFVmVhcMLU6v5fEb/ok4wyqtNU= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc h1:c0o/qxkaO2LF5t6fQrT4b5hzyggAkLLlCUjqfRxd8Q4= golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -927,7 +780,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067 h1:KYGJGHOQy8oSi1fDlSpcZF0+juKwk/hEMv5SiwHogR0= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -939,7 +791,6 @@ golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTk golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= @@ -978,7 +829,6 @@ golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -991,14 +841,12 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201016165138-7b1cca2348c0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= @@ -1008,13 +856,9 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200930132711-30421366ff76 h1:JnxiSYT3Nm0BT2a8CyvYyM6cnrWpidecD1UuSYbhKm0= -golang.org/x/sync v0.0.0-20200930132711-30421366ff76/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1027,7 +871,6 @@ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1037,8 +880,6 @@ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0 h1:HyfiK1WMnHj5FXFXatD+Qs1A/xC2Run6RzeW1SyHxpc= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1053,7 +894,6 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1071,23 +911,18 @@ golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201022201747-fb209a7c41cd h1:WgqgiQvkiZWz7XLhphjt2GI2GcGCTIZs9jqXMWmH+oc= -golang.org/x/sys v0.0.0-20201022201747-fb209a7c41cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40 h1:JWgyZ1qgdTaF3N3oxC+MdTV7qvEEgHo3otj+HB5CM7Q= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1116,7 +951,6 @@ golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1125,7 +959,6 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114 h1:DnSr2mCsxyCE6ZgIkmcWUQY2R5cH/6wL7eIxEmQOMSE= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1145,26 +978,19 @@ golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200601175630-2caf76543d99/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200606014950-c42cb6316fb6/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200608174601-1b747fd94509 h1:MI14dOfl3OG6Zd32w3ugsrvcUO810fDZdWakTq39dH4= golang.org/x/tools v0.0.0-20200608174601-1b747fd94509/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78 h1:M8tBwCtWD/cZV9DZpFYRUgaymAYAr+aIUTWzDaM3uPs= golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.6.0/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= -google.golang.org/api v0.7.0 h1:9sdfJOzWlkqPltHAuzT2Cp+yrBeY1KRVYgms8soxMwM= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0 h1:jbyannxz0XFD3zdjgrSUsaJbgpH4eTrkdhRChkHPfO8= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= @@ -1181,10 +1007,7 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.2 h1:j8RI1yW0SkI+paT6uGwMlrMI/6zwYA6/CFil8rxOzGI= -google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= @@ -1195,9 +1018,7 @@ google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190620144150-6af8c5fc6601/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= @@ -1218,7 +1039,6 @@ google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200603110839-e855014d5736/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482 h1:i+Aiej6cta/Frzp13/swvwz5O00kYcSe0A/C5Wd7zX8= @@ -1230,12 +1050,9 @@ google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiq google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= @@ -1249,14 +1066,11 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.26.0-rc.1 h1:7QnIQpGRHE5RnLKnESfDoxm2dTapTZua5a0kS0A+VXQ= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1264,7 +1078,6 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/dutchcoders/goftp.v1 v1.0.0-20170301105846-ed59a591ce14 h1:tHqNpm9sPaE6BSuMLXBzgTwukQLdBEt4OYU2coQjEQQ= gopkg.in/dutchcoders/goftp.v1 v1.0.0-20170301105846-ed59a591ce14/go.mod h1:nzmlZQ+UqB5+55CRTV/dOaiK8OrPl6Co96Ob8lH4Wxw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= @@ -1275,25 +1088,20 @@ gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= gopkg.in/jcmturner/goidentity.v3 v3.0.0 h1:1duIyWiTaYvVx3YX2CYtpJbUFd7/UuPYCfgXtQ3VTbI= gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.2.3 h1:hHMV/yKPwMnJhPuPx7pH2Uw/3Qyf+thJYlisUc44010= gopkg.in/jcmturner/gokrb5.v7 v7.2.3/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= gopkg.in/jcmturner/gokrb5.v7 v7.3.0 h1:0709Jtq/6QXEuWRfAm260XqlpcwL1vxtO1tUE2qK8Z4= gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= gopkg.in/jcmturner/rpc.v1 v1.1.0 h1:QHIUxTX1ISuAv9dD2wJ9HWQVuWDX/Zc0PfeC2tjc4rU= gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/karlseguin/expect.v1 v1.0.1 h1:9u0iUltnhFbJTHaSIH0EP+cuTU5rafIgmcsEsg2JQFw= -gopkg.in/karlseguin/expect.v1 v1.0.1/go.mod h1:uB7QIJBcclvYbwlUDkSCsGjAOMis3fP280LyhuDEf2I= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1304,7 +1112,6 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8= @@ -1317,11 +1124,11 @@ modernc.org/cc/v3 v3.33.5/go.mod h1:0R6jl1aZlIl2avnYfbfHBS1QB6/f+16mihBObaBC878= modernc.org/ccgo/v3 v3.9.2/go.mod h1:gnJpy6NIVqkETT+L5zPsQFj7L2kkhfPMzOghRNv/CFo= modernc.org/ccgo/v3 v3.9.4 h1:mt2+HyTZKxva27O6T4C9//0xiNQ/MornL3i8itM5cCs= modernc.org/ccgo/v3 v3.9.4/go.mod h1:19XAY9uOrYnDhOgfHwCABasBvK69jgC4I8+rizbk3Bc= +modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= modernc.org/libc v1.7.13-0.20210308123627-12f642a52bb8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= modernc.org/libc v1.9.5 h1:zv111ldxmP7DJ5mOIqzRbza7ZDl3kh4ncKfASB2jIYY= modernc.org/libc v1.9.5/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= -modernc.org/mathutil v1.1.1 h1:FeylZSVX8S+58VsyJlkEj2bcpdytmp9MmDKZkKx8OIE= modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.2.2 h1:+yFk8hBprV+4c0U9GjFtL+dV3N8hOJ8JCituQcMShFY= modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= @@ -1333,12 +1140,13 @@ modernc.org/sqlite v1.10.7 h1:B4ITfAx3HxSxOOKZqKhw4vnrhM+kTY1HoJf2L7PQBCQ= modernc.org/sqlite v1.10.7/go.mod h1:GXpJIZPNgRGqG0inyYDW18j9YpBpFUBn/weGI63hLLs= modernc.org/strutil v1.1.0 h1:+1/yCzZxY2pZwwrsbH+4T7BQMoLQ9QiBshRC9eicYsc= modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/tcl v1.5.2 h1:sYNjGr4zK6cDH74USl8wVJRrvDX6UOLpG0j4lFvR0W0= modernc.org/tcl v1.5.2/go.mod h1:pmJYOLgpiys3oI4AeAafkcUfE+TKKilminxNyU/+Zlo= modernc.org/token v1.0.0 h1:a0jaWiNMDhDUtqOj09wvjWWAqd3q7WpBulmL9H2egsk= modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.0.1-0.20210308123920-1f282aa71362/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA= +modernc.org/z v1.0.1 h1:WyIDpEpAIx4Hel6q/Pcgj/VhaQV5XPJ2I6ryIYbjnpc= modernc.org/z v1.0.1/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA= -pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/weed/server/filer_server_handlers_read.go b/weed/server/filer_server_handlers_read.go index ea0650ed8..153f68f8f 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -40,7 +40,7 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, stats.FilerRequestCounter.WithLabelValues("read.notfound").Inc() w.WriteHeader(http.StatusNotFound) } else { - glog.V(0).Infof("Internal %s: %v", path, err) + glog.Errorf("Internal %s: %v", path, err) stats.FilerRequestCounter.WithLabelValues("read.internalerror").Inc() w.WriteHeader(http.StatusInternalServerError) } From c2e0a75c1fbaf6abcaa8717bfcfea03b4077ebff Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 24 Jun 2021 12:46:00 -0700 Subject: [PATCH 040/265] adjust logs --- weed/command/filer_sync.go | 2 +- weed/server/filer_grpc_server_sub_meta.go | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/weed/command/filer_sync.go b/weed/command/filer_sync.go index 52fc0b477..211c34aea 100644 --- a/weed/command/filer_sync.go +++ b/weed/command/filer_sync.go @@ -197,7 +197,7 @@ func doSubscribeFilerMetaChanges(grpcDialOption grpc.DialOption, sourceFiler, so counter++ if lastWriteTime.Add(3 * time.Second).Before(time.Now()) { - glog.V(0).Infof("sync %s => %s progressed to %v %0.2f/sec", sourceFiler, targetFiler, time.Unix(0, resp.TsNs), float64(counter)/float64(3)) + glog.V(0).Infof("sync %s to %s progressed to %v %0.2f/sec", sourceFiler, targetFiler, time.Unix(0, resp.TsNs), float64(counter)/float64(3)) counter = 0 lastWriteTime = time.Now() if err := setOffset(grpcDialOption, targetFiler, SyncKeyPrefix, sourceFilerSignature, resp.TsNs); err != nil { diff --git a/weed/server/filer_grpc_server_sub_meta.go b/weed/server/filer_grpc_server_sub_meta.go index d9f91b125..ea481f56a 100644 --- a/weed/server/filer_grpc_server_sub_meta.go +++ b/weed/server/filer_grpc_server_sub_meta.go @@ -34,6 +34,8 @@ func (fs *FilerServer) SubscribeMetadata(req *filer_pb.SubscribeMetadataRequest, for { + glog.V(0).Infof("read on disk %v aggregated subscribe %s from %+v", clientName, req.PathPrefix, lastReadTime) + processedTsNs, err = fs.filer.ReadPersistedLogBuffer(lastReadTime, eachLogEntryFn) if err != nil { return fmt.Errorf("reading from persisted logs: %v", err) @@ -43,6 +45,8 @@ func (fs *FilerServer) SubscribeMetadata(req *filer_pb.SubscribeMetadataRequest, lastReadTime = time.Unix(0, processedTsNs) } + glog.V(0).Infof("read in memory %v aggregated subscribe %s from %+v", clientName, req.PathPrefix, lastReadTime) + lastReadTime, err = fs.filer.MetaAggregator.MetaLogBuffer.LoopProcessLogData(lastReadTime, func() bool { fs.filer.MetaAggregator.ListenersLock.Lock() fs.filer.MetaAggregator.ListenersCond.Wait() @@ -85,6 +89,7 @@ func (fs *FilerServer) SubscribeLocalMetadata(req *filer_pb.SubscribeMetadataReq for { // println("reading from persisted logs ...") + glog.V(0).Infof("read on disk %v local subscribe %s from %+v", clientName, req.PathPrefix, lastReadTime) processedTsNs, err = fs.filer.ReadPersistedLogBuffer(lastReadTime, eachLogEntryFn) if err != nil { return fmt.Errorf("reading from persisted logs: %v", err) @@ -93,9 +98,8 @@ func (fs *FilerServer) SubscribeLocalMetadata(req *filer_pb.SubscribeMetadataReq if processedTsNs != 0 { lastReadTime = time.Unix(0, processedTsNs) } - // glog.V(0).Infof("after local log reads, %v local subscribe %s from %+v", clientName, req.PathPrefix, lastReadTime) - // println("reading from in memory logs ...") + glog.V(0).Infof("read in memory %v local subscribe %s from %+v", clientName, req.PathPrefix, lastReadTime) lastReadTime, err = fs.filer.LocalMetaLogBuffer.LoopProcessLogData(lastReadTime, func() bool { fs.listenersLock.Lock() From 9dd09bbb332e5e12d7a20df560edafb7c800ddc9 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 24 Jun 2021 17:22:53 -0700 Subject: [PATCH 041/265] refactor --- weed/shell/command_volume_fsck.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/weed/shell/command_volume_fsck.go b/weed/shell/command_volume_fsck.go index 1fbc9ad35..d6c9e796f 100644 --- a/weed/shell/command_volume_fsck.go +++ b/weed/shell/command_volume_fsck.go @@ -92,6 +92,12 @@ func (c *commandVolumeFsck) Do(args []string, commandEnv *CommandEnv, writer io. } // volume file ids substract filer file ids + err = c.findExtraChunksInVolumeServers(volumeIdToVInfo, tempFolder, writer, verbose, applyPurging) + + return err +} + +func (c *commandVolumeFsck) findExtraChunksInVolumeServers(volumeIdToVInfo map[uint32]VInfo, tempFolder string, writer io.Writer, verbose *bool, applyPurging *bool) (error) { var totalInUseCount, totalOrphanChunkCount, totalOrphanDataSize uint64 for volumeId, vinfo := range volumeIdToVInfo { inUseCount, orphanFileIds, orphanDataSize, checkErr := c.oneVolumeFileIdsSubtractFilerFileIds(tempFolder, volumeId, writer, *verbose) @@ -112,7 +118,7 @@ func (c *commandVolumeFsck) Do(args []string, commandEnv *CommandEnv, writer io. if vinfo.isEcVolume { fmt.Fprintf(writer, "Skip purging for Erasure Coded volumes.\n") } - if err = c.purgeFileIdsForOneVolume(volumeId, orphanFileIds, writer); err != nil { + if err := c.purgeFileIdsForOneVolume(volumeId, orphanFileIds, writer); err != nil { return fmt.Errorf("purge for volume %d: %v\n", volumeId, err) } } @@ -130,7 +136,6 @@ func (c *commandVolumeFsck) Do(args []string, commandEnv *CommandEnv, writer io. fmt.Fprintf(writer, "This could be normal if multiple filers or no filers are used.\n") } - return nil } From 1cac2f2278b2344ac41ac882c7b21593f212d3bd Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 24 Jun 2021 23:56:24 -0700 Subject: [PATCH 042/265] shell: volume.fsck checks missing chunks in filer fix https://github.com/chrislusf/seaweedfs/issues/2154 --- weed/shell/command_volume_fsck.go | 165 ++++++++++++++++++++++++++++-- 1 file changed, 155 insertions(+), 10 deletions(-) diff --git a/weed/shell/command_volume_fsck.go b/weed/shell/command_volume_fsck.go index d6c9e796f..400e96fe7 100644 --- a/weed/shell/command_volume_fsck.go +++ b/weed/shell/command_volume_fsck.go @@ -1,6 +1,7 @@ package shell import ( + "bufio" "context" "flag" "fmt" @@ -44,6 +45,12 @@ func (c *commandVolumeFsck) Help() string { 2. collect all file ids from the filer, as set B 3. find out the set A subtract B + If -findMissingChunksInFiler is enabled, this works + in a reverse way: + 1. collect all file ids from all volumes, as set A + 2. collect all file ids from the filer, as set B + 3. find out the set B subtract A + ` } @@ -55,6 +62,7 @@ func (c *commandVolumeFsck) Do(args []string, commandEnv *CommandEnv, writer io. fsckCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) verbose := fsckCommand.Bool("v", false, "verbose mode") + findMissingChunksInFiler := fsckCommand.Bool("findMissingChunksInFiler", false, "see help volume.fsck") applyPurging := fsckCommand.Bool("reallyDeleteFromVolume", false, " delete data not referenced by the filer") if err = fsckCommand.Parse(args); err != nil { return nil @@ -86,21 +94,105 @@ func (c *commandVolumeFsck) Do(args []string, commandEnv *CommandEnv, writer io. } } - // collect all filer file ids - if err = c.collectFilerFileIds(tempFolder, volumeIdToVInfo, *verbose, writer); err != nil { - return fmt.Errorf("failed to collect file ids from filer: %v", err) + if *findMissingChunksInFiler { + // collect all filer file ids and paths + if err = c.collectFilerFileIdAndPaths(volumeIdToVInfo, tempFolder, writer, *verbose, applyPurging); err != nil { + return fmt.Errorf("collectFilerFileIdAndPaths: %v", err) + } + // for each volume, check filer file ids + if err = c.findFilerChunksMissingInVolumeServers(volumeIdToVInfo, tempFolder, writer, *verbose, applyPurging); err != nil { + return fmt.Errorf("findExtraChunksInVolumeServers: %v", err) + } + } else { + // collect all filer file ids + if err = c.collectFilerFileIds(tempFolder, volumeIdToVInfo, *verbose, writer); err != nil { + return fmt.Errorf("failed to collect file ids from filer: %v", err) + } + // volume file ids substract filer file ids + if err = c.findExtraChunksInVolumeServers(volumeIdToVInfo, tempFolder, writer, *verbose, applyPurging); err != nil { + return fmt.Errorf("findExtraChunksInVolumeServers: %v", err) + } } - // volume file ids substract filer file ids - err = c.findExtraChunksInVolumeServers(volumeIdToVInfo, tempFolder, writer, verbose, applyPurging) - - return err + return nil } -func (c *commandVolumeFsck) findExtraChunksInVolumeServers(volumeIdToVInfo map[uint32]VInfo, tempFolder string, writer io.Writer, verbose *bool, applyPurging *bool) (error) { +func (c *commandVolumeFsck) collectFilerFileIdAndPaths(volumeIdToServer map[uint32]VInfo, tempFolder string, writer io.Writer, verbose bool, applyPurging *bool) error { + + if verbose { + fmt.Fprintf(writer, "checking each file from filer ...\n") + } + + files := make(map[uint32]*os.File) + for vid := range volumeIdToServer { + dst, openErr := os.OpenFile(getFilerFileIdFile(tempFolder, vid), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) + if openErr != nil { + return fmt.Errorf("failed to create file %s: %v", getFilerFileIdFile(tempFolder, vid), openErr) + } + files[vid] = dst + } + defer func() { + for _, f := range files { + f.Close() + } + }() + + type Item struct { + vid uint32 + fileKey uint64 + cookie uint32 + path util.FullPath + } + return doTraverseBfsAndSaving(c.env, nil, "/", false, func(outputChan chan interface{}) { + buffer := make([]byte, 8) + for item := range outputChan { + i := item.(*Item) + if f, ok := files[i.vid]; ok { + util.Uint64toBytes(buffer, i.fileKey) + f.Write(buffer) + util.Uint32toBytes(buffer, i.cookie) + util.Uint32toBytes(buffer[4:], uint32(len(i.path))) + f.Write(buffer) + f.Write([]byte(i.path)) + } else { + fmt.Fprintf(writer, "%d,%x%08x %s volume not found\n", i.vid, i.fileKey, i.cookie, i.path) + } + } + }, func(entry *filer_pb.FullEntry, outputChan chan interface{}) (err error) { + dChunks, mChunks, resolveErr := filer.ResolveChunkManifest(filer.LookupFn(c.env), entry.Entry.Chunks) + if resolveErr != nil { + return nil + } + dChunks = append(dChunks, mChunks...) + for _, chunk := range dChunks { + outputChan <- &Item{ + vid: chunk.Fid.VolumeId, + fileKey: chunk.Fid.FileKey, + cookie: chunk.Fid.Cookie, + path: util.NewFullPath(entry.Dir, entry.Entry.Name), + } + } + return nil + }) + + return nil +} + +func (c *commandVolumeFsck) findFilerChunksMissingInVolumeServers(volumeIdToVInfo map[uint32]VInfo, tempFolder string, writer io.Writer, verbose bool, applyPurging *bool) error { + + for volumeId, vinfo := range volumeIdToVInfo { + checkErr := c.oneVolumeFileIdsCheckOneVolume(tempFolder, volumeId, writer, verbose) + if checkErr != nil { + return fmt.Errorf("failed to collect file ids from volume %d on %s: %v", volumeId, vinfo.server, checkErr) + } + } + return nil +} + +func (c *commandVolumeFsck) findExtraChunksInVolumeServers(volumeIdToVInfo map[uint32]VInfo, tempFolder string, writer io.Writer, verbose bool, applyPurging *bool) error { var totalInUseCount, totalOrphanChunkCount, totalOrphanDataSize uint64 for volumeId, vinfo := range volumeIdToVInfo { - inUseCount, orphanFileIds, orphanDataSize, checkErr := c.oneVolumeFileIdsSubtractFilerFileIds(tempFolder, volumeId, writer, *verbose) + inUseCount, orphanFileIds, orphanDataSize, checkErr := c.oneVolumeFileIdsSubtractFilerFileIds(tempFolder, volumeId, writer, verbose) if checkErr != nil { return fmt.Errorf("failed to collect file ids from volume %d on %s: %v", volumeId, vinfo.server, checkErr) } @@ -108,7 +200,7 @@ func (c *commandVolumeFsck) findExtraChunksInVolumeServers(volumeIdToVInfo map[u totalOrphanChunkCount += uint64(len(orphanFileIds)) totalOrphanDataSize += orphanDataSize - if *verbose { + if verbose { for _, fid := range orphanFileIds { fmt.Fprintf(writer, "%sxxxxxxxx\n", fid) } @@ -223,6 +315,59 @@ func (c *commandVolumeFsck) collectFilerFileIds(tempFolder string, volumeIdToSer }) } +func (c *commandVolumeFsck) oneVolumeFileIdsCheckOneVolume(tempFolder string, volumeId uint32, writer io.Writer, verbose bool) (err error) { + + db := needle_map.NewMemDb() + defer db.Close() + + if err = db.LoadFromIdx(getVolumeFileIdFile(tempFolder, volumeId)); err != nil { + return + } + + file := getFilerFileIdFile(tempFolder, volumeId) + fp, err := os.Open(file) + if err != nil { + return + } + defer fp.Close() + + type Item struct { + fileKey uint64 + cookie uint32 + path util.FullPath + } + + br := bufio.NewReader(fp) + buffer := make([]byte, 16) + item := &Item{} + var readSize int + for { + readSize, err = br.Read(buffer) + if err != nil || readSize != 16 { + if err == io.EOF { + return nil + } else { + break + } + } + + item.fileKey = util.BytesToUint64(buffer[:8]) + item.cookie = util.BytesToUint32(buffer[8:12]) + pathSize := util.BytesToUint32(buffer[12:16]) + pathBytes := make([]byte, int(pathSize)) + _, err = br.Read(pathBytes) + item.path = util.FullPath(string(pathBytes)) + + if _, found := db.Get(types.NeedleId(item.fileKey)); !found { + fmt.Fprintf(writer, "%d,%x%08x in %s not found\n", volumeId, item.fileKey, item.cookie, item.path) + } + + } + + return + +} + func (c *commandVolumeFsck) oneVolumeFileIdsSubtractFilerFileIds(tempFolder string, volumeId uint32, writer io.Writer, verbose bool) (inUseCount uint64, orphanFileIds []string, orphanDataSize uint64, err error) { db := needle_map.NewMemDb() From 8d70ba2eaab3394cd40bcc17db11eb2be188647a Mon Sep 17 00:00:00 2001 From: thephoenixofthevoid <49817252+thephoenixofthevoid@users.noreply.github.com> Date: Sat, 26 Jun 2021 10:50:03 +0300 Subject: [PATCH 043/265] Fix: Loosing environment variables at StartProcess --- weed/command/fuse.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/weed/command/fuse.go b/weed/command/fuse.go index b66487bdf..3949d8f70 100644 --- a/weed/command/fuse.go +++ b/weed/command/fuse.go @@ -195,7 +195,9 @@ func runFuse(cmd *Command, args []string) bool { arg0 := os.Args[0] argv := append(os.Args, "-o", "child") - attr := os.ProcAttr{} + attr := os.ProcAttr{} + attr.Env = os.Environ() + child, err := os.StartProcess(arg0, argv, &attr) if err != nil { @@ -211,11 +213,6 @@ func runFuse(cmd *Command, args []string) bool { return true } - // I don't know why PATH environment variable is lost - if err := os.Setenv("PATH", "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"); err != nil { - panic(fmt.Errorf("setenv: %s", err)) - } - // just call "weed mount" command return runMount(cmdMount, []string{}) } From cc7714fdbe4cce0eb8fd37915fa986064ffabdc1 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 27 Jun 2021 05:51:28 -0700 Subject: [PATCH 044/265] logging changes to debug --- .../load_test_meta_tail.go | 8 ++++++-- weed/filer/filer.go | 2 +- weed/filer/meta_aggregator.go | 3 ++- .../broker/broker_grpc_server_subscribe.go | 2 +- weed/messaging/broker/topic_manager.go | 2 +- weed/server/filer_grpc_server_sub_meta.go | 8 ++++---- weed/util/log_buffer/log_buffer.go | 19 +++++++++---------- weed/util/log_buffer/log_buffer_test.go | 4 ++-- weed/util/log_buffer/log_read.go | 14 ++++++-------- 9 files changed, 32 insertions(+), 30 deletions(-) diff --git a/unmaintained/load_test/load_test_meta_tail/load_test_meta_tail.go b/unmaintained/load_test/load_test_meta_tail/load_test_meta_tail.go index 98db80a05..53cb2f912 100644 --- a/unmaintained/load_test/load_test_meta_tail/load_test_meta_tail.go +++ b/unmaintained/load_test/load_test_meta_tail/load_test_meta_tail.go @@ -4,18 +4,20 @@ import ( "context" "flag" "fmt" + "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "google.golang.org/grpc" "io" "strconv" + "time" ) var ( dir = flag.String("dir", "/tmp", "directory to create files") n = flag.Int("n", 100, "the number of metadata") tailFiler = flag.String("filer", "localhost:8888", "the filer address") - isWrite = flag.Bool("write", false, "only write") + isWrite = flag.Bool("write", false, "only write") ) func main() { @@ -33,7 +35,7 @@ func main() { return nil } name := event.EventNotification.NewEntry.Name - fmt.Printf("=> %s\n", name) + glog.V(0).Infof("=> %s ts:%+v", name, time.Unix(0, event.TsNs)) id := name[4:] if x, err := strconv.Atoi(id); err == nil { if x != expected { @@ -43,6 +45,7 @@ func main() { } else { return err } + time.Sleep(10 * time.Millisecond) return nil }) @@ -96,6 +99,7 @@ func startSubscribeMetadata(eachEntryFunc func(event *filer_pb.SubscribeMetadata return listenErr } if err = eachEntryFunc(resp); err != nil { + glog.V(0).Infof("tail last record:%+v", time.Unix(0, lastTsNs)) return err } lastTsNs = resp.TsNs diff --git a/weed/filer/filer.go b/weed/filer/filer.go index 1bcf57fe7..3082d0f55 100644 --- a/weed/filer/filer.go +++ b/weed/filer/filer.go @@ -53,7 +53,7 @@ func NewFiler(masters []string, grpcDialOption grpc.DialOption, GrpcDialOption: grpcDialOption, FilerConf: NewFilerConf(), } - f.LocalMetaLogBuffer = log_buffer.NewLogBuffer(LogFlushInterval, f.logFlushFunc, notifyFn) + f.LocalMetaLogBuffer = log_buffer.NewLogBuffer("local", LogFlushInterval, f.logFlushFunc, notifyFn) f.metaLogCollection = collection f.metaLogReplication = replication diff --git a/weed/filer/meta_aggregator.go b/weed/filer/meta_aggregator.go index 241e99a1a..913cbd454 100644 --- a/weed/filer/meta_aggregator.go +++ b/weed/filer/meta_aggregator.go @@ -34,7 +34,7 @@ func NewMetaAggregator(filers []string, grpcDialOption grpc.DialOption) *MetaAgg grpcDialOption: grpcDialOption, } t.ListenersCond = sync.NewCond(&t.ListenersLock) - t.MetaLogBuffer = log_buffer.NewLogBuffer(LogFlushInterval, nil, func() { + t.MetaLogBuffer = log_buffer.NewLogBuffer("aggr", LogFlushInterval, nil, func() { t.ListenersCond.Broadcast() }) return t @@ -118,6 +118,7 @@ func (ma *MetaAggregator) subscribeToOneFiler(f *Filer, self string, peer string } for { + glog.V(4).Infof("subscribing remote %s meta change: %v", peer, time.Unix(0, lastTsNs)) err := pb.WithFilerClient(peer, ma.grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() diff --git a/weed/messaging/broker/broker_grpc_server_subscribe.go b/weed/messaging/broker/broker_grpc_server_subscribe.go index 3021473e5..d21fb351f 100644 --- a/weed/messaging/broker/broker_grpc_server_subscribe.go +++ b/weed/messaging/broker/broker_grpc_server_subscribe.go @@ -116,7 +116,7 @@ func (broker *MessageBroker) Subscribe(stream messaging_pb.SeaweedMessaging_Subs lastReadTime = time.Unix(0, processedTsNs) } - lastReadTime, err = lock.logBuffer.LoopProcessLogData(lastReadTime, func() bool { + lastReadTime, err = lock.logBuffer.LoopProcessLogData("broker", lastReadTime, func() bool { lock.Mutex.Lock() lock.cond.Wait() lock.Mutex.Unlock() diff --git a/weed/messaging/broker/topic_manager.go b/weed/messaging/broker/topic_manager.go index edddca813..c303c29b3 100644 --- a/weed/messaging/broker/topic_manager.go +++ b/weed/messaging/broker/topic_manager.go @@ -68,7 +68,7 @@ func (tm *TopicManager) buildLogBuffer(tl *TopicControl, tp TopicPartition, topi glog.V(0).Infof("log write failed %s: %v", targetFile, err) } } - logBuffer := log_buffer.NewLogBuffer(time.Minute, flushFn, func() { + logBuffer := log_buffer.NewLogBuffer("broker", time.Minute, flushFn, func() { tl.cond.Broadcast() }) diff --git a/weed/server/filer_grpc_server_sub_meta.go b/weed/server/filer_grpc_server_sub_meta.go index ea481f56a..23dc0bd59 100644 --- a/weed/server/filer_grpc_server_sub_meta.go +++ b/weed/server/filer_grpc_server_sub_meta.go @@ -34,7 +34,7 @@ func (fs *FilerServer) SubscribeMetadata(req *filer_pb.SubscribeMetadataRequest, for { - glog.V(0).Infof("read on disk %v aggregated subscribe %s from %+v", clientName, req.PathPrefix, lastReadTime) + glog.V(4).Infof("read on disk %v aggregated subscribe %s from %+v", clientName, req.PathPrefix, lastReadTime) processedTsNs, err = fs.filer.ReadPersistedLogBuffer(lastReadTime, eachLogEntryFn) if err != nil { @@ -45,9 +45,9 @@ func (fs *FilerServer) SubscribeMetadata(req *filer_pb.SubscribeMetadataRequest, lastReadTime = time.Unix(0, processedTsNs) } - glog.V(0).Infof("read in memory %v aggregated subscribe %s from %+v", clientName, req.PathPrefix, lastReadTime) + glog.V(4).Infof("read in memory %v aggregated subscribe %s from %+v", clientName, req.PathPrefix, lastReadTime) - lastReadTime, err = fs.filer.MetaAggregator.MetaLogBuffer.LoopProcessLogData(lastReadTime, func() bool { + lastReadTime, err = fs.filer.MetaAggregator.MetaLogBuffer.LoopProcessLogData("aggMeta:"+clientName, lastReadTime, func() bool { fs.filer.MetaAggregator.ListenersLock.Lock() fs.filer.MetaAggregator.ListenersCond.Wait() fs.filer.MetaAggregator.ListenersLock.Unlock() @@ -101,7 +101,7 @@ func (fs *FilerServer) SubscribeLocalMetadata(req *filer_pb.SubscribeMetadataReq glog.V(0).Infof("read in memory %v local subscribe %s from %+v", clientName, req.PathPrefix, lastReadTime) - lastReadTime, err = fs.filer.LocalMetaLogBuffer.LoopProcessLogData(lastReadTime, func() bool { + lastReadTime, err = fs.filer.LocalMetaLogBuffer.LoopProcessLogData("localMeta:"+clientName, lastReadTime, func() bool { fs.listenersLock.Lock() fs.listenersCond.Wait() fs.listenersLock.Unlock() diff --git a/weed/util/log_buffer/log_buffer.go b/weed/util/log_buffer/log_buffer.go index f84c674ff..e3153fddd 100644 --- a/weed/util/log_buffer/log_buffer.go +++ b/weed/util/log_buffer/log_buffer.go @@ -22,6 +22,7 @@ type dataToFlush struct { } type LogBuffer struct { + name string prevBuffers *SealedBuffers buf []byte idx []int @@ -39,8 +40,9 @@ type LogBuffer struct { sync.RWMutex } -func NewLogBuffer(flushInterval time.Duration, flushFn func(startTime, stopTime time.Time, buf []byte), notifyFn func()) *LogBuffer { +func NewLogBuffer(name string, flushInterval time.Duration, flushFn func(startTime, stopTime time.Time, buf []byte), notifyFn func()) *LogBuffer { lb := &LogBuffer{ + name: name, prevBuffers: newSealedBuffers(PreviousBufferCount), buf: make([]byte, BufferSize), sizeBuf: make([]byte, 4), @@ -93,6 +95,7 @@ func (m *LogBuffer) AddToBuffer(partitionKey, data []byte, eventTsNs int64) { } if m.startTime.Add(m.flushInterval).Before(ts) || len(m.buf)-m.pos < size+4 { + // glog.V(4).Infof("%s copyToFlush1 start time %v, ts %v, remaining %d bytes", m.name, m.startTime, ts, len(m.buf)-m.pos) m.flushChan <- m.copyToFlush() m.startTime = ts if len(m.buf) < size+4 { @@ -127,9 +130,10 @@ func (m *LogBuffer) Shutdown() { func (m *LogBuffer) loopFlush() { for d := range m.flushChan { if d != nil { - // fmt.Printf("flush [%v, %v] size %d\n", d.startTime, d.stopTime, len(d.data.Bytes())) + // glog.V(4).Infof("%s flush [%v, %v] size %d", m.name, d.startTime, d.stopTime, len(d.data.Bytes())) m.flushFn(d.startTime, d.stopTime, d.data.Bytes()) d.releaseMemory() + // local logbuffer is different from aggregate logbuffer here m.lastFlushTime = d.stopTime } } @@ -143,7 +147,6 @@ func (m *LogBuffer) loopInterval() { m.Unlock() return } - // println("loop interval") toFlush := m.copyToFlush() m.flushChan <- toFlush m.Unlock() @@ -162,7 +165,6 @@ func (m *LogBuffer) copyToFlush() *dataToFlush { data: copiedBytes(m.buf[:m.pos]), } } - // fmt.Printf("flusing [0,%d) with %d entries\n", m.pos, len(m.idx)) m.buf = m.prevBuffers.SealBuffer(m.startTime, m.stopTime, m.buf, m.pos) m.pos = 0 m.idx = m.idx[:0] @@ -200,12 +202,9 @@ func (m *LogBuffer) ReadFromBuffer(lastReadTime time.Time) (bufferCopy *bytes.Bu } if lastReadTime.Before(m.startTime) { // println("checking ", lastReadTime.UnixNano()) - for i, buf := range m.prevBuffers.buffers { + for _, buf := range m.prevBuffers.buffers { if buf.startTime.After(lastReadTime) { - if i == 0 { - // println("return the earliest in memory", buf.startTime.UnixNano()) - return copiedBytes(buf.buf[:buf.size]), nil - } + // glog.V(4).Infof("%s return the %d sealed buffer %v", m.name, i, buf.startTime) // println("return the", i, "th in memory", buf.startTime.UnixNano()) return copiedBytes(buf.buf[:buf.size]), nil } @@ -215,7 +214,7 @@ func (m *LogBuffer) ReadFromBuffer(lastReadTime time.Time) (bufferCopy *bytes.Bu return copiedBytes(buf.buf[pos:buf.size]), nil } } - // println("return the current buf", lastReadTime.UnixNano()) + // glog.V(4).Infof("%s return the current buf %v", m.name, lastReadTime) return copiedBytes(m.buf[:m.pos]), nil } diff --git a/weed/util/log_buffer/log_buffer_test.go b/weed/util/log_buffer/log_buffer_test.go index 3d77afb18..7dcfe5f52 100644 --- a/weed/util/log_buffer/log_buffer_test.go +++ b/weed/util/log_buffer/log_buffer_test.go @@ -10,7 +10,7 @@ import ( ) func TestNewLogBufferFirstBuffer(t *testing.T) { - lb := NewLogBuffer(time.Minute, func(startTime, stopTime time.Time, buf []byte) { + lb := NewLogBuffer("test", time.Minute, func(startTime, stopTime time.Time, buf []byte) { }, func() { @@ -27,7 +27,7 @@ func TestNewLogBufferFirstBuffer(t *testing.T) { } receivedmessageCount := 0 - lb.LoopProcessLogData(startTime, func() bool { + lb.LoopProcessLogData("test", startTime, func() bool { // stop if no more messages return false }, func(logEntry *filer_pb.LogEntry) error { diff --git a/weed/util/log_buffer/log_read.go b/weed/util/log_buffer/log_read.go index d6917abfe..02f5af274 100644 --- a/weed/util/log_buffer/log_read.go +++ b/weed/util/log_buffer/log_read.go @@ -17,10 +17,7 @@ var ( ResumeFromDiskError = fmt.Errorf("resumeFromDisk") ) -func (logBuffer *LogBuffer) LoopProcessLogData( - startTreadTime time.Time, - waitForDataFn func() bool, - eachLogDataFn func(logEntry *filer_pb.LogEntry) error) (lastReadTime time.Time, err error) { +func (logBuffer *LogBuffer) LoopProcessLogData(readerName string, startTreadTime time.Time, waitForDataFn func() bool, eachLogDataFn func(logEntry *filer_pb.LogEntry) error) (lastReadTime time.Time, err error) { // loop through all messages var bytesBuf *bytes.Buffer lastReadTime = startTreadTime @@ -39,7 +36,7 @@ func (logBuffer *LogBuffer) LoopProcessLogData( if err == ResumeFromDiskError { return lastReadTime, ResumeFromDiskError } - // fmt.Printf("ReadFromBuffer by %v\n", lastReadTime) + // glog.V(4).Infof("%s ReadFromBuffer by %v", readerName, lastReadTime) if bytesBuf == nil { if waitForDataFn() { continue @@ -49,7 +46,7 @@ func (logBuffer *LogBuffer) LoopProcessLogData( } buf := bytesBuf.Bytes() - // fmt.Printf("ReadFromBuffer by %v size %d\n", lastReadTime, len(buf)) + // fmt.Printf("ReadFromBuffer %s by %v size %d\n", readerName, lastReadTime, len(buf)) batchSize := 0 var startReadTime time.Time @@ -59,7 +56,7 @@ func (logBuffer *LogBuffer) LoopProcessLogData( size := util.BytesToUint32(buf[pos : pos+4]) if pos+4+int(size) > len(buf) { err = ResumeError - glog.Errorf("LoopProcessLogData: read buffer %v read %d [%d,%d) from [0,%d)", lastReadTime, batchSize, pos, pos+int(size)+4, len(buf)) + glog.Errorf("LoopProcessLogData: %s read buffer %v read %d [%d,%d) from [0,%d)", readerName, lastReadTime, batchSize, pos, pos+int(size)+4, len(buf)) return } entryData := buf[pos+4 : pos+4+int(size)] @@ -81,9 +78,10 @@ func (logBuffer *LogBuffer) LoopProcessLogData( pos += 4 + int(size) batchSize++ + } - // fmt.Printf("sent message ts[%d,%d] size %d\n", startReadTime.UnixNano(), lastReadTime.UnixNano(), batchSize) + // glog.V(4).Infof("%s sent messages ts[%+v,%+v] size %d\n", readerName, startReadTime, lastReadTime, batchSize) } } From c764596f96545c28793de6dd7e930fe0919584fb Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 27 Jun 2021 05:54:06 -0700 Subject: [PATCH 045/265] filer: slow metadata topic read may lose some change events fix https://github.com/chrislusf/seaweedfs/issues/2117 --- weed/util/log_buffer/log_buffer.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/weed/util/log_buffer/log_buffer.go b/weed/util/log_buffer/log_buffer.go index e3153fddd..12840a88a 100644 --- a/weed/util/log_buffer/log_buffer.go +++ b/weed/util/log_buffer/log_buffer.go @@ -164,6 +164,10 @@ func (m *LogBuffer) copyToFlush() *dataToFlush { stopTime: m.stopTime, data: copiedBytes(m.buf[:m.pos]), } + // glog.V(4).Infof("%s flushing [0,%d) with %d entries [%v, %v]", m.name, m.pos, len(m.idx), m.startTime, m.stopTime) + } else { + // glog.V(4).Infof("%s removed from memory [0,%d) with %d entries [%v, %v]", m.name, m.pos, len(m.idx), m.startTime, m.stopTime) + m.lastFlushTime = m.stopTime } m.buf = m.prevBuffers.SealBuffer(m.startTime, m.stopTime, m.buf, m.pos) m.pos = 0 From 17477b37d5def94bde993bb40adebcea8e89c6cf Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 27 Jun 2021 06:31:04 -0700 Subject: [PATCH 046/265] sleep before re-reading the messages If there are no more metadata changes and the client disconnects, it would go into a busy loop without this fix. --- weed/server/filer_grpc_server_sub_meta.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/weed/server/filer_grpc_server_sub_meta.go b/weed/server/filer_grpc_server_sub_meta.go index 23dc0bd59..18505a95f 100644 --- a/weed/server/filer_grpc_server_sub_meta.go +++ b/weed/server/filer_grpc_server_sub_meta.go @@ -55,14 +55,16 @@ func (fs *FilerServer) SubscribeMetadata(req *filer_pb.SubscribeMetadataRequest, }, eachLogEntryFn) if err != nil { if err == log_buffer.ResumeFromDiskError { + time.Sleep(5127 * time.Millisecond) continue } glog.Errorf("processed to %v: %v", lastReadTime, err) - time.Sleep(3127 * time.Millisecond) if err != log_buffer.ResumeError { break } } + + time.Sleep(5127 * time.Millisecond) } return err From 08377fecb8430cc78b274903c0f2d3a20a28f8cc Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 27 Jun 2021 23:32:57 -0700 Subject: [PATCH 047/265] fixes --- weed/shell/command_volume_fsck.go | 36 +++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/weed/shell/command_volume_fsck.go b/weed/shell/command_volume_fsck.go index 400e96fe7..64389fdb5 100644 --- a/weed/shell/command_volume_fsck.go +++ b/weed/shell/command_volume_fsck.go @@ -62,7 +62,8 @@ func (c *commandVolumeFsck) Do(args []string, commandEnv *CommandEnv, writer io. fsckCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) verbose := fsckCommand.Bool("v", false, "verbose mode") - findMissingChunksInFiler := fsckCommand.Bool("findMissingChunksInFiler", false, "see help volume.fsck") + findMissingChunksInFiler := fsckCommand.Bool("findMissingChunksInFiler", false, "see \"help volume.fsck\"") + findMissingChunksInFilerPath := fsckCommand.String("findMissingChunksInFilerPath", "/", "used together with findMissingChunksInFiler") applyPurging := fsckCommand.Bool("reallyDeleteFromVolume", false, " delete data not referenced by the filer") if err = fsckCommand.Parse(args); err != nil { return nil @@ -96,7 +97,7 @@ func (c *commandVolumeFsck) Do(args []string, commandEnv *CommandEnv, writer io. if *findMissingChunksInFiler { // collect all filer file ids and paths - if err = c.collectFilerFileIdAndPaths(volumeIdToVInfo, tempFolder, writer, *verbose, applyPurging); err != nil { + if err = c.collectFilerFileIdAndPaths(volumeIdToVInfo, tempFolder, writer, *findMissingChunksInFilerPath, *verbose, applyPurging); err != nil { return fmt.Errorf("collectFilerFileIdAndPaths: %v", err) } // for each volume, check filer file ids @@ -117,7 +118,7 @@ func (c *commandVolumeFsck) Do(args []string, commandEnv *CommandEnv, writer io. return nil } -func (c *commandVolumeFsck) collectFilerFileIdAndPaths(volumeIdToServer map[uint32]VInfo, tempFolder string, writer io.Writer, verbose bool, applyPurging *bool) error { +func (c *commandVolumeFsck) collectFilerFileIdAndPaths(volumeIdToServer map[uint32]VInfo, tempFolder string, writer io.Writer, filerPath string, verbose bool, applyPurging *bool) error { if verbose { fmt.Fprintf(writer, "checking each file from filer ...\n") @@ -143,22 +144,25 @@ func (c *commandVolumeFsck) collectFilerFileIdAndPaths(volumeIdToServer map[uint cookie uint32 path util.FullPath } - return doTraverseBfsAndSaving(c.env, nil, "/", false, func(outputChan chan interface{}) { - buffer := make([]byte, 8) + return doTraverseBfsAndSaving(c.env, nil, filerPath, false, func(outputChan chan interface{}) { + buffer := make([]byte, 16) for item := range outputChan { i := item.(*Item) if f, ok := files[i.vid]; ok { util.Uint64toBytes(buffer, i.fileKey) - f.Write(buffer) - util.Uint32toBytes(buffer, i.cookie) - util.Uint32toBytes(buffer[4:], uint32(len(i.path))) + util.Uint32toBytes(buffer[8:], i.cookie) + util.Uint32toBytes(buffer[12:], uint32(len(i.path))) f.Write(buffer) f.Write([]byte(i.path)) + // fmt.Fprintf(writer, "%d,%x%08x %d %s\n", i.vid, i.fileKey, i.cookie, len(i.path), i.path) } else { fmt.Fprintf(writer, "%d,%x%08x %s volume not found\n", i.vid, i.fileKey, i.cookie, i.path) } } }, func(entry *filer_pb.FullEntry, outputChan chan interface{}) (err error) { + if verbose && entry.Entry.IsDirectory { + fmt.Fprintf(writer, "checking directory %s\n", util.NewFullPath(entry.Dir, entry.Entry.Name)) + } dChunks, mChunks, resolveErr := filer.ResolveChunkManifest(filer.LookupFn(c.env), entry.Entry.Chunks) if resolveErr != nil { return nil @@ -317,6 +321,10 @@ func (c *commandVolumeFsck) collectFilerFileIds(tempFolder string, volumeIdToSer func (c *commandVolumeFsck) oneVolumeFileIdsCheckOneVolume(tempFolder string, volumeId uint32, writer io.Writer, verbose bool) (err error) { + if verbose { + fmt.Fprintf(writer, "find missing file chuns in volume %d ...\n", volumeId) + } + db := needle_map.NewMemDb() defer db.Close() @@ -342,7 +350,7 @@ func (c *commandVolumeFsck) oneVolumeFileIdsCheckOneVolume(tempFolder string, vo item := &Item{} var readSize int for { - readSize, err = br.Read(buffer) + readSize, err = io.ReadFull(br, buffer) if err != nil || readSize != 16 { if err == io.EOF { return nil @@ -355,11 +363,17 @@ func (c *commandVolumeFsck) oneVolumeFileIdsCheckOneVolume(tempFolder string, vo item.cookie = util.BytesToUint32(buffer[8:12]) pathSize := util.BytesToUint32(buffer[12:16]) pathBytes := make([]byte, int(pathSize)) - _, err = br.Read(pathBytes) + n, err := io.ReadFull(br, pathBytes) + if err != nil { + fmt.Fprintf(writer, "%d,%x%08x in unexpected error: %v\n", volumeId, item.fileKey, item.cookie, err) + } + if n != int(pathSize) { + fmt.Fprintf(writer, "%d,%x%08x %d unexpected file name size %d\n", volumeId, item.fileKey, item.cookie, pathSize, n) + } item.path = util.FullPath(string(pathBytes)) if _, found := db.Get(types.NeedleId(item.fileKey)); !found { - fmt.Fprintf(writer, "%d,%x%08x in %s not found\n", volumeId, item.fileKey, item.cookie, item.path) + fmt.Fprintf(writer, "%d,%x%08x in %s %d not found\n", volumeId, item.fileKey, item.cookie, item.path, pathSize) } } From a2979aa051692d5774d472e54ddaf974aabdb345 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 27 Jun 2021 23:33:45 -0700 Subject: [PATCH 048/265] 2.56 --- k8s/seaweedfs/Chart.yaml | 4 ++-- k8s/seaweedfs/values.yaml | 2 +- weed/util/constants.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/k8s/seaweedfs/Chart.yaml b/k8s/seaweedfs/Chart.yaml index 0aebc1c84..7b779debe 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.55" -version: "2.55" +appVersion: "2.56" +version: "2.56" diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index 072280f07..3b675eb41 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.55" - started using {.Chart.appVersion} + # imageTag: "2.56" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index ac80b1737..4d7082af0 100644 --- a/weed/util/constants.go +++ b/weed/util/constants.go @@ -5,7 +5,7 @@ import ( ) var ( - VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 55) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 56) COMMIT = "" ) From fc8dd58aea0564087effa37fb2a0bc41066b6cdb Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 28 Jun 2021 15:48:07 -0700 Subject: [PATCH 049/265] volume: large_volume version has bug when using in memory index fix https://github.com/chrislusf/seaweedfs/issues/2162 --- test/data/187.idx | Bin 0 -> 1028959 bytes weed/storage/needle_map/compact_map.go | 1 + .../needle_map/compact_map_cases_test.go | 33 ++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 test/data/187.idx create mode 100644 weed/storage/needle_map/compact_map_cases_test.go diff --git a/test/data/187.idx b/test/data/187.idx new file mode 100644 index 0000000000000000000000000000000000000000..d4cb42ef04b762dc6dff2b307097135d7ccd5427 GIT binary patch literal 1028959 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 z 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�@@(6$_>EsVN59cq<3GfvMh!o+|R3qP}>*rw$gk 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
  • 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

    D1k4dX zy9uCdTSh1|#V?0O;r*k;N|Kl>e&_gZsIo0sZ&)P$IBpPDDdLmFH1XHkDcqed5f|2O z2NyPDy>hX*a4X(&$~LV?D)YsEQ!q?8^JAgJ%kh2VPGFv-WXcn~!IopWzCaSZ{~x?3 z3mHqTmXwzy$sgE1o`6ir&@<=_&S3A5j6IWvf9%w}3`rc4Ozw6B8>_^ooWqhS2?G#@y0b}Q zr)28h4-Ok_A4eo}_x?qBygoz{MB1P|V59##Kp{ z<0IZ-FM>$on&eImE?(iCC2k*QwYeGJokl-m@ygxc#=20i<>9g zheql6V6(k7i>!-Yv>33x7TGV3=s_C1_{$I_-I5hAy%5&_So%}#+X z%Eadq@KV~+@r^pcE2|LjR@(XyuCwk7SSTM!+mwV2XJx;Wb}0$k@{&nO<-N44w-#yH za|QvQrM{ZYcUaxNkq)hb zLauO#4e+m}BetWEo$2sJI$=B5q3n~UWc0gqa@T8Eb_|>C55IFw~?{7RHy8zI+3Qaa-Dq zB*LTxsSb}F`%FLu>8s6%zUQ7q0?J5V4`1Tg7|~~ZdFkij87SmIRCDox(r=T8I3%cU z<4Z~ZOfG)p3stvR+M=z3_uYMpGQEr%=;B2JlZ4^5Fzu~x*n(f;6p%= z%y)CKQR2e*%Cgd%7lF2J5TC|Zl9heg4*zg#S9?Ls|4=46OBj6QRV{k|i8M2XZuLC z4WDk$BbCOo`5!>z9^v#{8XqNFkXc-FEVk*g6`ANBzUkDW%_{mlkE1vH^`ukVICL5!2Jcc4JZU@Q{FfzyE+C#KxZX!-3obAtXHaH0E-)u& zRAzBYVm4;yOv;?Zl~|H9D-#pFbJ;~Xi!#^a4uqeh!GE5U;uq#DX=~)F%*t8Q_6goD zPO}EQGG`Odi)&+T&JG^hyqk#LKI2#9>QcN7o`9{I4o# z+4VWcBc_6J#WDhx=bTCYPX}6-b0rxas9ZZ%FB@{MH^brTzGr;8Am{d@*4$+`

    }3 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%0AgVyC^feUKqqVuZ=E`!>>{yf*=9 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 TK6UkfcOX@} literal 0 HcmV?d00001 diff --git a/weed/storage/needle_map/compact_map.go b/weed/storage/needle_map/compact_map.go index 2b1a471bc..9495a49ab 100644 --- a/weed/storage/needle_map/compact_map.go +++ b/weed/storage/needle_map/compact_map.go @@ -96,6 +96,7 @@ func (cs *CompactSection) setOverflowEntry(skey SectionalNeedleId, offset Offset cs.overflowExtra[i] = cs.overflowExtra[i-1] } cs.overflow[insertCandidate] = needleValue + cs.overflowExtra[insertCandidate] = needleValueExtra } } diff --git a/weed/storage/needle_map/compact_map_cases_test.go b/weed/storage/needle_map/compact_map_cases_test.go new file mode 100644 index 000000000..a0142b57d --- /dev/null +++ b/weed/storage/needle_map/compact_map_cases_test.go @@ -0,0 +1,33 @@ +// +build 5BytesOffset + +package needle_map + +import ( + "fmt" + "github.com/chrislusf/seaweedfs/weed/storage/types" + "github.com/stretchr/testify/assert" + "log" + "os" + "testing" +) + +func Test5bytesIndexLoading(t *testing.T) { + + indexFile, ie := os.OpenFile("../../../test/data/187.idx", os.O_RDWR|os.O_RDONLY, 0644) + if ie != nil { + log.Fatalln(ie) + } + defer indexFile.Close() + m, rowCount := loadNewNeedleMap(indexFile) + + println("total entries:", rowCount) + + key := types.NeedleId(0x671b905) + + needle, found := m.Get(types.NeedleId(0x671b905)) + + fmt.Printf("%v key:%v offset:%v size:%v\n", found, key, needle.Offset, needle.Size) + + assert.Equal(t, int64(12884911892)*8, needle.Offset.ToActualOffset(), "offset") + +} From 24e11d1e90c2bf6ef512fbf787490caeb59348de Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 28 Jun 2021 22:46:49 -0700 Subject: [PATCH 050/265] look back when adding to sorted values look back when adding to sorted values, before adding it to overflow --- weed/storage/needle_map/compact_map.go | 28 ++++++++++++++++--- .../needle_map/compact_map_cases_test.go | 2 +- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/weed/storage/needle_map/compact_map.go b/weed/storage/needle_map/compact_map.go index 9495a49ab..3d2047f99 100644 --- a/weed/storage/needle_map/compact_map.go +++ b/weed/storage/needle_map/compact_map.go @@ -64,11 +64,31 @@ func (cs *CompactSection) Set(key NeedleId, offset Offset, size Size) (oldOffset needOverflow := cs.counter >= batch needOverflow = needOverflow || cs.counter > 0 && cs.values[cs.counter-1].Key > skey if needOverflow { - //println("start", cs.start, "counter", cs.counter, "key", key) - if oldValueExtra, oldValue, found := cs.findOverflowEntry(skey); found { - oldOffset.OffsetHigher, oldOffset.OffsetLower, oldSize = oldValueExtra.OffsetHigher, oldValue.OffsetLower, oldValue.Size + lookBackIndex := cs.counter - 128 + if lookBackIndex < 0 { + lookBackIndex = 0 + } + if cs.counter < batch && cs.values[lookBackIndex].Key < skey { + // still has capacity and only partially out of order + p := &cs.values[cs.counter] + p.Key, cs.valuesExtra[cs.counter].OffsetHigher, p.OffsetLower, p.Size = skey, offset.OffsetHigher, offset.OffsetLower, size + //println("added index", cs.counter, "key", key, cs.values[cs.counter].Key) + for x := cs.counter - 1; x >= lookBackIndex; x-- { + if cs.values[x].Key > cs.values[x+1].Key { + cs.values[x], cs.values[x+1] = cs.values[x+1], cs.values[x] + cs.valuesExtra[x], cs.valuesExtra[x+1] = cs.valuesExtra[x+1], cs.valuesExtra[x] + } else { + break + } + } + cs.counter++ + } else { + //println("start", cs.start, "counter", cs.counter, "key", key) + if oldValueExtra, oldValue, found := cs.findOverflowEntry(skey); found { + oldOffset.OffsetHigher, oldOffset.OffsetLower, oldSize = oldValueExtra.OffsetHigher, oldValue.OffsetLower, oldValue.Size + } + cs.setOverflowEntry(skey, offset, size) } - cs.setOverflowEntry(skey, offset, size) } else { p := &cs.values[cs.counter] p.Key, cs.valuesExtra[cs.counter].OffsetHigher, p.OffsetLower, p.Size = skey, offset.OffsetHigher, offset.OffsetLower, size diff --git a/weed/storage/needle_map/compact_map_cases_test.go b/weed/storage/needle_map/compact_map_cases_test.go index a0142b57d..305925699 100644 --- a/weed/storage/needle_map/compact_map_cases_test.go +++ b/weed/storage/needle_map/compact_map_cases_test.go @@ -22,7 +22,7 @@ func Test5bytesIndexLoading(t *testing.T) { println("total entries:", rowCount) - key := types.NeedleId(0x671b905) + key := types.NeedleId(0x671b905) // 108116229 needle, found := m.Get(types.NeedleId(0x671b905)) From 3668d10664ae3e8c62fbd315ba5c165078b43fd6 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 29 Jun 2021 02:13:29 -0700 Subject: [PATCH 051/265] range query for mp4 video play fix https://github.com/chrislusf/seaweedfs/issues/2156 --- weed/server/common.go | 1 + 1 file changed, 1 insertion(+) diff --git a/weed/server/common.go b/weed/server/common.go index 2e0ae4058..2cd2276eb 100644 --- a/weed/server/common.go +++ b/weed/server/common.go @@ -280,6 +280,7 @@ func processRangeRequest(r *http.Request, w http.ResponseWriter, totalSize int64 w.Header().Set("Content-Length", strconv.FormatInt(ra.length, 10)) w.Header().Set("Content-Range", ra.contentRange(totalSize)) + w.WriteHeader(http.StatusPartialContent) err = writeFn(w, ra.start, ra.length) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) From 41db292332c0f8f34dd489ea56a376545343d297 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 29 Jun 2021 10:06:38 -0700 Subject: [PATCH 052/265] skip s390 ppc64le due to https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/22703 --- weed/filer/sqlite/sqlite_store_unsupported.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/filer/sqlite/sqlite_store_unsupported.go b/weed/filer/sqlite/sqlite_store_unsupported.go index 9b7009df9..d5b82abf3 100644 --- a/weed/filer/sqlite/sqlite_store_unsupported.go +++ b/weed/filer/sqlite/sqlite_store_unsupported.go @@ -1,4 +1,4 @@ -// +build !linux,!darwin,!windows +// +build !linux,!darwin,!windows,!s390,!ppc64le // limited GOOS due to modernc.org/libc/unistd From 6f683e6572dc8c42339014d3fb286e99cef23280 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9D=A8=E6=96=87?= Date: Wed, 30 Jun 2021 04:36:00 +0800 Subject: [PATCH 053/265] also failed on mips64 alpine support mips64, will try to build on next version --- weed/filer/sqlite/sqlite_store_unsupported.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/filer/sqlite/sqlite_store_unsupported.go b/weed/filer/sqlite/sqlite_store_unsupported.go index d5b82abf3..803c71afa 100644 --- a/weed/filer/sqlite/sqlite_store_unsupported.go +++ b/weed/filer/sqlite/sqlite_store_unsupported.go @@ -1,4 +1,4 @@ -// +build !linux,!darwin,!windows,!s390,!ppc64le +// +build !linux,!darwin,!windows,!s390,!ppc64le,!mips64 // limited GOOS due to modernc.org/libc/unistd From 7566782c2e172408bbbfd32bb5c3b505bfd8d5e1 Mon Sep 17 00:00:00 2001 From: zhangsong Date: Wed, 30 Jun 2021 17:28:37 +0800 Subject: [PATCH 054/265] add proxy mode to read non-local volumes --- weed/command/server.go | 2 +- weed/command/volume.go | 6 +-- weed/server/volume_server.go | 6 +-- weed/server/volume_server_handlers.go | 2 + weed/server/volume_server_handlers_read.go | 51 ++++++++++++++++++---- 5 files changed, 52 insertions(+), 15 deletions(-) diff --git a/weed/command/server.go b/weed/command/server.go index d2bd6466e..a4050aa51 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -107,7 +107,7 @@ func init() { serverOptions.v.indexType = cmdServer.Flag.String("volume.index", "memory", "Choose [memory|leveldb|leveldbMedium|leveldbLarge] mode for memory~performance balance.") serverOptions.v.diskType = cmdServer.Flag.String("volume.disk", "", "[hdd|ssd|] hard drive or solid state drive or any tag") serverOptions.v.fixJpgOrientation = cmdServer.Flag.Bool("volume.images.fix.orientation", false, "Adjust jpg orientation when uploading.") - serverOptions.v.readRedirect = cmdServer.Flag.Bool("volume.read.redirect", true, "Redirect moved or non-local volumes.") + serverOptions.v.readMode = cmdServer.Flag.String("volume.readMode", "redirect", "[local|remote|redirect] how to deal with non-local volume: 'not found|read in remote node|redirect volume location'.") serverOptions.v.compactionMBPerSecond = cmdServer.Flag.Int("volume.compactionMBps", 0, "limit compaction speed in mega bytes per second") serverOptions.v.fileSizeLimitMB = cmdServer.Flag.Int("volume.fileSizeLimitMB", 256, "limit file size to avoid out of memory") serverOptions.v.concurrentUploadLimitMB = cmdServer.Flag.Int("volume.concurrentUploadLimitMB", 64, "limit total concurrent upload size") diff --git a/weed/command/volume.go b/weed/command/volume.go index 139a3791e..e974a9082 100644 --- a/weed/command/volume.go +++ b/weed/command/volume.go @@ -51,7 +51,7 @@ type VolumeServerOptions struct { indexType *string diskType *string fixJpgOrientation *bool - readRedirect *bool + readMode *string cpuProfile *string memProfile *string compactionMBPerSecond *int @@ -80,7 +80,7 @@ func init() { v.indexType = cmdVolume.Flag.String("index", "memory", "Choose [memory|leveldb|leveldbMedium|leveldbLarge] mode for memory~performance balance.") v.diskType = cmdVolume.Flag.String("disk", "", "[hdd|ssd|] hard drive or solid state drive or any tag") v.fixJpgOrientation = cmdVolume.Flag.Bool("images.fix.orientation", false, "Adjust jpg orientation when uploading.") - v.readRedirect = cmdVolume.Flag.Bool("read.redirect", true, "Redirect moved or non-local volumes.") + v.readMode = cmdVolume.Flag.String("readMode", "redirect", "[local|remote|redirect] how to deal with non-local volume: 'not found|read in remote node|redirect volume location'.") v.cpuProfile = cmdVolume.Flag.String("cpuprofile", "", "cpu profile output file") v.memProfile = cmdVolume.Flag.String("memprofile", "", "memory profile output file") v.compactionMBPerSecond = cmdVolume.Flag.Int("compactionMBps", 0, "limit background compaction or copying speed in mega bytes per second") @@ -228,7 +228,7 @@ func (v VolumeServerOptions) startVolumeServer(volumeFolders, maxVolumeCounts, v volumeNeedleMapKind, strings.Split(masters, ","), 5, *v.dataCenter, *v.rack, v.whiteList, - *v.fixJpgOrientation, *v.readRedirect, + *v.fixJpgOrientation, *v.readMode, *v.compactionMBPerSecond, *v.fileSizeLimitMB, int64(*v.concurrentUploadLimitMB)*1024*1024, diff --git a/weed/server/volume_server.go b/weed/server/volume_server.go index f7359ea6b..74c5f72c6 100644 --- a/weed/server/volume_server.go +++ b/weed/server/volume_server.go @@ -28,7 +28,7 @@ type VolumeServer struct { needleMapKind storage.NeedleMapKind FixJpgOrientation bool - ReadRedirect bool + ReadMode string compactionBytePerSecond int64 metricsAddress string metricsIntervalSec int @@ -50,7 +50,7 @@ func NewVolumeServer(adminMux, publicMux *http.ServeMux, ip string, dataCenter string, rack string, whiteList []string, fixJpgOrientation bool, - readRedirect bool, + readMode string, compactionMBPerSecond int, fileSizeLimitMB int, concurrentUploadLimit int64, @@ -72,7 +72,7 @@ func NewVolumeServer(adminMux, publicMux *http.ServeMux, ip string, rack: rack, needleMapKind: needleMapKind, FixJpgOrientation: fixJpgOrientation, - ReadRedirect: readRedirect, + ReadMode: readMode, grpcDialOption: security.LoadClientTLS(util.GetViper(), "grpc.volume"), compactionBytePerSecond: int64(compactionMBPerSecond) * 1024 * 1024, fileSizeLimitBytes: int64(fileSizeLimitMB) * 1024 * 1024, diff --git a/weed/server/volume_server_handlers.go b/weed/server/volume_server_handlers.go index 8ac3c0d90..d35146d56 100644 --- a/weed/server/volume_server_handlers.go +++ b/weed/server/volume_server_handlers.go @@ -1,6 +1,7 @@ package weed_server import ( + "fmt" "net/http" "strconv" "strings" @@ -81,6 +82,7 @@ func getContentLength(r *http.Request) int64 { } func (vs *VolumeServer) publicReadOnlyHandler(w http.ResponseWriter, r *http.Request) { + fmt.Printf("publicReadOnlyHandler in.") w.Header().Set("Server", "SeaweedFS Volume "+util.VERSION) if r.Header.Get("Origin") != "" { w.Header().Set("Access-Control-Allow-Origin", "*") diff --git a/weed/server/volume_server_handlers_read.go b/weed/server/volume_server_handlers_read.go index 3e977cfd4..2100eb620 100644 --- a/weed/server/volume_server_handlers_read.go +++ b/weed/server/volume_server_handlers_read.go @@ -58,14 +58,53 @@ func (vs *VolumeServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) hasVolume := vs.store.HasVolume(volumeId) _, hasEcVolume := vs.store.FindEcVolume(volumeId) if !hasVolume && !hasEcVolume { - if !vs.ReadRedirect { - glog.V(2).Infoln("volume is not local:", err, r.URL.Path) + if vs.ReadMode == "local" { + glog.V(0).Infoln("volume is not local:", err, r.URL.Path) w.WriteHeader(http.StatusNotFound) return } lookupResult, err := operation.Lookup(vs.GetMaster, volumeId.String()) glog.V(2).Infoln("volume", volumeId, "found on", lookupResult, "error", err) - if err == nil && len(lookupResult.Locations) > 0 { + if err != nil || len(lookupResult.Locations) <= 0{ + glog.V(0).Infoln("lookup error:", err, r.URL.Path) + w.WriteHeader(http.StatusNotFound) + return + } + if vs.ReadMode == "remote" { + // proxy client request to target server + u, _ := url.Parse(util.NormalizeUrl(lookupResult.Locations[0].Url)) + r.URL.Host = u.Host + r.URL.Scheme = u.Scheme + request, err := http.NewRequest("GET", r.URL.String(), nil) + if err != nil { + glog.V(0).Infof("failed to instance http request of url %s: %v", r.URL.String(), err) + w.WriteHeader(http.StatusInternalServerError) + return + } + for k, vv := range r.Header { + for _, v := range vv { + request.Header.Add(k, v) + } + } + + response, err := client.Do(request) + if err != nil { + glog.V(0).Infof("request remote url %s: %v", r.URL.String(), err) + w.WriteHeader(http.StatusInternalServerError) + return + } + defer util.CloseResponse(response) + // proxy target response to client + for k, vv := range response.Header { + for _, v := range vv { + w.Header().Add(k, v) + } + } + w.WriteHeader(response.StatusCode) + io.Copy(w, response.Body) + return + } else { + // redirect u, _ := url.Parse(util.NormalizeUrl(lookupResult.Locations[0].PublicUrl)) u.Path = fmt.Sprintf("%s/%s,%s", u.Path, vid, fid) arg := url.Values{} @@ -74,12 +113,8 @@ func (vs *VolumeServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) } u.RawQuery = arg.Encode() http.Redirect(w, r, u.String(), http.StatusMovedPermanently) - - } else { - glog.V(2).Infoln("lookup error:", err, r.URL.Path) - w.WriteHeader(http.StatusNotFound) + return } - return } cookie := n.Cookie From 20d33ae0252d73a1baa11758cea737227e73db56 Mon Sep 17 00:00:00 2001 From: zhangsong Date: Wed, 30 Jun 2021 18:33:18 +0800 Subject: [PATCH 055/265] add proxy mode to read non-local volumes --- weed/command/volume.go | 2 +- weed/server/volume_server_handlers.go | 2 -- weed/server/volume_server_handlers_read.go | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/weed/command/volume.go b/weed/command/volume.go index e974a9082..fe75e9e91 100644 --- a/weed/command/volume.go +++ b/weed/command/volume.go @@ -80,7 +80,7 @@ func init() { v.indexType = cmdVolume.Flag.String("index", "memory", "Choose [memory|leveldb|leveldbMedium|leveldbLarge] mode for memory~performance balance.") v.diskType = cmdVolume.Flag.String("disk", "", "[hdd|ssd|] hard drive or solid state drive or any tag") v.fixJpgOrientation = cmdVolume.Flag.Bool("images.fix.orientation", false, "Adjust jpg orientation when uploading.") - v.readMode = cmdVolume.Flag.String("readMode", "redirect", "[local|remote|redirect] how to deal with non-local volume: 'not found|read in remote node|redirect volume location'.") + v.readMode = cmdVolume.Flag.String("readMode", "redirect", "[local|proxy|redirect] how to deal with non-local volume: 'not found|proxy to remote node|redirect volume location'.") v.cpuProfile = cmdVolume.Flag.String("cpuprofile", "", "cpu profile output file") v.memProfile = cmdVolume.Flag.String("memprofile", "", "memory profile output file") v.compactionMBPerSecond = cmdVolume.Flag.Int("compactionMBps", 0, "limit background compaction or copying speed in mega bytes per second") diff --git a/weed/server/volume_server_handlers.go b/weed/server/volume_server_handlers.go index d35146d56..8ac3c0d90 100644 --- a/weed/server/volume_server_handlers.go +++ b/weed/server/volume_server_handlers.go @@ -1,7 +1,6 @@ package weed_server import ( - "fmt" "net/http" "strconv" "strings" @@ -82,7 +81,6 @@ func getContentLength(r *http.Request) int64 { } func (vs *VolumeServer) publicReadOnlyHandler(w http.ResponseWriter, r *http.Request) { - fmt.Printf("publicReadOnlyHandler in.") w.Header().Set("Server", "SeaweedFS Volume "+util.VERSION) if r.Header.Get("Origin") != "" { w.Header().Set("Access-Control-Allow-Origin", "*") diff --git a/weed/server/volume_server_handlers_read.go b/weed/server/volume_server_handlers_read.go index 2100eb620..13644ab01 100644 --- a/weed/server/volume_server_handlers_read.go +++ b/weed/server/volume_server_handlers_read.go @@ -70,7 +70,7 @@ func (vs *VolumeServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) w.WriteHeader(http.StatusNotFound) return } - if vs.ReadMode == "remote" { + if vs.ReadMode == "proxy" { // proxy client request to target server u, _ := url.Parse(util.NormalizeUrl(lookupResult.Locations[0].Url)) r.URL.Host = u.Host From 253b4ed8982dbdb83b84295bb4b5063903dfd0f1 Mon Sep 17 00:00:00 2001 From: Kevin Liu Date: Wed, 30 Jun 2021 13:05:45 -0700 Subject: [PATCH 056/265] remote -> proxy in server to match volume flags noticed this was missed in https://github.com/chrislusf/seaweedfs/pull/2168 --- weed/command/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/command/server.go b/weed/command/server.go index a4050aa51..f6c033c64 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -107,7 +107,7 @@ func init() { serverOptions.v.indexType = cmdServer.Flag.String("volume.index", "memory", "Choose [memory|leveldb|leveldbMedium|leveldbLarge] mode for memory~performance balance.") serverOptions.v.diskType = cmdServer.Flag.String("volume.disk", "", "[hdd|ssd|] hard drive or solid state drive or any tag") serverOptions.v.fixJpgOrientation = cmdServer.Flag.Bool("volume.images.fix.orientation", false, "Adjust jpg orientation when uploading.") - serverOptions.v.readMode = cmdServer.Flag.String("volume.readMode", "redirect", "[local|remote|redirect] how to deal with non-local volume: 'not found|read in remote node|redirect volume location'.") + serverOptions.v.readMode = cmdServer.Flag.String("volume.readMode", "redirect", "[local|proxy|redirect] how to deal with non-local volume: 'not found|read in remote node|redirect volume location'.") serverOptions.v.compactionMBPerSecond = cmdServer.Flag.Int("volume.compactionMBps", 0, "limit compaction speed in mega bytes per second") serverOptions.v.fileSizeLimitMB = cmdServer.Flag.Int("volume.fileSizeLimitMB", 256, "limit file size to avoid out of memory") serverOptions.v.concurrentUploadLimitMB = cmdServer.Flag.Int("volume.concurrentUploadLimitMB", 64, "limit total concurrent upload size") From a66112c9d258f9060f453fec2a3b7c0136256f13 Mon Sep 17 00:00:00 2001 From: danielflira Date: Thu, 1 Jul 2021 00:07:54 -0300 Subject: [PATCH 057/265] configurable fusermount path --- weed/command/fuse.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/weed/command/fuse.go b/weed/command/fuse.go index 3949d8f70..09dec388f 100644 --- a/weed/command/fuse.go +++ b/weed/command/fuse.go @@ -23,6 +23,7 @@ func runFuse(cmd *Command, args []string) bool { option := strings.Builder{} options := []parameter{} masterProcess := true + fusermountPath := "" // first parameter i := 0 @@ -187,6 +188,8 @@ func runFuse(cmd *Command, args []string) bool { } else { panic(fmt.Errorf("readRetryTime: %s", err)) } + case "fusermount.path": + fusermountPath = parameter.value } } @@ -213,6 +216,16 @@ func runFuse(cmd *Command, args []string) bool { return true } + if fusermountPath != "" { + if err := os.Setenv("PATH", fusermountPath); err != nil { + panic(fmt.Errorf("setenv: %s", err)) + } + } else if os.Getenv("PATH") == "" { + if err := os.Setenv("PATH", "/bin:/sbin:/usr/bin:/usr/sbin"); err != nil { + panic(fmt.Errorf("setenv: %s", err)) + } + } + // just call "weed mount" command return runMount(cmdMount, []string{}) } From 07f20155fdced66dd22ff41915299100dca35a3b Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 30 Jun 2021 12:33:04 -0700 Subject: [PATCH 058/265] small optimization --- weed/filesys/file.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/weed/filesys/file.go b/weed/filesys/file.go index c50ac0549..8f58511e2 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -144,17 +144,17 @@ func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *f file.dirtyMetadata = true } - if req.Valid.Mode() { + if req.Valid.Mode() && entry.Attributes.FileMode != uint32(req.Mode){ entry.Attributes.FileMode = uint32(req.Mode) file.dirtyMetadata = true } - if req.Valid.Uid() { + if req.Valid.Uid() && entry.Attributes.Uid != req.Uid { entry.Attributes.Uid = req.Uid file.dirtyMetadata = true } - if req.Valid.Gid() { + if req.Valid.Gid() && entry.Attributes.Gid != req.Gid { entry.Attributes.Gid = req.Gid file.dirtyMetadata = true } @@ -164,7 +164,7 @@ func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *f file.dirtyMetadata = true } - if req.Valid.Mtime() { + if req.Valid.Mtime() && entry.Attributes.Mtime != req.Mtime.Unix() { entry.Attributes.Mtime = req.Mtime.Unix() file.dirtyMetadata = true } From 30dbe98dffa9370ec45162e192e79dc7d2544406 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 30 Jun 2021 12:33:11 -0700 Subject: [PATCH 059/265] Update Makefile --- weed/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/Makefile b/weed/Makefile index edc0bf544..c82735a0e 100644 --- a/weed/Makefile +++ b/weed/Makefile @@ -16,7 +16,7 @@ debug_shell: debug_mount: go build -gcflags="all=-N -l" - dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec weed -- -v=4 mount -dir=~/tmp/mm -cacheCapacityMB=0 -filer.path=/buckets + dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec weed -- -v=4 mount -dir=~/tmp/mm -cacheCapacityMB=0 -filer.path=/ debug_server: go build -gcflags="all=-N -l" From c79518388755578c84874725aaafbec8d7ff5d54 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 30 Jun 2021 17:42:33 -0700 Subject: [PATCH 060/265] return node itself as directory handler --- weed/filesys/dir.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index 1af868d58..9a791e013 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -141,7 +141,7 @@ func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest, var node fs.Node if isDirectory { node = dir.newDirectory(util.NewFullPath(dir.FullPath(), req.Name)) - return node, nil, nil + return node, node, nil } node = dir.newFile(req.Name) From 215b1695623a4ebcba5f45488a05d19857436a6f Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 1 Jul 2021 01:19:28 -0700 Subject: [PATCH 061/265] mount: recursively rename locally --- go.mod | 2 +- go.sum | 2 + other/java/client/src/main/proto/filer.proto | 1 + weed/filesys/dir_rename.go | 127 +++++++++++++++---- weed/filesys/meta_cache/meta_cache.go | 34 +++-- weed/pb/filer.proto | 1 + weed/pb/filer_pb/filer.pb.go | 22 +++- weed/server/filer_grpc_server_rename.go | 18 +-- weed/server/filer_grpc_server_sub_meta.go | 15 ++- 9 files changed, 162 insertions(+), 60 deletions(-) diff --git a/go.mod b/go.mod index 5510eee8e..84c03ebdc 100644 --- a/go.mod +++ b/go.mod @@ -56,7 +56,7 @@ require ( github.com/pquerna/cachecontrol v0.1.0 github.com/prometheus/client_golang v1.11.0 github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563 // indirect - github.com/seaweedfs/fuse v1.1.7 + github.com/seaweedfs/fuse v1.1.8 github.com/seaweedfs/goexif v1.0.2 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/spaolacci/murmur3 v1.1.0 // indirect diff --git a/go.sum b/go.sum index e0587fd9c..1911be8dd 100644 --- a/go.sum +++ b/go.sum @@ -617,6 +617,8 @@ github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0 github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seaweedfs/fuse v1.1.7 h1:T4L5c/Sn+q8lE+0zCmH2MWvIO+B5TttWOSqK5KQPRMQ= github.com/seaweedfs/fuse v1.1.7/go.mod h1:+PP6WlkrRUG6KPE+Th2EX5To/PjHaFsvqg/UgQ39aj8= +github.com/seaweedfs/fuse v1.1.8 h1:YFSDPotG4uhQzV7ooDUvQ8BRVy5rM1XCFPJAmAsZz68= +github.com/seaweedfs/fuse v1.1.8/go.mod h1:+PP6WlkrRUG6KPE+Th2EX5To/PjHaFsvqg/UgQ39aj8= github.com/seaweedfs/goexif v1.0.2 h1:p+rTXYdQ2mgxd+1JaTrQ9N8DvYuw9UH9xgYmJ+Bb29E= github.com/seaweedfs/goexif v1.0.2/go.mod h1:MrKs5LK0HXdffrdCZrW3OIMegL2xXpC6ThLyXMyjdrk= github.com/secsy/goftp v0.0.0-20190720192957-f31499d7c79a h1:C6IhVTxNkhlb0tlCB6JfHOUv1f0xHPK7V8X4HlJZEJw= diff --git a/other/java/client/src/main/proto/filer.proto b/other/java/client/src/main/proto/filer.proto index cdbba7eb1..f49c1218f 100644 --- a/other/java/client/src/main/proto/filer.proto +++ b/other/java/client/src/main/proto/filer.proto @@ -208,6 +208,7 @@ message AtomicRenameEntryRequest { string old_name = 2; string new_directory = 3; string new_name = 4; + repeated int32 signatures = 5; } message AtomicRenameEntryResponse { diff --git a/weed/filesys/dir_rename.go b/weed/filesys/dir_rename.go index d50c6dab0..27a14d5c6 100644 --- a/weed/filesys/dir_rename.go +++ b/weed/filesys/dir_rename.go @@ -2,6 +2,9 @@ package filesys import ( "context" + "fmt" + "github.com/chrislusf/seaweedfs/weed/filer" + "math" "github.com/seaweedfs/fuse" "github.com/seaweedfs/fuse/fs" @@ -37,6 +40,7 @@ func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirector OldName: req.OldName, NewDirectory: newDir.FullPath(), NewName: req.NewName, + Signatures: []int32{dir.wfs.signature}, } _, err := client.AtomicRenameEntry(ctx, request) @@ -53,33 +57,11 @@ func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirector return fuse.EIO } - // TODO: replicate renaming logic on filer - if err := dir.wfs.metaCache.DeleteEntry(context.Background(), oldPath); err != nil { - glog.V(0).Infof("dir Rename delete local %s => %s : %v", oldPath, newPath, err) + err = dir.moveEntry(context.Background(), util.FullPath(dir.FullPath()), oldEntry, util.FullPath(newDir.FullPath()), req.NewName) + if err != nil { + glog.V(0).Infof("dir local Rename %s => %s : %v", oldPath, newPath, err) return fuse.EIO } - oldEntry.FullPath = newPath - if err := dir.wfs.metaCache.InsertEntry(context.Background(), oldEntry); err != nil { - glog.V(0).Infof("dir Rename insert local %s => %s : %v", oldPath, newPath, err) - return fuse.EIO - } - - oldFsNode := NodeWithId(oldPath.AsInode()) - newFsNode := NodeWithId(newPath.AsInode()) - dir.wfs.Server.InvalidateInternalNode(oldFsNode, newFsNode, func(internalNode fs.Node) { - if file, ok := internalNode.(*File); ok { - glog.V(4).Infof("internal file node %s", file.Name) - file.Name = req.NewName - file.id = uint64(newFsNode) - file.dir = newDir - } - if dir, ok := internalNode.(*Dir); ok { - glog.V(4).Infof("internal dir node %s", dir.name) - dir.name = req.NewName - dir.id = uint64(newFsNode) - dir.parent = newDir - } - }) // change file handle dir.wfs.handlesLock.Lock() @@ -96,3 +78,98 @@ func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirector return nil } + +func (dir *Dir) moveEntry(ctx context.Context, oldParent util.FullPath, entry *filer.Entry, newParent util.FullPath, newName string) error { + + oldName := entry.Name() + + if err := dir.moveSelfEntry(ctx, oldParent, entry, newParent, newName, func() error { + + oldFsNode := NodeWithId(oldParent.Child(oldName).AsInode()) + newFsNode := NodeWithId(newParent.Child(newName).AsInode()) + newDirNode, found := dir.wfs.Server.FindInternalNode(NodeWithId(newParent.AsInode())) + var newDir *Dir + if found { + newDir = newDirNode.(*Dir) + } + dir.wfs.Server.InvalidateInternalNode(oldFsNode, newFsNode, func(internalNode fs.Node) { + if file, ok := internalNode.(*File); ok { + glog.V(4).Infof("internal file node %s", oldParent.Child(oldName)) + file.Name = newName + file.id = uint64(newFsNode) + if found { + file.dir = newDir + } + } + if dir, ok := internalNode.(*Dir); ok { + glog.V(4).Infof("internal dir node %s", oldParent.Child(oldName)) + dir.name = newName + dir.id = uint64(newFsNode) + if found { + dir.parent = newDir + } + } + }) + + if entry.IsDirectory() { + if err := dir.moveFolderSubEntries(ctx, oldParent, oldName, newParent, newName); err != nil { + return err + } + } + return nil + }); err != nil { + return fmt.Errorf("fail to move %s => %s: %v", oldParent.Child(oldName), newParent.Child(newName), err) + } + + return nil +} + +func (dir *Dir) moveFolderSubEntries(ctx context.Context, oldParent util.FullPath, oldName string, newParent util.FullPath, newName string) error { + + currentDirPath := oldParent.Child(oldName) + newDirPath := newParent.Child(newName) + + glog.V(1).Infof("moving folder %s => %s", currentDirPath, newDirPath) + + var moveErr error + listErr := dir.wfs.metaCache.ListDirectoryEntries(ctx, currentDirPath, "", false, int64(math.MaxInt32), func(item *filer.Entry) bool { + moveErr = dir.moveEntry(ctx, currentDirPath, item, newDirPath, item.Name()) + if moveErr != nil { + return false + } + return true + }) + if listErr != nil { + return listErr + } + if moveErr != nil { + return moveErr + } + + return nil +} + +func (dir *Dir) moveSelfEntry(ctx context.Context, oldParent util.FullPath, entry *filer.Entry, newParent util.FullPath, newName string, moveFolderSubEntries func() error) error { + + newPath := newParent.Child(newName) + oldPath := oldParent.Child(entry.Name()) + + entry.FullPath = newPath + if err := dir.wfs.metaCache.InsertEntry(ctx, entry); err != nil { + glog.V(0).Infof("dir Rename insert local %s => %s : %v", oldPath, newPath, err) + return fuse.EIO + } + + if moveFolderSubEntries != nil { + if moveChildrenErr := moveFolderSubEntries(); moveChildrenErr != nil { + return moveChildrenErr + } + } + + if err := dir.wfs.metaCache.DeleteEntry(ctx, oldPath); err != nil { + glog.V(0).Infof("dir Rename delete local %s => %s : %v", oldPath, newPath, err) + return fuse.EIO + } + + return nil +} diff --git a/weed/filesys/meta_cache/meta_cache.go b/weed/filesys/meta_cache/meta_cache.go index 3f6391c39..69d1655ee 100644 --- a/weed/filesys/meta_cache/meta_cache.go +++ b/weed/filesys/meta_cache/meta_cache.go @@ -3,14 +3,12 @@ package meta_cache import ( "context" "fmt" - "os" - "sync" - "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/filer/leveldb" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/util" "github.com/chrislusf/seaweedfs/weed/util/bounded_tree" + "os" ) // need to have logic similar to FilerStoreWrapper @@ -18,7 +16,7 @@ import ( type MetaCache struct { localStore filer.VirtualFilerStore - sync.RWMutex + // sync.RWMutex visitedBoundary *bounded_tree.BoundedTree uidGidMapper *UidGidMapper invalidateFunc func(util.FullPath) @@ -54,8 +52,8 @@ func openMetaStore(dbFolder string) filer.VirtualFilerStore { } func (mc *MetaCache) InsertEntry(ctx context.Context, entry *filer.Entry) error { - mc.Lock() - defer mc.Unlock() + //mc.Lock() + //defer mc.Unlock() return mc.doInsertEntry(ctx, entry) } @@ -64,8 +62,8 @@ func (mc *MetaCache) doInsertEntry(ctx context.Context, entry *filer.Entry) erro } func (mc *MetaCache) AtomicUpdateEntryFromFiler(ctx context.Context, oldPath util.FullPath, newEntry *filer.Entry) error { - mc.Lock() - defer mc.Unlock() + //mc.Lock() + //defer mc.Unlock() oldDir, _ := oldPath.DirAndName() if mc.visitedBoundary.HasVisited(util.FullPath(oldDir)) { @@ -97,14 +95,14 @@ func (mc *MetaCache) AtomicUpdateEntryFromFiler(ctx context.Context, oldPath uti } func (mc *MetaCache) UpdateEntry(ctx context.Context, entry *filer.Entry) error { - mc.Lock() - defer mc.Unlock() + //mc.Lock() + //defer mc.Unlock() return mc.localStore.UpdateEntry(ctx, entry) } func (mc *MetaCache) FindEntry(ctx context.Context, fp util.FullPath) (entry *filer.Entry, err error) { - mc.RLock() - defer mc.RUnlock() + //mc.RLock() + //defer mc.RUnlock() entry, err = mc.localStore.FindEntry(ctx, fp) if err != nil { return nil, err @@ -114,14 +112,14 @@ func (mc *MetaCache) FindEntry(ctx context.Context, fp util.FullPath) (entry *fi } func (mc *MetaCache) DeleteEntry(ctx context.Context, fp util.FullPath) (err error) { - mc.Lock() - defer mc.Unlock() + //mc.Lock() + //defer mc.Unlock() return mc.localStore.DeleteEntry(ctx, fp) } func (mc *MetaCache) ListDirectoryEntries(ctx context.Context, dirPath util.FullPath, startFileName string, includeStartFile bool, limit int64, eachEntryFunc filer.ListEachEntryFunc) error { - mc.RLock() - defer mc.RUnlock() + //mc.RLock() + //defer mc.RUnlock() if !mc.visitedBoundary.HasVisited(dirPath) { return fmt.Errorf("unsynchronized dir: %v", dirPath) @@ -138,8 +136,8 @@ func (mc *MetaCache) ListDirectoryEntries(ctx context.Context, dirPath util.Full } func (mc *MetaCache) Shutdown() { - mc.Lock() - defer mc.Unlock() + //mc.Lock() + //defer mc.Unlock() mc.localStore.Shutdown() } diff --git a/weed/pb/filer.proto b/weed/pb/filer.proto index cdbba7eb1..f49c1218f 100644 --- a/weed/pb/filer.proto +++ b/weed/pb/filer.proto @@ -208,6 +208,7 @@ message AtomicRenameEntryRequest { string old_name = 2; string new_directory = 3; string new_name = 4; + repeated int32 signatures = 5; } message AtomicRenameEntryResponse { diff --git a/weed/pb/filer_pb/filer.pb.go b/weed/pb/filer_pb/filer.pb.go index 89fc448f4..2a7f3d041 100644 --- a/weed/pb/filer_pb/filer.pb.go +++ b/weed/pb/filer_pb/filer.pb.go @@ -1382,10 +1382,11 @@ type AtomicRenameEntryRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - OldDirectory string `protobuf:"bytes,1,opt,name=old_directory,json=oldDirectory,proto3" json:"old_directory,omitempty"` - OldName string `protobuf:"bytes,2,opt,name=old_name,json=oldName,proto3" json:"old_name,omitempty"` - NewDirectory string `protobuf:"bytes,3,opt,name=new_directory,json=newDirectory,proto3" json:"new_directory,omitempty"` - NewName string `protobuf:"bytes,4,opt,name=new_name,json=newName,proto3" json:"new_name,omitempty"` + OldDirectory string `protobuf:"bytes,1,opt,name=old_directory,json=oldDirectory,proto3" json:"old_directory,omitempty"` + OldName string `protobuf:"bytes,2,opt,name=old_name,json=oldName,proto3" json:"old_name,omitempty"` + NewDirectory string `protobuf:"bytes,3,opt,name=new_directory,json=newDirectory,proto3" json:"new_directory,omitempty"` + NewName string `protobuf:"bytes,4,opt,name=new_name,json=newName,proto3" json:"new_name,omitempty"` + Signatures []int32 `protobuf:"varint,5,rep,packed,name=signatures,proto3" json:"signatures,omitempty"` } func (x *AtomicRenameEntryRequest) Reset() { @@ -1448,6 +1449,13 @@ func (x *AtomicRenameEntryRequest) GetNewName() string { return "" } +func (x *AtomicRenameEntryRequest) GetSignatures() []int32 { + if x != nil { + return x.Signatures + } + return nil +} + type AtomicRenameEntryResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3418,7 +3426,7 @@ var file_filer_proto_rawDesc = []byte{ 0x72, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x22, 0x9a, 0x01, 0x0a, 0x18, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, + 0x22, 0xba, 0x01, 0x0a, 0x18, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x6c, 0x64, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, @@ -3427,7 +3435,9 @@ var file_filer_proto_rawDesc = []byte{ 0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x1b, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x1b, 0x0a, 0x19, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x13, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, diff --git a/weed/server/filer_grpc_server_rename.go b/weed/server/filer_grpc_server_rename.go index ba9f15370..8a11c91e3 100644 --- a/weed/server/filer_grpc_server_rename.go +++ b/weed/server/filer_grpc_server_rename.go @@ -33,7 +33,7 @@ func (fs *FilerServer) AtomicRenameEntry(ctx context.Context, req *filer_pb.Atom return nil, fmt.Errorf("%s/%s not found: %v", req.OldDirectory, req.OldName, err) } - moveErr := fs.moveEntry(ctx, oldParent, oldEntry, newParent, req.NewName) + moveErr := fs.moveEntry(ctx, oldParent, oldEntry, newParent, req.NewName, req.Signatures) if moveErr != nil { fs.filer.RollbackTransaction(ctx) return nil, fmt.Errorf("%s/%s move error: %v", req.OldDirectory, req.OldName, moveErr) @@ -47,23 +47,23 @@ func (fs *FilerServer) AtomicRenameEntry(ctx context.Context, req *filer_pb.Atom return &filer_pb.AtomicRenameEntryResponse{}, nil } -func (fs *FilerServer) moveEntry(ctx context.Context, oldParent util.FullPath, entry *filer.Entry, newParent util.FullPath, newName string) error { +func (fs *FilerServer) moveEntry(ctx context.Context, oldParent util.FullPath, entry *filer.Entry, newParent util.FullPath, newName string, signatures []int32) error { if err := fs.moveSelfEntry(ctx, oldParent, entry, newParent, newName, func() error { if entry.IsDirectory() { - if err := fs.moveFolderSubEntries(ctx, oldParent, entry, newParent, newName); err != nil { + if err := fs.moveFolderSubEntries(ctx, oldParent, entry, newParent, newName, signatures); err != nil { return err } } return nil - }); err != nil { + }, signatures); err != nil { return fmt.Errorf("fail to move %s => %s: %v", oldParent.Child(entry.Name()), newParent.Child(newName), err) } return nil } -func (fs *FilerServer) moveFolderSubEntries(ctx context.Context, oldParent util.FullPath, entry *filer.Entry, newParent util.FullPath, newName string) error { +func (fs *FilerServer) moveFolderSubEntries(ctx context.Context, oldParent util.FullPath, entry *filer.Entry, newParent util.FullPath, newName string, signatures []int32) error { currentDirPath := oldParent.Child(entry.Name()) newDirPath := newParent.Child(newName) @@ -84,7 +84,7 @@ func (fs *FilerServer) moveFolderSubEntries(ctx context.Context, oldParent util. for _, item := range entries { lastFileName = item.Name() // println("processing", lastFileName) - err := fs.moveEntry(ctx, currentDirPath, item, newDirPath, item.Name()) + err := fs.moveEntry(ctx, currentDirPath, item, newDirPath, item.Name(), signatures) if err != nil { return err } @@ -96,7 +96,7 @@ func (fs *FilerServer) moveFolderSubEntries(ctx context.Context, oldParent util. return nil } -func (fs *FilerServer) moveSelfEntry(ctx context.Context, oldParent util.FullPath, entry *filer.Entry, newParent util.FullPath, newName string, moveFolderSubEntries func() error) error { +func (fs *FilerServer) moveSelfEntry(ctx context.Context, oldParent util.FullPath, entry *filer.Entry, newParent util.FullPath, newName string, moveFolderSubEntries func() error, signatures []int32) error { oldPath, newPath := oldParent.Child(entry.Name()), newParent.Child(newName) @@ -115,7 +115,7 @@ func (fs *FilerServer) moveSelfEntry(ctx context.Context, oldParent util.FullPat Extended: entry.Extended, Content: entry.Content, } - if createErr := fs.filer.CreateEntry(ctx, newEntry, false, false, nil); createErr != nil { + if createErr := fs.filer.CreateEntry(ctx, newEntry, false, false, signatures); createErr != nil { return createErr } @@ -126,7 +126,7 @@ func (fs *FilerServer) moveSelfEntry(ctx context.Context, oldParent util.FullPat } // delete old entry - deleteErr := fs.filer.DeleteEntryMetaAndData(ctx, oldPath, false, false, false, false, nil) + deleteErr := fs.filer.DeleteEntryMetaAndData(ctx, oldPath, false, false, false, false, signatures) if deleteErr != nil { return deleteErr } diff --git a/weed/server/filer_grpc_server_sub_meta.go b/weed/server/filer_grpc_server_sub_meta.go index 18505a95f..e79406bbe 100644 --- a/weed/server/filer_grpc_server_sub_meta.go +++ b/weed/server/filer_grpc_server_sub_meta.go @@ -25,7 +25,20 @@ func (fs *FilerServer) SubscribeMetadata(req *filer_pb.SubscribeMetadataRequest, lastReadTime := time.Unix(0, req.SinceNs) glog.V(0).Infof(" %v starts to subscribe %s from %+v", clientName, req.PathPrefix, lastReadTime) - eachEventNotificationFn := fs.eachEventNotificationFn(req, stream, clientName, req.Signature) + t := fs.eachEventNotificationFn(req, stream, clientName, req.Signature) + + eachEventNotificationFn := func(dirPath string, eventNotification *filer_pb.EventNotification, tsNs int64) error { + found := false + for _, sig := range eventNotification.Signatures { + if req.Signature == sig { + found = true + } + } + if !found { + glog.V(0).Infof("fresh message for %s(%d) %s %s", clientName, req.Signature, dirPath, eventNotification.String()) + } + return t(dirPath, eventNotification, tsNs) + } eachLogEntryFn := eachLogEntryFn(eachEventNotificationFn) From b6240903986b9069b31a94df5e11594a1d1f2504 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 1 Jul 2021 01:21:14 -0700 Subject: [PATCH 062/265] go fmt --- weed/command/fuse.go | 30 +++++++++++----------- weed/command/upload.go | 2 +- weed/command/volume.go | 2 +- weed/filesys/dirty_pages_temp_file.go | 2 +- weed/filesys/dirty_pages_temp_interval.go | 2 +- weed/filesys/file.go | 2 +- weed/server/filer_server.go | 2 +- weed/server/master_grpc_server_volume.go | 2 +- weed/server/master_server.go | 2 +- weed/server/master_server_handlers.go | 2 +- weed/server/volume_server.go | 4 +-- weed/server/volume_server_handlers_read.go | 2 +- weed/storage/needle/needle_read_write.go | 8 +++--- weed/topology/node.go | 2 +- weed/util/grace/pprof.go | 8 +++--- 15 files changed, 36 insertions(+), 36 deletions(-) diff --git a/weed/command/fuse.go b/weed/command/fuse.go index 09dec388f..ac306876a 100644 --- a/weed/command/fuse.go +++ b/weed/command/fuse.go @@ -2,10 +2,10 @@ package command import ( "fmt" - "strings" - "strconv" - "time" "os" + "strconv" + "strings" + "time" ) func init() { @@ -13,7 +13,7 @@ func init() { } type parameter struct { - name string + name string value string } @@ -42,7 +42,7 @@ func runFuse(cmd *Command, args []string) bool { option.Reset() } - // dash separator read option until next space + // dash separator read option until next space } else if rawArgs[i] == '-' { for i++; i < rawArgsLen && rawArgs[i] != ' '; i++ { option.WriteByte(rawArgs[i]) @@ -50,7 +50,7 @@ func runFuse(cmd *Command, args []string) bool { options = append(options, parameter{option.String(), "true"}) option.Reset() - // equal separator start option with pending value + // equal separator start option with pending value } else if rawArgs[i] == '=' { name := option.String() option.Reset() @@ -62,13 +62,13 @@ func runFuse(cmd *Command, args []string) bool { option.WriteByte(rawArgs[i]) } - // single quote separator read option until next single quote + // single quote separator read option until next single quote } else if rawArgs[i] == '\'' { for i++; i < rawArgsLen && rawArgs[i] != '\''; i++ { option.WriteByte(rawArgs[i]) } - // add chars before comma + // add chars before comma } else if rawArgs[i] != ' ' { option.WriteByte(rawArgs[i]) } @@ -77,12 +77,12 @@ func runFuse(cmd *Command, args []string) bool { options = append(options, parameter{name, option.String()}) option.Reset() - // comma separator just read current option + // comma separator just read current option } else if rawArgs[i] == ',' { options = append(options, parameter{option.String(), "true"}) option.Reset() - // what is not a separator fill option buffer + // what is not a separator fill option buffer } else { option.WriteByte(rawArgs[i]) } @@ -99,7 +99,7 @@ func runFuse(cmd *Command, args []string) bool { for i := 0; i < len(options); i++ { parameter := options[i] - switch parameter.name { + switch parameter.name { case "child": masterProcess = false case "arg0": @@ -198,9 +198,9 @@ func runFuse(cmd *Command, args []string) bool { arg0 := os.Args[0] argv := append(os.Args, "-o", "child") - attr := os.ProcAttr{} - attr.Env = os.Environ() - + attr := os.ProcAttr{} + attr.Env = os.Environ() + child, err := os.StartProcess(arg0, argv, &attr) if err != nil { @@ -232,7 +232,7 @@ func runFuse(cmd *Command, args []string) bool { var cmdFuse = &Command{ UsageLine: "fuse /mnt/mount/point -o \"filer=localhost:8888,filer.path=/\"", - Short: "Allow use weed with linux's mount command", + Short: "Allow use weed with linux's mount command", Long: `Allow use weed with linux's mount command You can use -t weed on mount command: diff --git a/weed/command/upload.go b/weed/command/upload.go index a102796b4..ccdec561f 100644 --- a/weed/command/upload.go +++ b/weed/command/upload.go @@ -110,7 +110,7 @@ func runUpload(cmd *Command, args []string) bool { }) if err != nil { fmt.Println(err.Error()) - return false; + return false } } else { parts, e := operation.NewFileParts(args) diff --git a/weed/command/volume.go b/weed/command/volume.go index fe75e9e91..ced6ec414 100644 --- a/weed/command/volume.go +++ b/weed/command/volume.go @@ -51,7 +51,7 @@ type VolumeServerOptions struct { indexType *string diskType *string fixJpgOrientation *bool - readMode *string + readMode *string cpuProfile *string memProfile *string compactionMBPerSecond *int diff --git a/weed/filesys/dirty_pages_temp_file.go b/weed/filesys/dirty_pages_temp_file.go index 3826008b7..9fa7c0c8e 100644 --- a/weed/filesys/dirty_pages_temp_file.go +++ b/weed/filesys/dirty_pages_temp_file.go @@ -97,7 +97,7 @@ func (pages *TempFileDirtyPages) saveExistingPagesToStorage() { for _, list := range pages.writtenIntervals.lists { listStopOffset := list.Offset() + list.Size() - for uploadedOffset:=int64(0); uploadedOffset < listStopOffset; uploadedOffset += pageSize { + for uploadedOffset := int64(0); uploadedOffset < listStopOffset; uploadedOffset += pageSize { start, stop := max(list.Offset(), uploadedOffset), min(listStopOffset, uploadedOffset+pageSize) if start >= stop { continue diff --git a/weed/filesys/dirty_pages_temp_interval.go b/weed/filesys/dirty_pages_temp_interval.go index 2030178be..42c4b5a3b 100644 --- a/weed/filesys/dirty_pages_temp_interval.go +++ b/weed/filesys/dirty_pages_temp_interval.go @@ -54,7 +54,7 @@ func (list *WrittenIntervalLinkedList) ReadData(buf []byte, start, stop int64) { nodeStart, nodeStop := max(start, t.DataOffset), min(stop, t.DataOffset+t.Size) if nodeStart < nodeStop { // glog.V(4).Infof("copying start=%d stop=%d t=[%d,%d) => bufSize=%d nodeStart=%d, nodeStop=%d", start, stop, t.DataOffset, t.DataOffset+t.Size, len(buf), nodeStart, nodeStop) - list.tempFile.ReadAt(buf[nodeStart-start:nodeStop-start], t.TempOffset + nodeStart - t.DataOffset) + list.tempFile.ReadAt(buf[nodeStart-start:nodeStop-start], t.TempOffset+nodeStart-t.DataOffset) } if t.Next == nil { diff --git a/weed/filesys/file.go b/weed/filesys/file.go index 8f58511e2..7f021619c 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -144,7 +144,7 @@ func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *f file.dirtyMetadata = true } - if req.Valid.Mode() && entry.Attributes.FileMode != uint32(req.Mode){ + if req.Valid.Mode() && entry.Attributes.FileMode != uint32(req.Mode) { entry.Attributes.FileMode = uint32(req.Mode) file.dirtyMetadata = true } diff --git a/weed/server/filer_server.go b/weed/server/filer_server.go index dfb43c706..d7afaa65a 100644 --- a/weed/server/filer_server.go +++ b/weed/server/filer_server.go @@ -30,11 +30,11 @@ import ( _ "github.com/chrislusf/seaweedfs/weed/filer/mongodb" _ "github.com/chrislusf/seaweedfs/weed/filer/mysql" _ "github.com/chrislusf/seaweedfs/weed/filer/mysql2" - _ "github.com/chrislusf/seaweedfs/weed/filer/sqlite" _ "github.com/chrislusf/seaweedfs/weed/filer/postgres" _ "github.com/chrislusf/seaweedfs/weed/filer/postgres2" _ "github.com/chrislusf/seaweedfs/weed/filer/redis" _ "github.com/chrislusf/seaweedfs/weed/filer/redis2" + _ "github.com/chrislusf/seaweedfs/weed/filer/sqlite" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/notification" _ "github.com/chrislusf/seaweedfs/weed/notification/aws_sqs" diff --git a/weed/server/master_grpc_server_volume.go b/weed/server/master_grpc_server_volume.go index 3a4951cc5..4132ce690 100644 --- a/weed/server/master_grpc_server_volume.go +++ b/weed/server/master_grpc_server_volume.go @@ -143,7 +143,7 @@ func (ms *MasterServer) Assign(ctx context.Context, req *master_pb.AssignRequest maxTimeout = time.Second * 10 startTime = time.Now() ) - + for time.Now().Sub(startTime) < maxTimeout { fid, count, dn, err := ms.Topo.PickForWrite(req.Count, option) if err == nil { diff --git a/weed/server/master_server.go b/weed/server/master_server.go index 838803908..11dc95ded 100644 --- a/weed/server/master_server.go +++ b/weed/server/master_server.go @@ -97,7 +97,7 @@ func NewMasterServer(r *mux.Router, option *MasterOption, peers []string) *Maste ms := &MasterServer{ option: option, preallocateSize: preallocateSize, - vgCh: make(chan *topology.VolumeGrowRequest, 1 << 6), + vgCh: make(chan *topology.VolumeGrowRequest, 1<<6), clientChans: make(map[string]chan *master_pb.VolumeLocation), grpcDialOption: grpcDialOption, MasterClient: wdclient.NewMasterClient(grpcDialOption, "master", option.Host, 0, "", peers), diff --git a/weed/server/master_server_handlers.go b/weed/server/master_server_handlers.go index 974b3308f..0609732c7 100644 --- a/weed/server/master_server_handlers.go +++ b/weed/server/master_server_handlers.go @@ -123,7 +123,7 @@ func (ms *MasterServer) dirAssignHandler(w http.ResponseWriter, r *http.Request) Count: writableVolumeCount, ErrCh: errCh, } - if err := <- errCh; err != nil { + if err := <-errCh; err != nil { writeJsonError(w, r, http.StatusInternalServerError, fmt.Errorf("cannot grow volume group! %v", err)) return } diff --git a/weed/server/volume_server.go b/weed/server/volume_server.go index 74c5f72c6..0d765a253 100644 --- a/weed/server/volume_server.go +++ b/weed/server/volume_server.go @@ -28,7 +28,7 @@ type VolumeServer struct { needleMapKind storage.NeedleMapKind FixJpgOrientation bool - ReadMode string + ReadMode string compactionBytePerSecond int64 metricsAddress string metricsIntervalSec int @@ -72,7 +72,7 @@ func NewVolumeServer(adminMux, publicMux *http.ServeMux, ip string, rack: rack, needleMapKind: needleMapKind, FixJpgOrientation: fixJpgOrientation, - ReadMode: readMode, + ReadMode: readMode, grpcDialOption: security.LoadClientTLS(util.GetViper(), "grpc.volume"), compactionBytePerSecond: int64(compactionMBPerSecond) * 1024 * 1024, fileSizeLimitBytes: int64(fileSizeLimitMB) * 1024 * 1024, diff --git a/weed/server/volume_server_handlers_read.go b/weed/server/volume_server_handlers_read.go index 13644ab01..c5afd9545 100644 --- a/weed/server/volume_server_handlers_read.go +++ b/weed/server/volume_server_handlers_read.go @@ -65,7 +65,7 @@ func (vs *VolumeServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) } lookupResult, err := operation.Lookup(vs.GetMaster, volumeId.String()) glog.V(2).Infoln("volume", volumeId, "found on", lookupResult, "error", err) - if err != nil || len(lookupResult.Locations) <= 0{ + if err != nil || len(lookupResult.Locations) <= 0 { glog.V(0).Infoln("lookup error:", err, r.URL.Path) w.WriteHeader(http.StatusNotFound) return diff --git a/weed/storage/needle/needle_read_write.go b/weed/storage/needle/needle_read_write.go index d208404a8..84e00374a 100644 --- a/weed/storage/needle/needle_read_write.go +++ b/weed/storage/needle/needle_read_write.go @@ -52,7 +52,7 @@ func (n *Needle) prepareWriteBuffer(version Version, writeBytes *bytes.Buffer) ( writeBytes.Write(n.Data) padding := PaddingLength(n.Size, version) util.Uint32toBytes(header[0:NeedleChecksumSize], n.Checksum.Value()) - writeBytes.Write(header[0:NeedleChecksumSize+padding]) + writeBytes.Write(header[0 : NeedleChecksumSize+padding]) return size, actualSize, nil case Version2, Version3: header := make([]byte, NeedleHeaderSize+TimestampSize) // adding timestamp to reuse it and avoid extra allocation @@ -104,7 +104,7 @@ func (n *Needle) prepareWriteBuffer(version Version, writeBytes *bytes.Buffer) ( } if n.HasLastModifiedDate() { util.Uint64toBytes(header[0:8], n.LastModified) - writeBytes.Write(header[8-LastModifiedBytesLength:8]) + writeBytes.Write(header[8-LastModifiedBytesLength : 8]) } if n.HasTtl() && n.Ttl != nil { n.Ttl.ToBytes(header[0:TtlBytesLength]) @@ -119,11 +119,11 @@ func (n *Needle) prepareWriteBuffer(version Version, writeBytes *bytes.Buffer) ( padding := PaddingLength(n.Size, version) util.Uint32toBytes(header[0:NeedleChecksumSize], n.Checksum.Value()) if version == Version2 { - writeBytes.Write(header[0:NeedleChecksumSize+padding]) + writeBytes.Write(header[0 : NeedleChecksumSize+padding]) } else { // version3 util.Uint64toBytes(header[NeedleChecksumSize:NeedleChecksumSize+TimestampSize], n.AppendAtNs) - writeBytes.Write(header[0:NeedleChecksumSize+TimestampSize+padding]) + writeBytes.Write(header[0 : NeedleChecksumSize+TimestampSize+padding]) } return Size(n.DataSize), GetActualSize(n.Size, version), nil diff --git a/weed/topology/node.go b/weed/topology/node.go index 4556b4165..4772cb411 100644 --- a/weed/topology/node.go +++ b/weed/topology/node.go @@ -243,7 +243,7 @@ func (n *NodeImpl) CollectDeadNodeAndFullVolumes(freshThreshHold int64, volumeSi if v.Size >= volumeSizeLimit { //fmt.Println("volume",v.Id,"size",v.Size,">",volumeSizeLimit) n.GetTopology().chanFullVolumes <- v - }else if float64(v.Size) > float64(volumeSizeLimit) * growThreshold { + } else if float64(v.Size) > float64(volumeSizeLimit)*growThreshold { n.GetTopology().chanCrowdedVolumes <- v } } diff --git a/weed/util/grace/pprof.go b/weed/util/grace/pprof.go index 0406b762c..28bf6d553 100644 --- a/weed/util/grace/pprof.go +++ b/weed/util/grace/pprof.go @@ -21,21 +21,21 @@ func SetupProfiling(cpuProfile, memProfile string) { pprof.StopCPUProfile() // write block pprof - blockF, err := os.Create(cpuProfile+".block") + blockF, err := os.Create(cpuProfile + ".block") if err != nil { return } p := pprof.Lookup("block") - p.WriteTo(blockF,0) + p.WriteTo(blockF, 0) blockF.Close() // write mutex pprof - mutexF, err := os.Create(cpuProfile+".mutex") + mutexF, err := os.Create(cpuProfile + ".mutex") if err != nil { return } p = pprof.Lookup("mutex") - p.WriteTo(mutexF,0) + p.WriteTo(mutexF, 0) mutexF.Close() }) From 067eb15e707378c10b5d897c39bb681110ab268a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 1 Jul 2021 01:24:07 -0700 Subject: [PATCH 063/265] remove debug messages --- weed/server/filer_grpc_server_sub_meta.go | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/weed/server/filer_grpc_server_sub_meta.go b/weed/server/filer_grpc_server_sub_meta.go index e79406bbe..18505a95f 100644 --- a/weed/server/filer_grpc_server_sub_meta.go +++ b/weed/server/filer_grpc_server_sub_meta.go @@ -25,20 +25,7 @@ func (fs *FilerServer) SubscribeMetadata(req *filer_pb.SubscribeMetadataRequest, lastReadTime := time.Unix(0, req.SinceNs) glog.V(0).Infof(" %v starts to subscribe %s from %+v", clientName, req.PathPrefix, lastReadTime) - t := fs.eachEventNotificationFn(req, stream, clientName, req.Signature) - - eachEventNotificationFn := func(dirPath string, eventNotification *filer_pb.EventNotification, tsNs int64) error { - found := false - for _, sig := range eventNotification.Signatures { - if req.Signature == sig { - found = true - } - } - if !found { - glog.V(0).Infof("fresh message for %s(%d) %s %s", clientName, req.Signature, dirPath, eventNotification.String()) - } - return t(dirPath, eventNotification, tsNs) - } + eachEventNotificationFn := fs.eachEventNotificationFn(req, stream, clientName, req.Signature) eachLogEntryFn := eachLogEntryFn(eachEventNotificationFn) From 2420c60fc418638aef936ac3fae5f5b342e7cc42 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 1 Jul 2021 14:01:25 -0700 Subject: [PATCH 064/265] log reading adds delay between retries --- weed/server/filer_grpc_server_sub_meta.go | 57 ++++++++++++++--------- weed/util/log_buffer/log_buffer.go | 2 + 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/weed/server/filer_grpc_server_sub_meta.go b/weed/server/filer_grpc_server_sub_meta.go index 18505a95f..624069b7e 100644 --- a/weed/server/filer_grpc_server_sub_meta.go +++ b/weed/server/filer_grpc_server_sub_meta.go @@ -30,44 +30,49 @@ func (fs *FilerServer) SubscribeMetadata(req *filer_pb.SubscribeMetadataRequest, eachLogEntryFn := eachLogEntryFn(eachEventNotificationFn) var processedTsNs int64 - var err error + var readPersistedLogErr error + var readInMemoryLogErr error for { glog.V(4).Infof("read on disk %v aggregated subscribe %s from %+v", clientName, req.PathPrefix, lastReadTime) - processedTsNs, err = fs.filer.ReadPersistedLogBuffer(lastReadTime, eachLogEntryFn) - if err != nil { - return fmt.Errorf("reading from persisted logs: %v", err) + processedTsNs, readPersistedLogErr = fs.filer.ReadPersistedLogBuffer(lastReadTime, eachLogEntryFn) + if readPersistedLogErr != nil { + return fmt.Errorf("reading from persisted logs: %v", readPersistedLogErr) } if processedTsNs != 0 { lastReadTime = time.Unix(0, processedTsNs) + } else { + if readInMemoryLogErr == log_buffer.ResumeFromDiskError { + time.Sleep(1127 * time.Millisecond) + continue + } } glog.V(4).Infof("read in memory %v aggregated subscribe %s from %+v", clientName, req.PathPrefix, lastReadTime) - lastReadTime, err = fs.filer.MetaAggregator.MetaLogBuffer.LoopProcessLogData("aggMeta:"+clientName, lastReadTime, func() bool { + lastReadTime, readInMemoryLogErr = fs.filer.MetaAggregator.MetaLogBuffer.LoopProcessLogData("aggMeta:"+clientName, lastReadTime, func() bool { fs.filer.MetaAggregator.ListenersLock.Lock() fs.filer.MetaAggregator.ListenersCond.Wait() fs.filer.MetaAggregator.ListenersLock.Unlock() return true }, eachLogEntryFn) - if err != nil { - if err == log_buffer.ResumeFromDiskError { - time.Sleep(5127 * time.Millisecond) + if readInMemoryLogErr != nil { + if readInMemoryLogErr == log_buffer.ResumeFromDiskError { continue } - glog.Errorf("processed to %v: %v", lastReadTime, err) - if err != log_buffer.ResumeError { + glog.Errorf("processed to %v: %v", lastReadTime, readInMemoryLogErr) + if readInMemoryLogErr != log_buffer.ResumeError { break } } - time.Sleep(5127 * time.Millisecond) + time.Sleep(1127 * time.Millisecond) } - return err + return readInMemoryLogErr } @@ -87,41 +92,47 @@ func (fs *FilerServer) SubscribeLocalMetadata(req *filer_pb.SubscribeMetadataReq eachLogEntryFn := eachLogEntryFn(eachEventNotificationFn) var processedTsNs int64 - var err error + var readPersistedLogErr error + var readInMemoryLogErr error for { // println("reading from persisted logs ...") glog.V(0).Infof("read on disk %v local subscribe %s from %+v", clientName, req.PathPrefix, lastReadTime) - processedTsNs, err = fs.filer.ReadPersistedLogBuffer(lastReadTime, eachLogEntryFn) - if err != nil { - return fmt.Errorf("reading from persisted logs: %v", err) + processedTsNs, readPersistedLogErr = fs.filer.ReadPersistedLogBuffer(lastReadTime, eachLogEntryFn) + if readPersistedLogErr != nil { + return fmt.Errorf("reading from persisted logs: %v", readPersistedLogErr) } if processedTsNs != 0 { lastReadTime = time.Unix(0, processedTsNs) + } else { + if readInMemoryLogErr == log_buffer.ResumeFromDiskError { + time.Sleep(1127 * time.Millisecond) + continue + } } glog.V(0).Infof("read in memory %v local subscribe %s from %+v", clientName, req.PathPrefix, lastReadTime) - lastReadTime, err = fs.filer.LocalMetaLogBuffer.LoopProcessLogData("localMeta:"+clientName, lastReadTime, func() bool { + lastReadTime, readInMemoryLogErr = fs.filer.LocalMetaLogBuffer.LoopProcessLogData("localMeta:"+clientName, lastReadTime, func() bool { fs.listenersLock.Lock() fs.listenersCond.Wait() fs.listenersLock.Unlock() return true }, eachLogEntryFn) - if err != nil { - if err == log_buffer.ResumeFromDiskError { + if readInMemoryLogErr != nil { + if readInMemoryLogErr == log_buffer.ResumeFromDiskError { continue } - glog.Errorf("processed to %v: %v", lastReadTime, err) - time.Sleep(3127 * time.Millisecond) - if err != log_buffer.ResumeError { + glog.Errorf("processed to %v: %v", lastReadTime, readInMemoryLogErr) + time.Sleep(1127 * time.Millisecond) + if readInMemoryLogErr != log_buffer.ResumeError { break } } } - return err + return readInMemoryLogErr } diff --git a/weed/util/log_buffer/log_buffer.go b/weed/util/log_buffer/log_buffer.go index 12840a88a..4742c2b7c 100644 --- a/weed/util/log_buffer/log_buffer.go +++ b/weed/util/log_buffer/log_buffer.go @@ -170,6 +170,8 @@ func (m *LogBuffer) copyToFlush() *dataToFlush { m.lastFlushTime = m.stopTime } m.buf = m.prevBuffers.SealBuffer(m.startTime, m.stopTime, m.buf, m.pos) + m.startTime = time.Unix(0,0) + m.stopTime = time.Unix(0,0) m.pos = 0 m.idx = m.idx[:0] return d From c6d4c16079875dfbe0d350b83fbacccaaa9c15db Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 1 Jul 2021 19:12:11 -0700 Subject: [PATCH 065/265] S3: add metadata with multipart upload fix https://github.com/chrislusf/seaweedfs/issues/2173 --- weed/s3api/filer_multipart.go | 3 +++ weed/s3api/s3api_object_multipart_handlers.go | 17 +++++++++++++---- .../filer_server_handlers_write_autochunk.go | 4 ---- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/weed/s3api/filer_multipart.go b/weed/s3api/filer_multipart.go index f882592c1..61132c082 100644 --- a/weed/s3api/filer_multipart.go +++ b/weed/s3api/filer_multipart.go @@ -35,6 +35,9 @@ func (s3a *S3ApiServer) createMultipartUpload(input *s3.CreateMultipartUploadInp entry.Extended = make(map[string][]byte) } entry.Extended["key"] = []byte(*input.Key) + for k, v := range input.Metadata { + entry.Extended[k] = []byte(*v) + } }); err != nil { glog.Errorf("NewMultipartUpload error: %v", err) return nil, s3err.ErrInternalError diff --git a/weed/s3api/s3api_object_multipart_handlers.go b/weed/s3api/s3api_object_multipart_handlers.go index de3faaaaa..a4daea7a2 100644 --- a/weed/s3api/s3api_object_multipart_handlers.go +++ b/weed/s3api/s3api_object_multipart_handlers.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/s3api/s3err" + weed_server "github.com/chrislusf/seaweedfs/weed/server" "net/http" "net/url" "strconv" @@ -24,10 +25,18 @@ const ( func (s3a *S3ApiServer) NewMultipartUploadHandler(w http.ResponseWriter, r *http.Request) { bucket, object := getBucketAndObject(r) - response, errCode := s3a.createMultipartUpload(&s3.CreateMultipartUploadInput{ - Bucket: aws.String(bucket), - Key: objectKey(aws.String(object)), - }) + createMultipartUploadInput := &s3.CreateMultipartUploadInput{ + Bucket: aws.String(bucket), + Key: objectKey(aws.String(object)), + Metadata: make(map[string]*string), + } + + metadata := weed_server.SaveAmzMetaData(r, nil, false) + for k, v := range metadata { + createMultipartUploadInput.Metadata[k] = aws.String(string(v)) + } + + response, errCode := s3a.createMultipartUpload(createMultipartUploadInput) glog.V(2).Info("NewMultipartUploadHandler", s3err.EncodeXMLResponse(response), errCode) diff --git a/weed/server/filer_server_handlers_write_autochunk.go b/weed/server/filer_server_handlers_write_autochunk.go index fcb92d8ec..a42e0fc97 100644 --- a/weed/server/filer_server_handlers_write_autochunk.go +++ b/weed/server/filer_server_handlers_write_autochunk.go @@ -214,10 +214,6 @@ func (fs *FilerServer) saveMetaData(ctx context.Context, r *http.Request, fileNa Size: int64(entry.FileSize), } - if entry.Extended == nil { - entry.Extended = make(map[string][]byte) - } - entry.Extended = SaveAmzMetaData(r, entry.Extended, false) for k, v := range r.Header { From 1a4db87e19a577873d7f354673ac1cbf825597ae Mon Sep 17 00:00:00 2001 From: lyg Date: Fri, 2 Jul 2021 11:00:42 +0800 Subject: [PATCH 066/265] fix s3 metadata error with multipart upload --- weed/pb/filer_pb/filer_client.go | 6 +++++- weed/s3api/filer_multipart.go | 17 ++++++++++++++++- weed/s3api/filer_util.go | 4 ++-- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/weed/pb/filer_pb/filer_client.go b/weed/pb/filer_pb/filer_client.go index 65bd85c84..12f918137 100644 --- a/weed/pb/filer_pb/filer_client.go +++ b/weed/pb/filer_pb/filer_client.go @@ -236,7 +236,7 @@ func Mkdir(filerClient FilerClient, parentDirectoryPath string, dirName string, }) } -func MkFile(filerClient FilerClient, parentDirectoryPath string, fileName string, chunks []*FileChunk) error { +func MkFile(filerClient FilerClient, parentDirectoryPath string, fileName string, chunks []*FileChunk, fn func(entry *Entry)) error { return filerClient.WithFilerClient(func(client SeaweedFilerClient) error { entry := &Entry{ @@ -252,6 +252,10 @@ func MkFile(filerClient FilerClient, parentDirectoryPath string, fileName string Chunks: chunks, } + if fn != nil { + fn(entry) + } + request := &CreateEntryRequest{ Directory: parentDirectoryPath, Entry: entry, diff --git a/weed/s3api/filer_multipart.go b/weed/s3api/filer_multipart.go index 61132c082..5d7bf2ac3 100644 --- a/weed/s3api/filer_multipart.go +++ b/weed/s3api/filer_multipart.go @@ -71,6 +71,12 @@ func (s3a *S3ApiServer) completeMultipartUpload(input *s3.CompleteMultipartUploa return nil, s3err.ErrNoSuchUpload } + pentry, err := s3a.getEntry(s3a.genUploadsFolder(*input.Bucket),*input.UploadId) + if err != nil { + glog.Errorf("completeMultipartUpload %s %s error: %v", *input.Bucket, *input.UploadId, err) + return nil, s3err.ErrNoSuchUpload + } + var finalParts []*filer_pb.FileChunk var offset int64 @@ -106,7 +112,16 @@ func (s3a *S3ApiServer) completeMultipartUpload(input *s3.CompleteMultipartUploa dirName = dirName[:len(dirName)-1] } - err = s3a.mkFile(dirName, entryName, finalParts) + err = s3a.mkFile(dirName, entryName, finalParts,func(entry *filer_pb.Entry) { + if entry.Extended == nil { + entry.Extended = make(map[string][]byte) + } + for k,v := range pentry.Extended{ + if k != "key" { + entry.Extended[k] = v + } + } + }) if err != nil { glog.Errorf("completeMultipartUpload %s/%s error: %v", dirName, entryName, err) diff --git a/weed/s3api/filer_util.go b/weed/s3api/filer_util.go index 1803332a3..92267a154 100644 --- a/weed/s3api/filer_util.go +++ b/weed/s3api/filer_util.go @@ -15,9 +15,9 @@ func (s3a *S3ApiServer) mkdir(parentDirectoryPath string, dirName string, fn fun } -func (s3a *S3ApiServer) mkFile(parentDirectoryPath string, fileName string, chunks []*filer_pb.FileChunk) error { +func (s3a *S3ApiServer) mkFile(parentDirectoryPath string, fileName string, chunks []*filer_pb.FileChunk, fn func(entry *filer_pb.Entry)) error { - return filer_pb.MkFile(s3a, parentDirectoryPath, fileName, chunks) + return filer_pb.MkFile(s3a, parentDirectoryPath, fileName, chunks,fn) } From 586e066897c03fc4084d6ad0eaa8d77128e48f8c Mon Sep 17 00:00:00 2001 From: danielflira Date: Fri, 2 Jul 2021 16:52:52 -0300 Subject: [PATCH 067/265] fix weed fuse parameters parsing --- weed/command/fuse.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/weed/command/fuse.go b/weed/command/fuse.go index ac306876a..f2534e853 100644 --- a/weed/command/fuse.go +++ b/weed/command/fuse.go @@ -55,14 +55,14 @@ func runFuse(cmd *Command, args []string) bool { name := option.String() option.Reset() - for i++; i < rawArgsLen && rawArgs[i] != ','; i++ { + for i++; i < rawArgsLen && rawArgs[i] != ',' && rawArgs[i] != ' '; i++ { // double quote separator read option until next double quote if rawArgs[i] == '"' { for i++; i < rawArgsLen && rawArgs[i] != '"'; i++ { option.WriteByte(rawArgs[i]) } - // single quote separator read option until next single quote + // single quote separator read option until next single quote } else if rawArgs[i] == '\'' { for i++; i < rawArgsLen && rawArgs[i] != '\''; i++ { option.WriteByte(rawArgs[i]) From d8bda0b2294afe59f0edc062fd145cd24ea725db Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 2 Jul 2021 13:33:15 -0700 Subject: [PATCH 068/265] locate the weed binary --- weed/command/fuse.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/weed/command/fuse.go b/weed/command/fuse.go index f2534e853..609892b5b 100644 --- a/weed/command/fuse.go +++ b/weed/command/fuse.go @@ -195,7 +195,11 @@ func runFuse(cmd *Command, args []string) bool { // the master start the child, release it then finish himself if masterProcess { - arg0 := os.Args[0] + arg0, err := os.Executable() + if err != nil { + panic(err) + } + argv := append(os.Args, "-o", "child") attr := os.ProcAttr{} From 8425705643695df7e8f910c41b2f40ad71ecdedc Mon Sep 17 00:00:00 2001 From: nivekuil Date: Fri, 2 Jul 2021 13:02:26 -0700 Subject: [PATCH 069/265] Cassandra: Use TokenAwareHostPolicy by default with fallback See https://pkg.go.dev/github.com/gocql/gocql#hdr-Data_center_awareness_and_query_routing --- weed/command/scaffold.go | 2 ++ weed/filer/cassandra/cassandra_store.go | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/weed/command/scaffold.go b/weed/command/scaffold.go index 2d6729bd3..8e940f608 100644 --- a/weed/command/scaffold.go +++ b/weed/command/scaffold.go @@ -217,6 +217,8 @@ username="" password="" # This changes the data layout. Only add new directories. Removing/Updating will cause data loss. superLargeDirectories = [] +# Name of the datacenter local to this filer, used as host selection fallback. +localDC="" [hbase] enabled = false diff --git a/weed/filer/cassandra/cassandra_store.go b/weed/filer/cassandra/cassandra_store.go index 0398f5117..f4856657e 100644 --- a/weed/filer/cassandra/cassandra_store.go +++ b/weed/filer/cassandra/cassandra_store.go @@ -32,6 +32,7 @@ func (store *CassandraStore) Initialize(configuration util.Configuration, prefix configuration.GetString(prefix+"username"), configuration.GetString(prefix+"password"), configuration.GetStringSlice(prefix+"superLargeDirectories"), + configuration.GetString(prefix+"localDC"), ) } @@ -40,13 +41,19 @@ func (store *CassandraStore) isSuperLargeDirectory(dir string) (dirHash string, return } -func (store *CassandraStore) initialize(keyspace string, hosts []string, username string, password string, superLargeDirectories []string) (err error) { +func (store *CassandraStore) initialize(keyspace string, hosts []string, username string, password string, superLargeDirectories []string, localDC string) (err error) { store.cluster = gocql.NewCluster(hosts...) if username != "" && password != "" { store.cluster.Authenticator = gocql.PasswordAuthenticator{Username: username, Password: password} } store.cluster.Keyspace = keyspace + fallback := gocql.RoundRobinHostPolicy() + if localDC != "" { + fallback = gocql.DCAwareRoundRobinPolicy(localDC) + } + store.cluster.PoolConfig.HostSelectionPolicy = gocql.TokenAwareHostPolicy(fallback) store.cluster.Consistency = gocql.LocalQuorum + store.session, err = store.cluster.CreateSession() if err != nil { glog.V(0).Infof("Failed to open cassandra store, hosts %v, keyspace %s", hosts, keyspace) From 8fe75692ee9adaae3c2fc0a735ae4d8a172d97ae Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 2 Jul 2021 13:57:34 -0700 Subject: [PATCH 070/265] volume: address "unaligned 64-bit atomic operation" fix https://github.com/chrislusf/seaweedfs/issues/2177 --- weed/server/volume_server.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/weed/server/volume_server.go b/weed/server/volume_server.go index 0d765a253..be50739c6 100644 --- a/weed/server/volume_server.go +++ b/weed/server/volume_server.go @@ -17,6 +17,10 @@ import ( ) type VolumeServer struct { + inFlightDataSize int64 + concurrentUploadLimit int64 + inFlightDataLimitCond *sync.Cond + SeedMasterNodes []string currentMaster string pulseSeconds int @@ -35,10 +39,6 @@ type VolumeServer struct { fileSizeLimitBytes int64 isHeartbeating bool stopChan chan bool - - inFlightDataSize int64 - inFlightDataLimitCond *sync.Cond - concurrentUploadLimit int64 } func NewVolumeServer(adminMux, publicMux *http.ServeMux, ip string, From fa0dab60299e73acfb8bca72b50184722db8e3ab Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 3 Jul 2021 02:59:35 -0700 Subject: [PATCH 071/265] mount: rename also recursively move file handles related to https://github.com/chrislusf/seaweedfs/issues/2169 --- weed/filesys/dir_rename.go | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/weed/filesys/dir_rename.go b/weed/filesys/dir_rename.go index 27a14d5c6..f69339a14 100644 --- a/weed/filesys/dir_rename.go +++ b/weed/filesys/dir_rename.go @@ -63,18 +63,6 @@ func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirector return fuse.EIO } - // change file handle - dir.wfs.handlesLock.Lock() - defer dir.wfs.handlesLock.Unlock() - inodeId := oldPath.AsInode() - existingHandle, found := dir.wfs.handles[inodeId] - glog.V(4).Infof("has open filehandle %s: %v", oldPath, found) - if !found || existingHandle == nil { - return nil - } - glog.V(4).Infof("opened filehandle %s => %s", oldPath, newPath) - delete(dir.wfs.handles, inodeId) - dir.wfs.handles[newPath.AsInode()] = existingHandle return nil } @@ -83,10 +71,12 @@ func (dir *Dir) moveEntry(ctx context.Context, oldParent util.FullPath, entry *f oldName := entry.Name() + oldPath := oldParent.Child(oldName) + newPath := newParent.Child(newName) if err := dir.moveSelfEntry(ctx, oldParent, entry, newParent, newName, func() error { - oldFsNode := NodeWithId(oldParent.Child(oldName).AsInode()) - newFsNode := NodeWithId(newParent.Child(newName).AsInode()) + oldFsNode := NodeWithId(oldPath.AsInode()) + newFsNode := NodeWithId(newPath.AsInode()) newDirNode, found := dir.wfs.Server.FindInternalNode(NodeWithId(newParent.AsInode())) var newDir *Dir if found { @@ -111,6 +101,16 @@ func (dir *Dir) moveEntry(ctx context.Context, oldParent util.FullPath, entry *f } }) + // change file handle + inodeId := oldPath.AsInode() + dir.wfs.handlesLock.Lock() + if existingHandle, found := dir.wfs.handles[inodeId]; found && existingHandle == nil { + glog.V(4).Infof("opened file handle %s => %s", oldPath, newPath) + delete(dir.wfs.handles, inodeId) + dir.wfs.handles[newPath.AsInode()] = existingHandle + } + dir.wfs.handlesLock.Unlock() + if entry.IsDirectory() { if err := dir.moveFolderSubEntries(ctx, oldParent, oldName, newParent, newName); err != nil { return err @@ -118,7 +118,7 @@ func (dir *Dir) moveEntry(ctx context.Context, oldParent util.FullPath, entry *f } return nil }); err != nil { - return fmt.Errorf("fail to move %s => %s: %v", oldParent.Child(oldName), newParent.Child(newName), err) + return fmt.Errorf("fail to move %s => %s: %v", oldPath, newPath, err) } return nil From 3986601ee82a7a7edef01970ad57e523693fdd3c Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 3 Jul 2021 12:52:58 -0700 Subject: [PATCH 072/265] add run_image --- docker/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docker/Makefile b/docker/Makefile index 58d494b95..8efc0ded2 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -25,6 +25,9 @@ dev_tls: build certstrap dev_mount: build docker-compose -f compose/local-mount-compose.yml -p seaweedfs up +run_image: build + docker run --rm -ti --device /dev/fuse --cap-add SYS_ADMIN --entrypoint /bin/sh chrislusf/seaweedfs:local + profile_mount: build docker-compose -f compose/local-mount-profile-compose.yml -p seaweedfs up From d39b2689a5e6e651fadc18ae079bbaf4e74fc5c4 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 3 Jul 2021 14:50:53 -0700 Subject: [PATCH 073/265] S3 authorization: StreamingSigned enforces access control fix https://github.com/chrislusf/seaweedfs/issues/2180 --- weed/s3api/chunked_reader_v4.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/weed/s3api/chunked_reader_v4.go b/weed/s3api/chunked_reader_v4.go index b163ec2f6..ec26f693a 100644 --- a/weed/s3api/chunked_reader_v4.go +++ b/weed/s3api/chunked_reader_v4.go @@ -85,11 +85,17 @@ func (iam *IdentityAccessManagement) calculateSeedSignature(r *http.Request) (cr return nil, "", "", time.Time{}, errCode } // Verify if the access key id matches. - _, cred, found := iam.lookupByAccessKey(signV4Values.Credential.accessKey) + identity, cred, found := iam.lookupByAccessKey(signV4Values.Credential.accessKey) if !found { return nil, "", "", time.Time{}, s3err.ErrInvalidAccessKeyID } + bucket, _ := getBucketAndObject(r) + if !identity.canDo("Write", bucket) { + errCode = s3err.ErrAccessDenied + return + } + // Verify if region is valid. region = signV4Values.Credential.scope.region From a024254ad780452c4d317dbd0bc5399245f2b379 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 3 Jul 2021 14:51:01 -0700 Subject: [PATCH 074/265] logging --- weed/s3api/auth_credentials.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/s3api/auth_credentials.go b/weed/s3api/auth_credentials.go index 22df04dc0..3439b40df 100644 --- a/weed/s3api/auth_credentials.go +++ b/weed/s3api/auth_credentials.go @@ -190,7 +190,7 @@ func (iam *IdentityAccessManagement) authRequest(r *http.Request, action Action) return identity, s3Err } - glog.V(3).Infof("user name: %v actions: %v", identity.Name, identity.Actions) + glog.V(3).Infof("user name: %v actions: %v, action: %v", identity.Name, identity.Actions, action) bucket, _ := getBucketAndObject(r) From f5fa0b08fd2b10de88bcb4e7c16ca3e844e1831c Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 3 Jul 2021 15:10:57 -0700 Subject: [PATCH 075/265] 2.57 --- k8s/seaweedfs/Chart.yaml | 4 ++-- k8s/seaweedfs/values.yaml | 2 +- weed/util/constants.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/k8s/seaweedfs/Chart.yaml b/k8s/seaweedfs/Chart.yaml index 7b779debe..7435cb0dd 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.56" -version: "2.56" +appVersion: "2.57" +version: "2.57" diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index 3b675eb41..b46c8d666 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.56" - started using {.Chart.appVersion} + # imageTag: "2.57" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index 4d7082af0..6404636d5 100644 --- a/weed/util/constants.go +++ b/weed/util/constants.go @@ -5,7 +5,7 @@ import ( ) var ( - VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 56) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 57) COMMIT = "" ) From 5bcc77b46cd96c096bad7afbd8544496d828cff6 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 3 Jul 2021 15:55:56 -0700 Subject: [PATCH 076/265] volume: default readMode to proxy --- k8s/seaweedfs/templates/volume-statefulset.yaml | 2 +- k8s/seaweedfs/values.yaml | 4 ++-- weed/command/server.go | 2 +- weed/command/volume.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/k8s/seaweedfs/templates/volume-statefulset.yaml b/k8s/seaweedfs/templates/volume-statefulset.yaml index 652fd9ea3..2168b2b80 100644 --- a/k8s/seaweedfs/templates/volume-statefulset.yaml +++ b/k8s/seaweedfs/templates/volume-statefulset.yaml @@ -110,7 +110,7 @@ spec: -dataCenter={{ .Values.volume.dataCenter }} \ {{- end }} -ip.bind={{ .Values.volume.ipBind }} \ - -read.redirect={{ .Values.volume.readRedirect }} \ + -readMode={{ .Values.volume.readMode }} \ {{- if .Values.volume.whiteList }} -whiteList={{ .Values.volume.whiteList }} \ {{- end }} diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index b46c8d666..927141b47 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -175,8 +175,8 @@ volume: # Volume server's data center name dataCenter: null - # Redirect moved or non-local volumes. (default true) - readRedirect: true + # Redirect moved or non-local volumes. (default proxy) + readMode: proxy # Comma separated Ip addresses having write permission. No limit if empty. whiteList: null diff --git a/weed/command/server.go b/weed/command/server.go index f6c033c64..97f117665 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -107,7 +107,7 @@ func init() { serverOptions.v.indexType = cmdServer.Flag.String("volume.index", "memory", "Choose [memory|leveldb|leveldbMedium|leveldbLarge] mode for memory~performance balance.") serverOptions.v.diskType = cmdServer.Flag.String("volume.disk", "", "[hdd|ssd|] hard drive or solid state drive or any tag") serverOptions.v.fixJpgOrientation = cmdServer.Flag.Bool("volume.images.fix.orientation", false, "Adjust jpg orientation when uploading.") - serverOptions.v.readMode = cmdServer.Flag.String("volume.readMode", "redirect", "[local|proxy|redirect] how to deal with non-local volume: 'not found|read in remote node|redirect volume location'.") + serverOptions.v.readMode = cmdServer.Flag.String("volume.readMode", "proxy", "[local|proxy|redirect] how to deal with non-local volume: 'not found|read in remote node|redirect volume location'.") serverOptions.v.compactionMBPerSecond = cmdServer.Flag.Int("volume.compactionMBps", 0, "limit compaction speed in mega bytes per second") serverOptions.v.fileSizeLimitMB = cmdServer.Flag.Int("volume.fileSizeLimitMB", 256, "limit file size to avoid out of memory") serverOptions.v.concurrentUploadLimitMB = cmdServer.Flag.Int("volume.concurrentUploadLimitMB", 64, "limit total concurrent upload size") diff --git a/weed/command/volume.go b/weed/command/volume.go index ced6ec414..38a52efee 100644 --- a/weed/command/volume.go +++ b/weed/command/volume.go @@ -80,7 +80,7 @@ func init() { v.indexType = cmdVolume.Flag.String("index", "memory", "Choose [memory|leveldb|leveldbMedium|leveldbLarge] mode for memory~performance balance.") v.diskType = cmdVolume.Flag.String("disk", "", "[hdd|ssd|] hard drive or solid state drive or any tag") v.fixJpgOrientation = cmdVolume.Flag.Bool("images.fix.orientation", false, "Adjust jpg orientation when uploading.") - v.readMode = cmdVolume.Flag.String("readMode", "redirect", "[local|proxy|redirect] how to deal with non-local volume: 'not found|proxy to remote node|redirect volume location'.") + v.readMode = cmdVolume.Flag.String("readMode", "proxy", "[local|proxy|redirect] how to deal with non-local volume: 'not found|proxy to remote node|redirect volume location'.") v.cpuProfile = cmdVolume.Flag.String("cpuprofile", "", "cpu profile output file") v.memProfile = cmdVolume.Flag.String("memprofile", "", "memory profile output file") v.compactionMBPerSecond = cmdVolume.Flag.Int("compactionMBps", 0, "limit background compaction or copying speed in mega bytes per second") From 5dbbe19c8b3d7081de90f282189cc9589d29581c Mon Sep 17 00:00:00 2001 From: bingoohuang Date: Mon, 5 Jul 2021 11:16:49 +0800 Subject: [PATCH 077/265] extract embed toml example to separate files --- weed/command/scaffold.go | 527 +----------------------- weed/command/scaffold/example.go | 21 + weed/command/scaffold/filer.toml | 234 +++++++++++ weed/command/scaffold/master.toml | 60 +++ weed/command/scaffold/notification.toml | 54 +++ weed/command/scaffold/replication.toml | 71 ++++ weed/command/scaffold/security.toml | 60 +++ weed/command/scaffold/shell.toml | 10 + 8 files changed, 517 insertions(+), 520 deletions(-) create mode 100644 weed/command/scaffold/example.go create mode 100644 weed/command/scaffold/filer.toml create mode 100644 weed/command/scaffold/master.toml create mode 100644 weed/command/scaffold/notification.toml create mode 100644 weed/command/scaffold/replication.toml create mode 100644 weed/command/scaffold/security.toml create mode 100644 weed/command/scaffold/shell.toml diff --git a/weed/command/scaffold.go b/weed/command/scaffold.go index 8e940f608..b48cf0959 100644 --- a/weed/command/scaffold.go +++ b/weed/command/scaffold.go @@ -1,6 +1,7 @@ package command import ( + "github.com/chrislusf/seaweedfs/weed/command/scaffold" "io/ioutil" "path/filepath" ) @@ -35,17 +36,17 @@ func runScaffold(cmd *Command, args []string) bool { content := "" switch *config { case "filer": - content = FILER_TOML_EXAMPLE + content = scaffold.Filer case "notification": - content = NOTIFICATION_TOML_EXAMPLE + content = scaffold.Notification case "replication": - content = REPLICATION_TOML_EXAMPLE + content = scaffold.Replication case "security": - content = SECURITY_TOML_EXAMPLE + content = scaffold.Security case "master": - content = MASTER_TOML_EXAMPLE + content = scaffold.Master case "shell": - content = SHELL_TOML_EXAMPLE + content = scaffold.Shell } if content == "" { println("need a valid -config option") @@ -59,517 +60,3 @@ func runScaffold(cmd *Command, args []string) bool { } return true } - -const ( - FILER_TOML_EXAMPLE = ` -# A sample TOML config file for SeaweedFS filer store -# Used with "weed filer" or "weed server -filer" -# Put this file to one of the location, with descending priority -# ./filer.toml -# $HOME/.seaweedfs/filer.toml -# /etc/seaweedfs/filer.toml - -#################################################### -# Customizable filer server options -#################################################### -[filer.options] -# with http DELETE, by default the filer would check whether a folder is empty. -# recursive_delete will delete all sub folders and files, similar to "rm -Rf" -recursive_delete = false -# directories under this folder will be automatically creating a separate bucket -buckets_folder = "/buckets" - -#################################################### -# The following are filer store options -#################################################### - -[leveldb2] -# local on disk, mostly for simple single-machine setup, fairly scalable -# faster than previous leveldb, recommended. -enabled = true -dir = "./filerldb2" # directory to store level db files - -[leveldb3] -# similar to leveldb2. -# each bucket has its own meta store. -enabled = false -dir = "./filerldb3" # directory to store level db files - -[rocksdb] -# local on disk, similar to leveldb -# since it is using a C wrapper, you need to install rocksdb and build it by yourself -enabled = false -dir = "./filerrdb" # directory to store rocksdb files - -[sqlite] -# local on disk, similar to leveldb -enabled = false -dbFile = "./filer.db" # sqlite db file - -[mysql] # or memsql, tidb -# CREATE TABLE IF NOT EXISTS filemeta ( -# dirhash BIGINT COMMENT 'first 64 bits of MD5 hash value of directory field', -# name VARCHAR(1000) BINARY COMMENT 'directory or file name', -# directory TEXT COMMENT 'full path to parent directory', -# meta LONGBLOB, -# PRIMARY KEY (dirhash, name) -# ) DEFAULT CHARSET=utf8; - -enabled = false -hostname = "localhost" -port = 3306 -username = "root" -password = "" -database = "" # create or use an existing database -connection_max_idle = 2 -connection_max_open = 100 -connection_max_lifetime_seconds = 0 -interpolateParams = false -# if insert/upsert failing, you can disable upsert or update query syntax to match your RDBMS syntax: -enableUpsert = true -upsertQuery = """INSERT INTO ` + "`%s`" + ` (dirhash,name,directory,meta) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE meta = VALUES(meta)""" - -[mysql2] # or memsql, tidb -enabled = false -createTable = """ - CREATE TABLE IF NOT EXISTS ` + "`%s`" + ` ( - dirhash BIGINT, - name VARCHAR(1000) BINARY, - directory TEXT, - meta LONGBLOB, - PRIMARY KEY (dirhash, name) - ) DEFAULT CHARSET=utf8; -""" -hostname = "localhost" -port = 3306 -username = "root" -password = "" -database = "" # create or use an existing database -connection_max_idle = 2 -connection_max_open = 100 -connection_max_lifetime_seconds = 0 -interpolateParams = false -# if insert/upsert failing, you can disable upsert or update query syntax to match your RDBMS syntax: -enableUpsert = true -upsertQuery = """INSERT INTO ` + "`%s`" + ` (dirhash,name,directory,meta) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE meta = VALUES(meta)""" - -[postgres] # or cockroachdb, YugabyteDB -# CREATE TABLE IF NOT EXISTS filemeta ( -# dirhash BIGINT, -# name VARCHAR(65535), -# directory VARCHAR(65535), -# meta bytea, -# PRIMARY KEY (dirhash, name) -# ); -enabled = false -hostname = "localhost" -port = 5432 -username = "postgres" -password = "" -database = "postgres" # create or use an existing database -schema = "" -sslmode = "disable" -connection_max_idle = 100 -connection_max_open = 100 -connection_max_lifetime_seconds = 0 -# if insert/upsert failing, you can disable upsert or update query syntax to match your RDBMS syntax: -enableUpsert = true -upsertQuery = """INSERT INTO "%[1]s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4) ON CONFLICT (dirhash,name) DO UPDATE SET meta = EXCLUDED.meta WHERE "%[1]s".meta != EXCLUDED.meta""" - -[postgres2] -enabled = false -createTable = """ - CREATE TABLE IF NOT EXISTS "%s" ( - dirhash BIGINT, - name VARCHAR(65535), - directory VARCHAR(65535), - meta bytea, - PRIMARY KEY (dirhash, name) - ); -""" -hostname = "localhost" -port = 5432 -username = "postgres" -password = "" -database = "postgres" # create or use an existing database -schema = "" -sslmode = "disable" -connection_max_idle = 100 -connection_max_open = 100 -connection_max_lifetime_seconds = 0 -# if insert/upsert failing, you can disable upsert or update query syntax to match your RDBMS syntax: -enableUpsert = true -upsertQuery = """INSERT INTO "%[1]s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4) ON CONFLICT (dirhash,name) DO UPDATE SET meta = EXCLUDED.meta WHERE "%[1]s".meta != EXCLUDED.meta""" - -[cassandra] -# CREATE TABLE filemeta ( -# directory varchar, -# name varchar, -# meta blob, -# PRIMARY KEY (directory, name) -# ) WITH CLUSTERING ORDER BY (name ASC); -enabled = false -keyspace="seaweedfs" -hosts=[ - "localhost:9042", -] -username="" -password="" -# This changes the data layout. Only add new directories. Removing/Updating will cause data loss. -superLargeDirectories = [] -# Name of the datacenter local to this filer, used as host selection fallback. -localDC="" - -[hbase] -enabled = false -zkquorum = "" -table = "seaweedfs" - -[redis2] -enabled = false -address = "localhost:6379" -password = "" -database = 0 -# This changes the data layout. Only add new directories. Removing/Updating will cause data loss. -superLargeDirectories = [] - -[redis_cluster2] -enabled = false -addresses = [ - "localhost:30001", - "localhost:30002", - "localhost:30003", - "localhost:30004", - "localhost:30005", - "localhost:30006", -] -password = "" -# allows reads from slave servers or the master, but all writes still go to the master -readOnly = false -# automatically use the closest Redis server for reads -routeByLatency = false -# This changes the data layout. Only add new directories. Removing/Updating will cause data loss. -superLargeDirectories = [] - -[etcd] -enabled = false -servers = "localhost:2379" -timeout = "3s" - -[mongodb] -enabled = false -uri = "mongodb://localhost:27017" -option_pool_size = 0 -database = "seaweedfs" - -[elastic7] -enabled = false -servers = [ - "http://localhost1:9200", - "http://localhost2:9200", - "http://localhost3:9200", -] -username = "" -password = "" -sniff_enabled = false -healthcheck_enabled = false -# increase the value is recommend, be sure the value in Elastic is greater or equal here -index.max_result_window = 10000 - - - -########################## -########################## -# To add path-specific filer store: -# -# 1. Add a name following the store type separated by a dot ".". E.g., cassandra.tmp -# 2. Add a location configuraiton. E.g., location = "/tmp/" -# 3. Copy and customize all other configurations. -# Make sure they are not the same if using the same store type! -# 4. Set enabled to true -# -# The following is just using redis as an example -########################## -[redis2.tmp] -enabled = false -location = "/tmp/" -address = "localhost:6379" -password = "" -database = 1 - -` - - NOTIFICATION_TOML_EXAMPLE = ` -# A sample TOML config file for SeaweedFS filer store -# Used by both "weed filer" or "weed server -filer" and "weed filer.replicate" -# Put this file to one of the location, with descending priority -# ./notification.toml -# $HOME/.seaweedfs/notification.toml -# /etc/seaweedfs/notification.toml - -#################################################### -# notification -# send and receive filer updates for each file to an external message queue -#################################################### -[notification.log] -# this is only for debugging perpose and does not work with "weed filer.replicate" -enabled = false - - -[notification.kafka] -enabled = false -hosts = [ - "localhost:9092" -] -topic = "seaweedfs_filer" -offsetFile = "./last.offset" -offsetSaveIntervalSeconds = 10 - - -[notification.aws_sqs] -# experimental, let me know if it works -enabled = false -aws_access_key_id = "" # if empty, loads from the shared credentials file (~/.aws/credentials). -aws_secret_access_key = "" # if empty, loads from the shared credentials file (~/.aws/credentials). -region = "us-east-2" -sqs_queue_name = "my_filer_queue" # an existing queue name - - -[notification.google_pub_sub] -# read credentials doc at https://cloud.google.com/docs/authentication/getting-started -enabled = false -google_application_credentials = "/path/to/x.json" # path to json credential file -project_id = "" # an existing project id -topic = "seaweedfs_filer_topic" # a topic, auto created if does not exists - -[notification.gocdk_pub_sub] -# The Go Cloud Development Kit (https://gocloud.dev). -# PubSub API (https://godoc.org/gocloud.dev/pubsub). -# Supports AWS SNS/SQS, Azure Service Bus, Google PubSub, NATS and RabbitMQ. -enabled = false -# This URL will Dial the RabbitMQ server at the URL in the environment -# variable RABBIT_SERVER_URL and open the exchange "myexchange". -# The exchange must have already been created by some other means, like -# the RabbitMQ management plugin. Сreate myexchange of type fanout and myqueue then -# create binding myexchange => myqueue -topic_url = "rabbit://myexchange" -sub_url = "rabbit://myqueue" -` - - REPLICATION_TOML_EXAMPLE = ` -# A sample TOML config file for replicating SeaweedFS filer -# Used with "weed filer.backup" -# Using with "weed filer.replicate" is deprecated. -# Put this file to one of the location, with descending priority -# ./replication.toml -# $HOME/.seaweedfs/replication.toml -# /etc/seaweedfs/replication.toml - -[source.filer] # deprecated. Only useful with "weed filer.replicate" -enabled = true -grpcAddress = "localhost:18888" -# all files under this directory tree are replicated. -# this is not a directory on your hard drive, but on your filer. -# i.e., all files with this "prefix" are sent to notification message queue. -directory = "/buckets" - -[sink.local] -enabled = false -directory = "/data" -# all replicated files are under modified time as yyyy-mm-dd directories -# so each date directory contains all new and updated files. -is_incremental = false - -[sink.filer] -enabled = false -grpcAddress = "localhost:18888" -# all replicated files are under this directory tree -# this is not a directory on your hard drive, but on your filer. -# i.e., all received files will be "prefixed" to this directory. -directory = "/backup" -replication = "" -collection = "" -ttlSec = 0 -is_incremental = false - -[sink.s3] -# read credentials doc at https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/sessions.html -# default loads credentials from the shared credentials file (~/.aws/credentials). -enabled = false -aws_access_key_id = "" # if empty, loads from the shared credentials file (~/.aws/credentials). -aws_secret_access_key = "" # if empty, loads from the shared credentials file (~/.aws/credentials). -region = "us-east-2" -bucket = "your_bucket_name" # an existing bucket -directory = "/" # destination directory -endpoint = "" -is_incremental = false - -[sink.google_cloud_storage] -# read credentials doc at https://cloud.google.com/docs/authentication/getting-started -enabled = false -google_application_credentials = "/path/to/x.json" # path to json credential file -bucket = "your_bucket_seaweedfs" # an existing bucket -directory = "/" # destination directory -is_incremental = false - -[sink.azure] -# experimental, let me know if it works -enabled = false -account_name = "" -account_key = "" -container = "mycontainer" # an existing container -directory = "/" # destination directory -is_incremental = false - -[sink.backblaze] -enabled = false -b2_account_id = "" -b2_master_application_key = "" -bucket = "mybucket" # an existing bucket -directory = "/" # destination directory -is_incremental = false - -` - - SECURITY_TOML_EXAMPLE = ` -# Put this file to one of the location, with descending priority -# ./security.toml -# $HOME/.seaweedfs/security.toml -# /etc/seaweedfs/security.toml -# this file is read by master, volume server, and filer - -# the jwt signing key is read by master and volume server. -# a jwt defaults to expire after 10 seconds. -[jwt.signing] -key = "" -expires_after_seconds = 10 # seconds - -# jwt for read is only supported with master+volume setup. Filer does not support this mode. -[jwt.signing.read] -key = "" -expires_after_seconds = 10 # seconds - -# all grpc tls authentications are mutual -# the values for the following ca, cert, and key are paths to the PERM files. -# the host name is not checked, so the PERM files can be shared. -[grpc] -ca = "" -# Set wildcard domain for enable TLS authentication by common names -allowed_wildcard_domain = "" # .mycompany.com - -[grpc.volume] -cert = "" -key = "" -allowed_commonNames = "" # comma-separated SSL certificate common names - -[grpc.master] -cert = "" -key = "" -allowed_commonNames = "" # comma-separated SSL certificate common names - -[grpc.filer] -cert = "" -key = "" -allowed_commonNames = "" # comma-separated SSL certificate common names - -[grpc.msg_broker] -cert = "" -key = "" -allowed_commonNames = "" # comma-separated SSL certificate common names - -# use this for any place needs a grpc client -# i.e., "weed backup|benchmark|filer.copy|filer.replicate|mount|s3|upload" -[grpc.client] -cert = "" -key = "" - -# volume server https options -# Note: work in progress! -# this does not work with other clients, e.g., "weed filer|mount" etc, yet. -[https.client] -enabled = true -[https.volume] -cert = "" -key = "" - - -` - - MASTER_TOML_EXAMPLE = ` -# Put this file to one of the location, with descending priority -# ./master.toml -# $HOME/.seaweedfs/master.toml -# /etc/seaweedfs/master.toml -# this file is read by master - -[master.maintenance] -# periodically run these scripts are the same as running them from 'weed shell' -scripts = """ - lock - ec.encode -fullPercent=95 -quietFor=1h - ec.rebuild -force - ec.balance -force - volume.balance -force - volume.fix.replication - unlock -""" -sleep_minutes = 17 # sleep minutes between each script execution - -[master.filer] -default = "localhost:8888" # used by maintenance scripts if the scripts needs to use fs related commands - - -[master.sequencer] -type = "raft" # Choose [raft|etcd|snowflake] type for storing the file id sequence -# when sequencer.type = etcd, set listen client urls of etcd cluster that store file id sequence -# example : http://127.0.0.1:2379,http://127.0.0.1:2389 -sequencer_etcd_urls = "http://127.0.0.1:2379" - - -# configurations for tiered cloud storage -# old volumes are transparently moved to cloud for cost efficiency -[storage.backend] - [storage.backend.s3.default] - enabled = false - aws_access_key_id = "" # if empty, loads from the shared credentials file (~/.aws/credentials). - aws_secret_access_key = "" # if empty, loads from the shared credentials file (~/.aws/credentials). - region = "us-east-2" - bucket = "your_bucket_name" # an existing bucket - endpoint = "" - -# create this number of logical volumes if no more writable volumes -# count_x means how many copies of data. -# e.g.: -# 000 has only one copy, copy_1 -# 010 and 001 has two copies, copy_2 -# 011 has only 3 copies, copy_3 -[master.volume_growth] -copy_1 = 7 # create 1 x 7 = 7 actual volumes -copy_2 = 6 # create 2 x 6 = 12 actual volumes -copy_3 = 3 # create 3 x 3 = 9 actual volumes -copy_other = 1 # create n x 1 = n actual volumes - -# configuration flags for replication -[master.replication] -# any replication counts should be considered minimums. If you specify 010 and -# have 3 different racks, that's still considered writable. Writes will still -# try to replicate to all available volumes. You should only use this option -# if you are doing your own replication or periodic sync of volumes. -treat_replication_as_minimums = false - -` - SHELL_TOML_EXAMPLE = ` - -[cluster] -default = "c1" - -[cluster.c1] -master = "localhost:9333" # comma-separated master servers -filer = "localhost:8888" # filer host and port - -[cluster.c2] -master = "" -filer = "" - -` -) diff --git a/weed/command/scaffold/example.go b/weed/command/scaffold/example.go new file mode 100644 index 000000000..6be6804e5 --- /dev/null +++ b/weed/command/scaffold/example.go @@ -0,0 +1,21 @@ +package scaffold + +import _ "embed" + +//go:embed filer.toml +var Filer string + +//go:embed notification.toml +var Notification string + +//go:embed replication.toml +var Replication string + +//go:embed security.toml +var Security string + +//go:embed master.toml +var Master string + +//go:embed shell.toml +var Shell string diff --git a/weed/command/scaffold/filer.toml b/weed/command/scaffold/filer.toml new file mode 100644 index 000000000..1de7d02aa --- /dev/null +++ b/weed/command/scaffold/filer.toml @@ -0,0 +1,234 @@ +# A sample TOML config file for SeaweedFS filer store +# Used with "weed filer" or "weed server -filer" +# Put this file to one of the location, with descending priority +# ./filer.toml +# $HOME/.seaweedfs/filer.toml +# /etc/seaweedfs/filer.toml + +#################################################### +# Customizable filer server options +#################################################### +[filer.options] +# with http DELETE, by default the filer would check whether a folder is empty. +# recursive_delete will delete all sub folders and files, similar to "rm -Rf" +recursive_delete = false +# directories under this folder will be automatically creating a separate bucket +buckets_folder = "/buckets" + +#################################################### +# The following are filer store options +#################################################### + +[leveldb2] +# local on disk, mostly for simple single-machine setup, fairly scalable +# faster than previous leveldb, recommended. +enabled = true +dir = "./filerldb2" # directory to store level db files + +[leveldb3] +# similar to leveldb2. +# each bucket has its own meta store. +enabled = false +dir = "./filerldb3" # directory to store level db files + +[rocksdb] +# local on disk, similar to leveldb +# since it is using a C wrapper, you need to install rocksdb and build it by yourself +enabled = false +dir = "./filerrdb" # directory to store rocksdb files + +[sqlite] +# local on disk, similar to leveldb +enabled = false +dbFile = "./filer.db" # sqlite db file + +[mysql] # or memsql, tidb +# CREATE TABLE IF NOT EXISTS filemeta ( +# dirhash BIGINT COMMENT 'first 64 bits of MD5 hash value of directory field', +# name VARCHAR(1000) BINARY COMMENT 'directory or file name', +# directory TEXT COMMENT 'full path to parent directory', +# meta LONGBLOB, +# PRIMARY KEY (dirhash, name) +# ) DEFAULT CHARSET=utf8; + +enabled = false +hostname = "localhost" +port = 3306 +username = "root" +password = "" +database = "" # create or use an existing database +connection_max_idle = 2 +connection_max_open = 100 +connection_max_lifetime_seconds = 0 +interpolateParams = false +# if insert/upsert failing, you can disable upsert or update query syntax to match your RDBMS syntax: +enableUpsert = true +upsertQuery = """INSERT INTO ` + "`%s`" + ` (dirhash,name,directory,meta) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE meta = VALUES(meta)""" + +[mysql2] # or memsql, tidb +enabled = false +createTable = """ + CREATE TABLE IF NOT EXISTS ` + "`%s`" + ` ( + dirhash BIGINT, + name VARCHAR(1000) BINARY, + directory TEXT, + meta LONGBLOB, + PRIMARY KEY (dirhash, name) + ) DEFAULT CHARSET=utf8; +""" +hostname = "localhost" +port = 3306 +username = "root" +password = "" +database = "" # create or use an existing database +connection_max_idle = 2 +connection_max_open = 100 +connection_max_lifetime_seconds = 0 +interpolateParams = false +# if insert/upsert failing, you can disable upsert or update query syntax to match your RDBMS syntax: +enableUpsert = true +upsertQuery = """INSERT INTO ` + "`%s`" + ` (dirhash,name,directory,meta) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE meta = VALUES(meta)""" + +[postgres] # or cockroachdb, YugabyteDB +# CREATE TABLE IF NOT EXISTS filemeta ( +# dirhash BIGINT, +# name VARCHAR(65535), +# directory VARCHAR(65535), +# meta bytea, +# PRIMARY KEY (dirhash, name) +# ); +enabled = false +hostname = "localhost" +port = 5432 +username = "postgres" +password = "" +database = "postgres" # create or use an existing database +schema = "" +sslmode = "disable" +connection_max_idle = 100 +connection_max_open = 100 +connection_max_lifetime_seconds = 0 +# if insert/upsert failing, you can disable upsert or update query syntax to match your RDBMS syntax: +enableUpsert = true +upsertQuery = """INSERT INTO "%[1]s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4) ON CONFLICT (dirhash,name) DO UPDATE SET meta = EXCLUDED.meta WHERE "%[1]s".meta != EXCLUDED.meta""" + +[postgres2] +enabled = false +createTable = """ + CREATE TABLE IF NOT EXISTS "%s" ( + dirhash BIGINT, + name VARCHAR(65535), + directory VARCHAR(65535), + meta bytea, + PRIMARY KEY (dirhash, name) + ); +""" +hostname = "localhost" +port = 5432 +username = "postgres" +password = "" +database = "postgres" # create or use an existing database +schema = "" +sslmode = "disable" +connection_max_idle = 100 +connection_max_open = 100 +connection_max_lifetime_seconds = 0 +# if insert/upsert failing, you can disable upsert or update query syntax to match your RDBMS syntax: +enableUpsert = true +upsertQuery = """INSERT INTO "%[1]s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4) ON CONFLICT (dirhash,name) DO UPDATE SET meta = EXCLUDED.meta WHERE "%[1]s".meta != EXCLUDED.meta""" + +[cassandra] +# CREATE TABLE filemeta ( +# directory varchar, +# name varchar, +# meta blob, +# PRIMARY KEY (directory, name) +# ) WITH CLUSTERING ORDER BY (name ASC); +enabled = false +keyspace = "seaweedfs" +hosts = [ + "localhost:9042", +] +username = "" +password = "" +# This changes the data layout. Only add new directories. Removing/Updating will cause data loss. +superLargeDirectories = [] +# Name of the datacenter local to this filer, used as host selection fallback. +localDC = "" + +[hbase] +enabled = false +zkquorum = "" +table = "seaweedfs" + +[redis2] +enabled = false +address = "localhost:6379" +password = "" +database = 0 +# This changes the data layout. Only add new directories. Removing/Updating will cause data loss. +superLargeDirectories = [] + +[redis_cluster2] +enabled = false +addresses = [ + "localhost:30001", + "localhost:30002", + "localhost:30003", + "localhost:30004", + "localhost:30005", + "localhost:30006", +] +password = "" +# allows reads from slave servers or the master, but all writes still go to the master +readOnly = false +# automatically use the closest Redis server for reads +routeByLatency = false +# This changes the data layout. Only add new directories. Removing/Updating will cause data loss. +superLargeDirectories = [] + +[etcd] +enabled = false +servers = "localhost:2379" +timeout = "3s" + +[mongodb] +enabled = false +uri = "mongodb://localhost:27017" +option_pool_size = 0 +database = "seaweedfs" + +[elastic7] +enabled = false +servers = [ + "http://localhost1:9200", + "http://localhost2:9200", + "http://localhost3:9200", +] +username = "" +password = "" +sniff_enabled = false +healthcheck_enabled = false +# increase the value is recommend, be sure the value in Elastic is greater or equal here +index.max_result_window = 10000 + + + +########################## +########################## +# To add path-specific filer store: +# +# 1. Add a name following the store type separated by a dot ".". E.g., cassandra.tmp +# 2. Add a location configuraiton. E.g., location = "/tmp/" +# 3. Copy and customize all other configurations. +# Make sure they are not the same if using the same store type! +# 4. Set enabled to true +# +# The following is just using redis as an example +########################## +[redis2.tmp] +enabled = false +location = "/tmp/" +address = "localhost:6379" +password = "" +database = 1 diff --git a/weed/command/scaffold/master.toml b/weed/command/scaffold/master.toml new file mode 100644 index 000000000..f550f0ad6 --- /dev/null +++ b/weed/command/scaffold/master.toml @@ -0,0 +1,60 @@ +# Put this file to one of the location, with descending priority +# ./master.toml +# $HOME/.seaweedfs/master.toml +# /etc/seaweedfs/master.toml +# this file is read by master + +[master.maintenance] +# periodically run these scripts are the same as running them from 'weed shell' +scripts = """ + lock + ec.encode -fullPercent=95 -quietFor=1h + ec.rebuild -force + ec.balance -force + volume.balance -force + volume.fix.replication + unlock +""" +sleep_minutes = 17 # sleep minutes between each script execution + +[master.filer] +default = "localhost:8888" # used by maintenance scripts if the scripts needs to use fs related commands + + +[master.sequencer] +type = "raft" # Choose [raft|etcd|snowflake] type for storing the file id sequence +# when sequencer.type = etcd, set listen client urls of etcd cluster that store file id sequence +# example : http://127.0.0.1:2379,http://127.0.0.1:2389 +sequencer_etcd_urls = "http://127.0.0.1:2379" + + +# configurations for tiered cloud storage +# old volumes are transparently moved to cloud for cost efficiency +[storage.backend] +[storage.backend.s3.default] +enabled = false +aws_access_key_id = "" # if empty, loads from the shared credentials file (~/.aws/credentials). +aws_secret_access_key = "" # if empty, loads from the shared credentials file (~/.aws/credentials). +region = "us-east-2" +bucket = "your_bucket_name" # an existing bucket +endpoint = "" + +# create this number of logical volumes if no more writable volumes +# count_x means how many copies of data. +# e.g.: +# 000 has only one copy, copy_1 +# 010 and 001 has two copies, copy_2 +# 011 has only 3 copies, copy_3 +[master.volume_growth] +copy_1 = 7 # create 1 x 7 = 7 actual volumes +copy_2 = 6 # create 2 x 6 = 12 actual volumes +copy_3 = 3 # create 3 x 3 = 9 actual volumes +copy_other = 1 # create n x 1 = n actual volumes + +# configuration flags for replication +[master.replication] +# any replication counts should be considered minimums. If you specify 010 and +# have 3 different racks, that's still considered writable. Writes will still +# try to replicate to all available volumes. You should only use this option +# if you are doing your own replication or periodic sync of volumes. +treat_replication_as_minimums = false diff --git a/weed/command/scaffold/notification.toml b/weed/command/scaffold/notification.toml new file mode 100644 index 000000000..f35101edd --- /dev/null +++ b/weed/command/scaffold/notification.toml @@ -0,0 +1,54 @@ +# A sample TOML config file for SeaweedFS filer store +# Used by both "weed filer" or "weed server -filer" and "weed filer.replicate" +# Put this file to one of the location, with descending priority +# ./notification.toml +# $HOME/.seaweedfs/notification.toml +# /etc/seaweedfs/notification.toml + +#################################################### +# notification +# send and receive filer updates for each file to an external message queue +#################################################### +[notification.log] +# this is only for debugging perpose and does not work with "weed filer.replicate" +enabled = false + + +[notification.kafka] +enabled = false +hosts = [ + "localhost:9092" +] +topic = "seaweedfs_filer" +offsetFile = "./last.offset" +offsetSaveIntervalSeconds = 10 + + +[notification.aws_sqs] +# experimental, let me know if it works +enabled = false +aws_access_key_id = "" # if empty, loads from the shared credentials file (~/.aws/credentials). +aws_secret_access_key = "" # if empty, loads from the shared credentials file (~/.aws/credentials). +region = "us-east-2" +sqs_queue_name = "my_filer_queue" # an existing queue name + + +[notification.google_pub_sub] +# read credentials doc at https://cloud.google.com/docs/authentication/getting-started +enabled = false +google_application_credentials = "/path/to/x.json" # path to json credential file +project_id = "" # an existing project id +topic = "seaweedfs_filer_topic" # a topic, auto created if does not exists + +[notification.gocdk_pub_sub] +# The Go Cloud Development Kit (https://gocloud.dev). +# PubSub API (https://godoc.org/gocloud.dev/pubsub). +# Supports AWS SNS/SQS, Azure Service Bus, Google PubSub, NATS and RabbitMQ. +enabled = false +# This URL will Dial the RabbitMQ server at the URL in the environment +# variable RABBIT_SERVER_URL and open the exchange "myexchange". +# The exchange must have already been created by some other means, like +# the RabbitMQ management plugin. Сreate myexchange of type fanout and myqueue then +# create binding myexchange => myqueue +topic_url = "rabbit://myexchange" +sub_url = "rabbit://myqueue" diff --git a/weed/command/scaffold/replication.toml b/weed/command/scaffold/replication.toml new file mode 100644 index 000000000..c463c8077 --- /dev/null +++ b/weed/command/scaffold/replication.toml @@ -0,0 +1,71 @@ +# A sample TOML config file for replicating SeaweedFS filer +# Used with "weed filer.backup" +# Using with "weed filer.replicate" is deprecated. +# Put this file to one of the location, with descending priority +# ./replication.toml +# $HOME/.seaweedfs/replication.toml +# /etc/seaweedfs/replication.toml + +[source.filer] # deprecated. Only useful with "weed filer.replicate" +enabled = true +grpcAddress = "localhost:18888" +# all files under this directory tree are replicated. +# this is not a directory on your hard drive, but on your filer. +# i.e., all files with this "prefix" are sent to notification message queue. +directory = "/buckets" + +[sink.local] +enabled = false +directory = "/data" +# all replicated files are under modified time as yyyy-mm-dd directories +# so each date directory contains all new and updated files. +is_incremental = false + +[sink.filer] +enabled = false +grpcAddress = "localhost:18888" +# all replicated files are under this directory tree +# this is not a directory on your hard drive, but on your filer. +# i.e., all received files will be "prefixed" to this directory. +directory = "/backup" +replication = "" +collection = "" +ttlSec = 0 +is_incremental = false + +[sink.s3] +# read credentials doc at https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/sessions.html +# default loads credentials from the shared credentials file (~/.aws/credentials). +enabled = false +aws_access_key_id = "" # if empty, loads from the shared credentials file (~/.aws/credentials). +aws_secret_access_key = "" # if empty, loads from the shared credentials file (~/.aws/credentials). +region = "us-east-2" +bucket = "your_bucket_name" # an existing bucket +directory = "/" # destination directory +endpoint = "" +is_incremental = false + +[sink.google_cloud_storage] +# read credentials doc at https://cloud.google.com/docs/authentication/getting-started +enabled = false +google_application_credentials = "/path/to/x.json" # path to json credential file +bucket = "your_bucket_seaweedfs" # an existing bucket +directory = "/" # destination directory +is_incremental = false + +[sink.azure] +# experimental, let me know if it works +enabled = false +account_name = "" +account_key = "" +container = "mycontainer" # an existing container +directory = "/" # destination directory +is_incremental = false + +[sink.backblaze] +enabled = false +b2_account_id = "" +b2_master_application_key = "" +bucket = "mybucket" # an existing bucket +directory = "/" # destination directory +is_incremental = false diff --git a/weed/command/scaffold/security.toml b/weed/command/scaffold/security.toml new file mode 100644 index 000000000..0c69b2f24 --- /dev/null +++ b/weed/command/scaffold/security.toml @@ -0,0 +1,60 @@ +# Put this file to one of the location, with descending priority +# ./security.toml +# $HOME/.seaweedfs/security.toml +# /etc/seaweedfs/security.toml +# this file is read by master, volume server, and filer + +# the jwt signing key is read by master and volume server. +# a jwt defaults to expire after 10 seconds. +[jwt.signing] +key = "" +expires_after_seconds = 10 # seconds + +# jwt for read is only supported with master+volume setup. Filer does not support this mode. +[jwt.signing.read] +key = "" +expires_after_seconds = 10 # seconds + +# all grpc tls authentications are mutual +# the values for the following ca, cert, and key are paths to the PERM files. +# the host name is not checked, so the PERM files can be shared. +[grpc] +ca = "" +# Set wildcard domain for enable TLS authentication by common names +allowed_wildcard_domain = "" # .mycompany.com + +[grpc.volume] +cert = "" +key = "" +allowed_commonNames = "" # comma-separated SSL certificate common names + +[grpc.master] +cert = "" +key = "" +allowed_commonNames = "" # comma-separated SSL certificate common names + +[grpc.filer] +cert = "" +key = "" +allowed_commonNames = "" # comma-separated SSL certificate common names + +[grpc.msg_broker] +cert = "" +key = "" +allowed_commonNames = "" # comma-separated SSL certificate common names + +# use this for any place needs a grpc client +# i.e., "weed backup|benchmark|filer.copy|filer.replicate|mount|s3|upload" +[grpc.client] +cert = "" +key = "" + +# volume server https options +# Note: work in progress! +# this does not work with other clients, e.g., "weed filer|mount" etc, yet. +[https.client] +enabled = true +[https.volume] +cert = "" +key = "" + diff --git a/weed/command/scaffold/shell.toml b/weed/command/scaffold/shell.toml new file mode 100644 index 000000000..288ae2efe --- /dev/null +++ b/weed/command/scaffold/shell.toml @@ -0,0 +1,10 @@ +[cluster] +default = "c1" + +[cluster.c1] +master = "localhost:9333" # comma-separated master servers +filer = "localhost:8888" # filer host and port + +[cluster.c2] +master = "" +filer = "" From 233103f6b2d8104acffeb7a5b91600974430c762 Mon Sep 17 00:00:00 2001 From: qieqieplus Date: Mon, 5 Jul 2021 16:01:16 +0800 Subject: [PATCH 078/265] sync empty notification with timestamp --- weed/server/filer_grpc_server_sub_meta.go | 31 ++++++++++++++++++----- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/weed/server/filer_grpc_server_sub_meta.go b/weed/server/filer_grpc_server_sub_meta.go index 624069b7e..3fdac1b26 100644 --- a/weed/server/filer_grpc_server_sub_meta.go +++ b/weed/server/filer_grpc_server_sub_meta.go @@ -2,7 +2,6 @@ package weed_server import ( "fmt" - "github.com/chrislusf/seaweedfs/weed/util/log_buffer" "strings" "time" @@ -12,6 +11,12 @@ import ( "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/util" + "github.com/chrislusf/seaweedfs/weed/util/log_buffer" +) + +const ( + // MaxUnsyncedEvents send empty notification with timestamp when certain amount of events have been filtered + MaxUnsyncedEvents = 1e3 ) func (fs *FilerServer) SubscribeMetadata(req *filer_pb.SubscribeMetadataRequest, stream filer_pb.SeaweedFiler_SubscribeMetadataServer) error { @@ -25,7 +30,7 @@ func (fs *FilerServer) SubscribeMetadata(req *filer_pb.SubscribeMetadataRequest, lastReadTime := time.Unix(0, req.SinceNs) glog.V(0).Infof(" %v starts to subscribe %s from %+v", clientName, req.PathPrefix, lastReadTime) - eachEventNotificationFn := fs.eachEventNotificationFn(req, stream, clientName, req.Signature) + eachEventNotificationFn := fs.eachEventNotificationFn(req, stream, clientName) eachLogEntryFn := eachLogEntryFn(eachEventNotificationFn) @@ -87,7 +92,7 @@ func (fs *FilerServer) SubscribeLocalMetadata(req *filer_pb.SubscribeMetadataReq lastReadTime := time.Unix(0, req.SinceNs) glog.V(0).Infof(" %v local subscribe %s from %+v", clientName, req.PathPrefix, lastReadTime) - eachEventNotificationFn := fs.eachEventNotificationFn(req, stream, clientName, req.Signature) + eachEventNotificationFn := fs.eachEventNotificationFn(req, stream, clientName) eachLogEntryFn := eachLogEntryFn(eachEventNotificationFn) @@ -152,12 +157,25 @@ func eachLogEntryFn(eachEventNotificationFn func(dirPath string, eventNotificati } } -func (fs *FilerServer) eachEventNotificationFn(req *filer_pb.SubscribeMetadataRequest, stream filer_pb.SeaweedFiler_SubscribeMetadataServer, clientName string, clientSignature int32) func(dirPath string, eventNotification *filer_pb.EventNotification, tsNs int64) error { - return func(dirPath string, eventNotification *filer_pb.EventNotification, tsNs int64) error { +func (fs *FilerServer) eachEventNotificationFn(req *filer_pb.SubscribeMetadataRequest, stream filer_pb.SeaweedFiler_SubscribeMetadataServer, clientName string) func(dirPath string, eventNotification *filer_pb.EventNotification, tsNs int64) error { + filtered := 0 + return func(dirPath string, eventNotification *filer_pb.EventNotification, tsNs int64) error { + defer func() { + if filtered > MaxUnsyncedEvents { + if err := stream.Send(&filer_pb.SubscribeMetadataResponse{ + EventNotification: &filer_pb.EventNotification{}, + TsNs: tsNs, + }); err == nil { + filtered = 0 + } + } + }() + + filtered++ foundSelf := false for _, sig := range eventNotification.Signatures { - if sig == clientSignature && clientSignature != 0 { + if sig == req.Signature && req.Signature != 0 { return nil } if sig == fs.filer.Signature { @@ -204,6 +222,7 @@ func (fs *FilerServer) eachEventNotificationFn(req *filer_pb.SubscribeMetadataRe glog.V(0).Infof("=> client %v: %+v", clientName, err) return err } + filtered = 0 return nil } } From 44a2538f6772adddf6c47abe7cf6288718a80165 Mon Sep 17 00:00:00 2001 From: bingoohuang Date: Mon, 5 Jul 2021 18:09:44 +0800 Subject: [PATCH 079/265] extract embed html of master/volume/filer ui to separate files --- weed/server/filer_ui/filer.html | 182 ++++++++++++++++++++ weed/server/filer_ui/templates.go | 178 +------------------- weed/server/master_ui/master.html | 110 ++++++++++++ weed/server/master_ui/templates.go | 112 +------------ weed/server/volume_server_ui/templates.go | 191 +-------------------- weed/server/volume_server_ui/volume.html | 194 ++++++++++++++++++++++ 6 files changed, 498 insertions(+), 469 deletions(-) create mode 100644 weed/server/filer_ui/filer.html create mode 100644 weed/server/master_ui/master.html create mode 100644 weed/server/volume_server_ui/volume.html diff --git a/weed/server/filer_ui/filer.html b/weed/server/filer_ui/filer.html new file mode 100644 index 000000000..84dc4d4d6 --- /dev/null +++ b/weed/server/filer_ui/filer.html @@ -0,0 +1,182 @@ + + + + SeaweedFS Filer + + + + + +

    + +
    +
    + {{ range $entry := .Breadcrumbs }} + + {{ $entry.Name }} + + {{ end }} + +
    +
    + +
    +
    + + + + {{$path := .Path }} + {{ range $entry_index, $entry := .Entries }} + + + + + + + {{ end }} + +
    + {{if $entry.IsDirectory}} + + + {{ $entry.Name }} + + {{else}} + + {{ $entry.Name }} + + {{end}} + + {{if $entry.IsDirectory}} + {{else}} + {{ $entry.Mime }}  + {{end}} + + {{if $entry.IsDirectory}} + {{else}} + {{ $entry.Size | humanizeBytes }}  + {{end}} + + {{ $entry.Timestamp.Format "2006-01-02 15:04" }} +
    +
    +
    + + {{if .ShouldDisplayLoadMore}} + + +
    + + + diff --git a/weed/server/filer_ui/templates.go b/weed/server/filer_ui/templates.go index 648b97f22..f9ef064bc 100644 --- a/weed/server/filer_ui/templates.go +++ b/weed/server/filer_ui/templates.go @@ -1,6 +1,7 @@ package filer_ui import ( + _ "embed" "github.com/dustin/go-humanize" "html/template" "net/url" @@ -18,178 +19,7 @@ var funcMap = template.FuncMap{ "printpath": printpath, } -var StatusTpl = template.Must(template.New("status").Funcs(funcMap).Parse(` - - - SeaweedFS Filer - - - - - -
    - -
    -
    - {{ range $entry := .Breadcrumbs }} - - {{ $entry.Name }} - - {{ end }} - -
    -
    +//go:embed filer.html +var filerHtml string -
    -
    - - - - {{$path := .Path }} - {{ range $entry_index, $entry := .Entries }} - - - - - - - {{ end }} - -
    - {{if $entry.IsDirectory}} - - - {{ $entry.Name }} - - {{else}} - - {{ $entry.Name }} - - {{end}} - - {{if $entry.IsDirectory}} - {{else}} - {{ $entry.Mime }}  - {{end}} - - {{if $entry.IsDirectory}} - {{else}} - {{ $entry.Size | humanizeBytes }}  - {{end}} - - {{ $entry.Timestamp.Format "2006-01-02 15:04" }} -
    -
    -
    - - {{if .ShouldDisplayLoadMore}} - - -
    - - - -`)) +var StatusTpl = template.Must(template.New("status").Funcs(funcMap).Parse(filerHtml)) diff --git a/weed/server/master_ui/master.html b/weed/server/master_ui/master.html new file mode 100644 index 000000000..e0241d66d --- /dev/null +++ b/weed/server/master_ui/master.html @@ -0,0 +1,110 @@ + + + + SeaweedFS {{ .Version }} + + + +
    + + +
    +
    +

    Cluster status

    + + + + + + + + + + + + + + + {{ with .RaftServer }} + + + + + + + + + {{ end }} + +
    Volume Size Limit{{ .VolumeSizeLimitMB }}MB
    Free{{ .Topology.Free }}
    Max{{ .Topology.Max }}
    Leader{{ .Leader }}
    Other Masters + +
    +
    + +
    +

    System Stats

    + + + + + + {{ range $key, $val := .Stats }} + + + + + {{ end }} +
    Concurrent Connections{{ .Counters.Connections.WeekCounter.Sum }}
    {{ $key }}{{ $val }}
    +
    +
    + +
    +

    Topology

    + + + + + + + + + + + + + + {{ range $dc_index, $dc := .Topology.DataCenters }} + {{ range $rack_index, $rack := $dc.Racks }} + {{ range $dn_index, $dn := $rack.DataNodes }} + + + + + + + + + + {{ end }} + {{ end }} + {{ end }} + +
    Data CenterRackRemoteAddr#VolumesVolume Ids#ErasureCodingShardsMax
    {{ $dc.Id }}{{ $rack.Id }}{{ $dn.Url }} + {{ if ne $dn.PublicUrl $dn.Url }} + / {{ $dn.PublicUrl }} + {{ end }} + {{ $dn.Volumes }}{{ $dn.VolumeIds}}{{ $dn.EcShards }}{{ $dn.Max }}
    +
    + +
    + + diff --git a/weed/server/master_ui/templates.go b/weed/server/master_ui/templates.go index 31b6353e9..415022b97 100644 --- a/weed/server/master_ui/templates.go +++ b/weed/server/master_ui/templates.go @@ -1,115 +1,11 @@ package master_ui import ( + _ "embed" "html/template" ) -var StatusTpl = template.Must(template.New("status").Parse(` - - - SeaweedFS {{ .Version }} - - - -
    - +//go:embed master.html +var masterHtml string -
    -
    -

    Cluster status

    - - - - - - - - - - - - - - - {{ with .RaftServer }} - - - - - - - - - {{ end }} - -
    Volume Size Limit{{ .VolumeSizeLimitMB }}MB
    Free{{ .Topology.Free }}
    Max{{ .Topology.Max }}
    Leader{{ .Leader }}
    Other Masters
    -
    - -
    -

    System Stats

    - - - - - - {{ range $key, $val := .Stats }} - - - - - {{ end }} -
    Concurrent Connections{{ .Counters.Connections.WeekCounter.Sum }}
    {{ $key }}{{ $val }}
    -
    -
    - -
    -

    Topology

    - - - - - - - - - - - - - - {{ range $dc_index, $dc := .Topology.DataCenters }} - {{ range $rack_index, $rack := $dc.Racks }} - {{ range $dn_index, $dn := $rack.DataNodes }} - - - - - - - - - - {{ end }} - {{ end }} - {{ end }} - -
    Data CenterRackRemoteAddr#VolumesVolume Ids#ErasureCodingShardsMax
    {{ $dc.Id }}{{ $rack.Id }}{{ $dn.Url }} - {{ if ne $dn.PublicUrl $dn.Url }} - / {{ $dn.PublicUrl }} - {{ end }} - {{ $dn.Volumes }}{{ $dn.VolumeIds}}{{ $dn.EcShards }}{{ $dn.Max }}
    -
    - -
    - - -`)) +var StatusTpl = template.Must(template.New("status").Parse(masterHtml)) diff --git a/weed/server/volume_server_ui/templates.go b/weed/server/volume_server_ui/templates.go index 79f1a14a0..8034d8218 100644 --- a/weed/server/volume_server_ui/templates.go +++ b/weed/server/volume_server_ui/templates.go @@ -1,6 +1,7 @@ package volume_server_ui import ( + _ "embed" "fmt" "github.com/chrislusf/seaweedfs/weed/util" "html/template" @@ -26,191 +27,7 @@ var funcMap = template.FuncMap{ "percentFrom": percentFrom, } -var StatusTpl = template.Must(template.New("status").Funcs(funcMap).Parse(` - - - SeaweedFS {{ .Version }} - - - - - - - -
    - +//go:embed volume.html +var volumeHtml string -
    -
    -

    Disk Stats

    - - - - - - - - - - - - {{ range .DiskStatuses }} - - - - - - - - {{ end }} - -
    PathDiskTotalFreeUsage
    {{ .Dir }}{{ .DiskType }}{{ bytesToHumanReadable .All }}{{ bytesToHumanReadable .Free }}{{ percentFrom .All .Used}}%
    -
    - -
    -

    System Stats

    - - - - - - - - - - - - - - - - - - - - - - {{ range $key, $val := .Stats }} - - - - - {{ end }} -
    Masters{{.Masters}}
    Weekly # ReadRequests{{ .Counters.ReadRequests.WeekCounter.ToList | join }}
    Daily # ReadRequests{{ .Counters.ReadRequests.DayCounter.ToList | join }}
    Hourly # ReadRequests{{ .Counters.ReadRequests.HourCounter.ToList | join }}
    Last Minute # ReadRequests{{ .Counters.ReadRequests.MinuteCounter.ToList | join }}
    {{ $key }}{{ $val }}
    -
    -
    - -
    -

    Volumes

    - - - - - - - - - - - - - - - {{ range .Volumes }} - - - - - - - - - - - {{ end }} - -
    IdCollectionDiskData SizeFilesTrashTTLReadOnly
    {{ .Id }}{{ .Collection }}{{ .DiskType }}{{ bytesToHumanReadable .Size }}{{ .FileCount }}{{ .DeleteCount }} / {{bytesToHumanReadable .DeletedByteCount}}{{ .Ttl }}{{ .ReadOnly }}
    -
    - -
    -

    Remote Volumes

    - - - - - - - - - - - - - - {{ range .RemoteVolumes }} - - - - - - - - - - {{ end }} - -
    IdCollectionSizeFilesTrashRemoteKey
    {{ .Id }}{{ .Collection }}{{ bytesToHumanReadable .Size }}{{ .FileCount }}{{ .DeleteCount }} / {{bytesToHumanReadable .DeletedByteCount}}{{ .RemoteStorageName }}{{ .RemoteStorageKey }}
    -
    - -
    -

    Erasure Coding Shards

    - - - - - - - - - - - - {{ range .EcVolumes }} - - - - - - - - {{ end }} - -
    IdCollectionShard SizeShardsCreatedAt
    {{ .VolumeId }}{{ .Collection }}{{ bytesToHumanReadable .ShardSize }}{{ .ShardIdList }}{{ .CreatedAt.Format "02 Jan 06 15:04 -0700" }}
    -
    - -
    - - -`)) +var StatusTpl = template.Must(template.New("status").Funcs(funcMap).Parse(volumeHtml)) diff --git a/weed/server/volume_server_ui/volume.html b/weed/server/volume_server_ui/volume.html new file mode 100644 index 000000000..973b0bfbe --- /dev/null +++ b/weed/server/volume_server_ui/volume.html @@ -0,0 +1,194 @@ + + + + SeaweedFS {{ .Version }} + + + + + + + +
    + + +
    +
    +

    Disk Stats

    + + + + + + + + + + + + {{ range .DiskStatuses }} + + + + + + + + {{ end }} + +
    PathDiskTotalFreeUsage
    {{ .Dir }}{{ .DiskType }}{{ bytesToHumanReadable .All }}{{ bytesToHumanReadable .Free }}{{ percentFrom .All .Used}}%
    +
    + +
    +

    System Stats

    + + + + + + + + + + + + + + + + + + + + + + {{ range $key, $val := .Stats }} + + + + + {{ end }} +
    Masters{{.Masters}}
    Weekly # ReadRequests{{ .Counters.ReadRequests.WeekCounter.ToList | join }} +
    Daily # ReadRequests{{ .Counters.ReadRequests.DayCounter.ToList | join }} +
    Hourly # ReadRequests{{ .Counters.ReadRequests.HourCounter.ToList | join }} +
    Last Minute # ReadRequests{{ .Counters.ReadRequests.MinuteCounter.ToList | join }} +
    {{ $key }}{{ $val }}
    +
    +
    + +
    +

    Volumes

    + + + + + + + + + + + + + + + {{ range .Volumes }} + + + + + + + + + + + {{ end }} + +
    IdCollectionDiskData SizeFilesTrashTTLReadOnly
    {{ .Id }}{{ .Collection }}{{ .DiskType }}{{ bytesToHumanReadable .Size }}{{ .FileCount }}{{ .DeleteCount }} / {{bytesToHumanReadable .DeletedByteCount}}{{ .Ttl }}{{ .ReadOnly }}
    +
    + +
    +

    Remote Volumes

    + + + + + + + + + + + + + + {{ range .RemoteVolumes }} + + + + + + + + + + {{ end }} + +
    IdCollectionSizeFilesTrashRemoteKey
    {{ .Id }}{{ .Collection }}{{ bytesToHumanReadable .Size }}{{ .FileCount }}{{ .DeleteCount }} / {{bytesToHumanReadable .DeletedByteCount}}{{ .RemoteStorageName }}{{ .RemoteStorageKey }}
    +
    + +
    +

    Erasure Coding Shards

    + + + + + + + + + + + + {{ range .EcVolumes }} + + + + + + + + {{ end }} + +
    IdCollectionShard SizeShardsCreatedAt
    {{ .VolumeId }}{{ .Collection }}{{ bytesToHumanReadable .ShardSize }}{{ .ShardIdList }}{{ .CreatedAt.Format "02 Jan 06 15:04 -0700" }}
    +
    + +
    + + From 30156e142a24fe15967fd9e3aff06d003271ac59 Mon Sep 17 00:00:00 2001 From: Jerome Barotin Date: Mon, 5 Jul 2021 16:07:33 +0200 Subject: [PATCH 080/265] Change java client MIN_BUFFER_SIZE to 1MB --- .../client/src/main/java/seaweedfs/client/ByteBufferPool.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/other/java/client/src/main/java/seaweedfs/client/ByteBufferPool.java b/other/java/client/src/main/java/seaweedfs/client/ByteBufferPool.java index 51053becd..19ae78277 100644 --- a/other/java/client/src/main/java/seaweedfs/client/ByteBufferPool.java +++ b/other/java/client/src/main/java/seaweedfs/client/ByteBufferPool.java @@ -10,7 +10,7 @@ import java.util.List; public class ByteBufferPool { - private static final int MIN_BUFFER_SIZE = 8 * 1024 * 1024; + private static final int MIN_BUFFER_SIZE = 1 * 1024 * 1024; private static final Logger LOG = LoggerFactory.getLogger(ByteBufferPool.class); private static final List bufferList = new ArrayList<>(); From 44b50b2fdfc00f8a2990a84a4808827d11124728 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 5 Jul 2021 16:30:41 -0700 Subject: [PATCH 081/265] another fix related to 64 bit alignment fix https://github.com/chrislusf/seaweedfs/issues/2177 --- weed/wdclient/exclusive_locks/exclusive_locker.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/wdclient/exclusive_locks/exclusive_locker.go b/weed/wdclient/exclusive_locks/exclusive_locker.go index 5b5fa2704..0fa138496 100644 --- a/weed/wdclient/exclusive_locks/exclusive_locker.go +++ b/weed/wdclient/exclusive_locks/exclusive_locker.go @@ -18,10 +18,10 @@ const ( ) type ExclusiveLocker struct { - masterClient *wdclient.MasterClient token int64 lockTsNs int64 isLocking bool + masterClient *wdclient.MasterClient } func NewExclusiveLocker(masterClient *wdclient.MasterClient) *ExclusiveLocker { From ed57a55eaec2318bf21693582105660d7612118b Mon Sep 17 00:00:00 2001 From: bingoohuang Date: Tue, 6 Jul 2021 15:20:18 +0800 Subject: [PATCH 082/265] show RemoteVolumes/EcVolumes only if it is not empty --- weed/server/volume_server_ui/templates.go | 1 + weed/server/volume_server_ui/volume.html | 5 ++- weed/util/reflect.go | 40 +++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 weed/util/reflect.go diff --git a/weed/server/volume_server_ui/templates.go b/weed/server/volume_server_ui/templates.go index 8034d8218..d85eb247a 100644 --- a/weed/server/volume_server_ui/templates.go +++ b/weed/server/volume_server_ui/templates.go @@ -25,6 +25,7 @@ var funcMap = template.FuncMap{ "join": join, "bytesToHumanReadable": util.BytesToHumanReadable, "percentFrom": percentFrom, + "isNotEmpty": util.IsNotEmpty, } //go:embed volume.html diff --git a/weed/server/volume_server_ui/volume.html b/weed/server/volume_server_ui/volume.html index 973b0bfbe..91809beb0 100644 --- a/weed/server/volume_server_ui/volume.html +++ b/weed/server/volume_server_ui/volume.html @@ -133,6 +133,7 @@ + {{ if isNotEmpty .RemoteVolumes }}

    Remote Volumes

    @@ -162,7 +163,9 @@
    + {{ end }} + {{ if isNotEmpty .EcVolumes }}

    Erasure Coding Shards

    @@ -188,7 +191,7 @@
    - + {{ end }} diff --git a/weed/util/reflect.go b/weed/util/reflect.go new file mode 100644 index 000000000..77186f67e --- /dev/null +++ b/weed/util/reflect.go @@ -0,0 +1,40 @@ +package util + +import "reflect" + +// IsNotEmpty returns true if the given value is not zero or empty. +func IsNotEmpty(given interface{}) bool { + return !IsEmpty(given) +} + +// IsEmpty returns true if the given value has the zero value for its type. +func IsEmpty(given interface{}) bool { + g := reflect.ValueOf(given) + if !g.IsValid() { + return true + } + + if g.Kind() == reflect.Ptr { + g = g.Elem() + } + + // Basically adapted from text/template.isTrue + switch g.Kind() { + case reflect.Array, reflect.Slice, reflect.Map, reflect.String: + return g.Len() == 0 + case reflect.Bool: + return !g.Bool() + case reflect.Complex64, reflect.Complex128: + return g.Complex() == 0 + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return g.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return g.Uint() == 0 + case reflect.Float32, reflect.Float64: + return g.Float() == 0 + case reflect.Struct: + return g.IsZero() + default: + return g.IsNil() + } +} From da7bd6282200fdc8b47cf421a520dfbed4eab8e0 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 9 Jul 2021 02:33:14 -0700 Subject: [PATCH 083/265] /etc files are stored inside metadata store --- weed/server/filer_server_handlers_write_upload.go | 2 +- weed/shell/command_fs_configure.go | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/weed/server/filer_server_handlers_write_upload.go b/weed/server/filer_server_handlers_write_upload.go index e28309c6a..395852517 100644 --- a/weed/server/filer_server_handlers_write_upload.go +++ b/weed/server/filer_server_handlers_write_upload.go @@ -70,7 +70,7 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque return nil, md5Hash, 0, err, nil } if chunkOffset == 0 && !isAppend(r) { - if dataSize < fs.option.SaveToFilerLimit || strings.HasPrefix(r.URL.Path, filer.DirectoryEtcRoot) && dataSize < 4*1024 { + if dataSize < fs.option.SaveToFilerLimit || strings.HasPrefix(r.URL.Path, filer.DirectoryEtcRoot) { chunkOffset += dataSize smallContent = make([]byte, dataSize) bytesBuffer.Read(smallContent) diff --git a/weed/shell/command_fs_configure.go b/weed/shell/command_fs_configure.go index 52fcae1c6..a7e601bec 100644 --- a/weed/shell/command_fs_configure.go +++ b/weed/shell/command_fs_configure.go @@ -120,7 +120,9 @@ func (c *commandFsConfigure) Do(args []string, commandEnv *CommandEnv, writer io if *apply { - if err := filer.SaveAs(commandEnv.option.FilerHost, int(commandEnv.option.FilerPort), filer.DirectoryEtcSeaweedFS, filer.FilerConfName, "text/plain; charset=utf-8", &buf); err != nil { + if err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + return filer.SaveInsideFiler(client, filer.DirectoryEtcSeaweedFS, filer.FilerConfName, buf.Bytes()) + }); err != nil && err != filer_pb.ErrNotFound { return err } From ecce300964b1cb46069e8839659de5bbabb28771 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 9 Jul 2021 02:48:03 -0700 Subject: [PATCH 084/265] s3 config read via grpc --- weed/filer/read_write.go | 53 +++++----------------------------- weed/s3api/auth_credentials.go | 10 +++++-- 2 files changed, 16 insertions(+), 47 deletions(-) diff --git a/weed/filer/read_write.go b/weed/filer/read_write.go index c4c90fb63..14e8cab1e 100644 --- a/weed/filer/read_write.go +++ b/weed/filer/read_write.go @@ -2,13 +2,9 @@ package filer import ( "bytes" - "fmt" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" - "github.com/chrislusf/seaweedfs/weed/util" "github.com/chrislusf/seaweedfs/weed/wdclient" - "io/ioutil" "math" - "net/http" "time" ) @@ -31,50 +27,17 @@ func ReadEntry(masterClient *wdclient.MasterClient, filerClient filer_pb.Seaweed } -func ReadContent(filerAddress string, dir, name string) ([]byte, error) { - - target := fmt.Sprintf("http://%s%s/%s", filerAddress, dir, name) - - data, _, err := util.Get(target) - - return data, err -} - -func SaveAs(host string, port int, dir, name string, contentType string, byteBuffer *bytes.Buffer) error { - var target string - if port == 0 { - target = fmt.Sprintf("http://%s%s/%s", host, dir, name) - } else { - target = fmt.Sprintf("http://%s:%d%s/%s", host, port, dir, name) +func ReadInsideFiler(filerClient filer_pb.SeaweedFilerClient, dir, name string) (content []byte, err error) { + request := &filer_pb.LookupDirectoryEntryRequest{ + Directory: dir, + Name: name, } - - // set the HTTP method, url, and request body - req, err := http.NewRequest(http.MethodPut, target, byteBuffer) + respLookupEntry, err := filer_pb.LookupEntry(filerClient, request) if err != nil { - return err + return } - - // set the request header Content-Type for json - if contentType != "" { - req.Header.Set("Content-Type", contentType) - } - resp, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer util.CloseResponse(resp) - - b, err := ioutil.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode >= 400 { - return fmt.Errorf("%s: %s %v", target, resp.Status, string(b)) - } - - return nil - + content = respLookupEntry.Entry.Content + return } func SaveInsideFiler(client filer_pb.SeaweedFilerClient, dir, name string, content []byte) error { diff --git a/weed/s3api/auth_credentials.go b/weed/s3api/auth_credentials.go index 3439b40df..44c3f7aa7 100644 --- a/weed/s3api/auth_credentials.go +++ b/weed/s3api/auth_credentials.go @@ -4,6 +4,8 @@ import ( "fmt" "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/pb" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/pb/iam_pb" xhttp "github.com/chrislusf/seaweedfs/weed/s3api/http" "github.com/chrislusf/seaweedfs/weed/s3api/s3_constants" @@ -51,8 +53,12 @@ func NewIdentityAccessManagement(option *S3ApiServerOption) *IdentityAccessManag return iam } -func (iam *IdentityAccessManagement) loadS3ApiConfigurationFromFiler(option *S3ApiServerOption) error { - content, err := filer.ReadContent(option.Filer, filer.IamConfigDirecotry, filer.IamIdentityFile) +func (iam *IdentityAccessManagement) loadS3ApiConfigurationFromFiler(option *S3ApiServerOption) (err error) { + var content []byte + err = pb.WithFilerClient(option.Filer, option.GrpcDialOption, func(client filer_pb.SeaweedFilerClient) error { + content, err = filer.ReadInsideFiler(client, filer.IamConfigDirecotry, filer.IamIdentityFile) + return err + }) if err != nil { return fmt.Errorf("read S3 config: %v", err) } From 3d624d1e16a88840d8c4c87214ff3afd8c30db7f Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 9 Jul 2021 03:19:21 -0700 Subject: [PATCH 085/265] rename --- weed/filer/s3iam_conf.go | 3 ++- weed/filer/s3iam_conf_test.go | 2 +- weed/iamapi/iamapi_server.go | 4 ++-- weed/shell/command_s3_configure.go | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/weed/filer/s3iam_conf.go b/weed/filer/s3iam_conf.go index 92387fb09..55c976915 100644 --- a/weed/filer/s3iam_conf.go +++ b/weed/filer/s3iam_conf.go @@ -4,6 +4,7 @@ import ( "bytes" "github.com/chrislusf/seaweedfs/weed/pb/iam_pb" "github.com/golang/protobuf/jsonpb" + "github.com/golang/protobuf/proto" "io" ) @@ -14,7 +15,7 @@ func ParseS3ConfigurationFromBytes(content []byte, config *iam_pb.S3ApiConfigura return nil } -func S3ConfigurationToText(writer io.Writer, config *iam_pb.S3ApiConfiguration) error { +func ProtoToText(writer io.Writer, config proto.Message) error { m := jsonpb.Marshaler{ EmitDefaults: false, diff --git a/weed/filer/s3iam_conf_test.go b/weed/filer/s3iam_conf_test.go index 65cc49840..da7d9c9f1 100644 --- a/weed/filer/s3iam_conf_test.go +++ b/weed/filer/s3iam_conf_test.go @@ -44,7 +44,7 @@ func TestS3Conf(t *testing.T) { }, } var buf bytes.Buffer - err := S3ConfigurationToText(&buf, s3Conf) + err := ProtoToText(&buf, s3Conf) assert.Equal(t, err, nil) s3ConfSaved := &iam_pb.S3ApiConfiguration{} err = ParseS3ConfigurationFromBytes(buf.Bytes(), s3ConfSaved) diff --git a/weed/iamapi/iamapi_server.go b/weed/iamapi/iamapi_server.go index eb18e996d..037594165 100644 --- a/weed/iamapi/iamapi_server.go +++ b/weed/iamapi/iamapi_server.go @@ -96,8 +96,8 @@ func (iam IamS3ApiConfigure) GetS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfigurat func (iam IamS3ApiConfigure) PutS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfiguration) (err error) { buf := bytes.Buffer{} - if err := filer.S3ConfigurationToText(&buf, s3cfg); err != nil { - return fmt.Errorf("S3ConfigurationToText: %s", err) + if err := filer.ProtoToText(&buf, s3cfg); err != nil { + return fmt.Errorf("ProtoToText: %s", err) } return pb.WithGrpcFilerClient( iam.option.FilerGrpcAddress, diff --git a/weed/shell/command_s3_configure.go b/weed/shell/command_s3_configure.go index ca51ef72f..5eab2ebd0 100644 --- a/weed/shell/command_s3_configure.go +++ b/weed/shell/command_s3_configure.go @@ -164,7 +164,7 @@ func (c *commandS3Configure) Do(args []string, commandEnv *CommandEnv, writer io } buf.Reset() - filer.S3ConfigurationToText(&buf, s3cfg) + filer.ProtoToText(&buf, s3cfg) fmt.Fprintf(writer, string(buf.Bytes())) fmt.Fprintln(writer) From d013d6d9680296ba13c3f0da09f3bb3ae8550828 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 10 Jul 2021 23:16:06 -0700 Subject: [PATCH 086/265] shell: volume.fsck "reallyDeleteFromVolume" should send padded file ids to delete fix https://github.com/chrislusf/seaweedfs/issues/2188 --- weed/shell/command_volume_fsck.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/weed/shell/command_volume_fsck.go b/weed/shell/command_volume_fsck.go index 64389fdb5..0b40cfb7c 100644 --- a/weed/shell/command_volume_fsck.go +++ b/weed/shell/command_volume_fsck.go @@ -206,7 +206,7 @@ func (c *commandVolumeFsck) findExtraChunksInVolumeServers(volumeIdToVInfo map[u if verbose { for _, fid := range orphanFileIds { - fmt.Fprintf(writer, "%sxxxxxxxx\n", fid) + fmt.Fprintf(writer, "%s\n", fid) } } @@ -410,7 +410,7 @@ func (c *commandVolumeFsck) oneVolumeFileIdsSubtractFilerFileIds(tempFolder stri var orphanFileCount uint64 db.AscendingVisit(func(n needle_map.NeedleValue) error { // fmt.Printf("%d,%x\n", volumeId, n.Key) - orphanFileIds = append(orphanFileIds, fmt.Sprintf("%d,%s", volumeId, n.Key.String())) + orphanFileIds = append(orphanFileIds, fmt.Sprintf("%d,%s00000000", volumeId, n.Key.String())) orphanFileCount++ orphanDataSize += uint64(n.Size) return nil From 9e48bff8ee565546998b780bdd463fa94a73cce4 Mon Sep 17 00:00:00 2001 From: bingoohuang Date: Mon, 12 Jul 2021 13:51:21 +0800 Subject: [PATCH 087/265] fix typo in fs.configure help message text --- weed/shell/command_fs_configure.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/weed/shell/command_fs_configure.go b/weed/shell/command_fs_configure.go index a7e601bec..29cc54792 100644 --- a/weed/shell/command_fs_configure.go +++ b/weed/shell/command_fs_configure.go @@ -30,17 +30,17 @@ func (c *commandFsConfigure) Help() string { fs.configure # trying the changes and see the possible configuration file content - fs.configure -locationPrfix=/my/folder -collection=abc - fs.configure -locationPrfix=/my/folder -collection=abc -ttl=7d + fs.configure -locationPrefix=/my/folder -collection=abc + fs.configure -locationPrefix=/my/folder -collection=abc -ttl=7d # example: configure adding only 1 physical volume for each bucket collection - fs.configure -locationPrfix=/buckets/ -volumeGrowthCount=1 + fs.configure -locationPrefix=/buckets/ -volumeGrowthCount=1 # apply the changes - fs.configure -locationPrfix=/my/folder -collection=abc -apply + fs.configure -locationPrefix=/my/folder -collection=abc -apply # delete the changes - fs.configure -locationPrfix=/my/folder -delete -apply + fs.configure -locationPrefix=/my/folder -delete -apply ` } From b194f91f47d503b2424e0f7911756adab0b63fc6 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 12 Jul 2021 01:23:17 -0700 Subject: [PATCH 088/265] add version to filer configuration response --- other/java/client/src/main/proto/filer.proto | 1 + weed/pb/filer.proto | 1 + weed/pb/filer_pb/filer.pb.go | 398 ++++++++++--------- weed/server/filer_grpc_server.go | 1 + 4 files changed, 207 insertions(+), 194 deletions(-) diff --git a/other/java/client/src/main/proto/filer.proto b/other/java/client/src/main/proto/filer.proto index f49c1218f..522622a32 100644 --- a/other/java/client/src/main/proto/filer.proto +++ b/other/java/client/src/main/proto/filer.proto @@ -293,6 +293,7 @@ message GetFilerConfigurationResponse { int32 signature = 8; string metrics_address = 9; int32 metrics_interval_sec = 10; + string version = 11; } message SubscribeMetadataRequest { diff --git a/weed/pb/filer.proto b/weed/pb/filer.proto index f49c1218f..522622a32 100644 --- a/weed/pb/filer.proto +++ b/weed/pb/filer.proto @@ -293,6 +293,7 @@ message GetFilerConfigurationResponse { int32 signature = 8; string metrics_address = 9; int32 metrics_interval_sec = 10; + string version = 11; } message SubscribeMetadataRequest { diff --git a/weed/pb/filer_pb/filer.pb.go b/weed/pb/filer_pb/filer.pb.go index 2a7f3d041..d70d39436 100644 --- a/weed/pb/filer_pb/filer.pb.go +++ b/weed/pb/filer_pb/filer.pb.go @@ -2316,6 +2316,7 @@ type GetFilerConfigurationResponse struct { Signature int32 `protobuf:"varint,8,opt,name=signature,proto3" json:"signature,omitempty"` MetricsAddress string `protobuf:"bytes,9,opt,name=metrics_address,json=metricsAddress,proto3" json:"metrics_address,omitempty"` MetricsIntervalSec int32 `protobuf:"varint,10,opt,name=metrics_interval_sec,json=metricsIntervalSec,proto3" json:"metrics_interval_sec,omitempty"` + Version string `protobuf:"bytes,11,opt,name=version,proto3" json:"version,omitempty"` } func (x *GetFilerConfigurationResponse) Reset() { @@ -2413,6 +2414,13 @@ func (x *GetFilerConfigurationResponse) GetMetricsIntervalSec() int32 { return 0 } +func (x *GetFilerConfigurationResponse) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + type SubscribeMetadataRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3530,7 +3538,7 @@ var file_filer_proto_rawDesc = []byte{ 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1e, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc4, 0x02, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x46, 0x69, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xde, 0x02, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x73, 0x74, 0x65, @@ -3550,199 +3558,201 @@ var file_filer_proto_rawDesc = []byte{ 0x72, 0x69, 0x63, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x22, 0x95, 0x01, - 0x0a, 0x18, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, - 0x61, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x70, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x19, 0x0a, 0x08, - 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, - 0x73, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x79, 0x12, 0x4a, 0x0a, 0x12, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, - 0x05, 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, - 0x4e, 0x73, 0x22, 0x61, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x13, - 0x0a, 0x05, 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, - 0x73, 0x4e, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x10, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x65, 0x0a, 0x14, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, - 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, - 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xcd, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x1a, 0x58, - 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, - 0x70, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x67, 0x72, 0x70, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x0a, 0x0c, 0x4b, 0x76, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x3b, 0x0a, 0x0d, 0x4b, 0x76, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x36, 0x0a, 0x0c, 0x4b, 0x76, 0x50, 0x75, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x25, 0x0a, 0x0d, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xeb, 0x02, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, - 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, - 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x52, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x87, 0x02, 0x0a, 0x08, 0x50, - 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x66, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x2e, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x77, - 0x74, 0x68, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, - 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, - 0x4f, 0x6e, 0x6c, 0x79, 0x32, 0xdc, 0x0c, 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, - 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, - 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, - 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x41, 0x70, - 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, - 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x11, - 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, - 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, - 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, - 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, - 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, - 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, - 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x16, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, - 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, - 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, - 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, - 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x50, 0x75, 0x74, - 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, - 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x63, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x95, 0x01, 0x0a, 0x18, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x74, 0x68, + 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, + 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x4e, + 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, + 0x9a, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x4a, 0x0a, 0x12, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x73, 0x5f, 0x6e, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, 0x73, 0x22, 0x61, 0x0a, 0x08, + 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x73, 0x5f, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, 0x73, 0x12, 0x2c, 0x0a, + 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, + 0x65, 0x0a, 0x14, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x67, + 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, + 0x67, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x22, 0xcd, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, + 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, + 0x64, 0x12, 0x45, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x1a, 0x58, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x72, + 0x70, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0x20, 0x0a, 0x0c, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x22, 0x3b, 0x0a, 0x0d, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x36, 0x0a, 0x0c, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4b, 0x76, 0x50, + 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0xeb, 0x02, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x18, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x2e, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x87, 0x02, 0x0a, 0x08, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, + 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, + 0x74, 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, + 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x73, 0x79, 0x6e, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x73, 0x79, 0x6e, + 0x63, 0x12, 0x2e, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x77, + 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x32, 0xdc, + 0x0c, 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, + 0x67, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, + 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, + 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, + 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x5b, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, + 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, + 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0d, + 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x28, 0x01, 0x30, 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, + 0x6f, 0x6b, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, + 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, + 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4f, 0x0a, + 0x10, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x42, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2f, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, + 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, + 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/weed/server/filer_grpc_server.go b/weed/server/filer_grpc_server.go index 70f993962..64627deec 100644 --- a/weed/server/filer_grpc_server.go +++ b/weed/server/filer_grpc_server.go @@ -444,6 +444,7 @@ func (fs *FilerServer) GetFilerConfiguration(ctx context.Context, req *filer_pb. Signature: fs.filer.Signature, MetricsAddress: fs.metricsAddress, MetricsIntervalSec: int32(fs.metricsIntervalSec), + Version: util.Version(), } glog.V(4).Infof("GetFilerConfiguration: %v", t) From 297b41266bb338ee9c9af2c8da36af4498739907 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 12 Jul 2021 01:33:47 -0700 Subject: [PATCH 089/265] 2.58 --- k8s/seaweedfs/Chart.yaml | 4 ++-- k8s/seaweedfs/values.yaml | 2 +- weed/util/constants.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/k8s/seaweedfs/Chart.yaml b/k8s/seaweedfs/Chart.yaml index 7435cb0dd..31f13d3a4 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.57" -version: "2.57" +appVersion: "2.58" +version: "2.58" diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index 927141b47..5f7848781 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.57" - started using {.Chart.appVersion} + # imageTag: "2.58" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index 6404636d5..ca339e578 100644 --- a/weed/util/constants.go +++ b/weed/util/constants.go @@ -5,7 +5,7 @@ import ( ) var ( - VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 57) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 58) COMMIT = "" ) From 01adc567aae3b03e09601c4db1b413be1e0c90bc Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 12 Jul 2021 11:22:00 -0700 Subject: [PATCH 090/265] shell: volume.fsck deletes a volume is the volume has only orphaned data. fix https://github.com/chrislusf/seaweedfs/issues/2190 --- weed/shell/command_volume_fsck.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/weed/shell/command_volume_fsck.go b/weed/shell/command_volume_fsck.go index 0b40cfb7c..2ced0f571 100644 --- a/weed/shell/command_volume_fsck.go +++ b/weed/shell/command_volume_fsck.go @@ -5,6 +5,7 @@ import ( "context" "flag" "fmt" + "github.com/chrislusf/seaweedfs/weed/storage/needle" "io" "io/ioutil" "math" @@ -214,8 +215,14 @@ func (c *commandVolumeFsck) findExtraChunksInVolumeServers(volumeIdToVInfo map[u if vinfo.isEcVolume { fmt.Fprintf(writer, "Skip purging for Erasure Coded volumes.\n") } - if err := c.purgeFileIdsForOneVolume(volumeId, orphanFileIds, writer); err != nil { - return fmt.Errorf("purge for volume %d: %v\n", volumeId, err) + if inUseCount == 0 { + if err := deleteVolume(c.env.option.GrpcDialOption, needle.VolumeId(volumeId), vinfo.server); err != nil { + return fmt.Errorf("delete volume %d: %v\n", volumeId, err) + } + } else { + if err := c.purgeFileIdsForOneVolume(volumeId, orphanFileIds, writer); err != nil { + return fmt.Errorf("purge for volume %d: %v\n", volumeId, err) + } } } } From 49c66e88a0144247533e88f2b99c4731bd67bf10 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 13 Jul 2021 01:29:57 -0700 Subject: [PATCH 091/265] volume: change all writes to fsync during graceful stopping fix https://github.com/chrislusf/seaweedfs/issues/2193 --- weed/command/volume.go | 1 + weed/server/volume_server.go | 5 +++++ weed/storage/store.go | 7 ++++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/weed/command/volume.go b/weed/command/volume.go index 38a52efee..712fa0dce 100644 --- a/weed/command/volume.go +++ b/weed/command/volume.go @@ -259,6 +259,7 @@ func (v VolumeServerOptions) startVolumeServer(volumeFolders, maxVolumeCounts, v // Stop heartbeats if !volumeServer.StopHeartbeat() { + volumeServer.SetStopping() glog.V(0).Infof("stop send heartbeat and wait %d seconds until shutdown ...", *v.preStopSeconds) time.Sleep(time.Duration(*v.preStopSeconds) * time.Second) } diff --git a/weed/server/volume_server.go b/weed/server/volume_server.go index be50739c6..3bf740dc0 100644 --- a/weed/server/volume_server.go +++ b/weed/server/volume_server.go @@ -112,6 +112,11 @@ func NewVolumeServer(adminMux, publicMux *http.ServeMux, ip string, return vs } +func (vs *VolumeServer) SetStopping() { + glog.V(0).Infoln("Stopping volume server...") + vs.store.SetStopping() +} + func (vs *VolumeServer) Shutdown() { glog.V(0).Infoln("Shutting down volume server...") vs.store.Close() diff --git a/weed/storage/store.go b/weed/storage/store.go index 6ff996a3c..cda1e196b 100644 --- a/weed/storage/store.go +++ b/weed/storage/store.go @@ -46,6 +46,7 @@ type Store struct { DeletedVolumesChan chan master_pb.VolumeShortInformationMessage NewEcShardsChan chan master_pb.VolumeEcShardInformationMessage DeletedEcShardsChan chan master_pb.VolumeEcShardInformationMessage + isStopping bool } func (s *Store) String() (str string) { @@ -321,6 +322,10 @@ func (s *Store) CollectHeartbeat() *master_pb.Heartbeat { } +func (s *Store) SetStopping() { + s.isStopping = true +} + func (s *Store) Close() { for _, location := range s.Locations { location.Close() @@ -333,7 +338,7 @@ func (s *Store) WriteVolumeNeedle(i needle.VolumeId, n *needle.Needle, fsync boo err = fmt.Errorf("volume %d is read only", i) return } - _, _, isUnchanged, err = v.writeNeedle2(n, fsync) + _, _, isUnchanged, err = v.writeNeedle2(n, fsync && s.isStopping) return } glog.V(0).Infoln("volume", i, "not found!") From 6103649ffb3662834e5d0eea6652a720d23c77a6 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 13 Jul 2021 11:19:56 -0700 Subject: [PATCH 092/265] shell: volume.check.disk adds retries in case the volumes are just moved related to https://github.com/chrislusf/seaweedfs/issues/2194 --- weed/shell/command_volume_check_disk.go | 53 ++++++++++++++----------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/weed/shell/command_volume_check_disk.go b/weed/shell/command_volume_check_disk.go index 0f156ac2f..d8784f878 100644 --- a/weed/shell/command_volume_check_disk.go +++ b/weed/shell/command_volume_check_disk.go @@ -89,25 +89,28 @@ func (c *commandVolumeCheckDisk) Do(args []string, commandEnv *CommandEnv, write continue } - // reset index db - aDB.Close() - bDB.Close() - aDB, bDB = needle_map.NewMemDb(), needle_map.NewMemDb() + aHasChanges, bHasChanges := true, true + for aHasChanges || bHasChanges { + // reset index db + aDB.Close() + bDB.Close() + aDB, bDB = needle_map.NewMemDb(), needle_map.NewMemDb() - // read index db - if err := c.readIndexDatabase(aDB, a.info.Collection, a.info.Id, a.location.dataNode.Id, *verbose, writer); err != nil { - return err - } - if err := c.readIndexDatabase(bDB, b.info.Collection, b.info.Id, b.location.dataNode.Id, *verbose, writer); err != nil { - return err - } + // read index db + if err := c.readIndexDatabase(aDB, a.info.Collection, a.info.Id, a.location.dataNode.Id, *verbose, writer); err != nil { + return err + } + if err := c.readIndexDatabase(bDB, b.info.Collection, b.info.Id, b.location.dataNode.Id, *verbose, writer); err != nil { + return err + } - // find and make up the differnces - if err := c.doVolumeCheckDisk(aDB, bDB, a, b, *verbose, writer, *applyChanges, *nonRepairThreshold); err != nil { - return err - } - if err := c.doVolumeCheckDisk(bDB, aDB, b, a, *verbose, writer, *applyChanges, *nonRepairThreshold); err != nil { - return err + // find and make up the differences + if aHasChanges, err = c.doVolumeCheckDisk(aDB, bDB, a, b, *verbose, writer, *applyChanges, *nonRepairThreshold); err != nil { + return err + } + if bHasChanges, err = c.doVolumeCheckDisk(bDB, aDB, b, a, *verbose, writer, *applyChanges, *nonRepairThreshold); err != nil { + return err + } } replicas = replicas[1:] } @@ -116,7 +119,7 @@ func (c *commandVolumeCheckDisk) Do(args []string, commandEnv *CommandEnv, write return nil } -func (c *commandVolumeCheckDisk) doVolumeCheckDisk(subtrahend, minuend *needle_map.MemDb, source, target *VolumeReplica, verbose bool, writer io.Writer, applyChanges bool, nonRepairThreshold float64) error { +func (c *commandVolumeCheckDisk) doVolumeCheckDisk(subtrahend, minuend *needle_map.MemDb, source, target *VolumeReplica, verbose bool, writer io.Writer, applyChanges bool, nonRepairThreshold float64) (hasChanges bool, err error) { // find missing keys // hash join, can be more efficient @@ -133,12 +136,12 @@ func (c *commandVolumeCheckDisk) doVolumeCheckDisk(subtrahend, minuend *needle_m fmt.Fprintf(writer, "volume %d %s has %d entries, %s missed %d entries\n", source.info.Id, source.location.dataNode.Id, counter, target.location.dataNode.Id, len(missingNeedles)) if counter == 0 || len(missingNeedles) == 0 { - return nil + return false, nil } missingNeedlesFraction := float64(len(missingNeedles)) / float64(counter) if missingNeedlesFraction > nonRepairThreshold { - return fmt.Errorf( + return false, fmt.Errorf( "failed to start repair volume %d, percentage of missing keys is greater than the threshold: %.2f > %.2f", source.info.Id, missingNeedlesFraction, nonRepairThreshold) } @@ -147,7 +150,7 @@ func (c *commandVolumeCheckDisk) doVolumeCheckDisk(subtrahend, minuend *needle_m needleBlob, err := c.readSourceNeedleBlob(source.location.dataNode.Id, source.info.Id, needleValue) if err != nil { - return err + return } if !applyChanges { @@ -158,13 +161,15 @@ func (c *commandVolumeCheckDisk) doVolumeCheckDisk(subtrahend, minuend *needle_m fmt.Fprintf(writer, "read %d,%x %s => %s \n", source.info.Id, needleValue.Key, source.location.dataNode.Id, target.location.dataNode.Id) } - if err := c.writeNeedleBlobToTarget(target.location.dataNode.Id, source.info.Id, needleValue, needleBlob); err != nil { - return err + hasChanges = true + + if err = c.writeNeedleBlobToTarget(target.location.dataNode.Id, source.info.Id, needleValue, needleBlob); err != nil { + return } } - return nil + return } func (c *commandVolumeCheckDisk) readSourceNeedleBlob(sourceVolumeServer string, volumeId uint32, needleValue needle_map.NeedleValue) (needleBlob []byte, err error) { From 5a838dbe53acc82e853c206ce3d21e4712e16f73 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 13 Jul 2021 11:40:21 -0700 Subject: [PATCH 093/265] fix compilation --- weed/shell/command_volume_check_disk.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/weed/shell/command_volume_check_disk.go b/weed/shell/command_volume_check_disk.go index d8784f878..6fc70c753 100644 --- a/weed/shell/command_volume_check_disk.go +++ b/weed/shell/command_volume_check_disk.go @@ -150,7 +150,7 @@ func (c *commandVolumeCheckDisk) doVolumeCheckDisk(subtrahend, minuend *needle_m needleBlob, err := c.readSourceNeedleBlob(source.location.dataNode.Id, source.info.Id, needleValue) if err != nil { - return + return hasChanges, err } if !applyChanges { @@ -164,7 +164,7 @@ func (c *commandVolumeCheckDisk) doVolumeCheckDisk(subtrahend, minuend *needle_m hasChanges = true if err = c.writeNeedleBlobToTarget(target.location.dataNode.Id, source.info.Id, needleValue, needleBlob); err != nil { - return + return hasChanges, err } } From 18c40686d9c9f72f80a420c7a464d13cf33520d8 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 15 Jul 2021 11:56:28 -0700 Subject: [PATCH 094/265] s3: multipart upload miss data if file is chunked in 4MB fix https://github.com/chrislusf/seaweedfs/issues/2195 --- weed/server/filer_server_handlers_write_upload.go | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/weed/server/filer_server_handlers_write_upload.go b/weed/server/filer_server_handlers_write_upload.go index 395852517..2275ff1bc 100644 --- a/weed/server/filer_server_handlers_write_upload.go +++ b/weed/server/filer_server_handlers_write_upload.go @@ -28,19 +28,14 @@ var bufPool = sync.Pool{ }, } -func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Request, reader io.Reader, chunkSize int32, fileName, contentType string, contentLength int64, so *operation.StorageOption) ([]*filer_pb.FileChunk, hash.Hash, int64, error, []byte) { +func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Request, reader io.Reader, chunkSize int32, fileName, contentType string, contentLength int64, so *operation.StorageOption) (fileChunks []*filer_pb.FileChunk, md5Hash hash.Hash, chunkOffset int64, uploadErr error, smallContent []byte) { - md5Hash := md5.New() + md5Hash = md5.New() var partReader = ioutil.NopCloser(io.TeeReader(reader, md5Hash)) - chunkOffset := int64(0) - var smallContent []byte - var uploadErr error - var wg sync.WaitGroup var bytesBufferCounter int64 bytesBufferLimitCond := sync.NewCond(new(sync.Mutex)) - var fileChunks []*filer_pb.FileChunk var fileChunksLock sync.Mutex for { @@ -67,7 +62,7 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque bufPool.Put(bytesBuffer) atomic.AddInt64(&bytesBufferCounter, -1) bytesBufferLimitCond.Signal() - return nil, md5Hash, 0, err, nil + break } if chunkOffset == 0 && !isAppend(r) { if dataSize < fs.option.SaveToFilerLimit || strings.HasPrefix(r.URL.Path, filer.DirectoryEtcRoot) { From f0042f62dd8b823fc29dcc9a864a526534248ee0 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 15 Jul 2021 12:17:48 -0700 Subject: [PATCH 095/265] readable logs --- weed/s3api/s3api_object_multipart_handlers.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/weed/s3api/s3api_object_multipart_handlers.go b/weed/s3api/s3api_object_multipart_handlers.go index a4daea7a2..308d9a5f5 100644 --- a/weed/s3api/s3api_object_multipart_handlers.go +++ b/weed/s3api/s3api_object_multipart_handlers.go @@ -38,7 +38,7 @@ func (s3a *S3ApiServer) NewMultipartUploadHandler(w http.ResponseWriter, r *http response, errCode := s3a.createMultipartUpload(createMultipartUploadInput) - glog.V(2).Info("NewMultipartUploadHandler", s3err.EncodeXMLResponse(response), errCode) + glog.V(2).Info("NewMultipartUploadHandler", string(s3err.EncodeXMLResponse(response)), errCode) if errCode != s3err.ErrNone { s3err.WriteErrorResponse(w, errCode, r) @@ -62,7 +62,7 @@ func (s3a *S3ApiServer) CompleteMultipartUploadHandler(w http.ResponseWriter, r UploadId: aws.String(uploadID), }) - glog.V(2).Info("CompleteMultipartUploadHandler", s3err.EncodeXMLResponse(response), errCode) + glog.V(2).Info("CompleteMultipartUploadHandler", string(s3err.EncodeXMLResponse(response)), errCode) if errCode != s3err.ErrNone { s3err.WriteErrorResponse(w, errCode, r) @@ -91,7 +91,7 @@ func (s3a *S3ApiServer) AbortMultipartUploadHandler(w http.ResponseWriter, r *ht return } - glog.V(2).Info("AbortMultipartUploadHandler", s3err.EncodeXMLResponse(response)) + glog.V(2).Info("AbortMultipartUploadHandler", string(s3err.EncodeXMLResponse(response))) writeSuccessResponseXML(w, response) @@ -124,7 +124,7 @@ func (s3a *S3ApiServer) ListMultipartUploadsHandler(w http.ResponseWriter, r *ht UploadIdMarker: aws.String(uploadIDMarker), }) - glog.V(2).Info("ListMultipartUploadsHandler", s3err.EncodeXMLResponse(response), errCode) + glog.V(2).Info("ListMultipartUploadsHandler", string(s3err.EncodeXMLResponse(response)), errCode) if errCode != s3err.ErrNone { s3err.WriteErrorResponse(w, errCode, r) @@ -158,7 +158,7 @@ func (s3a *S3ApiServer) ListObjectPartsHandler(w http.ResponseWriter, r *http.Re UploadId: aws.String(uploadID), }) - glog.V(2).Info("ListObjectPartsHandler", s3err.EncodeXMLResponse(response), errCode) + glog.V(2).Info("ListObjectPartsHandler", string(s3err.EncodeXMLResponse(response)), errCode) if errCode != s3err.ErrNone { s3err.WriteErrorResponse(w, errCode, r) From a45bbc0b75dca72d715ef589d0a61f0e1b2c4eed Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 15 Jul 2021 15:52:22 -0700 Subject: [PATCH 096/265] 2.59 --- k8s/seaweedfs/Chart.yaml | 4 ++-- k8s/seaweedfs/values.yaml | 2 +- weed/util/constants.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/k8s/seaweedfs/Chart.yaml b/k8s/seaweedfs/Chart.yaml index 31f13d3a4..c5805d99c 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.58" -version: "2.58" +appVersion: "2.59" +version: "2.59" diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index 5f7848781..08cb9fddd 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.58" - started using {.Chart.appVersion} + # imageTag: "2.59" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index ca339e578..00774a83e 100644 --- a/weed/util/constants.go +++ b/weed/util/constants.go @@ -5,7 +5,7 @@ import ( ) var ( - VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 58) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 59) COMMIT = "" ) From e95166d739a845058532ae6c9d976e4ec1a63c71 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 15 Jul 2021 17:43:38 -0700 Subject: [PATCH 097/265] S --- weed/static/favicon.ico | Bin 3638 -> 5558 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/weed/static/favicon.ico b/weed/static/favicon.ico index cc6f531b34c8cd4353bcf9f3659e91ef0fb89d43..1059a4099c279b0e0bf1ad51056a1dd472b02235 100644 GIT binary patch literal 5558 zcmZQzU}RuoP*7k1(h3Y3f(#653=9kc0uX)%3j>26P)q|T22{e}0K_15U;tEu4o;Tp z{vXAoVSq0UoNIC#&@}S$_^SWU4=((Fs@z~e-0||n>i;0{>F$~T0}&Q5`$2B__3_pJ zYt!PX77kY?hW{so-(B7VvKkKl{r&y_;pT3txB+e`8H~3Vcl|$8V?mKS$gmbg%lB9J z{-1AkCEE=shLOQ}vTG{Yc7yW#m&aEL;@@B1VYuw~*Z2Q#%*mk0ZhU19vK(^y2RQ`f zW=g^w*=%Ci$o7NEqEi*dbn!RLZ6N#q{`&s^?uu%n>;>hC%e_HFsfF2rkAAeJk7)Bi z_JZ=n{WXnLvmc+^kmc?yD+h-YD2>q5eo%UNada8TS~#GW{h)mC`N2iFy)eepy|W0G z>!5NUIs8avU!R%$|JUcYFe}NTNwpKE{>JQdvg||G1T&8u`r+oD|Dd{%54L2bil2NuAcKyUkD?zp|E=>MM| zU+7x?!0d+67rT7_gYqVfKT41G?{K97^znd^#s`g)fQCgBfEYeb0vtm@2e`s-u!-MU zR`LH*k3Y$IAJT?d4lX}QZ5M#sAP*635Kw;s)K5jm_`>Pls@nhm{@|}i@#zQ2U7Zs9 z|L2F7VE2RiCFh!*P%yfFkeg3eo1ui$xkiWoAMcz5x0}$_qw{ah%lZH9#hw2byHUd$ zR1cw>3(^a!kC5?;qmZx$)fKlF7o)fX-7XNH5V*Ud3a=TUJ_IuUaN`KX$bbL-KifBl rR6^T&h(!%uj8H3T@W=NoO}NN|Gx9M|KdA<23lCH zpjk$Z0jLDvaD?-A8EB?j71c-rDsvr8EQo`}G`fzhL+|GzCOB!w^t8f-Zz24>j!D? zCJbEJk2$X!?kBAnx^;y6xpHoYaQRf2>OiUk|7-`=M(sNJA6Bj5cAcDrezhbm!)wyW zsh8$g$;`I9;Ia}g^EX32@^PsQK)(378Aep{YhVxmy9ng zh;3D1O|ssQmmd>k#7P+bbmQr$km}iN@GvvlF;hJ*ELbL?BYcE|5Eu4NTt7N From 4be5b4ff5cde0d5bf3fbb4b3e9e9d8f1cf4ec4c8 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 16 Jul 2021 02:03:32 -0700 Subject: [PATCH 098/265] [volume.check.disk] skip errors and check next volumes fix https://github.com/chrislusf/seaweedfs/issues/2129 --- weed/shell/command_volume_check_disk.go | 51 ++++++++++++++----------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/weed/shell/command_volume_check_disk.go b/weed/shell/command_volume_check_disk.go index 6fc70c753..f76555bed 100644 --- a/weed/shell/command_volume_check_disk.go +++ b/weed/shell/command_volume_check_disk.go @@ -89,28 +89,8 @@ func (c *commandVolumeCheckDisk) Do(args []string, commandEnv *CommandEnv, write continue } - aHasChanges, bHasChanges := true, true - for aHasChanges || bHasChanges { - // reset index db - aDB.Close() - bDB.Close() - aDB, bDB = needle_map.NewMemDb(), needle_map.NewMemDb() - - // read index db - if err := c.readIndexDatabase(aDB, a.info.Collection, a.info.Id, a.location.dataNode.Id, *verbose, writer); err != nil { - return err - } - if err := c.readIndexDatabase(bDB, b.info.Collection, b.info.Id, b.location.dataNode.Id, *verbose, writer); err != nil { - return err - } - - // find and make up the differences - if aHasChanges, err = c.doVolumeCheckDisk(aDB, bDB, a, b, *verbose, writer, *applyChanges, *nonRepairThreshold); err != nil { - return err - } - if bHasChanges, err = c.doVolumeCheckDisk(bDB, aDB, b, a, *verbose, writer, *applyChanges, *nonRepairThreshold); err != nil { - return err - } + if err := c.syncTwoReplicas(aDB, bDB, a, verbose, writer, b, err, applyChanges, nonRepairThreshold); err != nil { + fmt.Fprintf(writer, "snyc volume %d on %s and %s: %v\n", a.info.Id, a.location.dataNode.Id, b.location.dataNode.Id, err) } replicas = replicas[1:] } @@ -119,6 +99,33 @@ func (c *commandVolumeCheckDisk) Do(args []string, commandEnv *CommandEnv, write return nil } +func (c *commandVolumeCheckDisk) syncTwoReplicas(aDB *needle_map.MemDb, bDB *needle_map.MemDb, a *VolumeReplica, verbose *bool, writer io.Writer, b *VolumeReplica, err error, applyChanges *bool, nonRepairThreshold *float64) error { + aHasChanges, bHasChanges := true, true + for aHasChanges || bHasChanges { + // reset index db + aDB.Close() + bDB.Close() + aDB, bDB = needle_map.NewMemDb(), needle_map.NewMemDb() + + // read index db + if err := c.readIndexDatabase(aDB, a.info.Collection, a.info.Id, a.location.dataNode.Id, *verbose, writer); err != nil { + return err + } + if err := c.readIndexDatabase(bDB, b.info.Collection, b.info.Id, b.location.dataNode.Id, *verbose, writer); err != nil { + return err + } + + // find and make up the differences + if aHasChanges, err = c.doVolumeCheckDisk(aDB, bDB, a, b, *verbose, writer, *applyChanges, *nonRepairThreshold); err != nil { + return err + } + if bHasChanges, err = c.doVolumeCheckDisk(bDB, aDB, b, a, *verbose, writer, *applyChanges, *nonRepairThreshold); err != nil { + return err + } + } + return nil +} + func (c *commandVolumeCheckDisk) doVolumeCheckDisk(subtrahend, minuend *needle_map.MemDb, source, target *VolumeReplica, verbose bool, writer io.Writer, applyChanges bool, nonRepairThreshold float64) (hasChanges bool, err error) { // find missing keys From 2faf96f00261ba34ce5f56cbb91c0adc4b369edf Mon Sep 17 00:00:00 2001 From: nivekuil Date: Fri, 16 Jul 2021 04:29:46 -0700 Subject: [PATCH 099/265] cassandra: Use LocalOne instead of One consistency --- weed/filer/cassandra/cassandra_store.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/filer/cassandra/cassandra_store.go b/weed/filer/cassandra/cassandra_store.go index f4856657e..d917da518 100644 --- a/weed/filer/cassandra/cassandra_store.go +++ b/weed/filer/cassandra/cassandra_store.go @@ -124,7 +124,7 @@ func (store *CassandraStore) FindEntry(ctx context.Context, fullpath util.FullPa var data []byte if err := store.session.Query( "SELECT meta FROM filemeta WHERE directory=? AND name=?", - dir, name).Consistency(gocql.One).Scan(&data); err != nil { + dir, name).Consistency(gocql.LocalOne).Scan(&data); err != nil { if err != gocql.ErrNotFound { return nil, filer_pb.ErrNotFound } From fb7a1be1c4141b0e896d95a031a408ea7a1079e6 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 16 Jul 2021 11:46:04 -0700 Subject: [PATCH 100/265] refactor --- weed/shell/command_volume_fix_replication.go | 100 ++++++++++--------- 1 file changed, 54 insertions(+), 46 deletions(-) diff --git a/weed/shell/command_volume_fix_replication.go b/weed/shell/command_volume_fix_replication.go index 538351fd0..b48bd3ea0 100644 --- a/weed/shell/command_volume_fix_replication.go +++ b/weed/shell/command_volume_fix_replication.go @@ -157,61 +157,69 @@ func (c *commandVolumeFixReplication) fixOverReplicatedVolumes(commandEnv *Comma func (c *commandVolumeFixReplication) fixUnderReplicatedVolumes(commandEnv *CommandEnv, writer io.Writer, takeAction bool, underReplicatedVolumeIds []uint32, volumeReplicas map[uint32][]*VolumeReplica, allLocations []location) error { for _, vid := range underReplicatedVolumeIds { - replicas := volumeReplicas[vid] - replica := pickOneReplicaToCopyFrom(replicas) - replicaPlacement, _ := super_block.NewReplicaPlacementFromByte(byte(replica.info.ReplicaPlacement)) - foundNewLocation := false - hasSkippedCollection := false - keepDataNodesSorted(allLocations, types.ToDiskType(replica.info.DiskType)) - fn := capacityByFreeVolumeCount(types.ToDiskType(replica.info.DiskType)) - for _, dst := range allLocations { - // check whether data nodes satisfy the constraints - if fn(dst.dataNode) > 0 && satisfyReplicaPlacement(replicaPlacement, replicas, dst) { - // check collection name pattern - if *c.collectionPattern != "" { - matched, err := filepath.Match(*c.collectionPattern, replica.info.Collection) - if err != nil { - return fmt.Errorf("match pattern %s with collection %s: %v", *c.collectionPattern, replica.info.Collection, err) - } - if !matched { - hasSkippedCollection = true - break - } + err := c.fixOneUnderReplicatedVolume(commandEnv, writer, takeAction, volumeReplicas, vid, allLocations) + if err != nil { + return err + } + + } + return nil +} + +func (c *commandVolumeFixReplication) fixOneUnderReplicatedVolume(commandEnv *CommandEnv, writer io.Writer, takeAction bool, volumeReplicas map[uint32][]*VolumeReplica, vid uint32, allLocations []location) error { + replicas := volumeReplicas[vid] + replica := pickOneReplicaToCopyFrom(replicas) + replicaPlacement, _ := super_block.NewReplicaPlacementFromByte(byte(replica.info.ReplicaPlacement)) + foundNewLocation := false + hasSkippedCollection := false + keepDataNodesSorted(allLocations, types.ToDiskType(replica.info.DiskType)) + fn := capacityByFreeVolumeCount(types.ToDiskType(replica.info.DiskType)) + for _, dst := range allLocations { + // check whether data nodes satisfy the constraints + if fn(dst.dataNode) > 0 && satisfyReplicaPlacement(replicaPlacement, replicas, dst) { + // check collection name pattern + if *c.collectionPattern != "" { + matched, err := filepath.Match(*c.collectionPattern, replica.info.Collection) + if err != nil { + return fmt.Errorf("match pattern %s with collection %s: %v", *c.collectionPattern, replica.info.Collection, err) } - - // ask the volume server to replicate the volume - foundNewLocation = true - fmt.Fprintf(writer, "replicating volume %d %s from %s to dataNode %s ...\n", replica.info.Id, replicaPlacement, replica.location.dataNode.Id, dst.dataNode.Id) - - if !takeAction { + if !matched { + hasSkippedCollection = true break } + } - err := operation.WithVolumeServerClient(dst.dataNode.Id, commandEnv.option.GrpcDialOption, func(volumeServerClient volume_server_pb.VolumeServerClient) error { - _, replicateErr := volumeServerClient.VolumeCopy(context.Background(), &volume_server_pb.VolumeCopyRequest{ - VolumeId: replica.info.Id, - SourceDataNode: replica.location.dataNode.Id, - }) - if replicateErr != nil { - return fmt.Errorf("copying from %s => %s : %v", replica.location.dataNode.Id, dst.dataNode.Id, replicateErr) - } - return nil - }) + // ask the volume server to replicate the volume + foundNewLocation = true + fmt.Fprintf(writer, "replicating volume %d %s from %s to dataNode %s ...\n", replica.info.Id, replicaPlacement, replica.location.dataNode.Id, dst.dataNode.Id) - if err != nil { - return err - } - - // adjust free volume count - dst.dataNode.DiskInfos[replica.info.DiskType].FreeVolumeCount-- + if !takeAction { break } - } - if !foundNewLocation && !hasSkippedCollection { - fmt.Fprintf(writer, "failed to place volume %d replica as %s, existing:%+v\n", replica.info.Id, replicaPlacement, len(replicas)) - } + err := operation.WithVolumeServerClient(dst.dataNode.Id, commandEnv.option.GrpcDialOption, func(volumeServerClient volume_server_pb.VolumeServerClient) error { + _, replicateErr := volumeServerClient.VolumeCopy(context.Background(), &volume_server_pb.VolumeCopyRequest{ + VolumeId: replica.info.Id, + SourceDataNode: replica.location.dataNode.Id, + }) + if replicateErr != nil { + return fmt.Errorf("copying from %s => %s : %v", replica.location.dataNode.Id, dst.dataNode.Id, replicateErr) + } + return nil + }) + if err != nil { + return err + } + + // adjust free volume count + dst.dataNode.DiskInfos[replica.info.DiskType].FreeVolumeCount-- + break + } + } + + if !foundNewLocation && !hasSkippedCollection { + fmt.Fprintf(writer, "failed to place volume %d replica as %s, existing:%+v\n", replica.info.Id, replicaPlacement, len(replicas)) } return nil } From 2f209675ab9dd49a9c15a656a1358a1b388f0a4b Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 16 Jul 2021 12:08:21 -0700 Subject: [PATCH 101/265] Added `-retry` option for `volumeServer.evacuate` related to https://github.com/chrislusf/seaweedfs/issues/2191 --- weed/shell/command_volume_server_evacuate.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/weed/shell/command_volume_server_evacuate.go b/weed/shell/command_volume_server_evacuate.go index f21d0334c..fb9bf79c6 100644 --- a/weed/shell/command_volume_server_evacuate.go +++ b/weed/shell/command_volume_server_evacuate.go @@ -52,6 +52,7 @@ func (c *commandVolumeServerEvacuate) Do(args []string, commandEnv *CommandEnv, volumeServer := vsEvacuateCommand.String("node", "", ": of the volume server") skipNonMoveable := vsEvacuateCommand.Bool("skipNonMoveable", false, "skip volumes that can not be moved") applyChange := vsEvacuateCommand.Bool("force", false, "actually apply the changes") + retryCount := vsEvacuateCommand.Int("retry", 0, "how many times to retry") if err = vsEvacuateCommand.Parse(args); err != nil { return nil } @@ -60,7 +61,13 @@ func (c *commandVolumeServerEvacuate) Do(args []string, commandEnv *CommandEnv, return fmt.Errorf("need to specify volume server by -node=:") } - return volumeServerEvacuate(commandEnv, *volumeServer, *skipNonMoveable, *applyChange, writer) + for i:=0;i<*retryCount+1;i++{ + if err = volumeServerEvacuate(commandEnv, *volumeServer, *skipNonMoveable, *applyChange, writer); err == nil { + return nil + } + } + + return } From 99155e488072f694761dd2166e7b277a65b82124 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 16 Jul 2021 12:13:46 -0700 Subject: [PATCH 102/265] add `-retry` option for `volume.fix.replication` fix https://github.com/chrislusf/seaweedfs/issues/2191 --- weed/shell/command_volume_fix_replication.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/weed/shell/command_volume_fix_replication.go b/weed/shell/command_volume_fix_replication.go index b48bd3ea0..d1f830efb 100644 --- a/weed/shell/command_volume_fix_replication.go +++ b/weed/shell/command_volume_fix_replication.go @@ -58,6 +58,7 @@ func (c *commandVolumeFixReplication) Do(args []string, commandEnv *CommandEnv, volFixReplicationCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) c.collectionPattern = volFixReplicationCommand.String("collectionPattern", "", "match with wildcard characters '*' and '?'") skipChange := volFixReplicationCommand.Bool("n", false, "skip the changes") + retryCount := volFixReplicationCommand.Int("retry", 0, "how many times to retry") if err = volFixReplicationCommand.Parse(args); err != nil { return nil } @@ -100,7 +101,7 @@ func (c *commandVolumeFixReplication) Do(args []string, commandEnv *CommandEnv, } // find the most under populated data nodes - return c.fixUnderReplicatedVolumes(commandEnv, writer, takeAction, underReplicatedVolumeIds, volumeReplicas, allLocations) + return c.fixUnderReplicatedVolumes(commandEnv, writer, takeAction, underReplicatedVolumeIds, volumeReplicas, allLocations, *retryCount) } @@ -154,16 +155,16 @@ func (c *commandVolumeFixReplication) fixOverReplicatedVolumes(commandEnv *Comma return nil } -func (c *commandVolumeFixReplication) fixUnderReplicatedVolumes(commandEnv *CommandEnv, writer io.Writer, takeAction bool, underReplicatedVolumeIds []uint32, volumeReplicas map[uint32][]*VolumeReplica, allLocations []location) error { +func (c *commandVolumeFixReplication) fixUnderReplicatedVolumes(commandEnv *CommandEnv, writer io.Writer, takeAction bool, underReplicatedVolumeIds []uint32, volumeReplicas map[uint32][]*VolumeReplica, allLocations []location, retryCount int) (err error) { for _, vid := range underReplicatedVolumeIds { - err := c.fixOneUnderReplicatedVolume(commandEnv, writer, takeAction, volumeReplicas, vid, allLocations) - if err != nil { - return err + for i:=0;i Date: Mon, 19 Jul 2021 01:12:31 -0700 Subject: [PATCH 103/265] proto: add remote --- other/java/client/src/main/proto/filer.proto | 7 + weed/pb/filer.proto | 7 + weed/pb/filer_pb/filer.pb.go | 1138 ++++++++++-------- 3 files changed, 630 insertions(+), 522 deletions(-) diff --git a/other/java/client/src/main/proto/filer.proto b/other/java/client/src/main/proto/filer.proto index 522622a32..dd88bc005 100644 --- a/other/java/client/src/main/proto/filer.proto +++ b/other/java/client/src/main/proto/filer.proto @@ -101,6 +101,13 @@ message Entry { bytes hard_link_id = 7; int32 hard_link_counter = 8; // only exists in hard link meta data bytes content = 9; // if not empty, the file content + + message Remote { + int64 last_modified_at = 1; + int64 size = 2; + string e_tag = 3; + } + Remote remote = 10; } message FullEntry { diff --git a/weed/pb/filer.proto b/weed/pb/filer.proto index 522622a32..dd88bc005 100644 --- a/weed/pb/filer.proto +++ b/weed/pb/filer.proto @@ -101,6 +101,13 @@ message Entry { bytes hard_link_id = 7; int32 hard_link_counter = 8; // only exists in hard link meta data bytes content = 9; // if not empty, the file content + + message Remote { + int64 last_modified_at = 1; + int64 size = 2; + string e_tag = 3; + } + Remote remote = 10; } message FullEntry { diff --git a/weed/pb/filer_pb/filer.pb.go b/weed/pb/filer_pb/filer.pb.go index d70d39436..bf95c7688 100644 --- a/weed/pb/filer_pb/filer.pb.go +++ b/weed/pb/filer_pb/filer.pb.go @@ -270,6 +270,7 @@ type Entry struct { HardLinkId []byte `protobuf:"bytes,7,opt,name=hard_link_id,json=hardLinkId,proto3" json:"hard_link_id,omitempty"` HardLinkCounter int32 `protobuf:"varint,8,opt,name=hard_link_counter,json=hardLinkCounter,proto3" json:"hard_link_counter,omitempty"` // only exists in hard link meta data Content []byte `protobuf:"bytes,9,opt,name=content,proto3" json:"content,omitempty"` // if not empty, the file content + Remote *Entry_Remote `protobuf:"bytes,10,opt,name=remote,proto3" json:"remote,omitempty"` } func (x *Entry) Reset() { @@ -360,6 +361,13 @@ func (x *Entry) GetContent() []byte { return nil } +func (x *Entry) GetRemote() *Entry_Remote { + if x != nil { + return x.Remote + } + return nil +} + type FullEntry struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3082,6 +3090,69 @@ func (x *FilerConf) GetLocations() []*FilerConf_PathConf { return nil } +type Entry_Remote struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + LastModifiedAt int64 `protobuf:"varint,1,opt,name=last_modified_at,json=lastModifiedAt,proto3" json:"last_modified_at,omitempty"` + Size int64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` + ETag string `protobuf:"bytes,3,opt,name=e_tag,json=eTag,proto3" json:"e_tag,omitempty"` +} + +func (x *Entry_Remote) Reset() { + *x = Entry_Remote{} + if protoimpl.UnsafeEnabled { + mi := &file_filer_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Entry_Remote) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Entry_Remote) ProtoMessage() {} + +func (x *Entry_Remote) ProtoReflect() protoreflect.Message { + mi := &file_filer_proto_msgTypes[49] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Entry_Remote.ProtoReflect.Descriptor instead. +func (*Entry_Remote) Descriptor() ([]byte, []int) { + return file_filer_proto_rawDescGZIP(), []int{4, 1} +} + +func (x *Entry_Remote) GetLastModifiedAt() int64 { + if x != nil { + return x.LastModifiedAt + } + return 0 +} + +func (x *Entry_Remote) GetSize() int64 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *Entry_Remote) GetETag() string { + if x != nil { + return x.ETag + } + return "" +} + // if found, send the exact address // if not found, send the full list of existing brokers type LocateBrokerResponse_Resource struct { @@ -3096,7 +3167,7 @@ type LocateBrokerResponse_Resource struct { func (x *LocateBrokerResponse_Resource) Reset() { *x = LocateBrokerResponse_Resource{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[50] + mi := &file_filer_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3109,7 +3180,7 @@ func (x *LocateBrokerResponse_Resource) String() string { func (*LocateBrokerResponse_Resource) ProtoMessage() {} func (x *LocateBrokerResponse_Resource) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[50] + mi := &file_filer_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3157,7 +3228,7 @@ type FilerConf_PathConf struct { func (x *FilerConf_PathConf) Reset() { *x = FilerConf_PathConf{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[51] + mi := &file_filer_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3170,7 +3241,7 @@ func (x *FilerConf_PathConf) String() string { func (*FilerConf_PathConf) ProtoMessage() {} func (x *FilerConf_PathConf) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[51] + mi := &file_filer_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3271,8 +3342,8 @@ var file_filer_proto_rawDesc = []byte{ 0x22, 0x3c, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x85, - 0x03, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x92, + 0x04, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, @@ -3292,467 +3363,476 @@ var file_filer_proto_rawDesc = []byte{ 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x68, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x3b, 0x0a, 0x0d, 0x45, 0x78, 0x74, + 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x06, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x1a, 0x3b, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x44, 0x0a, 0x09, 0x46, 0x75, 0x6c, 0x6c, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x64, 0x69, 0x72, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x13, + 0x0a, 0x05, 0x65, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, + 0x54, 0x61, 0x67, 0x22, 0x44, 0x0a, 0x09, 0x46, 0x75, 0x6c, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, + 0x69, 0x72, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x8f, 0x02, 0x0a, 0x11, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x2c, 0x0a, 0x09, 0x6f, 0x6c, 0x64, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x6f, 0x6c, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2c, 0x0a, + 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, + 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x50, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, + 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, + 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x05, 0x52, + 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0xe6, 0x02, 0x0a, 0x09, + 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, + 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6d, + 0x74, 0x69, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x65, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x54, 0x61, 0x67, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, + 0x22, 0x0a, 0x03, 0x66, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x03, + 0x66, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x09, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x46, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, + 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x43, 0x6f, + 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x61, 0x6e, 0x69, + 0x66, 0x65, 0x73, 0x74, 0x22, 0x40, 0x0a, 0x11, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x58, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, + 0x08, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6f, 0x6b, + 0x69, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x07, 0x52, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, + 0x22, 0x9d, 0x03, 0x0a, 0x0e, 0x46, 0x75, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, + 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4d, + 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x72, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x63, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6d, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, + 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x74, 0x6c, 0x5f, 0x73, 0x65, 0x63, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x74, 0x74, 0x6c, 0x53, 0x65, 0x63, 0x12, 0x1b, + 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x79, + 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x64, 0x35, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, + 0x6d, 0x64, 0x35, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, + 0x22, 0xc3, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x8f, 0x02, 0x0a, - 0x11, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x09, 0x6f, 0x6c, 0x64, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6f, 0x6c, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x2c, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x23, - 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, - 0x77, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x31, 0x0a, 0x15, 0x69, - 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, - 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, - 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0xe6, - 0x02, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x17, 0x0a, 0x07, - 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, - 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x65, 0x5f, 0x74, 0x61, 0x67, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x54, 0x61, 0x67, 0x12, 0x24, 0x0a, 0x0e, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, - 0x49, 0x64, 0x12, 0x22, 0x0a, 0x03, 0x66, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, - 0x64, 0x52, 0x03, 0x66, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x66, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x09, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, - 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x63, 0x69, 0x70, - 0x68, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, - 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x69, - 0x73, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, - 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x22, 0x40, 0x0a, 0x11, 0x46, 0x69, 0x6c, 0x65, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x06, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x52, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x58, 0x0a, 0x06, 0x46, 0x69, 0x6c, - 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, - 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, - 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x07, 0x52, 0x06, 0x63, 0x6f, 0x6f, - 0x6b, 0x69, 0x65, 0x22, 0x9d, 0x03, 0x0a, 0x0e, 0x46, 0x75, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, - 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, - 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x72, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x63, 0x72, 0x74, 0x69, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6d, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x74, 0x6c, 0x5f, - 0x73, 0x65, 0x63, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x74, 0x74, 0x6c, 0x53, 0x65, - 0x63, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, - 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, - 0x0e, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x64, 0x35, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x03, 0x6d, 0x64, 0x35, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, - 0x79, 0x70, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x15, 0x0a, 0x06, + 0x6f, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x6f, 0x45, + 0x78, 0x63, 0x6c, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, + 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0xac, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x15, 0x0a, 0x06, 0x6f, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x6f, 0x45, 0x78, 0x63, 0x6c, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, - 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, - 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x13, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xac, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x25, 0x0a, 0x05, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, - 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x80, 0x01, 0x0a, - 0x14, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, - 0x17, 0x0a, 0x15, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x98, 0x02, 0x0a, 0x12, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x72, 0x65, - 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, - 0x73, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x67, - 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x67, 0x6e, 0x6f, - 0x72, 0x65, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, - 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x22, 0xba, 0x01, 0x0a, 0x18, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, - 0x0d, 0x6f, 0x6c, 0x64, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, - 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x1b, 0x0a, - 0x19, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x13, 0x41, - 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x74, - 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x74, 0x74, 0x6c, - 0x53, 0x65, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x43, 0x65, - 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x63, 0x6b, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, - 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0xe2, 0x01, 0x0a, 0x14, 0x41, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, - 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, - 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x34, - 0x0a, 0x13, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x49, 0x64, 0x73, 0x22, 0x3d, 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x3b, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, - 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x72, 0x6c, - 0x22, 0xc3, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x30, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, - 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x61, 0x70, - 0x1a, 0x54, 0x0a, 0x11, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x61, 0x70, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x20, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7b, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6e, 0x6f, 0x72, - 0x6d, 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x5f, 0x65, 0x63, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x45, 0x63, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x22, 0x50, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x36, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x39, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x84, - 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, - 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0x6f, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, - 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, - 0x65, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x66, 0x69, 0x6c, - 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1e, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xde, 0x02, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x62, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x61, 0x78, 0x4d, 0x62, 0x12, 0x1f, 0x0a, 0x0b, 0x64, - 0x69, 0x72, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x64, 0x69, 0x72, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x63, 0x69, - 0x70, 0x68, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, - 0x73, 0x65, 0x63, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x12, 0x18, 0x0a, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x95, 0x01, 0x0a, 0x18, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x74, 0x68, - 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, - 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x4e, - 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, - 0x9a, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x4a, 0x0a, 0x12, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x73, 0x5f, 0x6e, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, 0x73, 0x22, 0x61, 0x0a, 0x08, - 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x73, 0x5f, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, 0x73, 0x12, 0x2c, 0x0a, - 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x68, - 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, - 0x65, 0x0a, 0x14, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x67, - 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x67, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x22, 0xcd, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, - 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, - 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, - 0x64, 0x12, 0x45, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x1a, 0x58, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x72, - 0x70, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x22, 0x20, 0x0a, 0x0c, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x22, 0x3b, 0x0a, 0x0d, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x22, 0x36, 0x0a, 0x0c, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4b, 0x76, 0x50, - 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x22, 0xeb, 0x02, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x18, - 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, - 0x2e, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x87, 0x02, 0x0a, 0x08, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, - 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, - 0x74, 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, - 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, - 0x73, 0x79, 0x6e, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x73, 0x79, 0x6e, - 0x63, 0x12, 0x2e, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x77, - 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x32, 0xdc, - 0x0c, 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, - 0x67, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, - 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, - 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, - 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, - 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x5b, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, - 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, - 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0d, - 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x28, 0x01, 0x30, 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, - 0x6f, 0x6b, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, + 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, + 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x14, 0x41, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, + 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x2b, 0x0a, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x17, 0x0a, 0x15, + 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x98, 0x02, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, + 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x75, 0x72, + 0x73, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x52, 0x65, + 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x5f, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x52, + 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x31, 0x0a, + 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, + 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x08, + 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x22, 0x2b, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xba, 0x01, + 0x0a, 0x18, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x6c, + 0x64, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, + 0x19, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6f, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x65, + 0x77, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, + 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x1b, 0x0a, 0x19, 0x41, 0x74, + 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x13, 0x41, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x74, 0x6c, 0x5f, 0x73, + 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x74, 0x74, 0x6c, 0x53, 0x65, 0x63, + 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x63, 0x6b, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, + 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, + 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0xe2, 0x01, 0x0a, 0x14, 0x41, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, + 0x75, 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x34, 0x0a, 0x13, 0x4c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, + 0x73, 0x22, 0x3d, 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, + 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x3b, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, + 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, + 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x72, 0x6c, 0x22, 0xc3, 0x01, + 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x61, 0x70, 0x1a, 0x54, 0x0a, + 0x11, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x20, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7b, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, + 0x0a, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, + 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, + 0x65, 0x63, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x73, 0x22, 0x50, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0b, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x39, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x11, + 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, + 0x70, 0x65, 0x22, 0x6f, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x64, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x75, 0x73, 0x65, 0x64, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x1e, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0xde, 0x02, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, + 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x6d, 0x61, 0x78, 0x4d, 0x62, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x72, 0x5f, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, + 0x69, 0x72, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x69, 0x70, + 0x68, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x63, 0x69, 0x70, 0x68, 0x65, + 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, + 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x95, 0x01, 0x0a, 0x18, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x73, 0x12, 0x1c, + 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x9a, 0x01, 0x0a, + 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x4a, 0x0a, 0x12, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x11, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, 0x73, 0x22, 0x61, 0x0a, 0x08, 0x4c, 0x6f, 0x67, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x65, 0x0a, 0x14, + 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x70, 0x63, + 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x72, 0x70, + 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, + 0xcd, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x45, + 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x1a, 0x58, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x72, 0x70, 0x63, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x20, 0x0a, 0x0c, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x22, 0x3b, 0x0a, 0x0d, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x36, + 0x0a, 0x0c, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xeb, 0x02, + 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x2e, 0x50, 0x61, + 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x1a, 0x87, 0x02, 0x0a, 0x08, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x27, + 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x64, + 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x73, 0x79, 0x6e, + 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x2e, + 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x32, 0xdc, 0x0c, 0x0a, 0x0c, + 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x14, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, - 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4f, 0x0a, - 0x10, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x42, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2f, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, - 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, - 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x21, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x65, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0d, 0x4b, 0x65, 0x65, + 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, + 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, + 0x72, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, + 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, + 0x0a, 0x05, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, + 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, + 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, + 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, + 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -3767,7 +3847,7 @@ func file_filer_proto_rawDescGZIP() []byte { return file_filer_proto_rawDescData } -var file_filer_proto_msgTypes = make([]protoimpl.MessageInfo, 52) +var file_filer_proto_msgTypes = make([]protoimpl.MessageInfo, 53) var file_filer_proto_goTypes = []interface{}{ (*LookupDirectoryEntryRequest)(nil), // 0: filer_pb.LookupDirectoryEntryRequest (*LookupDirectoryEntryResponse)(nil), // 1: filer_pb.LookupDirectoryEntryResponse @@ -3818,9 +3898,10 @@ var file_filer_proto_goTypes = []interface{}{ (*KvPutResponse)(nil), // 46: filer_pb.KvPutResponse (*FilerConf)(nil), // 47: filer_pb.FilerConf nil, // 48: filer_pb.Entry.ExtendedEntry - nil, // 49: filer_pb.LookupVolumeResponse.LocationsMapEntry - (*LocateBrokerResponse_Resource)(nil), // 50: filer_pb.LocateBrokerResponse.Resource - (*FilerConf_PathConf)(nil), // 51: filer_pb.FilerConf.PathConf + (*Entry_Remote)(nil), // 49: filer_pb.Entry.Remote + nil, // 50: filer_pb.LookupVolumeResponse.LocationsMapEntry + (*LocateBrokerResponse_Resource)(nil), // 51: filer_pb.LocateBrokerResponse.Resource + (*FilerConf_PathConf)(nil), // 52: filer_pb.FilerConf.PathConf } var file_filer_proto_depIdxs = []int32{ 4, // 0: filer_pb.LookupDirectoryEntryResponse.entry:type_name -> filer_pb.Entry @@ -3828,65 +3909,66 @@ var file_filer_proto_depIdxs = []int32{ 7, // 2: filer_pb.Entry.chunks:type_name -> filer_pb.FileChunk 10, // 3: filer_pb.Entry.attributes:type_name -> filer_pb.FuseAttributes 48, // 4: filer_pb.Entry.extended:type_name -> filer_pb.Entry.ExtendedEntry - 4, // 5: filer_pb.FullEntry.entry:type_name -> filer_pb.Entry - 4, // 6: filer_pb.EventNotification.old_entry:type_name -> filer_pb.Entry - 4, // 7: filer_pb.EventNotification.new_entry:type_name -> filer_pb.Entry - 9, // 8: filer_pb.FileChunk.fid:type_name -> filer_pb.FileId - 9, // 9: filer_pb.FileChunk.source_fid:type_name -> filer_pb.FileId - 7, // 10: filer_pb.FileChunkManifest.chunks:type_name -> filer_pb.FileChunk - 4, // 11: filer_pb.CreateEntryRequest.entry:type_name -> filer_pb.Entry - 4, // 12: filer_pb.UpdateEntryRequest.entry:type_name -> filer_pb.Entry - 7, // 13: filer_pb.AppendToEntryRequest.chunks:type_name -> filer_pb.FileChunk - 25, // 14: filer_pb.Locations.locations:type_name -> filer_pb.Location - 49, // 15: filer_pb.LookupVolumeResponse.locations_map:type_name -> filer_pb.LookupVolumeResponse.LocationsMapEntry - 27, // 16: filer_pb.CollectionListResponse.collections:type_name -> filer_pb.Collection - 6, // 17: filer_pb.SubscribeMetadataResponse.event_notification:type_name -> filer_pb.EventNotification - 50, // 18: filer_pb.LocateBrokerResponse.resources:type_name -> filer_pb.LocateBrokerResponse.Resource - 51, // 19: filer_pb.FilerConf.locations:type_name -> filer_pb.FilerConf.PathConf - 24, // 20: filer_pb.LookupVolumeResponse.LocationsMapEntry.value:type_name -> filer_pb.Locations - 0, // 21: filer_pb.SeaweedFiler.LookupDirectoryEntry:input_type -> filer_pb.LookupDirectoryEntryRequest - 2, // 22: filer_pb.SeaweedFiler.ListEntries:input_type -> filer_pb.ListEntriesRequest - 11, // 23: filer_pb.SeaweedFiler.CreateEntry:input_type -> filer_pb.CreateEntryRequest - 13, // 24: filer_pb.SeaweedFiler.UpdateEntry:input_type -> filer_pb.UpdateEntryRequest - 15, // 25: filer_pb.SeaweedFiler.AppendToEntry:input_type -> filer_pb.AppendToEntryRequest - 17, // 26: filer_pb.SeaweedFiler.DeleteEntry:input_type -> filer_pb.DeleteEntryRequest - 19, // 27: filer_pb.SeaweedFiler.AtomicRenameEntry:input_type -> filer_pb.AtomicRenameEntryRequest - 21, // 28: filer_pb.SeaweedFiler.AssignVolume:input_type -> filer_pb.AssignVolumeRequest - 23, // 29: filer_pb.SeaweedFiler.LookupVolume:input_type -> filer_pb.LookupVolumeRequest - 28, // 30: filer_pb.SeaweedFiler.CollectionList:input_type -> filer_pb.CollectionListRequest - 30, // 31: filer_pb.SeaweedFiler.DeleteCollection:input_type -> filer_pb.DeleteCollectionRequest - 32, // 32: filer_pb.SeaweedFiler.Statistics:input_type -> filer_pb.StatisticsRequest - 34, // 33: filer_pb.SeaweedFiler.GetFilerConfiguration:input_type -> filer_pb.GetFilerConfigurationRequest - 36, // 34: filer_pb.SeaweedFiler.SubscribeMetadata:input_type -> filer_pb.SubscribeMetadataRequest - 36, // 35: filer_pb.SeaweedFiler.SubscribeLocalMetadata:input_type -> filer_pb.SubscribeMetadataRequest - 39, // 36: filer_pb.SeaweedFiler.KeepConnected:input_type -> filer_pb.KeepConnectedRequest - 41, // 37: filer_pb.SeaweedFiler.LocateBroker:input_type -> filer_pb.LocateBrokerRequest - 43, // 38: filer_pb.SeaweedFiler.KvGet:input_type -> filer_pb.KvGetRequest - 45, // 39: filer_pb.SeaweedFiler.KvPut:input_type -> filer_pb.KvPutRequest - 1, // 40: filer_pb.SeaweedFiler.LookupDirectoryEntry:output_type -> filer_pb.LookupDirectoryEntryResponse - 3, // 41: filer_pb.SeaweedFiler.ListEntries:output_type -> filer_pb.ListEntriesResponse - 12, // 42: filer_pb.SeaweedFiler.CreateEntry:output_type -> filer_pb.CreateEntryResponse - 14, // 43: filer_pb.SeaweedFiler.UpdateEntry:output_type -> filer_pb.UpdateEntryResponse - 16, // 44: filer_pb.SeaweedFiler.AppendToEntry:output_type -> filer_pb.AppendToEntryResponse - 18, // 45: filer_pb.SeaweedFiler.DeleteEntry:output_type -> filer_pb.DeleteEntryResponse - 20, // 46: filer_pb.SeaweedFiler.AtomicRenameEntry:output_type -> filer_pb.AtomicRenameEntryResponse - 22, // 47: filer_pb.SeaweedFiler.AssignVolume:output_type -> filer_pb.AssignVolumeResponse - 26, // 48: filer_pb.SeaweedFiler.LookupVolume:output_type -> filer_pb.LookupVolumeResponse - 29, // 49: filer_pb.SeaweedFiler.CollectionList:output_type -> filer_pb.CollectionListResponse - 31, // 50: filer_pb.SeaweedFiler.DeleteCollection:output_type -> filer_pb.DeleteCollectionResponse - 33, // 51: filer_pb.SeaweedFiler.Statistics:output_type -> filer_pb.StatisticsResponse - 35, // 52: filer_pb.SeaweedFiler.GetFilerConfiguration:output_type -> filer_pb.GetFilerConfigurationResponse - 37, // 53: filer_pb.SeaweedFiler.SubscribeMetadata:output_type -> filer_pb.SubscribeMetadataResponse - 37, // 54: filer_pb.SeaweedFiler.SubscribeLocalMetadata:output_type -> filer_pb.SubscribeMetadataResponse - 40, // 55: filer_pb.SeaweedFiler.KeepConnected:output_type -> filer_pb.KeepConnectedResponse - 42, // 56: filer_pb.SeaweedFiler.LocateBroker:output_type -> filer_pb.LocateBrokerResponse - 44, // 57: filer_pb.SeaweedFiler.KvGet:output_type -> filer_pb.KvGetResponse - 46, // 58: filer_pb.SeaweedFiler.KvPut:output_type -> filer_pb.KvPutResponse - 40, // [40:59] is the sub-list for method output_type - 21, // [21:40] is the sub-list for method input_type - 21, // [21:21] is the sub-list for extension type_name - 21, // [21:21] is the sub-list for extension extendee - 0, // [0:21] is the sub-list for field type_name + 49, // 5: filer_pb.Entry.remote:type_name -> filer_pb.Entry.Remote + 4, // 6: filer_pb.FullEntry.entry:type_name -> filer_pb.Entry + 4, // 7: filer_pb.EventNotification.old_entry:type_name -> filer_pb.Entry + 4, // 8: filer_pb.EventNotification.new_entry:type_name -> filer_pb.Entry + 9, // 9: filer_pb.FileChunk.fid:type_name -> filer_pb.FileId + 9, // 10: filer_pb.FileChunk.source_fid:type_name -> filer_pb.FileId + 7, // 11: filer_pb.FileChunkManifest.chunks:type_name -> filer_pb.FileChunk + 4, // 12: filer_pb.CreateEntryRequest.entry:type_name -> filer_pb.Entry + 4, // 13: filer_pb.UpdateEntryRequest.entry:type_name -> filer_pb.Entry + 7, // 14: filer_pb.AppendToEntryRequest.chunks:type_name -> filer_pb.FileChunk + 25, // 15: filer_pb.Locations.locations:type_name -> filer_pb.Location + 50, // 16: filer_pb.LookupVolumeResponse.locations_map:type_name -> filer_pb.LookupVolumeResponse.LocationsMapEntry + 27, // 17: filer_pb.CollectionListResponse.collections:type_name -> filer_pb.Collection + 6, // 18: filer_pb.SubscribeMetadataResponse.event_notification:type_name -> filer_pb.EventNotification + 51, // 19: filer_pb.LocateBrokerResponse.resources:type_name -> filer_pb.LocateBrokerResponse.Resource + 52, // 20: filer_pb.FilerConf.locations:type_name -> filer_pb.FilerConf.PathConf + 24, // 21: filer_pb.LookupVolumeResponse.LocationsMapEntry.value:type_name -> filer_pb.Locations + 0, // 22: filer_pb.SeaweedFiler.LookupDirectoryEntry:input_type -> filer_pb.LookupDirectoryEntryRequest + 2, // 23: filer_pb.SeaweedFiler.ListEntries:input_type -> filer_pb.ListEntriesRequest + 11, // 24: filer_pb.SeaweedFiler.CreateEntry:input_type -> filer_pb.CreateEntryRequest + 13, // 25: filer_pb.SeaweedFiler.UpdateEntry:input_type -> filer_pb.UpdateEntryRequest + 15, // 26: filer_pb.SeaweedFiler.AppendToEntry:input_type -> filer_pb.AppendToEntryRequest + 17, // 27: filer_pb.SeaweedFiler.DeleteEntry:input_type -> filer_pb.DeleteEntryRequest + 19, // 28: filer_pb.SeaweedFiler.AtomicRenameEntry:input_type -> filer_pb.AtomicRenameEntryRequest + 21, // 29: filer_pb.SeaweedFiler.AssignVolume:input_type -> filer_pb.AssignVolumeRequest + 23, // 30: filer_pb.SeaweedFiler.LookupVolume:input_type -> filer_pb.LookupVolumeRequest + 28, // 31: filer_pb.SeaweedFiler.CollectionList:input_type -> filer_pb.CollectionListRequest + 30, // 32: filer_pb.SeaweedFiler.DeleteCollection:input_type -> filer_pb.DeleteCollectionRequest + 32, // 33: filer_pb.SeaweedFiler.Statistics:input_type -> filer_pb.StatisticsRequest + 34, // 34: filer_pb.SeaweedFiler.GetFilerConfiguration:input_type -> filer_pb.GetFilerConfigurationRequest + 36, // 35: filer_pb.SeaweedFiler.SubscribeMetadata:input_type -> filer_pb.SubscribeMetadataRequest + 36, // 36: filer_pb.SeaweedFiler.SubscribeLocalMetadata:input_type -> filer_pb.SubscribeMetadataRequest + 39, // 37: filer_pb.SeaweedFiler.KeepConnected:input_type -> filer_pb.KeepConnectedRequest + 41, // 38: filer_pb.SeaweedFiler.LocateBroker:input_type -> filer_pb.LocateBrokerRequest + 43, // 39: filer_pb.SeaweedFiler.KvGet:input_type -> filer_pb.KvGetRequest + 45, // 40: filer_pb.SeaweedFiler.KvPut:input_type -> filer_pb.KvPutRequest + 1, // 41: filer_pb.SeaweedFiler.LookupDirectoryEntry:output_type -> filer_pb.LookupDirectoryEntryResponse + 3, // 42: filer_pb.SeaweedFiler.ListEntries:output_type -> filer_pb.ListEntriesResponse + 12, // 43: filer_pb.SeaweedFiler.CreateEntry:output_type -> filer_pb.CreateEntryResponse + 14, // 44: filer_pb.SeaweedFiler.UpdateEntry:output_type -> filer_pb.UpdateEntryResponse + 16, // 45: filer_pb.SeaweedFiler.AppendToEntry:output_type -> filer_pb.AppendToEntryResponse + 18, // 46: filer_pb.SeaweedFiler.DeleteEntry:output_type -> filer_pb.DeleteEntryResponse + 20, // 47: filer_pb.SeaweedFiler.AtomicRenameEntry:output_type -> filer_pb.AtomicRenameEntryResponse + 22, // 48: filer_pb.SeaweedFiler.AssignVolume:output_type -> filer_pb.AssignVolumeResponse + 26, // 49: filer_pb.SeaweedFiler.LookupVolume:output_type -> filer_pb.LookupVolumeResponse + 29, // 50: filer_pb.SeaweedFiler.CollectionList:output_type -> filer_pb.CollectionListResponse + 31, // 51: filer_pb.SeaweedFiler.DeleteCollection:output_type -> filer_pb.DeleteCollectionResponse + 33, // 52: filer_pb.SeaweedFiler.Statistics:output_type -> filer_pb.StatisticsResponse + 35, // 53: filer_pb.SeaweedFiler.GetFilerConfiguration:output_type -> filer_pb.GetFilerConfigurationResponse + 37, // 54: filer_pb.SeaweedFiler.SubscribeMetadata:output_type -> filer_pb.SubscribeMetadataResponse + 37, // 55: filer_pb.SeaweedFiler.SubscribeLocalMetadata:output_type -> filer_pb.SubscribeMetadataResponse + 40, // 56: filer_pb.SeaweedFiler.KeepConnected:output_type -> filer_pb.KeepConnectedResponse + 42, // 57: filer_pb.SeaweedFiler.LocateBroker:output_type -> filer_pb.LocateBrokerResponse + 44, // 58: filer_pb.SeaweedFiler.KvGet:output_type -> filer_pb.KvGetResponse + 46, // 59: filer_pb.SeaweedFiler.KvPut:output_type -> filer_pb.KvPutResponse + 41, // [41:60] is the sub-list for method output_type + 22, // [22:41] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name } func init() { file_filer_proto_init() } @@ -4471,8 +4553,8 @@ func file_filer_proto_init() { return nil } } - file_filer_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LocateBrokerResponse_Resource); i { + file_filer_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Entry_Remote); i { case 0: return &v.state case 1: @@ -4484,6 +4566,18 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LocateBrokerResponse_Resource); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_filer_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FilerConf_PathConf); i { case 0: return &v.state @@ -4502,7 +4596,7 @@ func file_filer_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_filer_proto_rawDesc, NumEnums: 0, - NumMessages: 52, + NumMessages: 53, NumExtensions: 0, NumServices: 1, }, From 450222dd64727caaa958ec99988e5352d3cad54c Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 19 Jul 2021 02:47:27 -0700 Subject: [PATCH 104/265] add remote to filer.Entry and filer_pb entry, add RemoteConf --- other/java/client/src/main/proto/filer.proto | 8 + weed/filer/entry.go | 60 +-- weed/filer/entry_codec.go | 23 +- weed/pb/filer.proto | 8 + weed/pb/filer_pb/filer.pb.go | 350 +++++++++++------- weed/replication/sink/filersink/filer_sink.go | 1 + weed/server/filer_grpc_server.go | 66 +--- 7 files changed, 288 insertions(+), 228 deletions(-) diff --git a/other/java/client/src/main/proto/filer.proto b/other/java/client/src/main/proto/filer.proto index dd88bc005..60c222413 100644 --- a/other/java/client/src/main/proto/filer.proto +++ b/other/java/client/src/main/proto/filer.proto @@ -374,3 +374,11 @@ message FilerConf { } repeated PathConf locations = 2; } + +message RemoteConf { + string type = 1; + string name = 2; + string url = 3; + string access_key = 4; + string secret_key = 5; +} diff --git a/weed/filer/entry.go b/weed/filer/entry.go index b7c8370e6..ede58a384 100644 --- a/weed/filer/entry.go +++ b/weed/filer/entry.go @@ -42,6 +42,7 @@ type Entry struct { HardLinkId HardLinkId HardLinkCounter int32 Content []byte + Remote *filer_pb.Entry_Remote } func (entry *Entry) Size() uint64 { @@ -60,16 +61,34 @@ func (entry *Entry) ToProtoEntry() *filer_pb.Entry { if entry == nil { return nil } - return &filer_pb.Entry{ - Name: entry.FullPath.Name(), - IsDirectory: entry.IsDirectory(), - Attributes: EntryAttributeToPb(entry), - Chunks: entry.Chunks, - Extended: entry.Extended, - HardLinkId: entry.HardLinkId, - HardLinkCounter: entry.HardLinkCounter, - Content: entry.Content, + message := &filer_pb.Entry{} + message.Name = entry.FullPath.Name() + entry.ToExistingProtoEntry(message) + return message +} + +func (entry *Entry) ToExistingProtoEntry(message *filer_pb.Entry) { + if entry == nil { + return } + message.IsDirectory = entry.IsDirectory() + message.Attributes = EntryAttributeToPb(entry) + message.Chunks = entry.Chunks + message.Extended = entry.Extended + message.HardLinkId = entry.HardLinkId + message.HardLinkCounter = entry.HardLinkCounter + message.Content = entry.Content + message.Remote = entry.Remote +} + +func FromPbEntryToExistingEntry(message *filer_pb.Entry, fsEntry *Entry) { + fsEntry.Attr = PbToEntryAttribute(message.Attributes) + fsEntry.Chunks = message.Chunks + fsEntry.Extended = message.Extended + fsEntry.HardLinkId = HardLinkId(message.HardLinkId) + fsEntry.HardLinkCounter = message.HardLinkCounter + fsEntry.Content = message.Content + fsEntry.Remote = message.Remote } func (entry *Entry) ToProtoFullEntry() *filer_pb.FullEntry { @@ -83,26 +102,11 @@ func (entry *Entry) ToProtoFullEntry() *filer_pb.FullEntry { } } -func (entry *Entry) Clone() *Entry { - return &Entry{ - FullPath: entry.FullPath, - Attr: entry.Attr, - Chunks: entry.Chunks, - Extended: entry.Extended, - HardLinkId: entry.HardLinkId, - HardLinkCounter: entry.HardLinkCounter, - } -} - func FromPbEntry(dir string, entry *filer_pb.Entry) *Entry { - return &Entry{ - FullPath: util.NewFullPath(dir, entry.Name), - Attr: PbToEntryAttribute(entry.Attributes), - Chunks: entry.Chunks, - HardLinkId: HardLinkId(entry.HardLinkId), - HardLinkCounter: entry.HardLinkCounter, - Content: entry.Content, - } + t := &Entry{} + t.FullPath = util.NewFullPath(dir, entry.Name) + FromPbEntryToExistingEntry(entry, t) + return t } func maxUint64(x, y uint64) uint64 { diff --git a/weed/filer/entry_codec.go b/weed/filer/entry_codec.go index 4c613f068..55c937b39 100644 --- a/weed/filer/entry_codec.go +++ b/weed/filer/entry_codec.go @@ -12,14 +12,8 @@ import ( ) func (entry *Entry) EncodeAttributesAndChunks() ([]byte, error) { - message := &filer_pb.Entry{ - Attributes: EntryAttributeToPb(entry), - Chunks: entry.Chunks, - Extended: entry.Extended, - HardLinkId: entry.HardLinkId, - HardLinkCounter: entry.HardLinkCounter, - Content: entry.Content, - } + message := &filer_pb.Entry{} + entry.ToExistingProtoEntry(message) return proto.Marshal(message) } @@ -31,15 +25,7 @@ func (entry *Entry) DecodeAttributesAndChunks(blob []byte) error { return fmt.Errorf("decoding value blob for %s: %v", entry.FullPath, err) } - entry.Attr = PbToEntryAttribute(message.Attributes) - - entry.Extended = message.Extended - - entry.Chunks = message.Chunks - - entry.HardLinkId = message.HardLinkId - entry.HardLinkCounter = message.HardLinkCounter - entry.Content = message.Content + FromPbEntryToExistingEntry(message, entry) return nil } @@ -129,6 +115,9 @@ func EqualEntry(a, b *Entry) bool { if !bytes.Equal(a.Content, b.Content) { return false } + if !proto.Equal(a.Remote, b.Remote) { + return false + } return true } diff --git a/weed/pb/filer.proto b/weed/pb/filer.proto index dd88bc005..60c222413 100644 --- a/weed/pb/filer.proto +++ b/weed/pb/filer.proto @@ -374,3 +374,11 @@ message FilerConf { } repeated PathConf locations = 2; } + +message RemoteConf { + string type = 1; + string name = 2; + string url = 3; + string access_key = 4; + string secret_key = 5; +} diff --git a/weed/pb/filer_pb/filer.pb.go b/weed/pb/filer_pb/filer.pb.go index bf95c7688..051f11fb6 100644 --- a/weed/pb/filer_pb/filer.pb.go +++ b/weed/pb/filer_pb/filer.pb.go @@ -3090,6 +3090,85 @@ func (x *FilerConf) GetLocations() []*FilerConf_PathConf { return nil } +type RemoteConf struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` + AccessKey string `protobuf:"bytes,4,opt,name=access_key,json=accessKey,proto3" json:"access_key,omitempty"` + SecretKey string `protobuf:"bytes,5,opt,name=secret_key,json=secretKey,proto3" json:"secret_key,omitempty"` +} + +func (x *RemoteConf) Reset() { + *x = RemoteConf{} + if protoimpl.UnsafeEnabled { + mi := &file_filer_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoteConf) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoteConf) ProtoMessage() {} + +func (x *RemoteConf) ProtoReflect() protoreflect.Message { + mi := &file_filer_proto_msgTypes[48] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoteConf.ProtoReflect.Descriptor instead. +func (*RemoteConf) Descriptor() ([]byte, []int) { + return file_filer_proto_rawDescGZIP(), []int{48} +} + +func (x *RemoteConf) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *RemoteConf) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RemoteConf) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *RemoteConf) GetAccessKey() string { + if x != nil { + return x.AccessKey + } + return "" +} + +func (x *RemoteConf) GetSecretKey() string { + if x != nil { + return x.SecretKey + } + return "" +} + type Entry_Remote struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3103,7 +3182,7 @@ type Entry_Remote struct { func (x *Entry_Remote) Reset() { *x = Entry_Remote{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[49] + mi := &file_filer_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3116,7 +3195,7 @@ func (x *Entry_Remote) String() string { func (*Entry_Remote) ProtoMessage() {} func (x *Entry_Remote) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[49] + mi := &file_filer_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3167,7 +3246,7 @@ type LocateBrokerResponse_Resource struct { func (x *LocateBrokerResponse_Resource) Reset() { *x = LocateBrokerResponse_Resource{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[51] + mi := &file_filer_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3180,7 +3259,7 @@ func (x *LocateBrokerResponse_Resource) String() string { func (*LocateBrokerResponse_Resource) ProtoMessage() {} func (x *LocateBrokerResponse_Resource) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[51] + mi := &file_filer_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3228,7 +3307,7 @@ type FilerConf_PathConf struct { func (x *FilerConf_PathConf) Reset() { *x = FilerConf_PathConf{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[52] + mi := &file_filer_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3241,7 +3320,7 @@ func (x *FilerConf_PathConf) String() string { func (*FilerConf_PathConf) ProtoMessage() {} func (x *FilerConf_PathConf) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[52] + mi := &file_filer_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3724,115 +3803,123 @@ var file_filer_proto_rawDesc = []byte{ 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x32, 0xdc, 0x0c, 0x0a, 0x0c, - 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x14, - 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x69, + 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x84, 0x01, 0x0a, 0x0a, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, + 0x65, 0x79, 0x32, 0xdc, 0x0c, 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, - 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, - 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, - 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x21, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, 0x53, 0x74, 0x61, - 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, - 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x65, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, - 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, + 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, + 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x0b, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65, + 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, + 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, + 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, + 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x41, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x49, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1b, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x47, + 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0d, 0x4b, 0x65, 0x65, - 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, - 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, - 0x72, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, - 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, - 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, - 0x0a, 0x05, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, - 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, - 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, - 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, - 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x16, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x56, 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, + 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, + 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x47, + 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x12, 0x16, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, + 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, + 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3847,7 +3934,7 @@ func file_filer_proto_rawDescGZIP() []byte { return file_filer_proto_rawDescData } -var file_filer_proto_msgTypes = make([]protoimpl.MessageInfo, 53) +var file_filer_proto_msgTypes = make([]protoimpl.MessageInfo, 54) var file_filer_proto_goTypes = []interface{}{ (*LookupDirectoryEntryRequest)(nil), // 0: filer_pb.LookupDirectoryEntryRequest (*LookupDirectoryEntryResponse)(nil), // 1: filer_pb.LookupDirectoryEntryResponse @@ -3897,19 +3984,20 @@ var file_filer_proto_goTypes = []interface{}{ (*KvPutRequest)(nil), // 45: filer_pb.KvPutRequest (*KvPutResponse)(nil), // 46: filer_pb.KvPutResponse (*FilerConf)(nil), // 47: filer_pb.FilerConf - nil, // 48: filer_pb.Entry.ExtendedEntry - (*Entry_Remote)(nil), // 49: filer_pb.Entry.Remote - nil, // 50: filer_pb.LookupVolumeResponse.LocationsMapEntry - (*LocateBrokerResponse_Resource)(nil), // 51: filer_pb.LocateBrokerResponse.Resource - (*FilerConf_PathConf)(nil), // 52: filer_pb.FilerConf.PathConf + (*RemoteConf)(nil), // 48: filer_pb.RemoteConf + nil, // 49: filer_pb.Entry.ExtendedEntry + (*Entry_Remote)(nil), // 50: filer_pb.Entry.Remote + nil, // 51: filer_pb.LookupVolumeResponse.LocationsMapEntry + (*LocateBrokerResponse_Resource)(nil), // 52: filer_pb.LocateBrokerResponse.Resource + (*FilerConf_PathConf)(nil), // 53: filer_pb.FilerConf.PathConf } var file_filer_proto_depIdxs = []int32{ 4, // 0: filer_pb.LookupDirectoryEntryResponse.entry:type_name -> filer_pb.Entry 4, // 1: filer_pb.ListEntriesResponse.entry:type_name -> filer_pb.Entry 7, // 2: filer_pb.Entry.chunks:type_name -> filer_pb.FileChunk 10, // 3: filer_pb.Entry.attributes:type_name -> filer_pb.FuseAttributes - 48, // 4: filer_pb.Entry.extended:type_name -> filer_pb.Entry.ExtendedEntry - 49, // 5: filer_pb.Entry.remote:type_name -> filer_pb.Entry.Remote + 49, // 4: filer_pb.Entry.extended:type_name -> filer_pb.Entry.ExtendedEntry + 50, // 5: filer_pb.Entry.remote:type_name -> filer_pb.Entry.Remote 4, // 6: filer_pb.FullEntry.entry:type_name -> filer_pb.Entry 4, // 7: filer_pb.EventNotification.old_entry:type_name -> filer_pb.Entry 4, // 8: filer_pb.EventNotification.new_entry:type_name -> filer_pb.Entry @@ -3920,11 +4008,11 @@ var file_filer_proto_depIdxs = []int32{ 4, // 13: filer_pb.UpdateEntryRequest.entry:type_name -> filer_pb.Entry 7, // 14: filer_pb.AppendToEntryRequest.chunks:type_name -> filer_pb.FileChunk 25, // 15: filer_pb.Locations.locations:type_name -> filer_pb.Location - 50, // 16: filer_pb.LookupVolumeResponse.locations_map:type_name -> filer_pb.LookupVolumeResponse.LocationsMapEntry + 51, // 16: filer_pb.LookupVolumeResponse.locations_map:type_name -> filer_pb.LookupVolumeResponse.LocationsMapEntry 27, // 17: filer_pb.CollectionListResponse.collections:type_name -> filer_pb.Collection 6, // 18: filer_pb.SubscribeMetadataResponse.event_notification:type_name -> filer_pb.EventNotification - 51, // 19: filer_pb.LocateBrokerResponse.resources:type_name -> filer_pb.LocateBrokerResponse.Resource - 52, // 20: filer_pb.FilerConf.locations:type_name -> filer_pb.FilerConf.PathConf + 52, // 19: filer_pb.LocateBrokerResponse.resources:type_name -> filer_pb.LocateBrokerResponse.Resource + 53, // 20: filer_pb.FilerConf.locations:type_name -> filer_pb.FilerConf.PathConf 24, // 21: filer_pb.LookupVolumeResponse.LocationsMapEntry.value:type_name -> filer_pb.Locations 0, // 22: filer_pb.SeaweedFiler.LookupDirectoryEntry:input_type -> filer_pb.LookupDirectoryEntryRequest 2, // 23: filer_pb.SeaweedFiler.ListEntries:input_type -> filer_pb.ListEntriesRequest @@ -4553,7 +4641,19 @@ func file_filer_proto_init() { return nil } } - file_filer_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_filer_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoteConf); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_filer_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Entry_Remote); i { case 0: return &v.state @@ -4565,7 +4665,7 @@ func file_filer_proto_init() { return nil } } - file_filer_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_filer_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LocateBrokerResponse_Resource); i { case 0: return &v.state @@ -4577,7 +4677,7 @@ func file_filer_proto_init() { return nil } } - file_filer_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_filer_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FilerConf_PathConf); i { case 0: return &v.state @@ -4596,7 +4696,7 @@ func file_filer_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_filer_proto_rawDesc, NumEnums: 0, - NumMessages: 53, + NumMessages: 54, NumExtensions: 0, NumServices: 1, }, diff --git a/weed/replication/sink/filersink/filer_sink.go b/weed/replication/sink/filersink/filer_sink.go index d7c5fccc3..608103469 100644 --- a/weed/replication/sink/filersink/filer_sink.go +++ b/weed/replication/sink/filersink/filer_sink.go @@ -133,6 +133,7 @@ func (fs *FilerSink) CreateEntry(key string, entry *filer_pb.Entry, signatures [ Attributes: entry.Attributes, Chunks: replicatedChunks, Content: entry.Content, + Remote: entry.Remote, }, IsFromOtherCluster: true, Signatures: signatures, diff --git a/weed/server/filer_grpc_server.go b/weed/server/filer_grpc_server.go index 64627deec..08b01dd09 100644 --- a/weed/server/filer_grpc_server.go +++ b/weed/server/filer_grpc_server.go @@ -31,16 +31,7 @@ func (fs *FilerServer) LookupDirectoryEntry(ctx context.Context, req *filer_pb.L } return &filer_pb.LookupDirectoryEntryResponse{ - Entry: &filer_pb.Entry{ - Name: req.Name, - IsDirectory: entry.IsDirectory(), - Attributes: filer.EntryAttributeToPb(entry), - Chunks: entry.Chunks, - Extended: entry.Extended, - HardLinkId: entry.HardLinkId, - HardLinkCounter: entry.HardLinkCounter, - Content: entry.Content, - }, + Entry: entry.ToProtoEntry(), }, nil } @@ -66,16 +57,7 @@ func (fs *FilerServer) ListEntries(req *filer_pb.ListEntriesRequest, stream file lastFileName, listErr = fs.filer.StreamListDirectoryEntries(stream.Context(), util.FullPath(req.Directory), lastFileName, includeLastFile, int64(paginationLimit), req.Prefix, "", "", func(entry *filer.Entry) bool { hasEntries = true if err = stream.Send(&filer_pb.ListEntriesResponse{ - Entry: &filer_pb.Entry{ - Name: entry.Name(), - IsDirectory: entry.IsDirectory(), - Chunks: entry.Chunks, - Attributes: filer.EntryAttributeToPb(entry), - Extended: entry.Extended, - HardLinkId: entry.HardLinkId, - HardLinkCounter: entry.HardLinkCounter, - Content: entry.Content, - }, + Entry: entry.ToProtoEntry(), }); err != nil { return false } @@ -161,15 +143,10 @@ func (fs *FilerServer) CreateEntry(ctx context.Context, req *filer_pb.CreateEntr return &filer_pb.CreateEntryResponse{}, fmt.Errorf("CreateEntry cleanupChunks %s %s: %v", req.Directory, req.Entry.Name, err2) } - createErr := fs.filer.CreateEntry(ctx, &filer.Entry{ - FullPath: util.JoinPath(req.Directory, req.Entry.Name), - Attr: filer.PbToEntryAttribute(req.Entry.Attributes), - Chunks: chunks, - Extended: req.Entry.Extended, - HardLinkId: filer.HardLinkId(req.Entry.HardLinkId), - HardLinkCounter: req.Entry.HardLinkCounter, - Content: req.Entry.Content, - }, req.OExcl, req.IsFromOtherCluster, req.Signatures) + newEntry := filer.FromPbEntry(req.Directory, req.Entry) + newEntry.Chunks = chunks + + createErr := fs.filer.CreateEntry(ctx, newEntry, req.OExcl, req.IsFromOtherCluster, req.Signatures) if createErr == nil { fs.filer.DeleteChunks(garbage) @@ -196,35 +173,8 @@ func (fs *FilerServer) UpdateEntry(ctx context.Context, req *filer_pb.UpdateEntr return &filer_pb.UpdateEntryResponse{}, fmt.Errorf("UpdateEntry cleanupChunks %s: %v", fullpath, err2) } - newEntry := &filer.Entry{ - FullPath: util.JoinPath(req.Directory, req.Entry.Name), - Attr: entry.Attr, - Extended: req.Entry.Extended, - Chunks: chunks, - HardLinkId: filer.HardLinkId(req.Entry.HardLinkId), - HardLinkCounter: req.Entry.HardLinkCounter, - Content: req.Entry.Content, - } - - glog.V(3).Infof("updating %s: %+v, chunks %d: %v => %+v, chunks %d: %v, extended: %v => %v", - fullpath, entry.Attr, len(entry.Chunks), entry.Chunks, - req.Entry.Attributes, len(req.Entry.Chunks), req.Entry.Chunks, - entry.Extended, req.Entry.Extended) - - if req.Entry.Attributes != nil { - if req.Entry.Attributes.Mtime != 0 { - newEntry.Attr.Mtime = time.Unix(req.Entry.Attributes.Mtime, 0) - } - if req.Entry.Attributes.FileMode != 0 { - newEntry.Attr.Mode = os.FileMode(req.Entry.Attributes.FileMode) - } - newEntry.Attr.Uid = req.Entry.Attributes.Uid - newEntry.Attr.Gid = req.Entry.Attributes.Gid - newEntry.Attr.Mime = req.Entry.Attributes.Mime - newEntry.Attr.UserName = req.Entry.Attributes.UserName - newEntry.Attr.GroupNames = req.Entry.Attributes.GroupName - - } + newEntry := filer.FromPbEntry(req.Directory, req.Entry) + newEntry.Chunks = chunks if filer.EqualEntry(entry, newEntry) { return &filer_pb.UpdateEntryResponse{}, err From b938df97a25fefecf4144ec29a40e36433faff61 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 19 Jul 2021 02:59:12 -0700 Subject: [PATCH 105/265] remove unused parameter --- weed/server/filer_server_handlers.go | 8 ++++---- weed/server/filer_server_handlers_read.go | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/weed/server/filer_server_handlers.go b/weed/server/filer_server_handlers.go index 56a47c860..0389e1e18 100644 --- a/weed/server/filer_server_handlers.go +++ b/weed/server/filer_server_handlers.go @@ -35,11 +35,11 @@ func (fs *FilerServer) filerHandler(w http.ResponseWriter, r *http.Request) { switch r.Method { case "GET": stats.FilerRequestCounter.WithLabelValues("get").Inc() - fs.GetOrHeadHandler(w, r, true) + fs.GetOrHeadHandler(w, r) stats.FilerRequestHistogram.WithLabelValues("get").Observe(time.Since(start).Seconds()) case "HEAD": stats.FilerRequestCounter.WithLabelValues("head").Inc() - fs.GetOrHeadHandler(w, r, false) + fs.GetOrHeadHandler(w, r) stats.FilerRequestHistogram.WithLabelValues("head").Observe(time.Since(start).Seconds()) case "DELETE": stats.FilerRequestCounter.WithLabelValues("delete").Inc() @@ -95,11 +95,11 @@ func (fs *FilerServer) readonlyFilerHandler(w http.ResponseWriter, r *http.Reque switch r.Method { case "GET": stats.FilerRequestCounter.WithLabelValues("get").Inc() - fs.GetOrHeadHandler(w, r, true) + fs.GetOrHeadHandler(w, r) stats.FilerRequestHistogram.WithLabelValues("get").Observe(time.Since(start).Seconds()) case "HEAD": stats.FilerRequestCounter.WithLabelValues("head").Inc() - fs.GetOrHeadHandler(w, r, false) + fs.GetOrHeadHandler(w, r) stats.FilerRequestHistogram.WithLabelValues("head").Observe(time.Since(start).Seconds()) case "OPTIONS": stats.FilerRequestCounter.WithLabelValues("options").Inc() diff --git a/weed/server/filer_server_handlers_read.go b/weed/server/filer_server_handlers_read.go index 153f68f8f..957e08855 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -21,7 +21,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" ) -func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, isGetMethod bool) { +func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) { path := r.URL.Path isForDirectory := strings.HasSuffix(path, "/") From b23b307e088efd41d4018fa7295f702bcda0f026 Mon Sep 17 00:00:00 2001 From: "byunghwa.yun" Date: Tue, 20 Jul 2021 08:49:28 +0900 Subject: [PATCH 106/265] Add fs rm --- weed/shell/command_fs_rm.go | 67 +++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 weed/shell/command_fs_rm.go diff --git a/weed/shell/command_fs_rm.go b/weed/shell/command_fs_rm.go new file mode 100644 index 000000000..4ee96ecf0 --- /dev/null +++ b/weed/shell/command_fs_rm.go @@ -0,0 +1,67 @@ +package shell + +import ( + "context" + "fmt" + "io" + + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/chrislusf/seaweedfs/weed/util" +) + +func init() { + Commands = append(Commands, &commandFsRm{}) +} + +type commandFsRm struct { +} + +func (c *commandFsRm) Name() string { + return "fs.rm" +} + +func (c *commandFsRm) Help() string { + return `remove a file or a folder, recursively delete all files and folders + + fs.rm + + fs.rm /dir/file_name + fs.rm /dir +` +} + +func (c *commandFsRm) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { + + if len(args) != 1 { + return fmt.Errorf("need to have arguments") + } + + targetPath, err := commandEnv.parseUrl(args[0]) + if err != nil { + return err + } + + targetDir, targetName := util.FullPath(targetPath).DirAndName() + + return commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + + request := &filer_pb.DeleteEntryRequest{ + Directory: targetDir, + Name: targetName, + IgnoreRecursiveError: true, + IsDeleteData: true, + IsRecursive: true, + IsFromOtherCluster: false, + Signatures: nil, + } + _, err = client.DeleteEntry(context.Background(), request) + + if err == nil { + fmt.Fprintf(writer, "remove: %s\n", targetPath) + } + + return err + + }) + +} From 93c37cfded59b28de0218758f79718a60d1da39f Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 19 Jul 2021 18:41:41 -0700 Subject: [PATCH 107/265] Update filechunk_manifest.go --- weed/filer/filechunk_manifest.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/filer/filechunk_manifest.go b/weed/filer/filechunk_manifest.go index c709dc819..abe329aaf 100644 --- a/weed/filer/filechunk_manifest.go +++ b/weed/filer/filechunk_manifest.go @@ -16,7 +16,7 @@ import ( ) const ( - ManifestBatch = 1000 + ManifestBatch = 10000 ) func HasChunkManifest(chunks []*filer_pb.FileChunk) bool { From 7ab389e7eca179516cdb19ad8b890e53053f2af3 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 19 Jul 2021 23:07:22 -0700 Subject: [PATCH 108/265] optimization: improve random range query for large files --- weed/filer/filechunk_manifest.go | 9 +++++++-- weed/filer/filechunks.go | 12 ++++++------ weed/filer/filechunks_test.go | 4 ++-- weed/filesys/filehandle.go | 2 +- weed/replication/sink/filersink/filer_sink.go | 5 +++-- weed/server/webdav_server.go | 2 +- weed/shell/command_volume_fsck.go | 4 ++-- 7 files changed, 22 insertions(+), 16 deletions(-) diff --git a/weed/filer/filechunk_manifest.go b/weed/filer/filechunk_manifest.go index c709dc819..2fe131dd0 100644 --- a/weed/filer/filechunk_manifest.go +++ b/weed/filer/filechunk_manifest.go @@ -39,9 +39,14 @@ func SeparateManifestChunks(chunks []*filer_pb.FileChunk) (manifestChunks, nonMa return } -func ResolveChunkManifest(lookupFileIdFn wdclient.LookupFileIdFunctionType, chunks []*filer_pb.FileChunk) (dataChunks, manifestChunks []*filer_pb.FileChunk, manifestResolveErr error) { +func ResolveChunkManifest(lookupFileIdFn wdclient.LookupFileIdFunctionType, chunks []*filer_pb.FileChunk, startOffset, stopOffset int64) (dataChunks, manifestChunks []*filer_pb.FileChunk, manifestResolveErr error) { // TODO maybe parallel this for _, chunk := range chunks { + + if max(chunk.Offset, startOffset) >= min(chunk.Offset+int64(chunk.Size), stopOffset) { + continue + } + if !chunk.IsChunkManifest { dataChunks = append(dataChunks, chunk) continue @@ -54,7 +59,7 @@ func ResolveChunkManifest(lookupFileIdFn wdclient.LookupFileIdFunctionType, chun manifestChunks = append(manifestChunks, chunk) // recursive - dchunks, mchunks, subErr := ResolveChunkManifest(lookupFileIdFn, resolvedChunks) + dchunks, mchunks, subErr := ResolveChunkManifest(lookupFileIdFn, resolvedChunks, startOffset, stopOffset) if subErr != nil { return chunks, nil, subErr } diff --git a/weed/filer/filechunks.go b/weed/filer/filechunks.go index 346eb3cfb..0dc03f6e2 100644 --- a/weed/filer/filechunks.go +++ b/weed/filer/filechunks.go @@ -53,7 +53,7 @@ func ETagChunks(chunks []*filer_pb.FileChunk) (etag string) { func CompactFileChunks(lookupFileIdFn wdclient.LookupFileIdFunctionType, chunks []*filer_pb.FileChunk) (compacted, garbage []*filer_pb.FileChunk) { - visibles, _ := NonOverlappingVisibleIntervals(lookupFileIdFn, chunks) + visibles, _ := NonOverlappingVisibleIntervals(lookupFileIdFn, chunks, 0, math.MaxInt64) fileIds := make(map[string]bool) for _, interval := range visibles { @@ -72,11 +72,11 @@ func CompactFileChunks(lookupFileIdFn wdclient.LookupFileIdFunctionType, chunks func MinusChunks(lookupFileIdFn wdclient.LookupFileIdFunctionType, as, bs []*filer_pb.FileChunk) (delta []*filer_pb.FileChunk, err error) { - aData, aMeta, aErr := ResolveChunkManifest(lookupFileIdFn, as) + aData, aMeta, aErr := ResolveChunkManifest(lookupFileIdFn, as, 0, math.MaxInt64) if aErr != nil { return nil, aErr } - bData, bMeta, bErr := ResolveChunkManifest(lookupFileIdFn, bs) + bData, bMeta, bErr := ResolveChunkManifest(lookupFileIdFn, bs, 0, math.MaxInt64) if bErr != nil { return nil, bErr } @@ -117,7 +117,7 @@ func (cv *ChunkView) IsFullChunk() bool { func ViewFromChunks(lookupFileIdFn wdclient.LookupFileIdFunctionType, chunks []*filer_pb.FileChunk, offset int64, size int64) (views []*ChunkView) { - visibles, _ := NonOverlappingVisibleIntervals(lookupFileIdFn, chunks) + visibles, _ := NonOverlappingVisibleIntervals(lookupFileIdFn, chunks, offset, offset+size) return ViewFromVisibleIntervals(visibles, offset, size) @@ -221,9 +221,9 @@ func MergeIntoVisibles(visibles []VisibleInterval, chunk *filer_pb.FileChunk) (n // NonOverlappingVisibleIntervals translates the file chunk into VisibleInterval in memory // If the file chunk content is a chunk manifest -func NonOverlappingVisibleIntervals(lookupFileIdFn wdclient.LookupFileIdFunctionType, chunks []*filer_pb.FileChunk) (visibles []VisibleInterval, err error) { +func NonOverlappingVisibleIntervals(lookupFileIdFn wdclient.LookupFileIdFunctionType, chunks []*filer_pb.FileChunk, startOffset int64, stopOffset int64) (visibles []VisibleInterval, err error) { - chunks, _, err = ResolveChunkManifest(lookupFileIdFn, chunks) + chunks, _, err = ResolveChunkManifest(lookupFileIdFn, chunks, startOffset, stopOffset) sort.Slice(chunks, func(i, j int) bool { if chunks[i].Mtime == chunks[j].Mtime { diff --git a/weed/filer/filechunks_test.go b/weed/filer/filechunks_test.go index 699e7e298..b0ea20848 100644 --- a/weed/filer/filechunks_test.go +++ b/weed/filer/filechunks_test.go @@ -90,7 +90,7 @@ func TestRandomFileChunksCompact(t *testing.T) { } } - visibles, _ := NonOverlappingVisibleIntervals(nil, chunks) + visibles, _ := NonOverlappingVisibleIntervals(nil, chunks, 0, math.MaxInt64) for _, v := range visibles { for x := v.start; x < v.stop; x++ { @@ -227,7 +227,7 @@ func TestIntervalMerging(t *testing.T) { for i, testcase := range testcases { log.Printf("++++++++++ merged test case %d ++++++++++++++++++++", i) - intervals, _ := NonOverlappingVisibleIntervals(nil, testcase.Chunks) + intervals, _ := NonOverlappingVisibleIntervals(nil, testcase.Chunks, 0, math.MaxInt64) for x, interval := range intervals { log.Printf("test case %d, interval %d, start=%d, stop=%d, fileId=%s", i, x, interval.start, interval.stop, interval.fileId) diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index f95051f65..9acede330 100644 --- a/weed/filesys/filehandle.go +++ b/weed/filesys/filehandle.go @@ -130,7 +130,7 @@ func (fh *FileHandle) readFromChunks(buff []byte, offset int64) (int64, error) { var chunkResolveErr error if fh.entryViewCache == nil { - fh.entryViewCache, chunkResolveErr = filer.NonOverlappingVisibleIntervals(fh.f.wfs.LookupFn(), entry.Chunks) + fh.entryViewCache, chunkResolveErr = filer.NonOverlappingVisibleIntervals(fh.f.wfs.LookupFn(), entry.Chunks, 0, math.MaxInt64) if chunkResolveErr != nil { return 0, fmt.Errorf("fail to resolve chunk manifest: %v", chunkResolveErr) } diff --git a/weed/replication/sink/filersink/filer_sink.go b/weed/replication/sink/filersink/filer_sink.go index 608103469..3898f2c58 100644 --- a/weed/replication/sink/filersink/filer_sink.go +++ b/weed/replication/sink/filersink/filer_sink.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/chrislusf/seaweedfs/weed/pb" "github.com/chrislusf/seaweedfs/weed/wdclient" + "math" "google.golang.org/grpc" @@ -228,11 +229,11 @@ func (fs *FilerSink) UpdateEntry(key string, oldEntry *filer_pb.Entry, newParent } func compareChunks(lookupFileIdFn wdclient.LookupFileIdFunctionType, oldEntry, newEntry *filer_pb.Entry) (deletedChunks, newChunks []*filer_pb.FileChunk, err error) { - aData, aMeta, aErr := filer.ResolveChunkManifest(lookupFileIdFn, oldEntry.Chunks) + aData, aMeta, aErr := filer.ResolveChunkManifest(lookupFileIdFn, oldEntry.Chunks, 0, math.MaxInt64) if aErr != nil { return nil, nil, aErr } - bData, bMeta, bErr := filer.ResolveChunkManifest(lookupFileIdFn, newEntry.Chunks) + bData, bMeta, bErr := filer.ResolveChunkManifest(lookupFileIdFn, newEntry.Chunks, 0, math.MaxInt64) if bErr != nil { return nil, nil, bErr } diff --git a/weed/server/webdav_server.go b/weed/server/webdav_server.go index c6550a36f..68c1f3233 100644 --- a/weed/server/webdav_server.go +++ b/weed/server/webdav_server.go @@ -532,7 +532,7 @@ func (f *WebDavFile) Read(p []byte) (readSize int, err error) { return 0, io.EOF } if f.entryViewCache == nil { - f.entryViewCache, _ = filer.NonOverlappingVisibleIntervals(filer.LookupFn(f.fs), f.entry.Chunks) + f.entryViewCache, _ = filer.NonOverlappingVisibleIntervals(filer.LookupFn(f.fs), f.entry.Chunks, 0, math.MaxInt64) f.reader = nil } if f.reader == nil { diff --git a/weed/shell/command_volume_fsck.go b/weed/shell/command_volume_fsck.go index 2ced0f571..bd3be4d89 100644 --- a/weed/shell/command_volume_fsck.go +++ b/weed/shell/command_volume_fsck.go @@ -164,7 +164,7 @@ func (c *commandVolumeFsck) collectFilerFileIdAndPaths(volumeIdToServer map[uint if verbose && entry.Entry.IsDirectory { fmt.Fprintf(writer, "checking directory %s\n", util.NewFullPath(entry.Dir, entry.Entry.Name)) } - dChunks, mChunks, resolveErr := filer.ResolveChunkManifest(filer.LookupFn(c.env), entry.Entry.Chunks) + dChunks, mChunks, resolveErr := filer.ResolveChunkManifest(filer.LookupFn(c.env), entry.Entry.Chunks, 0, math.MaxInt64) if resolveErr != nil { return nil } @@ -311,7 +311,7 @@ func (c *commandVolumeFsck) collectFilerFileIds(tempFolder string, volumeIdToSer files[i.vid].Write(buffer) } }, func(entry *filer_pb.FullEntry, outputChan chan interface{}) (err error) { - dChunks, mChunks, resolveErr := filer.ResolveChunkManifest(filer.LookupFn(c.env), entry.Entry.Chunks) + dChunks, mChunks, resolveErr := filer.ResolveChunkManifest(filer.LookupFn(c.env), entry.Entry.Chunks, 0, math.MaxInt64) if resolveErr != nil { return nil } From b9a67d46c5a1dc6ee18ab0835e6db014b0100c04 Mon Sep 17 00:00:00 2001 From: nivekuil Date: Tue, 20 Jul 2021 14:47:39 -0700 Subject: [PATCH 109/265] cassandra: use LocalQuorum for all queries This changes this filer store from eventual to strong consistency at the cost of read performance. --- weed/filer/cassandra/cassandra_store.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/filer/cassandra/cassandra_store.go b/weed/filer/cassandra/cassandra_store.go index d917da518..7affab9ec 100644 --- a/weed/filer/cassandra/cassandra_store.go +++ b/weed/filer/cassandra/cassandra_store.go @@ -124,7 +124,7 @@ func (store *CassandraStore) FindEntry(ctx context.Context, fullpath util.FullPa var data []byte if err := store.session.Query( "SELECT meta FROM filemeta WHERE directory=? AND name=?", - dir, name).Consistency(gocql.LocalOne).Scan(&data); err != nil { + dir, name).Scan(&data); err != nil { if err != gocql.ErrNotFound { return nil, filer_pb.ErrNotFound } From 70effac0d3edc95e55aa0c6d70e9d35a259ca2c8 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 21 Jul 2021 02:24:34 -0700 Subject: [PATCH 110/265] configure and store remote configurations --- other/java/client/src/main/proto/filer.proto | 7 +- weed/filer/filer_conf.go | 13 +- weed/pb/filer.proto | 7 +- weed/pb/filer_pb/filer.pb.go | 261 ++++++++++--------- weed/shell/command_remote_configure.go | 142 ++++++++++ 5 files changed, 293 insertions(+), 137 deletions(-) create mode 100644 weed/shell/command_remote_configure.go diff --git a/other/java/client/src/main/proto/filer.proto b/other/java/client/src/main/proto/filer.proto index 60c222413..803a2ce32 100644 --- a/other/java/client/src/main/proto/filer.proto +++ b/other/java/client/src/main/proto/filer.proto @@ -378,7 +378,8 @@ message FilerConf { message RemoteConf { string type = 1; string name = 2; - string url = 3; - string access_key = 4; - string secret_key = 5; + string s3_access_key = 4; + string s3_secret_key = 5; + string s3_region = 6; + string s3_endpoint = 7; } diff --git a/weed/filer/filer_conf.go b/weed/filer/filer_conf.go index da02c5b20..bae0eac5c 100644 --- a/weed/filer/filer_conf.go +++ b/weed/filer/filer_conf.go @@ -13,12 +13,13 @@ import ( ) const ( - DirectoryEtcRoot = "/etc" - DirectoryEtcSeaweedFS = "/etc/seaweedfs" - FilerConfName = "filer.conf" - IamConfigDirecotry = "/etc/iam" - IamIdentityFile = "identity.json" - IamPoliciesFile = "policies.json" + DirectoryEtcRoot = "/etc" + DirectoryEtcSeaweedFS = "/etc/seaweedfs" + DirectoryEtcRemote = "/etc/remote" + FilerConfName = "filer.conf" + IamConfigDirecotry = "/etc/iam" + IamIdentityFile = "identity.json" + IamPoliciesFile = "policies.json" ) type FilerConf struct { diff --git a/weed/pb/filer.proto b/weed/pb/filer.proto index 60c222413..803a2ce32 100644 --- a/weed/pb/filer.proto +++ b/weed/pb/filer.proto @@ -378,7 +378,8 @@ message FilerConf { message RemoteConf { string type = 1; string name = 2; - string url = 3; - string access_key = 4; - string secret_key = 5; + string s3_access_key = 4; + string s3_secret_key = 5; + string s3_region = 6; + string s3_endpoint = 7; } diff --git a/weed/pb/filer_pb/filer.pb.go b/weed/pb/filer_pb/filer.pb.go index 051f11fb6..2724bc7b0 100644 --- a/weed/pb/filer_pb/filer.pb.go +++ b/weed/pb/filer_pb/filer.pb.go @@ -3095,11 +3095,12 @@ type RemoteConf struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` - AccessKey string `protobuf:"bytes,4,opt,name=access_key,json=accessKey,proto3" json:"access_key,omitempty"` - SecretKey string `protobuf:"bytes,5,opt,name=secret_key,json=secretKey,proto3" json:"secret_key,omitempty"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + S3AccessKey string `protobuf:"bytes,4,opt,name=s3_access_key,json=s3AccessKey,proto3" json:"s3_access_key,omitempty"` + S3SecretKey string `protobuf:"bytes,5,opt,name=s3_secret_key,json=s3SecretKey,proto3" json:"s3_secret_key,omitempty"` + S3Region string `protobuf:"bytes,6,opt,name=s3_region,json=s3Region,proto3" json:"s3_region,omitempty"` + S3Endpoint string `protobuf:"bytes,7,opt,name=s3_endpoint,json=s3Endpoint,proto3" json:"s3_endpoint,omitempty"` } func (x *RemoteConf) Reset() { @@ -3148,23 +3149,30 @@ func (x *RemoteConf) GetName() string { return "" } -func (x *RemoteConf) GetUrl() string { +func (x *RemoteConf) GetS3AccessKey() string { if x != nil { - return x.Url + return x.S3AccessKey } return "" } -func (x *RemoteConf) GetAccessKey() string { +func (x *RemoteConf) GetS3SecretKey() string { if x != nil { - return x.AccessKey + return x.S3SecretKey } return "" } -func (x *RemoteConf) GetSecretKey() string { +func (x *RemoteConf) GetS3Region() string { if x != nil { - return x.SecretKey + return x.S3Region + } + return "" +} + +func (x *RemoteConf) GetS3Endpoint() string { + if x != nil { + return x.S3Endpoint } return "" } @@ -3803,123 +3811,126 @@ var file_filer_proto_rawDesc = []byte{ 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x84, 0x01, 0x0a, 0x0a, + 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0xba, 0x01, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, - 0x65, 0x79, 0x32, 0xdc, 0x0c, 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x46, 0x69, - 0x6c, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, - 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, - 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x0b, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65, - 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, - 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, - 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, - 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x41, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x49, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1b, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, - 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x47, - 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x16, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x56, 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, - 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, - 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, - 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x47, - 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x12, 0x16, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, - 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, - 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x33, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x33, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x33, 0x5f, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, + 0x33, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x33, + 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, + 0x33, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x33, 0x5f, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x33, + 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x32, 0xdc, 0x0c, 0x0a, 0x0c, 0x53, 0x65, 0x61, + 0x77, 0x65, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, + 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, + 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, + 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, + 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, + 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4f, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, + 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x65, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, 0x6f, 0x63, 0x61, + 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4f, + 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x12, 0x1d, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, + 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, + 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, + 0x76, 0x50, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, 0x61, 0x77, 0x65, + 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x46, 0x69, 0x6c, + 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, + 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/weed/shell/command_remote_configure.go b/weed/shell/command_remote_configure.go new file mode 100644 index 000000000..567143ce1 --- /dev/null +++ b/weed/shell/command_remote_configure.go @@ -0,0 +1,142 @@ +package shell + +import ( + "context" + "flag" + "fmt" + "github.com/chrislusf/seaweedfs/weed/filer" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/chrislusf/seaweedfs/weed/util" + "github.com/golang/protobuf/proto" + "io" + "regexp" +) + +func init() { + Commands = append(Commands, &commandRemoteConfigure{}) +} + +type commandRemoteConfigure struct { +} + +func (c *commandRemoteConfigure) Name() string { + return "remote.configure" +} + +func (c *commandRemoteConfigure) Help() string { + return `remote storage configuration + + # see the current configurations + remote.configure + + # set or update a configuration + remote.configure -name=cloud1 -type=s3 -access_key=xxx -secret_key=yyy + + # delete one configuration + remote.configure -delete -name=cloud1 + +` +} + +var ( + isAlpha = regexp.MustCompile(`^[A-Za-z][A-Za-z0-9]*$`).MatchString +) + +func (c *commandRemoteConfigure) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { + + conf := &filer_pb.RemoteConf{} + + remoteConfigureCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) + isDelete := remoteConfigureCommand.Bool("delete", false, "delete one remote storage by its name") + + remoteConfigureCommand.StringVar(&conf.Name, "name", "", "a short name to identify the remote storage") + remoteConfigureCommand.StringVar(&conf.Type, "type", "s3", "storage type, currently only support s3") + + remoteConfigureCommand.StringVar(&conf.S3AccessKey, "s3.access_key", "", "s3 access key") + remoteConfigureCommand.StringVar(&conf.S3SecretKey, "s3.secret_key", "", "s3 secret key") + remoteConfigureCommand.StringVar(&conf.S3Region, "s3.region", "us-east-2", "s3 region") + remoteConfigureCommand.StringVar(&conf.S3Endpoint, "s3.endpoint", "", "endpoint for s3-compatible local object store") + + if err = remoteConfigureCommand.Parse(args); err != nil { + return nil + } + + if conf.Name == "" { + return c.listExistingRemoteStorages(commandEnv, writer) + } + + if !isAlpha(conf.Name) { + return fmt.Errorf("only letters and numbers allowed in name: %v", conf.Name) + } + + if *isDelete { + return c.deleteRemoteStorage(commandEnv, writer, conf.Name) + } + + return c.saveRemoteStorage(commandEnv, writer, conf) + +} + +func (c *commandRemoteConfigure) listExistingRemoteStorages(commandEnv *CommandEnv, writer io.Writer) error { + + return filer_pb.ReadDirAllEntries(commandEnv, util.FullPath(filer.DirectoryEtcRemote), "", func(entry *filer_pb.Entry, isLast bool) error { + if len(entry.Content) == 0 { + fmt.Fprintf(writer, "skipping %s\n", entry.Name) + return nil + } + conf := &filer_pb.RemoteConf{} + + if err := proto.Unmarshal(entry.Content, conf); err != nil { + return fmt.Errorf("unmarshal %s/%s: %v", filer.DirectoryEtcRemote, entry.Name, err) + } + + conf.S3SecretKey = "" + + fmt.Fprintf(writer, "%+v\n", conf) + + return nil + }) + +} + +func (c *commandRemoteConfigure) deleteRemoteStorage(commandEnv *CommandEnv, writer io.Writer, storageName string) error { + + return commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + + request := &filer_pb.DeleteEntryRequest{ + Directory: filer.DirectoryEtcRemote, + Name: storageName, + IgnoreRecursiveError: false, + IsDeleteData: true, + IsRecursive: true, + IsFromOtherCluster: false, + Signatures: nil, + } + _, err := client.DeleteEntry(context.Background(), request) + + if err == nil { + fmt.Fprintf(writer, "removed: %s\n", storageName) + } + + return err + + }) + +} + +func (c *commandRemoteConfigure) saveRemoteStorage(commandEnv *CommandEnv, writer io.Writer, conf *filer_pb.RemoteConf) error { + + data, err := proto.Marshal(conf) + if err != nil { + return err + } + + if err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + return filer.SaveInsideFiler(client, filer.DirectoryEtcRemote, conf.Name, data) + }); err != nil && err != filer_pb.ErrNotFound { + return err + } + + return nil + +} From 41d559f54e2d235698091c360cfc899db58ccc9e Mon Sep 17 00:00:00 2001 From: "byunghwa.yun" Date: Wed, 21 Jul 2021 21:10:36 +0900 Subject: [PATCH 111/265] Add fs rm options --- weed/shell/command_fs_rm.go | 87 +++++++++++++++++++++++++------------ 1 file changed, 60 insertions(+), 27 deletions(-) diff --git a/weed/shell/command_fs_rm.go b/weed/shell/command_fs_rm.go index 4ee96ecf0..b383366ca 100644 --- a/weed/shell/command_fs_rm.go +++ b/weed/shell/command_fs_rm.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "io" + "strings" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/util" @@ -21,47 +22,79 @@ func (c *commandFsRm) Name() string { } func (c *commandFsRm) Help() string { - return `remove a file or a folder, recursively delete all files and folders + return `remove file and directory entries - fs.rm + fs.rm [-rf] ... - fs.rm /dir/file_name + fs.rm /dir/file_name1 dir/file_name2 fs.rm /dir + + The option "-r" can be recursive. + The option "-f" can be ignored by recursive error. ` } func (c *commandFsRm) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { - - if len(args) != 1 { + isRecursive := false + ignoreRecursiveError := false + var entiries []string + for _, arg := range args { + if !strings.HasPrefix(arg, "-") { + entiries = append(entiries, arg) + continue + } + for _, t := range arg { + switch t { + case 'r': + isRecursive = true + case 'f': + ignoreRecursiveError = true + } + } + } + if len(entiries) < 1 { return fmt.Errorf("need to have arguments") } - targetPath, err := commandEnv.parseUrl(args[0]) - if err != nil { - return err - } + commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + for _, entry := range entiries { + targetPath, err := commandEnv.parseUrl(entry) + if err != nil { + fmt.Fprintf(writer, "rm: %s: %v\n", targetPath, err) + continue + } - targetDir, targetName := util.FullPath(targetPath).DirAndName() + targetDir, targetName := util.FullPath(targetPath).DirAndName() - return commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + lookupRequest := &filer_pb.LookupDirectoryEntryRequest{ + Directory: targetDir, + Name: targetName, + } + _, err = filer_pb.LookupEntry(client, lookupRequest) + if err != nil { + fmt.Fprintf(writer, "rm: %s: %v\n", targetPath, err) + continue + } - request := &filer_pb.DeleteEntryRequest{ - Directory: targetDir, - Name: targetName, - IgnoreRecursiveError: true, - IsDeleteData: true, - IsRecursive: true, - IsFromOtherCluster: false, - Signatures: nil, + request := &filer_pb.DeleteEntryRequest{ + Directory: targetDir, + Name: targetName, + IgnoreRecursiveError: ignoreRecursiveError, + IsDeleteData: true, + IsRecursive: isRecursive, + IsFromOtherCluster: false, + Signatures: nil, + } + if resp, err := client.DeleteEntry(context.Background(), request); err != nil { + fmt.Fprintf(writer, "rm: %s: %v\n", targetPath, err) + } else { + if resp.Error != "" { + fmt.Fprintf(writer, "rm: %s: %v\n", targetPath, resp.Error) + } + } } - _, err = client.DeleteEntry(context.Background(), request) - - if err == nil { - fmt.Fprintf(writer, "remove: %s\n", targetPath) - } - - return err - + return nil }) + return } From e0c7708b038a7dcfc8127d2b9c57bf7c838853df Mon Sep 17 00:00:00 2001 From: "byunghwa.yun" Date: Wed, 21 Jul 2021 22:48:04 +0900 Subject: [PATCH 112/265] Fix error handling --- weed/command/fuse.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/weed/command/fuse.go b/weed/command/fuse.go index 609892b5b..a0dcaa86c 100644 --- a/weed/command/fuse.go +++ b/weed/command/fuse.go @@ -62,7 +62,7 @@ func runFuse(cmd *Command, args []string) bool { option.WriteByte(rawArgs[i]) } - // single quote separator read option until next single quote + // single quote separator read option until next single quote } else if rawArgs[i] == '\'' { for i++; i < rawArgsLen && rawArgs[i] != '\''; i++ { option.WriteByte(rawArgs[i]) @@ -109,7 +109,7 @@ func runFuse(cmd *Command, args []string) bool { case "filer.path": mountOptions.filerMountRootPath = ¶meter.value case "dirAutoCreate": - if parsed, err := strconv.ParseBool(parameter.value); err != nil { + if parsed, err := strconv.ParseBool(parameter.value); err == nil { mountOptions.dirAutoCreate = &parsed } else { panic(fmt.Errorf("dirAutoCreate: %s", err)) @@ -121,14 +121,14 @@ func runFuse(cmd *Command, args []string) bool { case "disk": mountOptions.diskType = ¶meter.value case "ttl": - if parsed, err := strconv.ParseInt(parameter.value, 0, 32); err != nil { + if parsed, err := strconv.ParseInt(parameter.value, 0, 32); err == nil { intValue := int(parsed) mountOptions.ttlSec = &intValue } else { panic(fmt.Errorf("ttl: %s", err)) } case "chunkSizeLimitMB": - if parsed, err := strconv.ParseInt(parameter.value, 0, 32); err != nil { + if parsed, err := strconv.ParseInt(parameter.value, 0, 32); err == nil { intValue := int(parsed) mountOptions.chunkSizeLimitMB = &intValue } else { @@ -136,7 +136,7 @@ func runFuse(cmd *Command, args []string) bool { } case "concurrentWriters": i++ - if parsed, err := strconv.ParseInt(parameter.value, 0, 32); err != nil { + if parsed, err := strconv.ParseInt(parameter.value, 0, 32); err == nil { intValue := int(parsed) mountOptions.concurrentWriters = &intValue } else { @@ -145,7 +145,7 @@ func runFuse(cmd *Command, args []string) bool { case "cacheDir": mountOptions.cacheDir = ¶meter.value case "cacheCapacityMB": - if parsed, err := strconv.ParseInt(parameter.value, 0, 64); err != nil { + if parsed, err := strconv.ParseInt(parameter.value, 0, 64); err == nil { mountOptions.cacheSizeMB = &parsed } else { panic(fmt.Errorf("cacheCapacityMB: %s", err)) @@ -153,7 +153,7 @@ func runFuse(cmd *Command, args []string) bool { case "dataCenter": mountOptions.dataCenter = ¶meter.value case "allowOthers": - if parsed, err := strconv.ParseBool(parameter.value); err != nil { + if parsed, err := strconv.ParseBool(parameter.value); err == nil { mountOptions.allowOthers = &parsed } else { panic(fmt.Errorf("allowOthers: %s", err)) @@ -161,7 +161,7 @@ func runFuse(cmd *Command, args []string) bool { case "umask": mountOptions.umaskString = ¶meter.value case "nonempty": - if parsed, err := strconv.ParseBool(parameter.value); err != nil { + if parsed, err := strconv.ParseBool(parameter.value); err == nil { mountOptions.nonempty = &parsed } else { panic(fmt.Errorf("nonempty: %s", err)) @@ -173,7 +173,7 @@ func runFuse(cmd *Command, args []string) bool { case "map.gid": mountOptions.gidMap = ¶meter.value case "readOnly": - if parsed, err := strconv.ParseBool(parameter.value); err != nil { + if parsed, err := strconv.ParseBool(parameter.value); err == nil { mountOptions.readOnly = &parsed } else { panic(fmt.Errorf("readOnly: %s", err)) @@ -183,7 +183,7 @@ func runFuse(cmd *Command, args []string) bool { case "memprofile": mountMemProfile = ¶meter.value case "readRetryTime": - if parsed, err := time.ParseDuration(parameter.value); err != nil { + if parsed, err := time.ParseDuration(parameter.value); err == nil { mountReadRetryTime = &parsed } else { panic(fmt.Errorf("readRetryTime: %s", err)) From 7359193e974e8ee30d2b2625ae30008ad940d1a6 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 21 Jul 2021 14:38:12 -0700 Subject: [PATCH 113/265] go fmt --- weed/filer/filer_conf.go | 14 +++++++------- weed/filesys/dir_rename.go | 1 - weed/replication/sink/filersink/filer_sink.go | 2 +- weed/s3api/filer_multipart.go | 6 +++--- weed/s3api/filer_util.go | 2 +- weed/shell/command_volume_fix_replication.go | 2 +- weed/shell/command_volume_server_evacuate.go | 2 +- weed/util/log_buffer/log_buffer.go | 4 ++-- 8 files changed, 16 insertions(+), 17 deletions(-) diff --git a/weed/filer/filer_conf.go b/weed/filer/filer_conf.go index bae0eac5c..c58b26dc2 100644 --- a/weed/filer/filer_conf.go +++ b/weed/filer/filer_conf.go @@ -13,13 +13,13 @@ import ( ) const ( - DirectoryEtcRoot = "/etc" - DirectoryEtcSeaweedFS = "/etc/seaweedfs" - DirectoryEtcRemote = "/etc/remote" - FilerConfName = "filer.conf" - IamConfigDirecotry = "/etc/iam" - IamIdentityFile = "identity.json" - IamPoliciesFile = "policies.json" + DirectoryEtcRoot = "/etc" + DirectoryEtcSeaweedFS = "/etc/seaweedfs" + DirectoryEtcRemote = "/etc/remote" + FilerConfName = "filer.conf" + IamConfigDirecotry = "/etc/iam" + IamIdentityFile = "identity.json" + IamPoliciesFile = "policies.json" ) type FilerConf struct { diff --git a/weed/filesys/dir_rename.go b/weed/filesys/dir_rename.go index f69339a14..dd76577b0 100644 --- a/weed/filesys/dir_rename.go +++ b/weed/filesys/dir_rename.go @@ -63,7 +63,6 @@ func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirector return fuse.EIO } - return nil } diff --git a/weed/replication/sink/filersink/filer_sink.go b/weed/replication/sink/filersink/filer_sink.go index 3898f2c58..2b526cc52 100644 --- a/weed/replication/sink/filersink/filer_sink.go +++ b/weed/replication/sink/filersink/filer_sink.go @@ -5,7 +5,7 @@ import ( "fmt" "github.com/chrislusf/seaweedfs/weed/pb" "github.com/chrislusf/seaweedfs/weed/wdclient" - "math" + "math" "google.golang.org/grpc" diff --git a/weed/s3api/filer_multipart.go b/weed/s3api/filer_multipart.go index 5d7bf2ac3..2b6707f2e 100644 --- a/weed/s3api/filer_multipart.go +++ b/weed/s3api/filer_multipart.go @@ -71,7 +71,7 @@ func (s3a *S3ApiServer) completeMultipartUpload(input *s3.CompleteMultipartUploa return nil, s3err.ErrNoSuchUpload } - pentry, err := s3a.getEntry(s3a.genUploadsFolder(*input.Bucket),*input.UploadId) + pentry, err := s3a.getEntry(s3a.genUploadsFolder(*input.Bucket), *input.UploadId) if err != nil { glog.Errorf("completeMultipartUpload %s %s error: %v", *input.Bucket, *input.UploadId, err) return nil, s3err.ErrNoSuchUpload @@ -112,11 +112,11 @@ func (s3a *S3ApiServer) completeMultipartUpload(input *s3.CompleteMultipartUploa dirName = dirName[:len(dirName)-1] } - err = s3a.mkFile(dirName, entryName, finalParts,func(entry *filer_pb.Entry) { + err = s3a.mkFile(dirName, entryName, finalParts, func(entry *filer_pb.Entry) { if entry.Extended == nil { entry.Extended = make(map[string][]byte) } - for k,v := range pentry.Extended{ + for k, v := range pentry.Extended { if k != "key" { entry.Extended[k] = v } diff --git a/weed/s3api/filer_util.go b/weed/s3api/filer_util.go index 92267a154..888003e45 100644 --- a/weed/s3api/filer_util.go +++ b/weed/s3api/filer_util.go @@ -17,7 +17,7 @@ func (s3a *S3ApiServer) mkdir(parentDirectoryPath string, dirName string, fn fun func (s3a *S3ApiServer) mkFile(parentDirectoryPath string, fileName string, chunks []*filer_pb.FileChunk, fn func(entry *filer_pb.Entry)) error { - return filer_pb.MkFile(s3a, parentDirectoryPath, fileName, chunks,fn) + return filer_pb.MkFile(s3a, parentDirectoryPath, fileName, chunks, fn) } diff --git a/weed/shell/command_volume_fix_replication.go b/weed/shell/command_volume_fix_replication.go index d1f830efb..9e6280788 100644 --- a/weed/shell/command_volume_fix_replication.go +++ b/weed/shell/command_volume_fix_replication.go @@ -158,7 +158,7 @@ func (c *commandVolumeFixReplication) fixOverReplicatedVolumes(commandEnv *Comma func (c *commandVolumeFixReplication) fixUnderReplicatedVolumes(commandEnv *CommandEnv, writer io.Writer, takeAction bool, underReplicatedVolumeIds []uint32, volumeReplicas map[uint32][]*VolumeReplica, allLocations []location, retryCount int) (err error) { for _, vid := range underReplicatedVolumeIds { - for i:=0;i:") } - for i:=0;i<*retryCount+1;i++{ + for i := 0; i < *retryCount+1; i++ { if err = volumeServerEvacuate(commandEnv, *volumeServer, *skipNonMoveable, *applyChange, writer); err == nil { return nil } diff --git a/weed/util/log_buffer/log_buffer.go b/weed/util/log_buffer/log_buffer.go index 4742c2b7c..c2158e7eb 100644 --- a/weed/util/log_buffer/log_buffer.go +++ b/weed/util/log_buffer/log_buffer.go @@ -170,8 +170,8 @@ func (m *LogBuffer) copyToFlush() *dataToFlush { m.lastFlushTime = m.stopTime } m.buf = m.prevBuffers.SealBuffer(m.startTime, m.stopTime, m.buf, m.pos) - m.startTime = time.Unix(0,0) - m.stopTime = time.Unix(0,0) + m.startTime = time.Unix(0, 0) + m.stopTime = time.Unix(0, 0) m.pos = 0 m.idx = m.idx[:0] return d From 84d91f143f59d9b98ea34f9b5a2fa0340ceb31b5 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 22 Jul 2021 00:40:16 -0700 Subject: [PATCH 114/265] mount: hide /etc folder also from mount --- weed/filesys/meta_cache/meta_cache_init.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/filesys/meta_cache/meta_cache_init.go b/weed/filesys/meta_cache/meta_cache_init.go index 9af25ae29..07098bf6b 100644 --- a/weed/filesys/meta_cache/meta_cache_init.go +++ b/weed/filesys/meta_cache/meta_cache_init.go @@ -43,5 +43,5 @@ func EnsureVisited(mc *MetaCache, client filer_pb.FilerClient, dirPath util.Full } func IsHiddenSystemEntry(dir, name string) bool { - return dir == "/" && name == "topics" + return dir == "/" && (name == "topics" || name == "etc") } From 182288f8606bde8bfcb31509335a4c33802db254 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 22 Jul 2021 08:23:20 -0700 Subject: [PATCH 115/265] filer: fix mysql, postgres batch delete error --- weed/filer/abstract_sql/abstract_sql_store.go | 26 +++++++------------ weed/filer/cassandra/cassandra_store.go | 2 +- weed/filer/elastic/v7/elastic_store.go | 2 +- weed/filer/etcd/etcd_store.go | 2 +- weed/filer/filer.go | 1 - weed/filer/filer_delete_entry.go | 2 +- weed/filer/filerstore.go | 2 +- weed/filer/filerstore_translate_path.go | 4 +-- weed/filer/filerstore_wrapper.go | 4 +-- weed/filer/hbase/hbase_store.go | 2 +- weed/filer/leveldb/leveldb_store.go | 2 +- weed/filer/leveldb2/leveldb2_store.go | 2 +- weed/filer/leveldb3/leveldb3_store.go | 2 +- weed/filer/mongodb/mongodb_store.go | 2 +- weed/filer/redis/universal_redis_store.go | 2 +- weed/filer/redis2/universal_redis_store.go | 2 +- weed/filer/rocksdb/rocksdb_store.go | 2 +- 17 files changed, 26 insertions(+), 35 deletions(-) diff --git a/weed/filer/abstract_sql/abstract_sql_store.go b/weed/filer/abstract_sql/abstract_sql_store.go index 26dff7fe7..4bf9b16fa 100644 --- a/weed/filer/abstract_sql/abstract_sql_store.go +++ b/weed/filer/abstract_sql/abstract_sql_store.go @@ -10,7 +10,6 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" "strings" "sync" - "time" ) type SqlGenerator interface { @@ -262,7 +261,7 @@ func (store *AbstractSqlStore) DeleteEntry(ctx context.Context, fullpath util.Fu return nil } -func (store *AbstractSqlStore) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath, limit int64) error { +func (store *AbstractSqlStore) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath) error { db, bucket, shortPath, err := store.getTxOrDB(ctx, fullpath, true) if err != nil { @@ -280,22 +279,15 @@ func (store *AbstractSqlStore) DeleteFolderChildren(ctx context.Context, fullpat } } - for { - glog.V(4).Infof("delete %s SQL %s %d", string(shortPath), store.GetSqlDeleteFolderChildren(bucket), util.HashStringToLong(string(shortPath))) - res, err := db.ExecContext(ctx, store.GetSqlDeleteFolderChildren(bucket), util.HashStringToLong(string(shortPath)), string(shortPath), limit) - if err != nil { - return fmt.Errorf("deleteFolderChildren %s: %s", fullpath, err) - } + glog.V(4).Infof("delete %s SQL %s %d", string(shortPath), store.GetSqlDeleteFolderChildren(bucket), util.HashStringToLong(string(shortPath))) + res, err := db.ExecContext(ctx, store.GetSqlDeleteFolderChildren(bucket), util.HashStringToLong(string(shortPath)), string(shortPath)) + if err != nil { + return fmt.Errorf("deleteFolderChildren %s: %s", fullpath, err) + } - rowCount, err := res.RowsAffected() - if err != nil { - return fmt.Errorf("deleteFolderChildren %s but no rows affected: %s", fullpath, err) - } - if rowCount < limit { - break - } - // to give the Galera Cluster a chance to breath - time.Sleep(time.Second) + _, err = res.RowsAffected() + if err != nil { + return fmt.Errorf("deleteFolderChildren %s but no rows affected: %s", fullpath, err) } return nil } diff --git a/weed/filer/cassandra/cassandra_store.go b/weed/filer/cassandra/cassandra_store.go index 7affab9ec..fc0b52ac7 100644 --- a/weed/filer/cassandra/cassandra_store.go +++ b/weed/filer/cassandra/cassandra_store.go @@ -161,7 +161,7 @@ func (store *CassandraStore) DeleteEntry(ctx context.Context, fullpath util.Full return nil } -func (store *CassandraStore) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath, limit int64) error { +func (store *CassandraStore) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath) error { if _, ok := store.isSuperLargeDirectory(string(fullpath)); ok { return nil // filer.ErrUnsupportedSuperLargeDirectoryListing } diff --git a/weed/filer/elastic/v7/elastic_store.go b/weed/filer/elastic/v7/elastic_store.go index 986c55b38..a16e5ebca 100644 --- a/weed/filer/elastic/v7/elastic_store.go +++ b/weed/filer/elastic/v7/elastic_store.go @@ -186,7 +186,7 @@ func (store *ElasticStore) deleteEntry(ctx context.Context, index, id string) (e return fmt.Errorf("delete entry %v.", err) } -func (store *ElasticStore) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath, limit int64) (err error) { +func (store *ElasticStore) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath) (err error) { _, err = store.ListDirectoryEntries(ctx, fullpath, "", false, math.MaxInt32, func(entry *filer.Entry) bool { if err := store.DeleteEntry(ctx, entry.FullPath); err != nil { glog.Errorf("elastic delete %s: %v.", entry.FullPath, err) diff --git a/weed/filer/etcd/etcd_store.go b/weed/filer/etcd/etcd_store.go index 96322081a..71ed738f9 100644 --- a/weed/filer/etcd/etcd_store.go +++ b/weed/filer/etcd/etcd_store.go @@ -130,7 +130,7 @@ func (store *EtcdStore) DeleteEntry(ctx context.Context, fullpath weed_util.Full return nil } -func (store *EtcdStore) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath, limit int64) (err error) { +func (store *EtcdStore) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath) (err error) { directoryPrefix := genDirectoryKeyPrefix(fullpath, "") if _, err := store.client.Delete(ctx, string(directoryPrefix), clientv3.WithPrefix()); err != nil { diff --git a/weed/filer/filer.go b/weed/filer/filer.go index 3082d0f55..d4c0b4eef 100644 --- a/weed/filer/filer.go +++ b/weed/filer/filer.go @@ -19,7 +19,6 @@ import ( const ( LogFlushInterval = time.Minute PaginationSize = 1024 - DeleteMaxRows = 10000 FilerStoreId = "filer.store.id" ) diff --git a/weed/filer/filer_delete_entry.go b/weed/filer/filer_delete_entry.go index be21801dc..35187d034 100644 --- a/weed/filer/filer_delete_entry.go +++ b/weed/filer/filer_delete_entry.go @@ -115,7 +115,7 @@ func (f *Filer) doBatchDeleteFolderMetaAndData(ctx context.Context, entry *Entry glog.V(3).Infof("deleting directory %v delete %d chunks: %v", entry.FullPath, len(chunks), shouldDeleteChunks) - if storeDeletionErr := f.Store.DeleteFolderChildren(ctx, entry.FullPath, DeleteMaxRows); storeDeletionErr != nil { + if storeDeletionErr := f.Store.DeleteFolderChildren(ctx, entry.FullPath); storeDeletionErr != nil { return nil, nil, fmt.Errorf("filer store delete: %v", storeDeletionErr) } diff --git a/weed/filer/filerstore.go b/weed/filer/filerstore.go index 63e2e7817..38927d6fb 100644 --- a/weed/filer/filerstore.go +++ b/weed/filer/filerstore.go @@ -25,7 +25,7 @@ type FilerStore interface { // err == filer_pb.ErrNotFound if not found FindEntry(context.Context, util.FullPath) (entry *Entry, err error) DeleteEntry(context.Context, util.FullPath) (err error) - DeleteFolderChildren(context.Context, util.FullPath, int64) (err error) + DeleteFolderChildren(context.Context, util.FullPath) (err error) ListDirectoryEntries(ctx context.Context, dirPath util.FullPath, startFileName string, includeStartFile bool, limit int64, eachEntryFunc ListEachEntryFunc) (lastFileName string, err error) ListDirectoryPrefixedEntries(ctx context.Context, dirPath util.FullPath, startFileName string, includeStartFile bool, limit int64, prefix string, eachEntryFunc ListEachEntryFunc) (lastFileName string, err error) diff --git a/weed/filer/filerstore_translate_path.go b/weed/filer/filerstore_translate_path.go index cb9fabfc0..00bf82ed4 100644 --- a/weed/filer/filerstore_translate_path.go +++ b/weed/filer/filerstore_translate_path.go @@ -100,10 +100,10 @@ func (t *FilerStorePathTranlator) DeleteOneEntry(ctx context.Context, existingEn return t.actualStore.DeleteEntry(ctx, existingEntry.FullPath) } -func (t *FilerStorePathTranlator) DeleteFolderChildren(ctx context.Context, fp util.FullPath, limit int64) (err error) { +func (t *FilerStorePathTranlator) DeleteFolderChildren(ctx context.Context, fp util.FullPath) (err error) { newFullPath := t.translatePath(fp) - return t.actualStore.DeleteFolderChildren(ctx, newFullPath, limit) + return t.actualStore.DeleteFolderChildren(ctx, newFullPath) } func (t *FilerStorePathTranlator) ListDirectoryEntries(ctx context.Context, dirPath util.FullPath, startFileName string, includeStartFile bool, limit int64, eachEntryFunc ListEachEntryFunc) (string, error) { diff --git a/weed/filer/filerstore_wrapper.go b/weed/filer/filerstore_wrapper.go index 997d70a80..2470f340c 100644 --- a/weed/filer/filerstore_wrapper.go +++ b/weed/filer/filerstore_wrapper.go @@ -213,7 +213,7 @@ func (fsw *FilerStoreWrapper) DeleteOneEntry(ctx context.Context, existingEntry return actualStore.DeleteEntry(ctx, existingEntry.FullPath) } -func (fsw *FilerStoreWrapper) DeleteFolderChildren(ctx context.Context, fp util.FullPath, limit int64) (err error) { +func (fsw *FilerStoreWrapper) DeleteFolderChildren(ctx context.Context, fp util.FullPath) (err error) { actualStore := fsw.getActualStore(fp + "/") stats.FilerStoreCounter.WithLabelValues(actualStore.GetName(), "deleteFolderChildren").Inc() start := time.Now() @@ -222,7 +222,7 @@ func (fsw *FilerStoreWrapper) DeleteFolderChildren(ctx context.Context, fp util. }() glog.V(4).Infof("DeleteFolderChildren %s", fp) - return actualStore.DeleteFolderChildren(ctx, fp, limit) + return actualStore.DeleteFolderChildren(ctx, fp) } func (fsw *FilerStoreWrapper) ListDirectoryEntries(ctx context.Context, dirPath util.FullPath, startFileName string, includeStartFile bool, limit int64, eachEntryFunc ListEachEntryFunc) (string, error) { diff --git a/weed/filer/hbase/hbase_store.go b/weed/filer/hbase/hbase_store.go index 43c14cc15..e0d878ca7 100644 --- a/weed/filer/hbase/hbase_store.go +++ b/weed/filer/hbase/hbase_store.go @@ -109,7 +109,7 @@ func (store *HbaseStore) DeleteEntry(ctx context.Context, path util.FullPath) (e return store.doDelete(ctx, store.cfMetaDir, []byte(path)) } -func (store *HbaseStore) DeleteFolderChildren(ctx context.Context, path util.FullPath, limit int64) (err error) { +func (store *HbaseStore) DeleteFolderChildren(ctx context.Context, path util.FullPath) (err error) { family := map[string][]string{store.cfMetaDir: {COLUMN_NAME}} expectedPrefix := []byte(path.Child("")) diff --git a/weed/filer/leveldb/leveldb_store.go b/weed/filer/leveldb/leveldb_store.go index 50367c87b..ce454f36a 100644 --- a/weed/filer/leveldb/leveldb_store.go +++ b/weed/filer/leveldb/leveldb_store.go @@ -136,7 +136,7 @@ func (store *LevelDBStore) DeleteEntry(ctx context.Context, fullpath weed_util.F return nil } -func (store *LevelDBStore) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath, limit int64) (err error) { +func (store *LevelDBStore) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath) (err error) { batch := new(leveldb.Batch) diff --git a/weed/filer/leveldb2/leveldb2_store.go b/weed/filer/leveldb2/leveldb2_store.go index 59e831598..124d61c1c 100644 --- a/weed/filer/leveldb2/leveldb2_store.go +++ b/weed/filer/leveldb2/leveldb2_store.go @@ -144,7 +144,7 @@ func (store *LevelDB2Store) DeleteEntry(ctx context.Context, fullpath weed_util. return nil } -func (store *LevelDB2Store) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath, limit int64) (err error) { +func (store *LevelDB2Store) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath) (err error) { directoryPrefix, partitionId := genDirectoryKeyPrefix(fullpath, "", store.dbCount) batch := new(leveldb.Batch) diff --git a/weed/filer/leveldb3/leveldb3_store.go b/weed/filer/leveldb3/leveldb3_store.go index 3db7722b7..d1cdfbbf6 100644 --- a/weed/filer/leveldb3/leveldb3_store.go +++ b/weed/filer/leveldb3/leveldb3_store.go @@ -245,7 +245,7 @@ func (store *LevelDB3Store) DeleteEntry(ctx context.Context, fullpath weed_util. return nil } -func (store *LevelDB3Store) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath, limit int64) (err error) { +func (store *LevelDB3Store) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath) (err error) { db, bucket, shortPath, err := store.findDB(fullpath, true) if err != nil { diff --git a/weed/filer/mongodb/mongodb_store.go b/weed/filer/mongodb/mongodb_store.go index 5861d86b0..1ef5056f4 100644 --- a/weed/filer/mongodb/mongodb_store.go +++ b/weed/filer/mongodb/mongodb_store.go @@ -167,7 +167,7 @@ func (store *MongodbStore) DeleteEntry(ctx context.Context, fullpath util.FullPa return nil } -func (store *MongodbStore) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath, limit int64) error { +func (store *MongodbStore) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath) error { where := bson.M{"directory": fullpath} _, err := store.connect.Database(store.database).Collection(store.collectionName).DeleteMany(ctx, where) diff --git a/weed/filer/redis/universal_redis_store.go b/weed/filer/redis/universal_redis_store.go index fb49740cd..30d11a7f4 100644 --- a/weed/filer/redis/universal_redis_store.go +++ b/weed/filer/redis/universal_redis_store.go @@ -107,7 +107,7 @@ func (store *UniversalRedisStore) DeleteEntry(ctx context.Context, fullpath util return nil } -func (store *UniversalRedisStore) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath, limit int64) (err error) { +func (store *UniversalRedisStore) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath) (err error) { members, err := store.Client.SMembers(ctx, genDirectoryListKey(string(fullpath))).Result() if err != nil { diff --git a/weed/filer/redis2/universal_redis_store.go b/weed/filer/redis2/universal_redis_store.go index 6bb56f5f8..aab3d1f4a 100644 --- a/weed/filer/redis2/universal_redis_store.go +++ b/weed/filer/redis2/universal_redis_store.go @@ -127,7 +127,7 @@ func (store *UniversalRedis2Store) DeleteEntry(ctx context.Context, fullpath uti return nil } -func (store *UniversalRedis2Store) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath, limit int64) (err error) { +func (store *UniversalRedis2Store) DeleteFolderChildren(ctx context.Context, fullpath util.FullPath) (err error) { if store.isSuperLargeDirectory(string(fullpath)) { return nil diff --git a/weed/filer/rocksdb/rocksdb_store.go b/weed/filer/rocksdb/rocksdb_store.go index face5963e..379a18c62 100644 --- a/weed/filer/rocksdb/rocksdb_store.go +++ b/weed/filer/rocksdb/rocksdb_store.go @@ -148,7 +148,7 @@ func (store *RocksDBStore) DeleteEntry(ctx context.Context, fullpath weed_util.F return nil } -func (store *RocksDBStore) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath, limit int64) (err error) { +func (store *RocksDBStore) DeleteFolderChildren(ctx context.Context, fullpath weed_util.FullPath) (err error) { directoryPrefix := genDirectoryKeyPrefix(fullpath, "") batch := gorocksdb.NewWriteBatch() From a70e772a03f2f6c743aa3cc3bca6a7edcd1c6aee Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 22 Jul 2021 09:49:40 -0700 Subject: [PATCH 116/265] update mongodb lib due to security warning --- go.mod | 2 +- go.sum | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 84c03ebdc..1e711c81d 100644 --- a/go.mod +++ b/go.mod @@ -76,7 +76,7 @@ require ( github.com/willf/bitset v1.1.10 // indirect github.com/willf/bloom v2.0.3+incompatible go.etcd.io/etcd v3.3.15+incompatible - go.mongodb.org/mongo-driver v1.3.2 + go.mongodb.org/mongo-driver v1.7.0 gocloud.dev v0.20.0 gocloud.dev/pubsub/natspubsub v0.20.0 gocloud.dev/pubsub/rabbitpubsub v0.20.0 diff --git a/go.sum b/go.sum index 1911be8dd..a991384fb 100644 --- a/go.sum +++ b/go.sum @@ -307,6 +307,7 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= @@ -551,6 +552,8 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.4.0 h1:u3Z1r+oOXJIkxqw34zVhyPgjBsm6X2wn21NWs/HfSeg= github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/pelletier/go-toml v1.7.0 h1:7utD74fnzVc/cpcyy8sjrlFr5vYpypUixARcHIMIGuI= +github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterh/liner v1.1.0 h1:f+aAedNJA6uk7+6rXsYBnhdo4Xux7ESLe+kcuVUF5os= github.com/peterh/liner v1.1.0/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= @@ -705,6 +708,12 @@ github.com/willf/bloom v2.0.3+incompatible h1:QDacWdqcAUI1MPOwIQZRy9kOR7yxfyEmxX github.com/willf/bloom v2.0.3+incompatible/go.mod h1:MmAltL9pDMNTrvUkxdg0k0q5I0suxmuwp3KbyrZLOZ8= github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0 h1:3UeQBvD0TFrlVjOeLOBz+CPAI8dnbqNSVwUwRrkp7vQ= github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0/go.mod h1:IXCdmsXIht47RaVFLEdVnh1t+pgYtTAhQGj73kz+2DM= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.0.2 h1:akYIkZ28e6A96dkWNJQu3nmCzH3YfwMPQExUYDaRv7w= +github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= +github.com/xdg-go/stringprep v1.0.2 h1:6iq84/ryjjeRmMJwxutI51F2GIPlP5BfTvXHeYjyhBc= +github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= @@ -713,6 +722,8 @@ github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -723,6 +734,8 @@ go.etcd.io/etcd v0.5.0-alpha.5.0.20200425165423-262c93980547 h1:s71VGheLtWmCYsnN go.etcd.io/etcd v0.5.0-alpha.5.0.20200425165423-262c93980547/go.mod h1:YoUyTScD3Vcv2RBm3eGVOq7i1ULiz3OuXoQFWOirmAM= go.mongodb.org/mongo-driver v1.3.2 h1:IYppNjEV/C+/3VPbhHVxQ4t04eVW0cLp0/pNdW++6Ug= go.mongodb.org/mongo-driver v1.3.2/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= +go.mongodb.org/mongo-driver v1.7.0 h1:hHrvOBWlWB2c7+8Gh/Xi5jj82AgidK/t7KVXBZ+IyUA= +go.mongodb.org/mongo-driver v1.7.0/go.mod h1:Q4oFMbo1+MSNqICAdYMlC/zSTrwCogR4R8NzkI+yfU8= go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -768,6 +781,7 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= @@ -923,6 +937,8 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From f3746d350fc7e8614ba60ada6002d11d6deb5328 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 22 Jul 2021 09:57:49 -0700 Subject: [PATCH 117/265] resolve gjson security alert resolve https://github.com/chrislusf/seaweedfs/security/dependabot/go.mod/github.com%2Ftidwall%2Fgjson/open --- go.mod | 4 ++-- go.sum | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 1e711c81d..f1d039301 100644 --- a/go.mod +++ b/go.mod @@ -66,8 +66,8 @@ require ( github.com/stretchr/testify v1.6.1 github.com/syndtr/goleveldb v1.0.0 github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c - github.com/tidwall/gjson v1.3.2 - github.com/tidwall/match v1.0.1 + github.com/tidwall/gjson v1.8.1 + github.com/tidwall/match v1.0.3 github.com/tsuna/gohbase v0.0.0-20201125011725-348991136365 github.com/valyala/bytebufferpool v1.0.0 github.com/viant/assertly v0.5.4 // indirect diff --git a/go.sum b/go.sum index a991384fb..782d87092 100644 --- a/go.sum +++ b/go.sum @@ -682,10 +682,16 @@ github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzH github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tidwall/gjson v1.3.2 h1:+7p3qQFaH3fOMXAJSrdZwGKcOO/lYdGS0HqGhPqDdTI= github.com/tidwall/gjson v1.3.2/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= +github.com/tidwall/gjson v1.8.1 h1:8j5EE9Hrh3l9Od1OIEDAb7IpezNA20UdRngNAj5N0WU= +github.com/tidwall/gjson v1.8.1/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc= github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= +github.com/tidwall/match v1.0.3 h1:FQUVvBImDutD8wJLN6c5eMzWtjgONK9MwIBCOrUJKeE= +github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.1.0 h1:K3hMW5epkdAVwibsQEfR/7Zj0Qgt4DxtNumTq/VloO8= +github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= From 60f5c0a2f57748727b236c09377d02a06b7b4aaa Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 22 Jul 2021 10:22:09 -0700 Subject: [PATCH 118/265] fix security alert on github.com/dgrijalva/jwt-go resolve https://github.com/chrislusf/seaweedfs/security/dependabot/go.mod/github.com%2Fdgrijalva%2Fjwt-go/open --- go.mod | 2 +- go.sum | 17 ++--------------- weed/security/jwt.go | 2 +- 3 files changed, 4 insertions(+), 17 deletions(-) diff --git a/go.mod b/go.mod index f1d039301..53188faf2 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,6 @@ require ( github.com/cespare/xxhash v1.1.0 github.com/chrislusf/raft v1.0.7 github.com/coreos/go-semver v0.3.0 // indirect - github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/disintegration/imaging v1.6.2 github.com/dustin/go-humanize v1.0.0 github.com/eapache/go-resiliency v1.2.0 // indirect @@ -30,6 +29,7 @@ require ( github.com/go-sql-driver/mysql v1.5.0 github.com/gocql/gocql v0.0.0-20190829130954-e163eff7a8c6 github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48 // indirect + github.com/golang-jwt/jwt v3.2.1+incompatible github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e github.com/golang/protobuf v1.4.3 github.com/google/btree v1.0.0 diff --git a/go.sum b/go.sum index 782d87092..c96845979 100644 --- a/go.sum +++ b/go.sum @@ -265,6 +265,8 @@ github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48 h1:X+zN6RZXsvnrSJaAIQhZezPfAfvsqihKKR8oiLHid34= github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -550,8 +552,6 @@ github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIw github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.4.0 h1:u3Z1r+oOXJIkxqw34zVhyPgjBsm6X2wn21NWs/HfSeg= -github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= github.com/pelletier/go-toml v1.7.0 h1:7utD74fnzVc/cpcyy8sjrlFr5vYpypUixARcHIMIGuI= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= @@ -618,8 +618,6 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seaweedfs/fuse v1.1.7 h1:T4L5c/Sn+q8lE+0zCmH2MWvIO+B5TttWOSqK5KQPRMQ= -github.com/seaweedfs/fuse v1.1.7/go.mod h1:+PP6WlkrRUG6KPE+Th2EX5To/PjHaFsvqg/UgQ39aj8= github.com/seaweedfs/fuse v1.1.8 h1:YFSDPotG4uhQzV7ooDUvQ8BRVy5rM1XCFPJAmAsZz68= github.com/seaweedfs/fuse v1.1.8/go.mod h1:+PP6WlkrRUG6KPE+Th2EX5To/PjHaFsvqg/UgQ39aj8= github.com/seaweedfs/goexif v1.0.2 h1:p+rTXYdQ2mgxd+1JaTrQ9N8DvYuw9UH9xgYmJ+Bb29E= @@ -680,15 +678,10 @@ github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFd github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= -github.com/tidwall/gjson v1.3.2 h1:+7p3qQFaH3fOMXAJSrdZwGKcOO/lYdGS0HqGhPqDdTI= -github.com/tidwall/gjson v1.3.2/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= github.com/tidwall/gjson v1.8.1 h1:8j5EE9Hrh3l9Od1OIEDAb7IpezNA20UdRngNAj5N0WU= github.com/tidwall/gjson v1.8.1/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= -github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc= -github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= github.com/tidwall/match v1.0.3 h1:FQUVvBImDutD8wJLN6c5eMzWtjgONK9MwIBCOrUJKeE= github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.1.0 h1:K3hMW5epkdAVwibsQEfR/7Zj0Qgt4DxtNumTq/VloO8= github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= @@ -720,10 +713,7 @@ github.com/xdg-go/scram v1.0.2 h1:akYIkZ28e6A96dkWNJQu3nmCzH3YfwMPQExUYDaRv7w= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= github.com/xdg-go/stringprep v1.0.2 h1:6iq84/ryjjeRmMJwxutI51F2GIPlP5BfTvXHeYjyhBc= github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= -github.com/xdg/stringprep v1.0.0 h1:d9X0esnoa3dFsV0FG35rAT0RIhYFlPq7MiP+DW89La0= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= @@ -738,8 +728,6 @@ go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.5.0-alpha.5.0.20200425165423-262c93980547 h1:s71VGheLtWmCYsnNjf+s7XE8HsrZnd3EYGrLGWVm7nY= go.etcd.io/etcd v0.5.0-alpha.5.0.20200425165423-262c93980547/go.mod h1:YoUyTScD3Vcv2RBm3eGVOq7i1ULiz3OuXoQFWOirmAM= -go.mongodb.org/mongo-driver v1.3.2 h1:IYppNjEV/C+/3VPbhHVxQ4t04eVW0cLp0/pNdW++6Ug= -go.mongodb.org/mongo-driver v1.3.2/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= go.mongodb.org/mongo-driver v1.7.0 h1:hHrvOBWlWB2c7+8Gh/Xi5jj82AgidK/t7KVXBZ+IyUA= go.mongodb.org/mongo-driver v1.7.0/go.mod h1:Q4oFMbo1+MSNqICAdYMlC/zSTrwCogR4R8NzkI+yfU8= go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= @@ -941,7 +929,6 @@ golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fq golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= diff --git a/weed/security/jwt.go b/weed/security/jwt.go index 0bd7fa974..7327f7b8b 100644 --- a/weed/security/jwt.go +++ b/weed/security/jwt.go @@ -7,7 +7,7 @@ import ( "time" "github.com/chrislusf/seaweedfs/weed/glog" - jwt "github.com/dgrijalva/jwt-go" + "github.com/golang-jwt/jwt" ) type EncodedJwt string From 2b46df13f862b99d671edbaec96d2cad26f8ed55 Mon Sep 17 00:00:00 2001 From: qieqieplus Date: Fri, 23 Jul 2021 14:05:59 -0600 Subject: [PATCH 119/265] add bloom filter for filer leveldb/rocksdb --- weed/filer/leveldb2/leveldb2_store.go | 11 +++++++---- weed/filer/leveldb3/leveldb3_store.go | 14 +++++++++----- weed/filer/rocksdb/rocksdb_store.go | 8 ++++++++ 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/weed/filer/leveldb2/leveldb2_store.go b/weed/filer/leveldb2/leveldb2_store.go index 59e831598..bf81bface 100644 --- a/weed/filer/leveldb2/leveldb2_store.go +++ b/weed/filer/leveldb2/leveldb2_store.go @@ -5,13 +5,15 @@ import ( "context" "crypto/md5" "fmt" - "github.com/syndtr/goleveldb/leveldb" - leveldb_errors "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/opt" - leveldb_util "github.com/syndtr/goleveldb/leveldb/util" "io" "os" + "github.com/syndtr/goleveldb/leveldb" + leveldb_errors "github.com/syndtr/goleveldb/leveldb/errors" + "github.com/syndtr/goleveldb/leveldb/filter" + "github.com/syndtr/goleveldb/leveldb/opt" + leveldb_util "github.com/syndtr/goleveldb/leveldb/util" + "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" @@ -47,6 +49,7 @@ func (store *LevelDB2Store) initialize(dir string, dbCount int) (err error) { BlockCacheCapacity: 32 * 1024 * 1024, // default value is 8MiB WriteBuffer: 16 * 1024 * 1024, // default value is 4MiB CompactionTableSizeMultiplier: 4, + Filter: filter.NewBloomFilter(8), // false positive rate 0.02 } for d := 0; d < dbCount; d++ { diff --git a/weed/filer/leveldb3/leveldb3_store.go b/weed/filer/leveldb3/leveldb3_store.go index 3db7722b7..70e5088a2 100644 --- a/weed/filer/leveldb3/leveldb3_store.go +++ b/weed/filer/leveldb3/leveldb3_store.go @@ -5,15 +5,17 @@ import ( "context" "crypto/md5" "fmt" - "github.com/syndtr/goleveldb/leveldb" - leveldb_errors "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/opt" - leveldb_util "github.com/syndtr/goleveldb/leveldb/util" "io" "os" "strings" "sync" + "github.com/syndtr/goleveldb/leveldb" + leveldb_errors "github.com/syndtr/goleveldb/leveldb/errors" + "github.com/syndtr/goleveldb/leveldb/filter" + "github.com/syndtr/goleveldb/leveldb/opt" + leveldb_util "github.com/syndtr/goleveldb/leveldb/util" + "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" @@ -62,17 +64,19 @@ func (store *LevelDB3Store) initialize(dir string) (err error) { } func (store *LevelDB3Store) loadDB(name string) (*leveldb.DB, error) { - + bloom := filter.NewBloomFilter(8) // false positive rate 0.02 opts := &opt.Options{ BlockCacheCapacity: 32 * 1024 * 1024, // default value is 8MiB WriteBuffer: 16 * 1024 * 1024, // default value is 4MiB CompactionTableSizeMultiplier: 4, + Filter: bloom, } if name != DEFAULT { opts = &opt.Options{ BlockCacheCapacity: 4 * 1024 * 1024, // default value is 8MiB WriteBuffer: 2 * 1024 * 1024, // default value is 4MiB CompactionTableSizeMultiplier: 4, + Filter: bloom, } } diff --git a/weed/filer/rocksdb/rocksdb_store.go b/weed/filer/rocksdb/rocksdb_store.go index face5963e..467b07aaa 100644 --- a/weed/filer/rocksdb/rocksdb_store.go +++ b/weed/filer/rocksdb/rocksdb_store.go @@ -24,18 +24,21 @@ func init() { type options struct { opt *gorocksdb.Options + bto *gorocksdb.BlockBasedTableOptions ro *gorocksdb.ReadOptions wo *gorocksdb.WriteOptions } func (opt *options) init() { opt.opt = gorocksdb.NewDefaultOptions() + opt.bto = gorocksdb.NewDefaultBlockBasedTableOptions() opt.ro = gorocksdb.NewDefaultReadOptions() opt.wo = gorocksdb.NewDefaultWriteOptions() } func (opt *options) close() { opt.opt.Destroy() + opt.bto.Destroy() opt.ro.Destroy() opt.wo.Destroy() } @@ -69,6 +72,11 @@ func (store *RocksDBStore) initialize(dir string) (err error) { store.opt.SetCompactionFilter(NewTTLFilter()) // store.opt.SetMaxBackgroundCompactions(2) + // https://github.com/tecbot/gorocksdb/issues/132 + store.bto.SetFilterPolicy(gorocksdb.NewBloomFilterFull(8)) + store.opt.SetBlockBasedTableFactory(store.bto) + // store.opt.EnableStatistics() + store.db, err = gorocksdb.OpenDb(store.opt, dir) return From 092932af8f9a72fd8eaecba278b8085fe34748c5 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 23 Jul 2021 11:25:43 -0700 Subject: [PATCH 120/265] shell: faster bucket delete avoid waiting for large object metadata --- weed/shell/command_s3_bucket_delete.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/weed/shell/command_s3_bucket_delete.go b/weed/shell/command_s3_bucket_delete.go index a8d8c5c29..26953c249 100644 --- a/weed/shell/command_s3_bucket_delete.go +++ b/weed/shell/command_s3_bucket_delete.go @@ -1,8 +1,10 @@ package shell import ( + "context" "flag" "fmt" + "github.com/chrislusf/seaweedfs/weed/pb/master_pb" "io" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" @@ -49,6 +51,17 @@ func (c *commandS3BucketDelete) Do(args []string, commandEnv *CommandEnv, writer return fmt.Errorf("read buckets: %v", err) } + // delete the collection directly first + err = commandEnv.MasterClient.WithClient(func(client master_pb.SeaweedClient) error { + _, err = client.CollectionDelete(context.Background(), &master_pb.CollectionDeleteRequest{ + Name: *bucketName, + }) + return err + }) + if err != nil { + return + } + return filer_pb.Remove(commandEnv, filerBucketsPath, *bucketName, false, true, true, false, nil) } From 10fc478557558084d27d7497064dd158c28c6913 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 23 Jul 2021 18:41:25 -0700 Subject: [PATCH 121/265] scaffold -config= should output to stdout fix https://github.com/chrislusf/seaweedfs/issues/2212 --- weed/command/scaffold.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/weed/command/scaffold.go b/weed/command/scaffold.go index b48cf0959..886c0ac5e 100644 --- a/weed/command/scaffold.go +++ b/weed/command/scaffold.go @@ -1,6 +1,7 @@ package command import ( + "fmt" "github.com/chrislusf/seaweedfs/weed/command/scaffold" "io/ioutil" "path/filepath" @@ -56,7 +57,7 @@ func runScaffold(cmd *Command, args []string) bool { if *outputPath != "" { ioutil.WriteFile(filepath.Join(*outputPath, *config+".toml"), []byte(content), 0644) } else { - println(content) + fmt.Println(content) } return true } From 4cc2165061bef27c403dc7f0a8f7148e63317588 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 23 Jul 2021 18:44:53 -0700 Subject: [PATCH 122/265] weed -h subcommand list is not sorted, makes discovery difficult fix https://github.com/chrislusf/seaweedfs/issues/2214 --- weed/command/command.go | 4 ++-- weed/command/filer_copy.go | 28 ++++++++++++++-------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/weed/command/command.go b/weed/command/command.go index 18e53ad8c..0bac56442 100644 --- a/weed/command/command.go +++ b/weed/command/command.go @@ -8,15 +8,15 @@ import ( ) var Commands = []*Command{ - cmdBenchmark, cmdBackup, + cmdBenchmark, cmdCompact, - cmdCopy, cmdDownload, cmdExport, cmdFiler, cmdFilerBackup, cmdFilerCat, + cmdFilerCopy, cmdFilerMetaBackup, cmdFilerMetaTail, cmdFilerReplicate, diff --git a/weed/command/filer_copy.go b/weed/command/filer_copy.go index 9d21c40ef..97f1517cd 100644 --- a/weed/command/filer_copy.go +++ b/weed/command/filer_copy.go @@ -52,21 +52,21 @@ type CopyOptions struct { } func init() { - cmdCopy.Run = runCopy // break init cycle - cmdCopy.IsDebug = cmdCopy.Flag.Bool("debug", false, "verbose debug information") - copy.include = cmdCopy.Flag.String("include", "", "pattens of files to copy, e.g., *.pdf, *.html, ab?d.txt, works together with -dir") - copy.replication = cmdCopy.Flag.String("replication", "", "replication type") - copy.collection = cmdCopy.Flag.String("collection", "", "optional collection name") - copy.ttl = cmdCopy.Flag.String("ttl", "", "time to live, e.g.: 1m, 1h, 1d, 1M, 1y") - copy.diskType = cmdCopy.Flag.String("disk", "", "[hdd|ssd|] hard drive or solid state drive or any tag") - copy.maxMB = cmdCopy.Flag.Int("maxMB", 4, "split files larger than the limit") - copy.concurrenctFiles = cmdCopy.Flag.Int("c", 8, "concurrent file copy goroutines") - copy.concurrenctChunks = cmdCopy.Flag.Int("concurrentChunks", 8, "concurrent chunk copy goroutines for each file") - copy.checkSize = cmdCopy.Flag.Bool("check.size", false, "copy when the target file size is different from the source file") - copy.verbose = cmdCopy.Flag.Bool("verbose", false, "print out details during copying") + cmdFilerCopy.Run = runCopy // break init cycle + cmdFilerCopy.IsDebug = cmdFilerCopy.Flag.Bool("debug", false, "verbose debug information") + copy.include = cmdFilerCopy.Flag.String("include", "", "pattens of files to copy, e.g., *.pdf, *.html, ab?d.txt, works together with -dir") + copy.replication = cmdFilerCopy.Flag.String("replication", "", "replication type") + copy.collection = cmdFilerCopy.Flag.String("collection", "", "optional collection name") + copy.ttl = cmdFilerCopy.Flag.String("ttl", "", "time to live, e.g.: 1m, 1h, 1d, 1M, 1y") + copy.diskType = cmdFilerCopy.Flag.String("disk", "", "[hdd|ssd|] hard drive or solid state drive or any tag") + copy.maxMB = cmdFilerCopy.Flag.Int("maxMB", 4, "split files larger than the limit") + copy.concurrenctFiles = cmdFilerCopy.Flag.Int("c", 8, "concurrent file copy goroutines") + copy.concurrenctChunks = cmdFilerCopy.Flag.Int("concurrentChunks", 8, "concurrent chunk copy goroutines for each file") + copy.checkSize = cmdFilerCopy.Flag.Bool("check.size", false, "copy when the target file size is different from the source file") + copy.verbose = cmdFilerCopy.Flag.Bool("verbose", false, "print out details during copying") } -var cmdCopy = &Command{ +var cmdFilerCopy = &Command{ UsageLine: "filer.copy file_or_dir1 [file_or_dir2 file_or_dir3] http://localhost:8888/path/to/a/folder/", Short: "copy one or a list of files to a filer folder", Long: `copy one or a list of files, or batch copy one whole folder recursively, to a filer folder @@ -154,7 +154,7 @@ func runCopy(cmd *Command, args []string) bool { } copy.ttlSec = int32(ttl.Minutes()) * 60 - if *cmdCopy.IsDebug { + if *cmdFilerCopy.IsDebug { grace.SetupProfiling("filer.copy.cpu.pprof", "filer.copy.mem.pprof") } From 5c14da0f1efbd835e076433c0b7f1a80aebf61c2 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 23 Jul 2021 20:01:43 -0700 Subject: [PATCH 123/265] filer.copy: fail early if assign request failed fix https://github.com/chrislusf/seaweedfs/issues/2216 --- weed/command/filer_copy.go | 3 +++ weed/operation/assign_file_id.go | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/weed/command/filer_copy.go b/weed/command/filer_copy.go index 97f1517cd..722f64679 100644 --- a/weed/command/filer_copy.go +++ b/weed/command/filer_copy.go @@ -381,6 +381,9 @@ func (worker *FileCopyWorker) uploadFileAsOne(task FileCopyTask, f *os.File) err if assignResult.Error != "" { return fmt.Errorf("assign volume failure %v: %v", request, assignResult.Error) } + if assignResult.Url == "" { + return fmt.Errorf("assign volume failure %v: %v", request, assignResult) + } return nil }) }) diff --git a/weed/operation/assign_file_id.go b/weed/operation/assign_file_id.go index ffd3e4938..fabc820ff 100644 --- a/weed/operation/assign_file_id.go +++ b/weed/operation/assign_file_id.go @@ -73,6 +73,10 @@ func Assign(masterFn GetMasterFn, grpcDialOption grpc.DialOption, primaryRequest ret.Error = resp.Error ret.Auth = security.EncodedJwt(resp.Auth) + if resp.Error != "" { + return fmt.Errorf("assignRequest: %v", resp.Error) + } + return nil }) From ac286118176f757e039df9e0349f132be0b126bf Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 23 Jul 2021 20:54:03 -0700 Subject: [PATCH 124/265] snowflake sequencer need an unique id fix https://github.com/chrislusf/seaweedfs/issues/2213 --- weed/command/scaffold/master.toml | 2 ++ weed/sequence/snowflake_sequencer.go | 5 ++++- weed/server/master_server.go | 4 +++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/weed/command/scaffold/master.toml b/weed/command/scaffold/master.toml index f550f0ad6..60a7dbcfc 100644 --- a/weed/command/scaffold/master.toml +++ b/weed/command/scaffold/master.toml @@ -26,6 +26,8 @@ type = "raft" # Choose [raft|etcd|snowflake] type for storing the file id se # when sequencer.type = etcd, set listen client urls of etcd cluster that store file id sequence # example : http://127.0.0.1:2379,http://127.0.0.1:2389 sequencer_etcd_urls = "http://127.0.0.1:2379" +# when sequencer.type = snowflake, the snowflake id must be different from other masters +sequencer_snowflake_id = 0 # any number between 1~1023 # configurations for tiered cloud storage diff --git a/weed/sequence/snowflake_sequencer.go b/weed/sequence/snowflake_sequencer.go index 300449fa0..381933b3a 100644 --- a/weed/sequence/snowflake_sequencer.go +++ b/weed/sequence/snowflake_sequencer.go @@ -13,8 +13,11 @@ type SnowflakeSequencer struct { node *snowflake.Node } -func NewSnowflakeSequencer(nodeid string) (*SnowflakeSequencer, error) { +func NewSnowflakeSequencer(nodeid string, snowflakeId int) (*SnowflakeSequencer, error) { nodeid_hash := hash(nodeid) & 0x3ff + if snowflakeId != 0 { + nodeid_hash = uint32(snowflakeId) + } glog.V(0).Infof("use snowflake seq id generator, nodeid:%s hex_of_nodeid: %x", nodeid, nodeid_hash) node, err := snowflake.NewNode(int64(nodeid_hash)) if err != nil { diff --git a/weed/server/master_server.go b/weed/server/master_server.go index 11dc95ded..9d222a342 100644 --- a/weed/server/master_server.go +++ b/weed/server/master_server.go @@ -28,6 +28,7 @@ import ( const ( SequencerType = "master.sequencer.type" SequencerEtcdUrls = "master.sequencer.sequencer_etcd_urls" + SequencerSnowflakeId = "master.sequencer.sequencer_snowflake_id" ) type MasterOption struct { @@ -293,7 +294,8 @@ func (ms *MasterServer) createSequencer(option *MasterOption) sequence.Sequencer } case "snowflake": var err error - seq, err = sequence.NewSnowflakeSequencer(fmt.Sprintf("%s:%d", option.Host, option.Port)) + snowflakeId := v.GetInt(SequencerSnowflakeId) + seq, err = sequence.NewSnowflakeSequencer(fmt.Sprintf("%s:%d", option.Host, option.Port), snowflakeId) if err != nil { glog.Error(err) seq = nil From 2595f269d16f09682ff6531a0e545283d0964468 Mon Sep 17 00:00:00 2001 From: "byunghwa.yun" Date: Sat, 24 Jul 2021 14:26:40 +0900 Subject: [PATCH 125/265] Add the webp image type --- weed/images/resizing.go | 5 +++++ weed/images/resizing_test.go | 23 +++++++++++++++++++++++ weed/images/sample2.webp | Bin 0 -> 212586 bytes 3 files changed, 28 insertions(+) create mode 100644 weed/images/resizing_test.go create mode 100644 weed/images/sample2.webp diff --git a/weed/images/resizing.go b/weed/images/resizing.go index b048daa1c..20b9a5030 100644 --- a/weed/images/resizing.go +++ b/weed/images/resizing.go @@ -11,6 +11,8 @@ import ( "github.com/disintegration/imaging" "github.com/chrislusf/seaweedfs/weed/glog" + + _ "golang.org/x/image/webp" ) func Resized(ext string, read io.ReadSeeker, width, height int, mode string) (resized io.ReadSeeker, w int, h int) { @@ -47,6 +49,9 @@ func Resized(ext string, read io.ReadSeeker, width, height int, mode string) (re jpeg.Encode(&buf, dstImage, nil) case ".gif": gif.Encode(&buf, dstImage, nil) + case ".webp": + // Webp does not have golang encoder. + png.Encode(&buf, dstImage) } return bytes.NewReader(buf.Bytes()), dstImage.Bounds().Dx(), dstImage.Bounds().Dy() } else { diff --git a/weed/images/resizing_test.go b/weed/images/resizing_test.go new file mode 100644 index 000000000..d12f799d8 --- /dev/null +++ b/weed/images/resizing_test.go @@ -0,0 +1,23 @@ +package images + +import ( + "bytes" + "io/ioutil" + "os" + "testing" +) + +func TestResizing(t *testing.T) { + fname := "sample2.webp" + + dat, _ := ioutil.ReadFile(fname) + + resized, _, _ := Resized(".webp", bytes.NewReader(dat), 100, 30, "") + buf := new(bytes.Buffer) + buf.ReadFrom(resized) + + ioutil.WriteFile("resized1.png", buf.Bytes(), 0644) + + os.Remove("resized1.png") + +} diff --git a/weed/images/sample2.webp b/weed/images/sample2.webp new file mode 100644 index 0000000000000000000000000000000000000000..1fdfc01fc9b8b0664aee468ef57bea99383cb531 GIT binary patch literal 212586 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
    6pY+J-5X-=_|S?!Cy!}< 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

    %1~(G!`V|RuZ4;vz|0~3~%{o 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⪚^mVZ5ZwZ!rMweQY^VQ$i!M@l;TxdjiEYu$Eu zEd%BNo5vDt2g$-e3=^N)5lLsd9iBm!x=)zL3F$)YJYEmS{aQA@%U(6F^O9cMFIiA} zBt9Ivfv81Mr={yx$Dg}}>epQsA11J)54B?E^XX?fj!~)-e5J-=bCl@-oRkGEHn6@g zl!$j11oy)?^XGwJlBNy7Zv%X%aH2ElUsEa3GCF-7>yc*y#~>q;jLoOzFh6c$!~3;Xcvpj9_VA|oz9MP|7_ z6XkH_U<7f6bG3-A&Jwx?a|W+_a%8x+CBx4Z0d7D&%6cvQ2VEl)MW(nzsSou5a^z%- zA&_eG3b{OtdL6QOCm^wd_o&1$Yac_$e zDtU8{1w>Xg_40ZGBNY`>O9(P@xM7Huvc5$0t&0SlSm`BM;l*DSaB6UA_?`_pSH@_0`eI$+WeiFKpFd zlNh^t{!1-WFr<-`t3FZmkxv4QFA0MomGpm%RfQsuQIhM~E?SrSlyk_N)tCR&RARm3 z%FGt$R^_uJ?VAVufLL*2`fw#&s-daw+z2-!Fa3FMW_bDM9#ndvO228?M}vxbOJGR* zvBoGY59nKbW5iy0=NL#8Xd!~HD8pXFs)Gp6F7Vq1iZY}3AmwnXir@|~n)Jx&fdR2I zzwE`DLNoWM?wOhPzq598ZL5n0+IcIt>QNIUN?C|1oguqRaw^X z3dm}V@q$ka$rhL6Pba_I9wgeo*7z6#!jM>%1bUMtEhdvBQDdo1F`Oc*lA_G{62h9s zJ$?u`&l9fgh>~N#hgY6&Nu^TZ&?Ic9t}tot;wwMV*uJk1R(G~THjCuBj{Bl_`;hDb zvy3i43lKb)=q_;?D|OVVLK;#d zm0mw>A=w;{l*dffwh+2NF~GOwQ$#8dvm}YG%QL^^Of|CT(wupkYTBIAhcRHk{u#4{ zKXk55p3X8h%4$U`6wPFdj^3hn9+J*nMzC7Q1&wr9X^ud^m%@GWD+}R`BB#KbWuH{b z=QjzF61RRb5TqB*mklaer#&YF`W$W~4*BZDw&TNO{dBG3-RwSQTxc4VFmyq`78DOT z_#_ywzIzw7lbfpAX;J#PgPgXD7u5ko09f4B6r_;;cv7-4$YDv;A*;)5P&LRbWS2SIG_X#CCPhU%d|Nb zn5@9+;LOjj281c%eTrDty-XZmx&hA>@U5C#;yZk;tuy<5iy|>VQpOw7TJq6>Orw6$ z@pTrEfzF^Ztz0LZ9-q*dP$d#yK`O&S5MkPaLa30Sm1M16a(rFUndH1Oh*EkSD^rjB zC~=A^TtiJ^o>3oOr5lS1gi6zN0i}FT4C~lj*b#_91X|Sp+K;i)<)5R6_>7NP-ZS*! z11RK4v3^*1&7MP{5CBKQ0D>5y5=|&l$>tFX!_x+8B$yqxM)GV{;d{8snd#36|3^ML zOJBf=k%;6$Bc=2kE5rHSVv@QlkZm-lRoI4hxDunDtX{^fC|R;N@?pmsZZkPGMf2b^ zfEKyF%NQhd|099DK9wa+rCNCQ8YJB|O&>%E2l=4JRhm*(PR*4-mbK-lnAGr{UYp0U zpyc~G!pWb8%t){t5RUY+$XrnM7#aM$#|y+8 z1AwAV7Ro4ArQn$+%2%qzvY6Te1X&V$r&^(3Fb3S+18n8hR|{mNWt#&GSA|uIoyPaO z^kJD?1-dH{NqB*YY!5yrwJFJ6I;^qfOpnMsXUG#>s7@-)dGT!n&k31RKSEVa*e03; zbPIp)I4f9*aX~3Ody!G!=0)l9m1I%k%{B#1)ET88NG6MX4>69fcaRHENlefB$|r2# zqe-+R{#dFwQ&lE|n-~V{@HP8622AX>BOn8~ep1}DghKXS>C_b=+~`?zZPhry+)Ht3 zGW8nbDBZ+wpRo88(+E;InaH`K-58&O8@@>xy$LwL_J7hhi(-&yXtG>H znbFt(Xv548(uAbNm(zsmYf zwQmC`{@ui<39V((!`I`zA)^D80l-?fcA~M}&d#x`TWdLuQj?486G+k|X}=)H_w-1& zDTQLthv3!+9?{fVV&p`0Z4Yf5Sv+{SSWb&dfmu`=WinJ)E|`d$Ae@}B*ULn;%}f{S z`xiw6(T(oAJ={FLP2oSVZu1wSAr6~=huz6rv1m_0Q z5!_3k#gT>qBvj^BDSK$12Gs<0Iv%rBt`fNb>SspPKL24V`C(fHclt>$-uG^gJs(4= zR2yG2ALOjW_gQFd`^Dhcd*m_!0xKdx+27-#RvlH<%Z$_GzHqf>4N1C$f|3iASJsDA zki&*+OT)ms{b^d;iIVfZF_p6o?2z(cfvG3sd!8|HHx3)1_$8AWbUt=y%A)cq$0rCA z6^MQ0{3w5&d_%oDkT*+|x92R{@^B7RQuavA05xejAaL8i$O*7QxVFqOa^DxvZJYR1 zE6Tgxc$&aVrG0%pNc$3UpWMk7F2!4%ZyU#Z3z*Q1a%u^1v^EOHXN47uiq0nn&?SF~ z$WtsF(VAD$d7c@G_-c=r3aHMWT&+stBld4`2l0AZthn0nr5R>299KkC;IjA$L?3h`I(wplAIbhYbeaUqpa=2lL!7`&Vtb94 zfmK89SBMr~*?i#FD4|j7T-kGtnT8=ANt<=t#+b!Og_{bV|w0R5WHlp zVVa&vRYbgzzSr*g7#DO{9ZrNeqkrs&LLtBLbGe33rU#M28tsnoi()Yc8{}*`9DpMf zkzF-SiYy$@iHP+WAgErzy7j%uBab|mJkFqT@5VWBjR5rqUl~X0*hQmFg>Xb6EBaRt zdzFv`UD#k|g4#(T(qJL0rkQttfzlVXSxxBcng4IAhMc`4ZxOmD}`mJK)Dep#&=kPfO6Ch12I#gWh68@??@#VMHP@ z0-D$f(*>@Ww~K->=t_jE55rOC)pRY2o-0o!Q)I~pyor;0HE<)yw?tznga~j7k~n17 z%N@)3cxBtQ^gTlL5DOlbRxDF}lAkwzV~v3(mY8Q>ZX@!{u#E`<_$sOzf0?{NE1E%` zNHy97vs$WVk9%0gCsNS4KGaVKUWR98uZ?*+!A=Y<`fSRmh93gwwp$Wf4&Delu?PwN zTLy62fVCX6C1lxyQ|QYCryt=eq*f{UdKRR}-sHgtY*_KceRmk(ROdaJY)90VfIL9y zRIxLt0-SobP4$|G4w-#klP;(&djuVpjL6+CP#UBK>InV`TP&nQ?{>an7-BYJvmrO? zB%^6LW)L+1nOE{QA%7PYMpWZfYwt)J(9n~rC^>qqwERF-7#UC6-y!r@CiMAT<9e8zR4 z%DoWZ_Tmc~%|vq)XiteaxB~h#dbV*$c5lOyA^~oOOQ%u-C4bwY3$hm%;eRu8V1hrk z9>k*3zx}l5q5=8-63XLM;Wa``c&R5Xjbd~#PRU&;10Y(+_*A#HmiBAI1c+@2Hw6(P z3egUir4LiQTajl%A=di1oohMW9B9Qcqc^w)3Yo!FFLkHserd0nM8)LwD2fK+qTN8=4Y|-(&!enz{f#quJbAtig&}^|Xe5 z?TCAqDB2+5lztSR`syEpYS>9m=0r=sr6G$({NiSXpV&N1z>1}rlxFDbpOF+~QJ?lz zl#&!UwRx7*&FpPC1rT}d;&jdEZ)X2m;CcM~r$Jp4gtJ;lRZE-r*~mPQKcFjtiym~L zHWcdjN79PT?zGjU#7t@F3^l&R&wL(KF7AI#wj&nZkn7Q|444I1p~wIML|7>UeMU+aHr*_ zRA2$|Go9lgVV7+0-Rdse0M(>fvmcxo;&kJfH>qhlisYRzu)(PVG9H>*!$|o^^-a$~ zsUwd-D$_|3K|@N663^bf6FP&WyTBII+rG!-8FlcVTj z$3+5JcMWsQWBOJOI`IRxzV#>UrU)OKpF44c0vNC;j=JvAz{&K?SF@^^vw>4fQS*GG zyzN|fWE|gSPdhqPpeDC93Iu5pz=eY&84@kV>QVV5RaR~*@J zh@pLoyz0S?3F_=fyx^65-G%WswNXIMS0sj0!0h^XPUTG=C*GM^L`Wl}X`q}jlxq~t zG_I8CX$GcE(+E8Mc>042ZuA+*n7f!3e-8SyDLXRxmB)Zj^2|0-WAx0#zQFyMp7?2$ zCLsQXU&hf?q$_}0G;5XUB9dv&H?s)qx}ELn{peD)00=MX`rpKRaAu!t&_0f-7s9Sp zFYY80@$}2L=nnm_b~1x(rCyo9Kda3^@D>K9E_KT9b@YWW_+op=T%$gM8E-)UdB9_@ z2raGnxm^NK)3sP@(eH0w0OfMM-g-0?t&2~j8BD(9VCg%yB3zoQeY{g^+*2H$Jn4uU zNUMbHT^n^;=})5?<^np;Y0sN)uYe8fPrh5LC#J0Pqnr{x9n=Un#G$vCBW?GR?MP!(Lt1o^C zGH$0{_F(h~6vd=~i>;Gsfz)bcuSJUclPG17e;QO(j)mp|E6OTX(1W)kN+nSwW-Z z9;v3D!x8a${|k0nXgHHP-TbN77Q&5B^B&k+)VcJux;REKNs+Dv{?(1_=4pr131OWO zIjX`C{m6P*iE0>Rl_%pMCT$}hgyW;A;D&Kh?23-MBkVK()O0j1EFX5e^`D@gtG>BU zz(~@cKaVR)lwkvVl9W-V@&Lw!*4@>|s*K~V;^3c?&|nH8u`UeOo^Q)kx_66+vSOit zV+pVvJhr^DH;LJotjli8S@PBXlwU6pnBS<#GxE%mWX{Q5$|@)$`Fbonue!$hS@S9 zWLQeqYZr^Kb=}}ON(3YNyHcd_ku4B%A%{=`Vu}%ja+a)ie7F^J^?GwuCaJ{1n=2}) zJu974GD>sHWlypOv+q|Jm3)cb&VmidlVX9Pl8VsST69U51R(iinT*T=VE&b;q}TUQ zrnGw4fy4X~(_}(AmeG```P*w)V1y&iao4*#LSSb@@Z>E<;mE2}a|y;kq_$8I80L<* ze()n59&BJN=_g#eEE2uuLri0F8=mrl7jjSo9&^HUK|B&zf4)Y5Nchm5y}bQBIu{tB%zuWu_$C zAi?D2fmJ7tD8FH~^S8D8s&%)oSNWp*M#6Wy!#o1v*m$RT$=wGX)CxFrMAYK-Lj7}s zLR4@g5z}Yx?J=#nT7>AK2UGCCAMcaxvIwi1yc0YPbV9dIx`BMm!^go_H*fJ4IMJol z)+=_I?+hM@a*bS>>Wzqz8evkvy`UUxZkU+Ab zagea!Fz)I=eYj`f&(OZiBg7y5p*5J`Acb-A)CN#nqU|f)1orB!2vUz{&z&^uxV*^dA zhbyU~Q&;|Kh)|6|En`kxt(%>kr`_h2sS3i(^K7siuoA0t*_78$FSZ?bon0qn4(%p& zZMGvb&MeS2CsV@s{rz_G(_4I2U~vvK)oID7Fz)VCORSy0UyP= zIwf3(1PQ+_B#qDTavKj&74yJ@3X4iuE62baUdI+Ukt;LhD1k{$j9ZLY^#3~Heb4-V zEx<`p(<^jJ9_#>IkW3S@w@Ro?{&F-%sS9YUUNMLO87>GM=BM1m zCGWlTX(1aTeTSPV6EQj&;aw-OBu4u}nU@$yEIb5+K?1wXr7RMC1s1Y_6;LW#oF|U% z%_P*t_%EqN#n28v#MSOMbq?C;dZNO11Y0?7%ZC~^0=Rb|aN?&@FI#w0*2G7w{G)zf z;D7mH?PJ@JfO)My26Zn-N~TVj+j!>m?l#DF`?xo_f8X`X70$DC&64a3tw%8B#A-v2pi&@?{Cqm(+ z6dJpbFPMQ$b`bl#re@iDaOyCqS~0km&oUDM9{eU1jceQ)Gx!G#(j-Ed-h$Ywndy&> zWKsq3ocu|t&&Gl)WOm_I%FhZTZDWC3rRU8(DdF36_eD!0sV>zpQu#9JSkFyos-JCN z;fa|^kepl*SFo}qANlQnv)k<0Es9q(_255UKDwhs=`s}IPF@e+_hjIU{RkO|td?b6 z<%zEd1EY0M<^f923|+QG4f*r9fT>KNGhb)iVgFH@`|UWffw(oU;1rVFQk%85(285YgQu%qRT}-mH*1W{%!C=bH4;&=sc4 zQ08qbV}n~3JdWY0TEI5Ksd-6<9J+QCO?b`owXhI@Le(={HB|w4GrsSwMH>tY( zuJT(Re#Jt?Nv-_XfUC-4;P(v=0~q*)tcSE*gw}yQVjhpd#7K0}-lfBOg_R6izra8=M8Yi}i&?)&rRu^poeof7K>#5j*D zpxle&dP|IzacO7?l2G0-Jd-u2?*uIrsUT{X5!l`c? z2Zt2tJLs`%y|>e?dqCG% zz$I+0zPFMh61Gcz?}hkI&Bd3F~D$^ z_0-K^IIbj|5Q0E-Q*AxjUrh_W2Gr0V|6Bu^+WX8KB_Fd=Jr&HhJ&B#D;%~{AmB%-m zEP2c+_u56J>hHh4C#1IiS@`cO~R_;C^xkZ>kw~Oea;<$mGg+yWixlF_E+5 zA*o;6uFQ89Do-GCcd!^eo)`j^a#rlTS}IYAiLa-J7 zyu$|Ig3bG>23OKcPRNegfGqY4G&64YS4sdh)@$_`9#e&;I38lTyM95@)dQ_`V73^C zzPM`#pLXMy{WIhYLpXO2Zb#TAEg;@VUFoD=C}@1xS$vnAIVFP8-lz}F$S>~qm2qg= zB=e4IhQDBeHfREi`_q(rX-|yt1jd^|j>|1;blj;WrBpl!LB~&ow$ZPg5 zy@Qb}+dj7nfz03N4rkWs>Q|1{cf_%6pF7>*1Rz0BPxv9Ok6!>72CF>7bW?I#C!9uK zV=JK9F(>|QCF3V!b;&I~#L>2ET+Nv^tv6KjiTq#0k#HZU#eJhhJ)k&d5cvUil4@Bl zmjIE^$p-sZy@WSwHbGQAMO9B2L|7@h*;nMxG7!!nPB?7|V83AgV*iJg=+YPW^Rtr- zu}YS#jG*hK%(3}|`;`wob488teGrflRd=HM;d6cG-iCF6G_E`-X5^iIWVBz&@eoWc zQfmz8N{fl>WAc(aK=2|oRJYi_TsbY#8hhQkJ|eVvML5{Y0%|CX(4?k9E!?gJ>|Ge^ zhTM1EL1I~8rp+!BvR;_nCdiv{59}cP8m-OS!Hj;%IkCw$oPQ~}eRIc9`kH_DyBwR+ z09p;;k4L+n5x%d?2$yF8!7(vJp(rWQCiP{?j-!0ejEolaS^%6XtCh_&aJOg*GBEz| z;He<>VZ-nKOUd(QLB25Gj6Cok{zs=pafH+wlh%zel-juQRo@?U7S*R75Xetsb4rey z4A_!6kRN3-J}W_%z09|rF6FTot+hp~?Abak{>0Kg&WiP$5GTBIbjLdJF(YWxa@ZX~ zA%r|AD0@)JXEZGJA<6j}Wn6E5xt2J{6Zm`teO_j_;Aj~fyoScElC80hFA=^0-uP0y z-S4^%%R-r{cJyS&eHsf;BNaDOj7t8%cUyJe;kz0w{D_}@ysx#X5O z+-kLe7*!eU7J_ey2%!TRup?APH6i$ACu;>s6kS(ha`ZX@^_=U<(W?KGxcuC|Q zV|Ual!qXmu7)t?Zo~Iz%s^|~|b1f+|4(oPww~QBd2B&vXbPym$iB*bGeCbI2BVQXO z;?!EezM%~T5_8ePIF|88_1k07lnX41F^sU?8>Y9#P9$?MUpk@h#EeJ%^{L50u4zd$oVO z6ic2wN&4j~D6uEB6e2S0_~J|wGfCZ|RiY6qY*{dp{f_nx9l~@)bQRdGw&BNDZ?9;+ zh|d)*-ocZCvAeUpF&cIk5Dv&BR{j_2JJ(mMO1Hh@auW|IZaIKs#de7t>(h7SL%Z@y z7s#mu^DB7~+YGwL7nsoBw>+2pCFQ~QgWV{w*jJeTW1pv_M~7OtM1t#4FAAhOJrJ~d za9NlLG>Qu~&mMuVRHAC@>F0OvpBTLnGFH}d}SvaZWteWB62oWO+#(P2BHDT3(r3949iCZr$(>=Ixa}1TD<^Y9pIGEzVgEL1neqx z2yl><6vQTRIxSR&Rh>6W?$b~+Y`u8oiB6uJcK=+$3nH{PlgUY1=@%G`#C|td;qy0f zbl~B_<|U{evsdIBxR+={~rT)$t% z=ZV*{UUjnR1nGE~BA1=rHb3oj8ybp2$2&^oGNIfDQrd5s;`kvdgdX$M?7P9fwJIV= zuP<^0V%+V0U|ZO=w5ajiJ9@r2SQyLm&WKkhK;wH1|6K3S^(Q7bfLC#?ID z6ACnZ`SZMFr0yq?(Crh-#fow`l3vueE=yi-4TErBnk>{z`NTlyt}RKpB;nGQOtmm2 zMPVwtA8mD+hDlUPVuXr=EZ{KLd9|gGw{JoM>c?o@4a0c>H%mCZ8O=v3<*AlKkh~Ip zMv&p7d#~eJe56Mn2F=WC$jAsLp0QK4*U1bOlw8219a6Nl6haNa3S1nK4J{fe1=G5^ z0*S*m32(i{4TZhOXgd}!FnMrJ8nfQllB`{-M)kCG4{J8Xu)QU8Mzd;kl6+(8P4N`4 zy6cd`L3`HPZClFH|CGAe_Bwi7qtN6?&l#ar*%(#VpVh0KdS7PF3&nr+`F8+R1nMzZ z_+v72s@){mj0+4b-k@i}TBWKmV3RUM-~Ww6N3V^R@0}-Ew32dA&J>*41>1IeVj@%h zbsV?LK?A`MqyJnHe#yD#=WCWv2pTDHw7e_5xnXGr5eeDv+uZs`+K^j%X14b@BH%%v7bSa1_ zC)C1wV`WnSNz3r2odoL$5k!F;i}c{`>29F^DV=uyw>X3%y_n-Wi_BP)hm7s8L?QU`|S+LlVakSsI*2fJB}!X zsZcIJ7Wt3a5l@1W1yBQobs0e}ZnItrv)JNGstc$un%m&$%g#sG>Uhu>vdXeMLdE82 zaFrR0*8Soto(K|5<7*UMy`o1aR5MJoF!_M5l-os(*uxSo3Tsg4OhY~6dJhlPl-3B= zWO6KC;5DV@zgB{yfe-{{}*^O(#TL5hJ07$M6*6z5Elrl8> zAD4-I?BFA2nMUkYyfGHl=a>1t;2N=F=u|GG>5~7DYOn5u;D=rS`g-8|1PeXO&Q;fz zwN`KOxPuZS&9>NcmmW<*qT7~x83>AG==ENX_ zWUV6C1>WzeqVX&D4}50#2hyV4@70JC^av!YR{3_GL8QMF69$YsAyDSMGv4o=&m#Yj zL-Z}Q-fqeVhY-eqUpu>5xAO|pYBNnXq)>lI3aO4o-H)#!=CzlA^zH7KN|Ww-_hyzz zT)Zdn9V_KwiJ`=1VlE; z0T4FhQjIX_SV93>!VAB%FiGOAz( z^ny`ARwm_jF-b)E*9N?*C7}e`=7@y@MtOn)L&6U}z z0b#woi6k405??8gX>{@*L9qoe2;MG2E4NOaUeGbXq@T)2(xfC1^@>m{zO_i*5*5XBQINHJrK4K(_?K{ovc67AGD;fyV322gb*kf$ z>)3l?i9J+;p-4Y8k|m6h(RXC7Nd^g5oTd0C1dVxHncOEC^b|t|)^tt#AmSn=$<+%! z`^rd#>wqUFP>|DMju|Q}t6I02P(;+A@x2z zvjdrBqX>{#Go~9^^L zE>{p3IjpNR>ftirgRkd1dJ%BVfgOMJ!fL+13Z}$zY~-%I)fzoCJ8i%hgZk^J1nPpe zDB&m(6+27bj!JWjkhY{;iR|j}lbhCW3fori$UmCU)b#s7t2oKrHLTe-rol4Msv$R3 zzEqxqX~U0)TqyY;uIdS#KS%QF*c}UNo;Y3KHy~rF(fPM670JEluIC&JDzq7Bs^4(* zC#C<_Mqxa_PAha^b=R5tQI_?7DFwPAEXsb@o0MatI;xpTnAS zH%C6$Sh4sV)+^AA|IaMf#VR#-f8Xr4<=Tn<&DH`;b%9>j=Pr<+j`=?6pJ_zhht?KQWy z=FWM|#5nOCwa(q8;$*6Gdf3gJS1zNE3V}Kd3nIB%6r(SUZ$bO8Q`hd zM~GnxayMReP_-xl*=|7&tq;<2?V!~P4$S;Xi}T{mw22>jHMn;1q3)Q}tg=z$V&cUJ zZeJ`74RXL6>~gKCS8@E4>MC2s^;Jq}SyRy%j7evl=3vu>?LF3h|?7CW@b{F9)=&a2qd(lB^2Y=CQMiCa1%ygl}Fi#8pWro4{|E$5tI_-v!AX*TEOTlBT@|6q8?yXTk}rN@-aD^LuT2gK4H3!4bJ8Pp8q({}1= z^#lZ!s_f(g`&pj7<6|nxZ*sJU#nEM~$TirP+S9!IxFDxU9r;Ir36ZP|1f=?!4 zFAIRw(zB$RX#j*AWq?I-*ISN}DYPnxU}5q9x#hKmaL72D@7E4edh+wqYUi7dH18IM z5Br8QK8FJmm$Ia+Q?dCeN=ecyt;xiu=KXkK(*-qIp1MnN@WFw~$_`4J*>P0u!m)vD zn)i6t*?md|M(MO;-W<|Aklj5BwGd7h99o+r@$L%M*NHyv;55#VUFjpRB?`>UOhv5;BPYoBwug-?9Hpd(~+ z&l%u`U877mK8@Ygm4ecQ*rvN8#;2$t5!tJ|AHa_qkZmmJ##0X)+U)(0i1-dfqu;dQ zfJxBK)8jqt#yGnic#&`D#xD-M{$FIm(RUQ~JGiGZp}_akL`B}^vMo}a705m|54fry zQzTq}U(XHI=zwTMb!;o{%*0FIxeaJ&C8lu0elya;9#+hX?C??m_7k?=sxu?AT)Xj4 z!Xi|8x!?49)C8UREyZY@|9(^bnt!hZue(bRe7o)~fQJ1U9DSPS{%bVgCX7zUS~yPA4p*UV7mT7Trh;kGjf!fa^Ajm!~9m`hP{*= z6+!TMN;r2I>eWh9-RAVSvEEY=%z&w0JFe)mif|igpvl{^@w&!*w@^%(YgjO+|BlZH z-rE8!I3UPi%7^cNhgLRaYtZ>QcK8%vlf>j8Ieg5OWx z_zuva#*2~U7Cg;OYd1O&tM(ULa!OtS9|y!rihe;0JQGRnnQtq$mle8~!g1`2N(qpY z%FL+bh1l)R`y40%U;P}Ut_s*O#1;eFavwuyk6dIr^5?ys9_eNSn0er=dLjJoc*(uy zyFQ#OsFkUlh#L{AE6e0bfo`kA<1q&$bd`1GhUD8r_yd z!bL^{hTBJYn>(K?7k=4*{<2;nZfwVMW9mNUclS!*9CL)nltymp(Kf=1f@_CjEBbbi z!mv^!9B?RGM!fXh@M1dHpGL(V5qahv>fb3-N0w;T?j-qg*n{QE-2!}vO~s*|<}g#% zcW>E7l()sgQC^n7EZ*omXx)luEX|n0_y-RE`h?i|>MWP?AQBzjnioy#qlLk}TNY)p z4?3T6XfuYa_4W*D3jJa3yRkjcR)2mydg$mcoXv9Go06V}EGA~03~O*BpfaAwo~boa zU5(b5EtZD5)a}9N6pnw~B!@zU7s`AFMS_pwk67OcdFDr%7f8@n>*SJ~+>`vI;DAm+ z&wO2ITogjD1myZ$vq_6W49B9*g@%CI#JS7-mtCv3o6*tdXga}an$R0 zN38EFl^#=uYZ=-L-=#0Pe_;Wpv>O=|P3aTFANjEci;B~qDWTIWmWv8{+8G7Lwh zk6pXcM+znF+s{K7sSk28mG~La=@?10zUNmmPQtc2*jzp8K!_8i(L7HS+Kz5Y5sd2l zcK3=Hl1n6V1tNR431n%Uv{QhruyxgWGpHr zE<#kwx3bHH*(JszrExkIOMAE8yh zFhx7e!zdX%b;;wIFY>GQ)OC6gsj`BXZV*YF&4Mr>8AhMaGr6IBFQLp1TP39hElY2|PSN1$e!^w8j!Ddf2sL)yPF#1adu<9cYtV_ab<(AHq>qw_7jjd635O>r z4NInS{6+VYtw>(0HHrK~!9tgeuks^#PSr^+EF73U)KhBwE$E8jD7#}LErKX?ui=!c zUChEjponL)pac$G_9>`eGAC?TE2NB$RPO4`SU+#r_IVHjGBf8GqD_aIcbOZ(4(?k` ziz>2*5B2wOVCmt)&>$0sXwhLL}ctNZH8!p z;Cmv9j;QYR)uuT)uwffiLw*I4+i}Bs#*?#pP{37JXwasYWldH^&FogFg{0$h$b|7P zHqf;=8Ydz>+y}i=Vf34YQ)>(4tY{sM|FA#VOU4c4hd6^Of7TYAfNhyqOH&XscD=n! zesoliKvYX3y3A5~-4de`T%lR0M-6 ze(Y~mNThz=Ybmy?7;&1khcxpw)0paH1X@O`o?3k`Wdr+~evLdZ7i;}pxt%?;LjP1S z#s8=no=k|sHKO$|JQB`f@Z*2r6GaQC@-|pf6(C!Yiu^;TA?kNitZQdX7Y@<-CmrR} zr4qsAfrC^2yed<9Cyz~gcuy`Fbl8me`c`L1I~=#z_gzCr%zE$_7|l4%?ZLh9Hpft5 z!QZbc+IIiaEJmEyD86MQuCzcY`ru1qQ9>ntMuADlNCY(xTwt;vp=!a?dxq-=YdDrt z>y88_JycGy47t-e+78BFhmb%M>DaeyulCMRUJMwtXni3XU7CmF_9VK459|?bkiAig zgT@Df{Rg*NG-1OgvzhFDWig4hC}*;C+@8^GE0$3^k@nA9eTT&)p)%4D3!fpD93FAO`c0maxsK8aVt_;-^>8u@oS1Hx($yxHyf?Wp@qcDzMK_RbVMS{ow=Y4I+s~ayL+BXC> z551LI2fsfVSF;)W)9S1NvB(bODv9m8?9Y?J4~x%=eZi0GPvLJwlLx%ax~Hb9l;F;0 zMvo^53LtOzl|oa{x&|#L=EUdkaaKhrw?E?>?fY#&-{iTPV3njA$5B}6HE7X-C25Q1 z&)|3>1#N@ZD=Bvuqe5PYI9Nx@&v%(`Y|nK;k%a#RX1ER zENjAjbw01t;@~fw{1fv7#wctM#8b0?7=`92s96nrXH#9?HR-uxN7Q(?Gj5c@nt12+ zmm|oU`<+blZzV*tq4eNX4f*fv9r6B}m9aP`9Q!|MR}dsa&8v&3g{;q9`R(Crm_6@fXm=Wl4(c|lf+x|LOsXwxt%8FL0 z230&02qE6Aj>j_EU{dD^%B7<*h{pglF9bUFPfrROKzaGR?Kdy(DuR9daVHzxvhu>I zKu+ee=wet6W6@DoRe^-}jy$2>U>yLpIIf9F*;z?sWF#E;GSaL{0Z}LEEak$7U0Pr& zmxcrJyE6%67#EPh^f`@TG#I7^(Yp~^{T69ktAQll!9{WdSgiT=AI1kGU))L!jDwn@ zOLN(JDq#O$GgQ$!^?EaF(8SV7@&z1I988Z4WN^sR-zflzGctU;6BqUMFMfi-@HIL_ zpi90#bCxJ9hK-Nlx=xi=XD3bmQ>3ijVl^LTx#HCGNb*#yvC=csp->yxIdQ-$ube49 zZt;TEMc0t{QSs1Hx-GazhL*8lZTTo-JHsiY-f8<&?~Q9HlS4D+Jyic!B>}N#g*aH= z34)*+2*6p>43L`9V0%F?>%tNeQ2M2`^r};<55? zskl89_q$W|^9~PkQGGiKS|dgmki?&doBWZcU@?q6q>fzebMUPpP7|6s)*h` z-&o=V+g5DTanRGk5wRIU{KxtCT74m3UTKnKg*5jD?}SC2hfEd|i8MWAAx9x;^aw>n zRyJoWOecT$jH6NdfpCNb;5V}QFgWlo^Zh79NL^zGm>WF9zHGQYY-Mkyt}W!2L4|o! zyA3l*Q~m4zFW#yQLC}+v@VSRBuK%V%c?uWT=U0;QOTmFKfFAYIBJ2B6kL2m&i6Y22 z9Js6dw+bC+zu%*sPn^flB{Ty4Sg>o2jq^?;0TvRdRa)8bA_ULfDKdO= zF(eU!?3vkX7y^roEB!h*X5s^KBvA>`77upPBvFo+bmF@hS43z#kWbA%s_2tpWlgm! zPj1A61@&+JLF~z?Uyd2_!!Y1;=rc*l?Y4w+`Bc}+Op70s0052)+Vz-OK?MI;g4NGt ze!JV0T&;7Y>*biWcnBW_NAD+6q*FuWa6diGYy{HsQ;shQO!(r{&vKij_+nGcMrsV@_in;OoEVKN&G z7j*O2OaScb$xGa$QREz&nEbUSj_!a`mbSfXaNvqYly_vM7X>`@s66p0tJ-)c_Wx@4 z5(DgjrRYwnkaMvIt-6DeSr{KDb;hcHcnZ%q!#SS$DaP9iJkdQ;QV^wAI}rhOoh+rh z@g*pGu|48A?&&&d>#K?kwJ;8E)w`%oIs-P-f_edX#}T0n7B{L1w=l9oGIkZfN-!XaD6eD*V(_V8jJoV~8 z=iAR<#Ch+-4+^uyFpPY##Eg2uE^-PTk>@Jg3JcC5(#Y^6-K*oV5( z&GV=g-xCZF6DscJv{$P#6)WgLPNw#P8)#Q2Ad=vE`j^v8WtalH7KBJZkixXGyiq0} zPZSWCS4gXj7h)-OC{eLRdtKl34GxDI%>Ni!fIzLI2F6O4I17^ zFDp{ZL)XMEB5%N1^l96A87w7$(I-eL{ql>&O&Iw*c@*<7qtVtxM%XOww~fbHstq-E z0uFw!Ssq#3C#qod7lp4W0F4R9tAvhQIznTaPEk!e_Ao{$qcYc@Ni5Ob*}k1bQay^2 z_4s>Y*Hq2Y3w~UWcK2qxt1{%ieb-p1_#F^@z#7|!lNf8EDRfrEqJ65|qmxt? z&>kI3e-PT)PNL^bdbcyF_z#&%mBDM(i0-M=qC!RsjYY1H#?JYrXdKXjV`?U%IeLRW znMOgrh5o)!-D6Q%CJn(ZIBp^0r0G9~H_Ik+DI36k*;u&dF0++dny7U{0XSxc%;RHx zZjZ}d|eZkbhOz52L+GhKVx-+D-jRXUa>ydv_qGra1+CWp-X( zvG>3x8UZwZ@S{TvlJ$pBTdfcu=>)bbmvfhrUlsPZE~Ka-4|J!OMMC1zqOg;Y(p7Iu z&-NVaLWfx9r*ZCGp5xXi?gXi4%Xp>dYl zleFN&ML$9)xS*POVkput2$|)8>cuH*ixLoy@xaT%roydl{)#~~&tp&>rcd0-o^Kze z1^>o6%TddRW9ey^g%m*->W^0E;@)QztPRkRcj%+{%D zy2t>E^{A_lu|i&xqHjjuJRIxsH?>aY`S+2#n>BKj!kC&nbBfyR21OCNnxvCcynD1b zl@tRXY1;H}syDC&MB!|^Fz?hj2j(cOC8)oJ5ICy#Lyh#f;nB?=y*jDr>~22|Ez>%Q-BG%iuy-c*=cMcf17yK zh;6A0isaF->(n}9|NA%S=HzbENKyp)Oc35+0KQA@rNfQzO8F+cr1gve)Td_4V=67l zTg+Q~>%pMYKWoa872CZ%^RBY!r3)g`C$J4)9qBO8z`=T+V<+V@WkGjGfElYbJGnAJ{wVta9{E46T>Yd3Zk7sG0cqmF1ip(t2k?W#22pIQ6@pfD@3%&HC01 zbX}w5=bV%_y^b#@9@h4yF8UawATB9m()4n@!Z|er*81Z$_``D$1|4)fV>G?OB_7DkUCG z*Efh3DhFrs^9bONW{-!LB2{wu|{kiaFpR3 z+G7YK+Hf+)a=&XI21*^6r_JM+_;*YcKP4oqaDRi1G{sOrEWDDn<(#5JejfhwexujV z`ld*~_^8zbH%tswbS_H$*VAH!LrOmB_V9`teH_6i2WHD2S9Z|3=XS4V&C!yIxGWYy zGAc$Ko}9KC5E(F`Iy9#u8UqmKIUy)FnmYC|%(Q{rua)(eB5Irq#^YczcuBB?$fK$RerLYg! z!QQ24r&0S0W@4^*H)KF6R{Fl{3eizh&5>$j+IU~se0K#4H@U{)=Btn5IP11o;shs1 zHK1R_ncOocbHqXsBP-klovZ)1g51ASFOD!Uij7*g6Bb(vxOU>>ME$5^>TUI1NKMPO zfO%SYdj$r#41Yg?yxDkrZtF+z>b=j=gpff#>vb`A=zv<;!x%G9R=-4o9ER^&p+;>^ z<^VMlWudMNh7+Fg8JZi52*}5he+C5o0(UoZ)v>@X5!_po-qCj{xMlYAFlf~1W}J>3 zH5N>+yr!h%LWB=ag$;`g*!9aoc=z7_#Ved;T1}lz#tQ0IvwZQ=Uq}88rJOC`oUlob zk*1#iz^B%Q=x;6-`ics&R_hmB2u-m#IJWaNsW|w2YiU0_HjN`f59{2Vr^}^lD&G;6 ze4#VIeOH82o0JChDhlM9FR$|)ym2>-_!|@WcZW6*Mz%Ldo;~Ey0-&{h6Zi+D%)6Juxd&uhwQ8&JSW?+z>RU z7+X_XMRlm?;?ZMHbRif}^UiUk;mge%&N>(cb~AUW;PhFl7nGxQ2WXO8Z=BsUlv?za zj~d7vdJ_e{I-|RK>(P;TvigBP)q$lq2L*lV=B#OT&ua3T5Gt;d4zfcwd;!p=LEsKW zd~O*k#6g>Bp}(F7G>}^k^@VhQ-hD~xZx|T&)$Y-Bjf0cn(Tt8v$q8*r5ZrtW9 z-+4FkOz`axx+aKz^xzrPV0-?AQr7Igtaebe&zrm?ldVG?Xs$Ns5)K|Nm3@|IQeSea zx38F}ji0>-8;K>D(jAyGyBgO6H}*AYg`1E{QIfzC#RUioVU_;JzBwLaw1YFC$H9kW_b#o+Sve{o|6cVpAJss-dZj^(QC%dmd%irQVpLEg{H&&DJ!{N<6MuhSLY zT6nY=O_8iaa37471YkFzlg}j%awl(Wh~F{|#+oj)$sJv{N?Rf$g!}!7)jy?~Z171< zas!nSb`J%@Vi*T*O+6Ol@o_7ymVHfm%T51)9%^2dS9Wc}ShDwgZ3+$hV4=Hv+Eoa)3r82RW zoh)&`xEPR5LCr3+k}G1Q;=7(hw`)(z{*0ibk?eAJj#`M;yZWRJ-`83WFabD&L2Wxj zPn2|{oS))G_3gE`mDd7!?*#8~)|!kZFDEi^4s6lM3$u=K9v)cNWyw*t_?wX(ivwJ@ zuwF&{;0Y@JAZ$bL%PyQl#+lj^Z0sEf!klz=6=c%#u#DTb`@aw|g*PCO(dzeO`t7#@ z^cq+}koYB*Rz^2WX229EQkvtSLr~$75|pFwBasD=Y0e|{3@GSEH?X6;!9PhPSBQQ8bNCy!N~gD*iGxhMTpdgx+eE>B;%D)Ba z!NhLjJF)81V65&uO1>aCJMCPQ1xu)65HG(8cqq{r9-k|?B8fw6kKg1s=f^*8_l_mm z)J?ke|CpSreT~GbH}kY7jJHWBDyxetw4WpWM0VKFX|C4w71z{HZ7};p0}o*{Q8$K( z*UJ??d;nBsC|Mumz7f|9U8=1{6g4C*N%MFKS`(4R?Pt99&Lm#*LF}-(d34sj+p4>ruy>J0DDU zgtnRm{(rJ3T_JZ%KAuh&*(*G%(~a#nRIk0gG+XuDlBaGT z-Xz^ebk@Ibn%XfE8#@vy60llxhqAq7TlatyRZ`Lp@D16g7nbn(S}u)klwOp$vX^|{ zcX$+3qbE^}U<(Teoxv?Y7|KcR@L|Crm9ByT#IMYwkWr*8#(>`g|PNp7&WIWz^rU;$j=#Q}SZLQN}WQk;ajQ+&o#P zZ9`uospV(ed+II@B@fgHe7}tUMw4XgB*PP$d;=up7?qzYdJ?*`B*n?dfV3d(c>qQ2 zkbH_QGhN6+yoiRZj{fI-(_<}ZvF1tN|6nt7pSmpiSZEl5T3mjRXdu0bIW=uujXMN8 z@Kay*oCGM?GaV3xnFLlLa~jca@+fK+FHi`xtvj zyH(DztR%)?g}Y-$eu$CdmLAyQZ7OnDm}2Ku(l9a$eN?h8@?U;LGKKtCl}qENK=X+) z9e)T@Y@e>0si1^7!-FO#;}@1yy(}$nG#k1{L|~n4tDwcS^?o6SF`VQo--I%YNS!D5 z5HZQzQ#@DzOw0jJ8{b4AFCaDGuN>xK%f>?FFY08K3A(g4mM8Z!_$JcfX-z*d$8~LH zR&e$Nlino|c}Vip#ky^pODdYuG|ofS-@cE+l?@J$&lf<(6;XakFTx_a6~6f!h^@f{qtNjf9*m zvc;_)f_pC?bhAh3lmwKe4JiF)PQV~Ainf^AgVr8LAo9XS#EL?NQOnUDqu6R{U0i3P zNzeyNp-}?u6jqyk3=sxUW*S-?HeXV(S2}bjUK*EO2{yX!2i-|gjvEG?+@)p^JzAZS z-*0M*C9`D^!AzM$Z1*b_EqP(qiAhe<2H3hV%wXBT&1OdY-_Q?W3WkHa%XeZT$@K=; z1tBDrBy@wvtC)Ed zxC!16A^bFy5*&gDMZQ7oL?Y1q$YD44<~DNoalETTAV9nM>z3LLJf(YPUNr3LZQlcH z!s`x2mS`7{T7`;nZm8=%Wdg}+PfAykN=gUZrbVT@iTyXA8mGZ9Pkp-p1sl5@rPEH< z;P+id#2{FL53p-X8z~p-;SDc(3lA3SUK(O`bHa_}QcP#`4lcbk*s6E5>$r=(K=OH0`B!r7x$ z#J558{xwBScSmQp&w;5sqbP^Kr%MxCY0`BbB7z{wEef@>f=5!RlMuBeEAxvX`0;U%w6I7I==D5lNztI;NxfU?x7X_Io;cUn{d5N6A z3Q&z@XkmnfXjEdff86Wg^(~~f9RKotI4xYq*#-HQBgmr9SAp*Ro|qP=6U35@d__9q zzf8f4U{MjUdX&cq$_Eh3@Ac;KISlc-`}OOL)&;5)^hE`>fr$9?(_IeajiV^s^}vYbj_1Oh3-+D17EJ~I#J&6@ayF%9l+OuRan z)IUmNF*rr_G}DpU9@=yiwo1c>$JsYfceUlyCZKqj6lv?N?sV|>D#E*x`3{lUro@Da z&6Kdqz#-D6(EqC!?TJB%1CHCly}LMhi8E`UA>a#sR7?jND>xJ}E_VSxHy#Zs{?L+R zhRkSP>yI^^49(KwEL9fGHQf)rcow7QHnd=E;!ps;J_MCF9h3^1;#eyuY{0XiCE5^Y z7iSACh>!r6m6J>SpVojx8@VN+UWRRzp4=TeSrYUwEN-a8RS33Ocwy5EShEkxJws?w zu&^n;rLL$3=IFrE14hw;vV9^!cF@Plu{iB_x(T`Ky&QDK59+T{>q~ZpqbnLsAKOV961y--!HR}a0H9=nATIU zGOpw1>z6Dhr5SYUGjUB*ySbJfx;BrHlMqya;9+c3 zx-~OqQnBB4bl8jtH^ij06MD;%_M35N$jXMgXhdI*As&@d&WUXCS*YII2aL#mmx}GN zB-D!XKhp{12j_1wtRE|ZtJlsT$ACbNTWqea-A0NoVcu6SYyQ}n{0>rG#W@CQ$jbxzGfiGsVvups>kjgI zehbipOVCY*$#0@;xQF#1)&E2$Bbjwv1yv5bQAL||UwPHvY9W@RqV5xl;7@GV&0s7I z0%J#7YiX8*ObDb!@4i$58jq)Vzn3kf+c7LRW-RU&u2+I8mi2SBvCx(2oT`8)C9$Ll zR^>??d8;1~;Ws4l{SPY*q5kH)pMsd5yT@={tCUxmFGu9MjEhNBj(jb!`>7># z6%L$it74F4<+JSV ze(#f^c*JXtaJ}%qvHduTnQH%;xTG1LwZoS55(9-US#N_km-~gji5p>p%zP?BA*mSN zPip4gTZ_H)ve6!TAWsDyr2rGG+hEhtZaS-kfyhG2?Q@YKb`#%As3R$hb;w@KcX{Cj zpwigK-7*N^h+Rw|xDMQRCh=kIOu%UCEK)fgd^+~UCVKs@T`J%IaU~UL%xCN+bZld3q=pkA`Y#a z!4K{A9%44;&A&<#7Tkhr^X|#3uK+W82Ey5@JJqSk#rRq2wo)#q0sAFp`ScL*cg39D z8%XoG1PcEs7~=)DvBBHS;m!SP2sT}I(FEG_U!yU#&b62N`JRvqHBt;D( z6fvO)(B!l*ICKQxj}9n71cW-yQE&%S$VxVsCD1pMjL5-bGkL8iL^u?#v)=f&zH>Su zzm?3YT6|Y>Y%SRNvJPU(sX6gaPmA<0+0%HBOh#h(@@NugV6jB_8h2S%m<+9moX9y8 zA{{#n0*xlS?fnS7RGrXNQ@wQxpZr2F% zS)Zgfs;kv{P*P+Ox*y>l{2iNMEEC9_MkU*~%{(LZ5P=m(B_ATA5ZGxdzg$o-_?JN_ z&boqx7=WDA$fv^!v4PEF{$yl$4%UrRlUI?|LPc^<5U&Y z+e%9yu%If}g>lDBNgm75a}o0|VA=o-P<^jm(QDIbKy~;FC$MG@?)y0HER7h8fnzTx2d{oYn| zI7Uny=~Uxu%AyF@x+32!gX&xGHn%z_n_by$+dzjyz5b0P>?n&cmaALe@W}_qD%1`) zbc?}11;10HsF>T)T*ZlX`ng4p!N^)mxc6>3kT{MqtM>botMJVu(5KLTc2GxU3x~|pUg2uQdFfizss|$l*R0+o@)2js^pBS736ABVN?ijXV)2PXb+;I`zo@05>$X6{ zzw}o7Z_>AR)W=7l7L_C5sG*%8E2){FmHV|rv2+-p=n^%{7eBMub+&-p2W7%`=mT~d zrGqK8um2olV2_}g$MflE_;icaY#gGANNw=sj@us+>1GuEhX61#aj^R687^`g)a(~|0J z6pLWS&nboG{C!fq_NP}IO>l{AQL{}*fkF^YGt+ENq2Ol%%BdvJLh7rmEh>$do`dn8 zIxwiRi6$Bx2?Bdy>nvtHrqa4B?!f!1Za442$kF-xkQexzUmp9DX& zb0$kBk=-K6^Q$hN-QjS(&_z6Rzj!Dyh%Z4DB|yD0o>^o0qPgI6D`EiA$YMwfA@z?u z6ef@zrpx1uI#>0w8bP3!$kDWvGj!STkVF%qHxX29^u ze0&L@)t{e6f|x|^j#xfWiefJSp=pCW%{6l-`l_KvLq=mSQG9p!q5RuafAJ#=j{Zg9 zRF4ez{u;u!_|MMm5vZB!@(|eT`B=grEG2F@fVnn?RMt9bfv`4q9=H{uHDdU!^kfHe zi;{oadF1N7Fg1=3kO0oW-)`CX{G2@26wm+nOaggc0Igh+kPZ%ilM)I)uW7hyaN@{P z6zTh;o&H*@d>p$@G0LiS2of>6tf^WRgSU(%8B@{6hP^Bnuh)wNCEKG?5#f;LB&u4Cl3nbEZ{ZrcE(8d_zW0005=3QQh?|S^|LDr7eK^N z=3e5c8={$cyPp9LpPAJ}Q|0vpq9qWAd+y{s5UD(JVCyupg$;OmZ@9np_G)qF3>{4> zauYtZ`mWW%>tf zd9j|Mb0k))(z4}Qzeg(~aR4h5tI_%)v`@pInBy!epiVkNGeY;2x^*JhUS16fwzaOe z;EV(Bc@+@lF7p?o@GVlB!1G)_k3rN9G(2!}QfkDS*6lUEH5D_xYdiCsR4-)jy1bCeLLk79mJ?7)TqYLwFv(gC>bEcP1u?cc;$D7wJQD`H_4Y~2Ll5+iOo zcO&PPVTqcUTehI)AZRRWLy5@@?`7OF#`mSQ+ng0X4DH7`&8bKeITiM8^54d>Qc zy`t!Kz9%eX(HWVE+tgRh3k6}o^(wRmjHT@DeG@D;S5V>ZapnAS8x)q zVV$`w7iB;-z4u>XT(<$c|06FX^7X$E?4A{QIlM2|Q%&aNikN0V+T{>|v|aDfzBs$b z0f;jD1D{OMDYc%~*Mpa|7rx7-@|=O|6$0-+x^g&V`#ae{aK%;3EJ-;f+;;k)e|xK} z6M_oqBx{lE4iO5jV^{_VXUM2QVT2R+0IcRXl7u{KN!=v&VXIUyjY)xl!m<%<)i;lE za_V=lMZxZB-l5jyn%3^`VrrR1WvgdPrGB)DK~*OKNk*3`SKKg7IjrZ8KW%^`FoyuF zYYCS3CR=+4n770dtqm~4L{?Ifn?_~=0B)fAu`8#r7+n9rvP-bhXtaIcxoOEFr4$s% zDpFFHMZ?x}%AJOlJyEySV_t8m#+~YX!wYwnDg}A~?S|az?o2h>c|10Y*IQI|B6#4p z+XmM2Li}c4M3i*dbd^TnJf!D*hKqJ2%b~ZZg2Hii?Uj7{94I;*p*G*L9t`80a+SbQ zeh5k)TX#UfKS#$abO9-`65Cz#U+tGAB_U8-yRQ`K%((#f{c4j`#l+z;n~TaOAdVuv z<7kcENDAh)8sC8F!-x6t`0jJW^T(BZRq^=sSj@(Ht~h4&$A}UYaiTjLtxz2F;bPAy zHu5m;5czywf13A84u>0`hbv>l2D1my?g#wtsou*Gn!65G7>R+z3CbZ$;DtwT3mZF` zz!)3QMFfZ-J;&-o4~ljR76O_87!AWg=P?Ms(s(O?=)Cz4>R{Ry`E2`NXP)f^UI1?D z$42kjMEkjAd8^+(x3`7+ydcymgk`B?q!@681*l=`Q2Sg9niL<{U^>0pLsQP3pE@?~ z|Atb8sK0u2g_&wg$F8rbCV;@XD@$&hE|Ij%^VYgMPtQf%onY!rZN)^4gnmDq?8g=k zX&-G<=7lH2qMgg(5=DUYH!n#-%tz^5z6J+ay-0-m?x72S-ZK$B6`rct%<%U2(;@=m zh3U5)MV5dctzV+nLtneyVPOr^O0n0tq=khP!dIe7VaM5V#f2C^ZbTcJ)e!>^NaC)b zD6eOafe{Em>qGoQjpK+}Hy@oyr-pc0&cLe)j0@dW*Ud7~w!Pum<8W0!&sPUdoS$lF z-$xeP?$N24#JKg*_9=V$!ZAA%k_W`djf_fKZMCjEfhCE7PnDX>(ACNSTk28aJ?1q; zekMd#DsBHg?=D9#h3&ggCEVHGnxEs6Ne}sN)7pXm^&yJa9-5eJRfu9sF0~Iy-gtdm zZn4wHCiKTcy$sfpBf;^&vr@J{wz zK{WD_z`#zJB@n*dT`iJQ)Fz7)ODXlge?hdY;@l5v6)KyMii0_-w6kV(ukt4Dm0RMI}jS+D2J8_`T!vEr(gyErg2D#Jx@*1@pkLZH1cv<|^ z{flv~Ji6u#A5s7M=n*-XE?O$m?{qXv_Z8v9h-8fhUR5n&<9M^7=!I7Ln z0sIH&Y-I9ZPLsUj*eIOUu7_q4K9kNO**G0Bcvc#kz&+yCuhh0CvQsTRGAS~rS8-m@ z{->`8ZA?f%3ISoAgRH>;`WSyNl4K;>+CUs!=dcAI1rJ3N>%}cGsfj#zD@Sh-owdWa z%q*3dk`WTL7ZI7ZX#B?>pk#JW%$L5#51_$-1fu@Qs^-`;5de93lKfHh`Cq_1t`z(`TZYPAxXRxPVeaI7leU%6&KsZnk+BgYjO|Q|pvg8%U3WhN- zJuK6Nfx1shvz}A6epMD_QqW2p&zWc+)XnA6#G&_KhQ}Z(j*}pUfH&7Q)Jfo;6B?}> zkwbYW%imKrHx2BrgK2ePpqz5ryMiA0*!Y^)A26h;rCc0<*X`pVBE!1``w_>a#VUwC z`VH8T$zjMg9`@fxH4>&HFm*skTeB(38BS7%)1rlo$VLPb(~W25`2_zUpi^sMhUMF?Sc9fkMtF!X*=> zn-<&YutFhg$ZZOfiK?b}P!O~@8;!^-fY9GhT_(ov`P)0Tw0oFF81Ux9IZf%D>v-zS zF7Okxoe884`blue7Ep=bh-=pNB#W8Rp>?-`9489w@V~ypurEIUQgbB$#6E5?(wNQ? z`Hv8pYkKJhIjrm&2(D}r9P62H4+|Xrl>yxqn&kXUS_GLg1Uac&kB894xP+eN&6 zIbZLbtz9F!ad^Z6k-XiiHjYjKo4vHb8jVdb37_kA=sJKR3rhAT56#RZ-Xuh;_3EpkjDmUIy-#9JoLhS59s#dYqA2K>?#FfU(3xW=Dy_^tJxvg@R> z6f{a^sd$g$`bFs?s#zsX49DwD_Nt1rb-ZcLpypCXE@m_wBJ}BBAuF10I&*5XW(6Tm z$1DrH&?lOrx#tXu6@l9?GXh<6WAqLdT48+X;~;yT;Q;1UA4(~)AzuwgxzzIfWe&zT zEn9zDkArMxyHr^S(r`uX_Q#uk{NKctqTWCAT5rq=HV5jFrATnU0=HkPil~mQ)|bRi z3uA?AKlH-g3W+MKlfG=9LedgFKf?VE=PKWYZgOGP4Z#+FP>~t?OVFal=7;bgC3UJK za4^#Cvq-gvrsBs;|7nI27NoKJptETWWHyJ(0+j1i(12O$#aEQe8wcf!E67i#so*-e zl{@v+{iXCb5MEGu^FQC0XnjT$iBKF(3ZmhQ^DoyKi^ZVe{i~YwPUq%KqjA^1IYTi6*<^m zi>b6jkR@Oij=X{19n+bMWhiXN{hbwabSx7u8r%L%y2EuuJ#r5}-P^Bg3zA3iK*I49 z*FQHeMdXeWdx#_&gD9yVkfn(2zzA`Wj%^N|@e{e~6*gPeN%!1jEVV3e*4ZP4xF1bZpV``9|$w>`erd1Xj7c_SnKceDcJkgI}5?8 zv*0oAvZG}lqhSXNCAC}NI2EPB00S{Auk_W#?|*A|{|UI;xtq%k{mb2EBR0G_q^0G` z%HII5FFo%j3JK%*vL_5&d#HT2e*Z`an|V*JgMI1T*6)SyaTt232xsxhT=`~S%Tm^r zUed|bJ*xY*bFy<4=Dw6OB3Lb|;LVhE5Q~eE`XG8h$KDiLpjUT*3g-aKZNTEMq8QIn z4EosEdIO^xXV?T!Rsr;D=W5MkGp9@mQ+2d z%xS8YU$byMx9M@Q$4T#AY)C~8f)UPYR_2H~@Odb^fl{MWvKxTFr8EYYQbI)H6@uRm z+%i_x@axujuNN}ICs0&PKXHvb#&zu*ZFmFlPDTwMuOb+yrswh7tlU<09+9%r?Y7Wo&6epPlP$`y-!v&XC-_#+0-9i0mll7YOf`*h`AMiRfZHzsn zow#mWf+MQ9^^q4vxkr(^B%C0rDQge0hxcPqa14-gP9Tka_lN^=nV)wk+g>EZ z#d()oBqAO2Uug1~;HkH#b9!3(yW_&$`$7SYIjR{R-R`-s9ONrVfKxW+EH6e#2hsf0 z4({1|L_&MV;lk+^MR4KCX7Jz#%8LlAa8Mm=ynn)+5MV)|LeJPdBV^Kb4?1O=c0Y4W zW1cL>b9D%hjNxe+P3m=D%P>~+t9hP(2Yf_XmRz(O zPVxpXGimD-PKrdEb{7d6>69&Zp}92E61pLe)6agrEzO?7+FfOnB!^OuS!6T6s%hVA zcQqN4maHU;*DJ-4{W*&eW7k{j>OT68WIh4W5fDUUM~_+(=9ei@h`Jk zS~!TovRLA$GmwO+^)en2SEq>jmw{Bb3UcXj1kd zRp?w*-A#hT2Pcz*|9GNu`D}U)dljr^mb$-`?bq;z^=Q<%)WjjVij{Cb*wb+eB9qw_ zAcp!DBl)Pp|J78c`D(){W_6iL+5f5oNcNRfdyQ6*ZNOLH|7a|$g2EqHx^mE!GX#Hv zZurcXx(5D#gA>~l5_lqj=bCJvR8)7%g~iW}Ez|%cpn#7y_jzu|g2qR_>bkf?_8qZC zaSn?ocb35@&69S24e3x$im;Dq+}2*cWPN%QIhM$k^U*qFdTvvlKBtes|BylM}k2g7cn zf#$P0k62@gEqLB@h??>x$p7JV-GdbN{b8{a)c$eOlboKA?6cTvk6?J80%^jC_7D!6 zt(R&z{);QYPmhb@H>=r{EeaTT?d^*TS;2s%(LapykP_p;nGsPp7PHd;pOx66VhQKZ zM{#_7j+gz*mabDSMPg=A8cMr%9J}QUBbK!(T~xfFeBBO&9lA$C65{IbO5qLeX0)@9 z_&Lh--A!90(o}QTxG>8TiVjtwtGs9zb{*EEg;ii_&F~L~2Z_g`0za};8X>;J3k|$y zk%UM?z^9?zAju6sFS#Te+sYO`!M(k23>7Z8rNRsQiMC2MTI`JO?Q-R?j^lP3qC5;{ zR&t>0KLaW7TTf}M{3q)bn^pMy)cE@S8ipHfxXs@)rkb=t&TLrqx)~oAVH>Ikmx}?O zBoR;4@nz-F@XUl$=jVl-x2YfACkAGy0J>9dN_hbe1wkM9(_D*`aar(9YlY(Vo4u{H z!?RINQ`ZReY{<`wOL;2W4X5(PXycYFfI%i61>yAc8^9q~1X!~!1<7?w9x1O@KFPj1 z&0Sv}C; z7#xVu@Q0b^pg~v(6B=6M0&Y^(v-%0+NCG~bjv=U!6WwA9m4q{Zf-z59wpL**^Ad;H zek85$Mn#p>{7&wfUorUGn*>%*78Is&ad=4&%|nIAG*R^r zz*7$bl3M47-;m^q22#`m>5JOx!#Fb12TFvDWJuqJXbt=R^=ZFn@9)EX@&F_dUF=FgMaTL} zLCC0?YTsqBB9v4GRz9}e!h<_wGkpm2L_CkAkG8@4SeONY9aU} zktHh9-c&-GGkpm;9{73DV7s&$T05J!c2AA2@HYd;ApfWLPANtL){+p0PK9@pJGVK+ z{ofPy+a7ns13O7tN*hgQf*C!UA}%x^jJNk5p)>1SPX2V%Z|BRtLZDt7@YK_<^I&+yz zMPEW#DMPt!mj{7!F{hOM3NM||oxbHOF8m?&zn}DlI<3?nuMNulf&JiP3}Q_%ByBJ$ zhbm?9*4eXTbmU22noX;XC@FOraFF4IKYl0D=}N@|0E7mvbt&+UtJP6yqeS`&Mamta zf*_Y(Np_+7bi;xwM4v#^Px&(?eS)U&?@E&ksX@LqrxKR5gI6tp1?4Xz}OUlF`5PzurXa-cKaXY49jWivD{##*Dtp#6`1VvDbk9N9>nlm zbtm|79g-dKh&ZyxH%S+}&&pt~sr12X_U3H{uDI{~8h828f7?1#G^qucm|+gBEwP$T z*7aiHi!VZt@RtfQ7lj0st(U_mH2c_#As#WU^BFKez}W-g%X$2A@4?krQdO%7k7~jb z6qz}SdnonRW+bF1BlGep6O`i|E@`&zk*%FFBOKS#1o;(KYJfZt!l11-xTqov>bQ<+ z|ITdpsY3wGz=Nxxf3D;ODoWUXw24T}3XE8n{uubIxx9Tpip9F1AY(c2yPm+^uKY+G zkZcrmB;d|SGB$GD-!US;m)T|sCy-A~o`x(;LCK=%3iuanx2s}_J*{up%WjlGAG4n+ z**bbf$x$ei09GjbxkMDknqRs%gGeynfY|4$YoRtvAbl^*z(xQ>i(yYe#jtc;?55&Nu4 zz^&%lxvvU!eNaX0o?wYZ2oT$&j6c;T7X3^dHCZB0JzDVy35}K9AB`2N%oVbS-m)2J zE_11QEnrgi#DvYlqAm~g@PiX9`OSDP*G_y>5bK7$AfNe!`dF*Ey|iZlCI$M4dj{Ut z1bD-!0FZCSX;*Vj{WOlN%ri!Kv2=TDWh7P(Zj8QjTWS>Uv>E;grs@=pG?G$w&pWLi9VIceI1XEcbfwe?vbAbKxeGEpDpSnP%fZB|JZ_nyXGS6FmuOIM`!+Y^d`It3 z{Of#nWl{DTD2@nm8Ez%(aq9C_s8)w&7gYN znY7YYoMqVTV*59bn`5kcNy)N^bSaCV;-Uqo7|jgu83Z25hgtfR?Ws@JN?pJ4sgjUw zNb871MU-9jDm_)gVD)77R)*7tqyeMa_H6@{rR{ZGp(lZKqKNbXV2o2mxGl9CB7i zedw)~$B40cwKWWXgVl(3X<*n-(~eo2QkN2cTyEQ_5C)+U2zy_u|!>_t)PPg3y0>SjiVz9t9n|4^+i#xNYpSXsUd0p*XJ7kH|iS zbH`MhD$*~`||jZ zdW`|d9`}`u+*U*CKBA*?BR`t~P+AcANQqj1tb!=DT!@8~+mRIIQ+?JZyWcVrqn8_T zQ@Sy@XC{$}Q2b0w?3~grjYJwN#uwRf`N__W*=5Ga6Soq zrPbet?lEKplGd^mAv9yys=ekR3Z~T>76i&Lf}JVNu^h3B6_m5as*btPcfHIy?44Z} z%Z9_+KVw2$BiE*1fPKwkuFBto8nfoaQsq-`D(`B}eAYLGO+E%sTg=|nj+C$ zTZi8+vmlPP`&ZaF zz@;tg+6)4v!Q~QUaJk{afF_D+P2qdHKdZnu@EtxrBXi=o#jeZY=Oq{}9k&TSz9#Mi zmWPom?76KiVn9y&YR$2rGHYpP`N$W41H0lr&aI7b{a)v?=Ti^roklc!T~1&5HJlc~ zV@3j9#)nn5%PdzgRsk?ao(UnW=hKSI+%u@q$cx4jg@L!fD*PIp(!J5gN9O?&!e>kj zy`Vx+%XI2vOr#U12W!SLLKi$OOs?n! zAwQ=}=H`ooJbR8(h!RC_ydi=tw=i0~QCq!ah*)QLI#=aVGz=SLm}`KFMo(In^kVRjIr%LQ7{Z-+hR;MjQk{88xQ2_7$$N7E#sfWu#=VU-xv?nwKr6EAfWI`4YbUEob&G$rIL6B>bPH$Ct}SaUCz5{AHom zQN;5SolP9Y4~-$rn-~;xZRAZUg9rRo=};T3a|Y8FAJm6Z$bXG}w3Y91lEAQp1@eTP zvY2rq(ktuHFiribA(nxB{5AR8Ebz}y_HGlx=q(3t8-Yg*XohX#Toucw{|$KXPT6Z<{I<|uYC>tH8o70XH+CrpOt1cx|zXQ_{V*}8MVsb)BA`J@LoKk&d?X?*5 z+iy?wTaz5|V%#2Sn#($NgXo-?*@pV%_Z~&e_#ytI_SMHy(SU(vhBVC^BIqS6;KG?I zj&hx4;-2<&CPZ(xNd`9YUW-?5!@Oe&O)!ZS!#;knZ?nQLJf<+RKoBz+LPMM>E+ML^ z={FT1!x1^)4czWC*|rJ?9iOD%U5RU2N1_T9EY1VW<HF;;kzL~nEJu{;$`3r zFJ{VHv~mwoqoAyOG#v*=CSt>go*95{pU4fmN4?RQ-I@#mG#hf2V;VC}Zdr?KZWSRs z@iY|<04F42e0YPp>bTAS~NPMwTA+6*>}A)w7!I2>@f~{ zxsD6l6s?I-7BT+LOY;K-CX}A511usvX*3USZ9P5=mp>|_Q%Z|NlaWfqBcBdy+lNJS z5nT_%sF*BHI)3`vw$WWB#v8EAASu^=<<;haxV+5{f~0{|npCUQvOQ7?3jRIbG7}AP z&+`E>c&z61mYt=(yx!ooiV0Prd_DWm-lV;FtPi3ovk6@#Ns9-p)4Cq?;4>=MX4Da> zP|6Lo?G2z%ssQN|L;hUASXFFm_Yr??g9P(ZUtW~tzX+$TXQP64h#!I;&iZucB9z7# z6m8syWJE2~(5=FTzx8}iARgGl=3aLFImIJMfnRTTKA+_CJ>J)yVX}n&Vsl>4NH4@n zswZcoHWpt2x16bvUW8$PG9;O`*O4TByJYMoOMNDQ_|bu$E$QcY&2XYxeEX+1aSfR@ zBuUwIy41Z))2ovYKZU@fk7%Ms@wDAX$Tqi&OfgXJ?Qd_FjE~X>Oic+wfcmqu7`*rX*o6k2~9kA1h zFgRU9t2H_FwJ@NPoSqT<#>m7vqyx;~?I<4v)d)MFzg!2VT83lGDhZ9jlF{yRVXh$c zu@Zj>*lb)S+RshmQYl5~MdC}|&A4@l)!?KSrY_w>uLN~KG2Kke&~n;+UemI-okK3Z zh)>PZbIj@QsPcQ3hRhnzu=LIu>y@lo93#d$W0S$CZb2nrOn8uaOV<8?&qFRAGk$5B zo!mkwxX;K+c#s``s@9Uxt1utVXh3UE1;`K01nf~WB%(j_e(_OPkPf`MH`yeXTxrvQ z<#?*vXi~)0-gFv$_QYCo^{b-2!#cV|PnHd0g#$UZDS5Ob38w|9tJ~7vxu*0&%tn3U z1VC>1Xwon^?fBs$gzSA^M}Vs?DBt<2p2yP;5;sE2qR0%+KIr#+N^ zLCoOArdd12CG_f!$~CuMqamZT*BL%0-R_wZ5;%BQ%mAZf%)}Q0BG&)fH>uzp23@F; z^ZbIX93Re$IIhR0x7rmz`1O3x0F1c z+0!BDZ*d|j@DmPtnVDzsEPf)LLrvAZ?ntG_*}?<7>~Pv|8t}DIK_$RW@=< znoG>B0y}D_jL6U}bCSQQ|I-kh5SNB)RXMbZZNw>_VN>;cn}~Nzx7?qq2>e7l48bhh zyvWd0RoDHU!@s(f{vb!XN?7#)m!yjs8d0PW}yBksZ|N3o^VH(osi+Tc29_ECryOd0)qAN?N-=2ro7F z`L!#Og-A1>I8s+Vf-rY&e(W*Vduza1=`*Y%wx=lK7V|uqKK}h&n^OU9v!~$_-U%%E z;Cby@CoLpa1Fg0YU&8W1&7u(U3xiCr`bno6Lt4>co9=l_t(q8@58RF6$dQlQy(k~m z5VjhfA-Wmj`WPKHkX8-1oukZir_$SbCAi;JLQh?1b1G8*p!dJ> zjUfe_N%Whr@j7nyW-0$Lqo*uW3^*%F_{TA9&78~;PH6+k+t}q%)pTpVpP1kcx!Y1W zJr%>VqqWe~G9tDehTZC%KSMk`XzYL6#GfCev_Ek;yKYR}EWk5vfI|O9j2KU2v^Qh@ zE?({v6Om@&MN@Ah6p6K!G{l5pShb&M#VJ1+L6BB(CB! z=0ns~slXJyhR&06!wkZyUyEa*$k+6xxVeOueG(@G-lviD%_tdHr+G3Y5Bps1g;hwS z_KI^w!)JrUqYRs%eP*2YxP48qe|^c$UawIqi~Ij3q%4gLI~Ypg}s7l2nL_MHpJ$wg|? zTisKx#;}7!8jC=#id?G7i=~>PO~su5{$4JNR#gcb5v$`Absi&VXO=u0-g-4o;mxI< zqoIWe{o;Q-*6kWH-Zv(WuQ!)^6-cKh=ZL~D;AepxboFM7?38?B2unkaTOd|_XPX0o z`pX?N7}9ZcNNG%PnUH96I`acB*Y@k2eHs|}XqkqhLL_SEuon8UfP-@ap@yFr(ql6~ zZ}UaQ&a?6jvh8Npq6aOQ_7uXo%){%C#z~4a{+fRmVU)SQza6m*Z|FKVDx)-r2fdpM z-=CHB{;Gtrel{hi%XzBz?nt=py?*P|e>gV9lYFFHTgHf%Q+HPzk4$;6272%l5#eT1 zuW@MrKS0302Y|JxMI1|VjAt)Od}LaQtj9A_f$P9%P;G5#8{}F1idm(}53lMKD)zZ2 z^>nh?PF+dQpGBP|_t?d6ZyyVWR7mE_$YgfUNeoJG3C*KSmQD~XshrLfe&P0z91r_E7&}mz)>x!i z^ZAMf#}FDM%>s9K^S*PQ^Ws@kz*p#S6@X=$Pz*4ema7$mzYydAr@TL&Ta}2mwSP68 z6C6TgQu2_$%q-zV z#qql=k}`7MS1C-?;@I7tH#s6`vu*un9e`o594J49#dj3E@lksI^s+9Z)n%nHB z4;4d0XnkPca`XG<53Wti_g)%EQhVn6^ zOl9fU*{2x+2W6>Q12xS8qCy4|vFi#7J^w}cyVbz~!Hk6~ddaTvQ$#tIw0e2Z%=o48 zn?r!%wn6D-mZw)4#Z~{txq~l`;r=mIteoU7d{Q%rSZY4~Zah)RETe&?-CSsqEAVoC z%XoE7eRy(SLJNvuL@dmQ--DSCpS(_RlLrA1Uuw>7t=c2hX%xBuUq1XY%$t%Qs;wI! zil(fPR9t~A62JjTmAIY9=JfQIfg7srd=}rsq9vWx-s*Gk?&=++rL~6xSno+Mfa&%?v5wN5CCRQo^bbGER5=RLczCD# z$;GTl4;G3?SB5-f6M5&(QF3?%Dv7brWxa?`e?$XzK3j|v`ANWT}E9_(|F10Qq%(d7TKImgRMY;kC5EV9> zdd`bYToSD4!zNjLwtbqqUkX9sw$kZon|ck8H}b3NAuOt}ruV@5rf>=eLT1>6MU>%s{C$}Mag60RaO z#k2?V`d1@JYnz}DkYUj&JR&4oX$Q|C3v4=$6Mpy+r(roKF!r?#r^Wo?7`2BgCA`IMq+BSMe+R*K! zfUT_&tMk=ca>nS102kxS#n_3d!Jdya+^qFr4*Ytb=)j?IE_jrua|R$s8j@temh~fP zgc=44#VkP>5Q?YJ-9IumQVdCTTU+|-845rb`vi>JU{?2)CLy0FB4a9o#8fT!Ug=u4 zHbgA82-}$zX$4OKGEW5HdqjN|Zi3~q0@i-} zQPsXR&c_D+p@4Pls4&SrwYNdgxRPnQ``& zUCZC3wv*BJ8$WzUNzVzP70r?HA6!e8-d@-q|AWhM`ks+m zmz9XIyK!BTdq<3qr=oAcJS#|u1q~5+{Liqgbo6d+bTb)vMFozq`i^&mgut%icrd37-G;g?~xiv`Jdfb|2^+qvr~{g zp^uMc=K@xcyA>RvVanm*`*M%JJ_WLBiTa>L2lt=$qq%#hy|hgTJ5K7+$q$W3Yu#qE zp$@^5kinh_Fk(oRIlJ2nTmLMQgfB>Tw=iBVIH(y56v9bP8X}-+HyCAcEs4ZNB!MST zTQe53oqc9Vpih9lK#xl8+l)Fv(gJL0_V;+~9CX#8g&#LxvWEndEeOX|I7jIZpD7%k zz*XM2xBTcr*G&tZ2K(bt&d7AoO2_#H*v$)A>>Lmi`Ow_8$#fvi-T3yub}%?yhjw)l zx1_HYe>t5Z$(Me0E_AT9e#Ou$CD*K{{D%*YpCeD&lia8>daT zyyc0fssWxp-3O68OM6dqm3)hXcKWF&fv^v2;+(l4t1h*t>mnEXz0upKzNn=h*JRf^HkZdXLU(68we>W2Tl@TE;#96HU(~|Pt*tl>6QW81k!%NSb?y>&lMS> zsZv)d9CjCqEh2DL4(y%%59v~CZn>wmMT29FgTHHrUBL@k}@{xqWJxzv37S0o0@8E~T{6ew0ZY zWBZmaBINMcxkk#j>nf9ppm?tcKZfV7x_D&Q+5Tx;j%dpaA81zuPLj*9+e{boznpbnbW{A z)7?K}S6mZYeP|-5(u$S6duwE$Y>wNrUBVPPKe*ir+!ieURN$_|Cxtjpwqqs~M6Nlk zw-#=u=0sJ)N7n?Fx?eS;(gZh_n>|3>L5t-aJDl9zJlKQ%0_uMs)_V!{p~cF?W1S4I z>@fZ13Stb{giJ!!0Ro~x7|omWR3XFKLNv{qq2n<;pKdGa9CJ z=TOW5Y^|H4PyBZ62&M)?ZqT7k5!!?k(~X41NZ<&`dzy`2ez9z&&&1pX!`_07&xf?+ z{g3n!kO9s>r(mCz|M@%NUO=656K7EhegX{fr2lYn{GQroRwV>CfT=Qa9<9Iwo=jmSpSiqL$-adDQvCPaU5igpG#}8~ z0-%XF!cRK5uX|r;(@ZnR#>n9(xy4z!@s@+8ga&!DN~@>3)&VOfvdhLW1x4tkTE?CGeIivWF-?ofapC+=b(+zw zhU=(Ycp8R=og4^K(9`1_67-9La*;m7a)1SpO>` z27DvD)dPVtoHO3~K$>C5(7Bp#p5s+p#IT!C!eYqwW8;`@z724%jQi5##ziAk!&Z`pC(KG~RJ93z9*|S&%r$smOF1KlS1mBEX zJp{Zt+}k;X=?CXs`ha2iLb4zlYvFz3jkI>H^ka|n{;=TVX7A}2m{X@V&S6l_WYDbf z=&?G5s(@t6g;rZ+bj414gkM8URn=nxEXW7w@_{>n#tS`SzIMW#ohDBDL!!}S{>=A^ zRfX47_E^n!>rX93Iq$A3SYea`K-f*N%yiytztAhEj2KMb*izxE!NsKKyRS0@8Cub; z4d=QYoK`wYiB`HJoZrv}qc<}zYT3wKStUB8$?!EK?yX4eetRHeO}Y1zL{W+hW%em~ zk3F%R`{mJ+?$vHi=D9yqoHM+Y@=p$2Z12MnoGiCPJy>-iS$a)J)>V!pqg9N1x?WA; zuF+@D;dDHfSNIi&YvEFlB}CaeeayaD@BS8K#{bufr8K-6qKa+aU7@{-Ck@`)zNk**Ab&_1=1@-GrMFruD3-riVTsG=cuOFiA|fsfIjrDRZ;RJ(1*b zuL*?6I}~wDntw2BN48o}_zCS?S*#+7PU18$avwkGht6#Xvh(A-R9a;x^dySn_)%bX zSpwjZg3E)opRciKUjW%LORMmtxjddp`20*#6-1(b=RSm`Y)kQiF9+zwFwe}V$Nz?r zZg&Wtac4_t)b;V?=4p3YUFq5OcPtnT5vWaDPSVH1*UURG(mLfM!$}_^H&G5eYGa+r z`n{m(QfmF0(DgsBr>}DIY8Q`R?XHyU<}e-)-p>PF!j~SwH$OwNm4x5`3}VryOYQrC zIn;5?fJxVV@_Jwmbh=zxC!=-8Yr{~HKCs-^K`9jh7uemo5F!Yl0VgT$DWhcBU0|EA znVJotL(1#YCL%MsG87!p3OwPWbkI?~&Me_=8w4^AR$@&DV%n$RGzx+_gMG841Y=k~ z-0Y*PdgwpSL?6>NsY0==GN?%fIq%((JiE@{;r}vknEBn@r8rV0c@OQwPs6oK=^?6s z>rLlYeJTx>CCD9m^6p}P?@!;{B_yNCc<{2~@#rbq={e&fh{lC&R4+u@>!9c_Ros&mp+3A{sXfKQ3HIxxx zm|uDM=(4&EDSG0FYI>Rg3sVYV>`G9?)bW0=-CHv*AWGILypGuRuwdA|Mo^H!F#I&evW` z0Bio46SLhzu4&MGKNDzuk5mZF6m);&MNwZfcQz(RNwz`^i(#sBGIdWdt?Jo5t7k`s z!}n2x!!HbzdTnG!b>>%nM5awr$Y`ToG9O8;w-wILMYAL9_1C^-h`H~Fb(O!+Lj4nJ zgZ~ELHk1RFyokJ;#+mk32r7yl#J)P&8LOXbQUS7ybm8PGC#OX_D?_oc(Sjy~aW6n~ zZ1KC46q#VceSV2~PgVnBz@<8l8Q%B6H(Hdysf5x?pl&mG>YXYAdSFHN)(g-DLR382 zSO;uNsC+rEDhNY(PmSD-!vlpc(6mOlh(_RC7yX0yiy&6dr`H+Tb5$bMcd^9}Gq&yK zsz&)vv(p$PbHO5+lumpfuuHzo+NhoUh>J&oSwQd!>;%q>%M?Pxbu9}4M6lua7@|3m zCyzPbVqXm2sT&@PM{4I-+)^uph11|$UWk{hrrg6!vzmek%v%RcFZ8bYyhN~>|6Cq~ zzZtgyGRK{Jr#XIoTZOPl9=n?|(KQS_dSycyU02G2)0Ai+I8eQLSPZ6PK5CU`c6Q{ z7lX8eL+D49alN=_*)t%mqjeQDe=3RC$@Z|uYm zj5wjR($L$bLQOJ5qssb-=pArmfh~_wB=x|s@=mHcd~9F$sKwT*({TyzML@-8b_r5e ztrZkhzCbTGXZ463^_gYYuD1n@1de4*PgCFxq_%pk5-X9i)Ce#)x>`jV+ji6Shu*Vz z@}tY2Y%I!bY@-b4Tt|sQkG@+ii}Ou12{g~T3qH7D641enjk87LfO@(!rQA>8se*uL z1ojiQu(25D@aCDJhHRmYr~-TF+C zy>OcdWU=I8hQ=Gq9Htxra8;j?3vi>uA~H_Q-mU@6TDC2BA)I#8DY6D3LrSn~(};da z2a(bP_lsM1RX(9Y*ANQGV_zCRl-yaWKR|!gTfRedR#G!Vok!IV*yqXaju&j_RDv(jp_ zxV|>tMi$$_8N}IP{)3p{!?i?_Dl8!N}#J?aYq zgqUdnTa(Knd(NW)V*UA?>+y65T|GBF$NOgA z0zln-#wOFPo3R+Qq8A7w2adk;uALv#3K}IlR-z;cjb|7$-Kj{zLBw7V=Qbp`Hz^>R zrYwp~t;5$wWZ;nFhk^KIg0}f}@A#Fji6b04!06T4 zNj6UlYBd`_NrC!YtxrLN7DPy{aSG41PHz)kOPb|q8f{Nc_$L!_Iqg54x8(-?q*uJH zv20Ob@!2aUfQFO;&$e6AA`9V-W|gaZ&`LO&ge~#;$_6QXL~M}oPDpLp6Xf{9yh;`M zmr4C&FIi6DYj$r+j__15Xz^t;7QLmyA<4lKJninXT^1Y1pW%sfBe<;{>!W$cQzQG- z1_bCyxzl#?L0kW<#(baz)e0*^iI&}nr~G%yfo?1L*Ishke3e^R)n8iqV5`;FcCjhAOw+|TJB z=tETUg=-kd?ZK@xdt56XH{*Na?P_PN1B=8*z(S?|%{nSUrZnl}2TK~+NY!Uat~0V7 z$KQ1hHBmZF_YxUB`&gAD7o>>n@W=r5j^iEd2Ao#QHWexcr;JoE3Vn3tC?uY$6za0= zjKKd~^5C-0(jI?`0~e?f}+!wb^1AW-o$S zX6rKtHkbpm6ZX9RdU^si3@NXB_)_>Uut9?s?CQ{TPd4UtJ%J!^Y}7TgwNaZc+;V|s z9F7|DHw+yEJm*NE)=M{%9MxHQ%vBi)_m!e^LV^=S6%u0nbDmd`GI!|K1TnR4)QWLb zo~$4>@K{Z=Msq9@uj%6lVG^{6JD6l58;MGex|+i5pF3@ugQ26>o%|UTROR*3r_89b zC5h6f&QJz=Gz!c$G72@vLAM9+=(NHQ-FyCeL9&W}H{|pQzst>Sw>AeTItlwT+rQ8~ zJZ0ge!!aU3Ak*gNT$P4X?QhUM?~frJ_)U^gdn}1rf?b}ERy)GR^-l>VcM^u8>U`d_ zK9b$5fpNMMAtm$0IS_@3pIx+vn#Ll#mYs%)iE$Ie+V<%2C4myAGn4jmzdCnAsVbzn z60eJ>0CvQ?NCQT!Z!v=W`zeGf#mlQB#!NVFUBu@;XBV3q_~S?Q|aG#JuqV$ z8IVYH^iJ{uE=>%2r*Ij*z_|(CPgPgGkpDiv^!?J(F)al(if#pIWOFnFSth3Nuon1? zOnxHz(U+(nwe8_|wQqwj{#rbK$boS?0nC_QNPBx71N>rhJ?e4={wG5edE#3#X||G2 z;fi>>?mS%gsOoKC3xtEG7uqKOR{x?6)U|jWMV~hnJc=lpwzEBo3O{AD6n0&6RmP9#dJs2X$MqW9mU7d#q1gNKJE6z}^rb>0R4mat_>vk9ZH{tM`$c z)O|qm9Vvbxp90dgEN}Aef4xJzi#@396skz=sJ${m>Dax#a?%DlO8j$+_52Svg+Qm2 zT$-b@A|1-XniAMsjBLf=FTOcgOfvc|ihJVHQLkX{M3pg;bYJ@E+n!J7h!rcC{R)gd($yWPX>7=%u|}3bsYT$0M$-*9A|zuP02V` z^!P3uQ|ns1t?%%_$Yf{WRTf%RazEXDpKmFs23x!wH;T`p?lVervFnbP=j%|69w{qq zE!;un+<^|2b3`aQREFTaC)>h~(9c$`R#h1G%e$Jc&$!tws>J{i^U^NmN!(w6!_2;f z#f;r=CI4JU?``{!`YwG!Q&#*Q(Y9PYhg!Z3NgZvs&N{$fGSbo)xDHI^;X72tCo#=q z!qM`#vtSa+FhGA^2Vrw2z?$+<+^Li0`kNV?OW_TzBp11&CTLZsrD*vX=%)E|`I?FL zc(uvsSu&Czaq>71X&0;Lq#AtpK<*?T+ zR}8>yRZcwImEv@uqR2Xa_4v3Qq6vfY+LPbYJ|sMI`IDt*Ycb)8|<+Ky7|x$PFw{pN~J z{ktpnvcg&Mq#Ap2en}zL`nwMs9e+9kgnw*a4+=uZCCkN|pmDLq>R965%nnePmFPWy z*H=W4H`v5%Vm+Zc406Y|-7>M%NPmBUR;G0{lf#9aaRWBDk!yv}9eI7EoZ?icTxNc}bA1l}%%-Z8Tmr zMZ#{dt7I`JvqP+(t&B3(kFB$iQ7foI$AZoSV&O)0P`@%a%zOgF`C8xjZz6@C>NQBNj;wL2{L#Lv$`y`wIpj}P~<3g0cU$=N2dfr*(0>{YmOUB$VE6p@CsKYB^M zc_v#)#Kz26cbCL3VT&(ZY)ZJD$wF#D!2nb0<0pyWpmf7ZYMz|?O0D(l(1M0aOxgC= z@AjNDNkhE~)1Fg-XtGo~X`%GM7)CU#8j}Ql;cXg}$SL9%Ry13fMIeXU>(Hka z40>k~e&d~Ia73HfnCouW0nP~L>2YNwLMHB0BJx!>_k2~*xYE%h4pSfSB z5}FDJeS{vsQ{WN;;NdyiHCh*=eGdWfikhb+3^OE?FPgWy);&iuM*hN6P+W|ut{~g- zIE+SzaYbJO{d-wOV@vMce@kmCzDm^SjloFX2S00#en+H!DrSH0!<%CZ&53yhJpt^z zMHQlxj2#rn(zbD8i43-4jMK+kux%@ShV)F(@EOC`h8NyFn{!bY4&I+vN`#j%fr?eY zgq|5AU}jJw(7=%Z<6n@q{we!tyCUYvY_`PrG}4mRH+EKaAw^UN!I>(vN907xn|!>q zc_0kUCryS?*29J;XT}G}YN9D)Qw-5B#))9b4`mdUm&nsCTJvpz-H~W11BapoWSbWG zar3BVZgfzInaW%-Mlsef779mWG5ut$Ii?_G_Y{(FVF^VPL2J-GP(UyH4XqzVYQN>> zxNBAa4i+lMX^3;Dw6=6*3UT>B0_x_o_JED;U`FaNQ>a}o`rmNZ-o1GLUr-VGLG?|Z z4~A5RcL$_Zc}ZueH2KD|s=t?1Z_;CA4_@%HFSL z1CFwwc-Ef+w?@m1;^SKLMSiO)n$?R@bL`J+ zYx<=XiE6n> z^Ttc=;NbX+`E-T6ZO8&~3~xarONAB&6|HkQNSn`lh_S>bww7P(Dx0GLBf8O*EV+Vq znCPn@sKP%MaRc}MHgc(c-K-XJSPQ|)1Yppr1Bc4p?O$YQHk=e|ZLp`Fp)Y_wEsETzzP0Q!!AL%f21MddIaSM%)h-#bW%s1P$0b&WNJ%$mA~c}B3)@N0_8C~i>xCq z_tSP%!X$3xr>|q0&6~91%)A`4`s3&5`j!1^@A6Me=tEh!sS56*{-O@0!HEYSzutZ~ zs@i4lz&4j>1|C5Us)|O?&a1B2h7CNH~HPc(7i{fLYFWX3L z{CMUg`b^J~aY9uMZ6Y(6%P%Xco=flUFzjycL@{!UqPSFLWbAwO0SPA-GmoZv z1Q>t==ALI=kE-iHg4&ngd6DSgv)=aj6Vpr}|8AM7RX!j5BZUy*k*VHyM^{K|LJ!np%A7<(v6w6z zw>vX~otUj8mLNQNooI}L-jLta{nFZ|NV-P{=!0#JAGU}M#?$Vs%>lw~?se)FI$%Z? zx}=KYIbQw+AauYu;^kx`yl6fpj3Kr-=0Mb@I?Ztc09D2N|KLkFzMbn)Jlu1E<0mK} zYK-XlwT<48lyl8B3~#%5XjuL&7)>xHt^C-gfh1W1qtBr5v`iF$#V1A#YbA~D4vE`42{ z&v`Lxl57`iP&JcCor2P##mY}4M6z8>rE5UAk1YLIbsD!nnhF9z-$$kqfR&<^LO#QcxI@gnDA<-MGJ#Va~2-g0R5yr~xmZu39_G8;kuv5v*hNPgVbtf>cZ zrUCuea$B#%*Z=_6PmAtO9I+&VTT`l#9ikfuG0dM4BITFZF1BFQ6k*n*i(}I{|2NTx z^+nc&vr%~y^WouwCz>i3UPy_bM(>xbR&_Tn@(aodu3bblOflc_E&&Ekt{+vF8It^a z$rmR7Isg^j$R3nIkfRZv+K79=7+7~LdHTv0POp;*X(XvEt6G86$F(Hm$V6@{X>2l_ zP-kRARU7__JSiQS8RQv?oP5juyc$!3mva~2#vJ~6_Ml|HY5Wp-UGxjtQzCYyEnHUjCR zkTQD&jpKkL8rUY-D~d)e#CwDoQ13(rKbB^>7v*mefnFNFQmse_LLDsW%vtES;v9~q zX&tT$l(ktCBJPyRxNA(m%`TP?I?ke{9PK!~y8gL~33qjVhh*_lMQ&g9QzdyjaB)M2 z`b969YP7hqS1=$T9A{JMfz86^`sW-a?x=An?L23v8{BZH;R)^ zSq|jjl0s5vaLNQ^w&&FK!2%hHE>)0l3P;-Cnh!%LO8X-d{(=%`geFg_T_xl1UY2(f0@nm`V8;SwJTSelc8}G6R(5U` zmn`Cqw!F{yYrLcX*L7X$;bzmR4ehgLnl^$U`6(RJJ0hoy-?oIR%%~n#7#x`4gf*3g zDJiW>7H!*xl(CuRx6;a1w*trk*MsZN`FFtNkmAI(g#Z>G>vCdSOuS?!jczW1(27w% zcf1Mj?+WTVim0F$w>w!sqPyh?5-H*!gooVgCpmHeAcI-rY54g)E(#dFe0<7GI{?3i zkj#IQV^y6!ad9QlBrH#-^Y>~073}<6w)RSB7-CZk#T*W;@I!ZBlCYK4Z0ox~-yO|N zW`?Mfg)NbgQr3jga9dar=Ug2%Hf;~yE3<pb;ov_ zV=J&$$$MeGbx1u*-c9>jNdQB@_BXzgStV!&0K=8Uf+^gFi^vlN((WIR?6KI};WVQA z9><=X@EX#lZgo^hx<8SmYhYb&WERRme!q;dbZj#Y(;JILujYXYx&X#BlHaAC{^So@ zc@gh|DnHz&on9CoFl%1?ev``ND9y(43-B}d0L1P>T~+XY&SgyI@NqCgqe?C;w?F!4 z-cmu#R?B7Vc;v4I7Q*OygU}Ldvo)4j8zHR&_TA_7_PXi(hC>Cnayd#=@?sraB(@4I zwbIw!U<*DjFLjKR%RT0^;;X5Sp;)S5OV>(ka_2XJ>64bj2iuB7y5)e?mL~=S%jWB5 z4wFA~IHvHcv0EAfXFb_)bDwd=c-_|S_pIMpv&lKu%>Qe0PSiW7kM8{{pnK!*e^F{OIo~f0+wjFpqrPX(8F{gZD4kKq$uJwo)45BzrPN>`b^*=ddU+k zYB$%f3z&jt!E_xmPRRf^$C8Ziql?b(6HU;4JJ1J{0Qo;kMWDk!s+4+1(Na3=3*J%m zMNk}xImMBQJ6TMIktQV*z%k$Cn@J=7w_k|2LqinAp-*8Edl!U;CAvppGba8N$2-R& zslD&{*~N$IC&1X50<%AotCbvYULiFOh>7~x3-CDjI5{6DQU7V)^i{ub%43t&F-?g! zwgobCx4W504O8P7#^it$^Cx^_t`7SQePU$)KG8P;LlR5~!TB9gJ;O9k1skCX8SPc} zzu}y%ID%Pm$m8%S0thnlzCgRuKpDo>c^xQZSQP6KKkQ!!8x24_!(KpoV zGWE85R=?&9-=37u&bU27K0$4@ZTvC@A6B@kcv}}9L_M~wiI;GrKp0{OJ=am;lN1_X z7iem?U*JtUqgp|g~Rd$v?i6gBek1!iQASzMOxor!#9mgJ&$2)?m@+61l9cY z*=m!ipG?c2TF%OlioK)=8{uY$)_4~!hRj>68P4Xe#^5~7JoYr2abEEAxGUUG-;SCf zf&K(Q#f-yn$b2Q2#e}t7;Zn}xPVGm*5w`QfSoa{^+Ddq~{8+kN+Q-V`kt5@78dPX( zN8EiQ91!zdYMsDq&A_9T$LllRpLKWQNtnv-uDg*i5(@ir7La@nj@X# z_MbSidFJK&!+urk-o#fwL8^FIJtNIvWCq;Ov19u!HU1$0Og zLC=1?XUy5C#hP=`|C}o^Bs^W{pCNQqa4P6ZdUqJs1<9EEp~R!d@?o#It@V0}8}%J8 z%$I-BB3}Rz+0cokK!gD@tgOIw-0^D0>$ef&X&qE4)?=$51YQfJfM}=>p~3+1s>rp; zw{B$}$p>DGB|bc0PTR65vu1?0+-eb};B<0p?1)5z4i_u8)p%0{nMG7;X5JE#P%}eq znk6k}EqVsiB<9!X!xfh?s17awYXa&*NB@HaWM9?9Tv%C6rU&dE>cw;D<#zC&V+iAw`&pL zn@E9)QD5>pAu?6&m3dGokZiY;$v@$jD*clI;mhf0x7EFJ|Kc`cDll|~0IKQDT2K?E zcp7fy?T4fl0glB|WHD!1YtmyoRE$;E0xOCvnkG*kc7&GW=pI%ljItvo3e?V?1C}aT zK@A3B12|pjX^iQfa+@8u_Zl;z;@He#mCczwHbD@eWj}v~Nh0(Xq_CXiaZ27le;9&A zaRCfWp)}ltqoCMN&5UT&p5fjEkA@Ta^nOuRs})v}Zn@N1+o>m|=HcGf4Ulm#7_^R~ z4B7ECA2UPA`IPDpk{MjO{lvcvG33IL99gnfjBIos=f6Iu&$po*wP#cuHXV-ygyh}p z<<&Gt>!xFobOZ7b*4rPiDF`Zsce`-B6Tmzf1hc}fC6BGjt8{&gy(|NpqnZTobR~Fj z2n)rRHN{En6d$IU8Xmc}L_6^JI6MJ?ws=@swqn@LQMNK{jGoYS)!_#}?3+!I-mVv( zJ+qE`x=hL+TNI_%<-^EJNkn@oP}B{~#Sd;5kUU!G&gifd`;5;#+;~2>tAFTc&U<>2#+KeNvxGDh5Y@^mhJ1QK97OD^m~ z`=~q#KaT;_RutBGz|_-B4OQ1?J}r*}@Zm1zo>gk$I5@)nENeQ?d|9>gnREzCajxhu zgmBxQJ+tBUL1I|aVxrZ+Mw^YOFA>55i-{ylx?cBT=)xNoLi*d2`hVE#mW!Grmud*?-! zM>l>wZ@U@!tc^f2%5L`Lo-5xABMCP*=y`$L7@ZC~iG8br0R?7B3KP$mjxD5Qb)eiP zasnPQZC5~~j12$^Oal`T-(Hz^)F6a=IqX-um&J0)AmO&PJBQQ;mBt_w=fF8!u z8}*9;urXxy2)n?*jgE~H)PXp9%w1{A)*mxammm&0y@>#B%Bb;Zbd`~5?^i`2ZuVgU6OVWofrF(CJKHE`bLo6UL1JVZ5S`UWKO!$J)&1j4ePLQO-# zbI;x<961mSEAtxI7l~(^Dn-2_K!j)ayyuvG&m-Rvym27ox*JC|6IlmGfTn}Y$2XF5 zZGC*$13wBoiXEU^g5+?+*)d7zOJV+odKD6NYwLioCh)%r_%iJ!2F+-w?DE{myu6|V zZu?Jcp=_*beDWL#Hm)TTIVnh$B6V2HAzw0j?kVEu{gcSazFxWb5z;YrUT?DHc^3zN zv;J`MM&F-^Nz&JI{JZ(V|Ans&!XWSIqD~Z6W*g$%HF`T?hjK%xJ)JmDEl+`>7{i1#anazU5R(7E`SzSYCS2P6~r@N z#*AvYy5wl&5y+vTl+w;q<02?tD64%X8c6nZMppue9xyEshtrbDb^LA{caB>5?6(+9 z`cu{@q$em(5s(l>VpSY&!6hzbh{U94Jn@Z!idg>zUtIBc_5otiY8%wQkbDeKDz{p; zFo3f(8x4B1U{4-nAhHQDE5-@*H5`8y|?Pp96J(fBN$AaVV_-XO$s z&U6tse{Bk`m<&74KrXQn=wc^~DruDoWC)4vWQ6ryDJW34PpED4YZK#R=O}Lzm{x0C z0J8vn%9UiuGifcF)=o@r7!FA`Uh{mDq?A))jw`zi!81U_773qx$-9NVx)q#Tg|-C| zVWxCSH($ZL`f!HJQ1<`HaZF&@M3^K{j&B^W;)n0eP*3=Pa3m`3FUu|amv>rJXbnWk`JnLTFA z?@S5*M=J#~_~GhpJ8_(cI&?H*KPA%{J`=W{EKsZ*ejkNN+f&Zb`&7D8Ckcyu2Qzg~ z)%)xOx}KW_hk*GRlzW=P3N#QnB}Aje&p=)aj_#uAv;zKur!` zO3#V{3_4SZOYEvLa?8BxGcU!jTtbQZ$6oSGJRDe%&?zCLS|d!67hPv;<-<(}JXm=f zMld*WT=`kqudG{V*qQH3g-7^2+-Sb8Ps?~aFptraC&ijgWLZ7dru~aNH(Ux2Rw^UV zn6Lm;S1v_)w$B7L!O2qD)U-NooKryx-|EI;mXr$%YVhMHeEi`RY&#Poqz?4+ryG}W zw>(^ZgT@>`DBGrn?dRQ)%D2Ki{sThu^>Jh9+OU1mAOT9z`M>(_Ilqr-fh+-(Ww2T5WU*w9B?!p(SiaRLE(FTD@5JSYvb$w)9qnEM`%GqO_Aa2h z_|EfezAHEoMvGYB5$dQpN4-t0?>~FfwGOq=ByUk;FDvc23Su`pY=~tVNg5VZoU1~q zPEF}qFwJn)b%IAW+XzIj7W{0NE0;V|-S3~$32l}hY>c>otdT-ovu`|=-$#%}**2@= zz`tkNmVqJo8*KHlvdSTS#k({wVmLP#gH2^8x1$28#3uGtdTYBpbcmY@{!g7E30*dL0woiN8D#kTW;U05@bWbQ{}b$MthTuW zdGjv+YaPJs@9_kLJh`7mDS8%H)U1r6bnxW)lNu?vV(}%>5{^m?R;pp5%ZkNCV~)j5bb_MFlO!X}&ve?S7`}ur%@%*N z=HifQ@3B;oWM!fD39-rLMl%H7%6o-)tK5;?Md`)M<^)aBm$0ofZ_VWO(&w23JxkD4 zgnu#QG`f$BT$m&|@C3HRC|5|HXwvTo2w^icFtFPmynE4)ib>+=&nn+byAm24Z*?=d zD=QglXs(1Cp;)5-Ciyc#N;t!CZ=z{os}06T7IzN*05s}XzHF1V)7vzeILqYs#5uco zbPSbC$e#&tg#0-lns3hfZb0w@lQU&aFeH7kc2T|T&cA98s$hQ_&jYt@tX?YgiBwT; zWT44XD8&>lNs=8(hRPE_;f4W=vZ_wI7G<_MrbvlD`EQhk%!Ry6sfnm8TC0`Pv1ci6 z8RfJx%8Qm)P1({`z!|z+E|IVt*3gvzML@d0j$InUSlZlaO){0S5fbGXW${3a@y|Ve zj;WZ#-34T(f91coVr=@*FBICBQ?ysIE8_UaWla*5UXmz%tx7nclG$j8*p=AOd+)Y_ zS|8b=A2sZ9(Ur1k07OraBJy!(; zpmEYnwS4l~7P@9CFSAViF$F9K>%+D=uRq|N{R-TfO5}6atw-YkIgbK|xXW^C%t@DW z_jPXVid!-((wX&iU@+rh2%l>A=KoT7zHGtDLqN3BlLSwqHd1y2;4Nwz4m6JAkaG8f zQieGah`1Wal!CEutCU>iI{3Sad@EJ(&7fzgRV?B*%Iv%pdR&6NfWvbv&`a1Mh>};E z7*_&2#vwA^=p}*58=MHJowkri3n&ep5#B3d=O^s!R@s+iR3O4m7oHo7;&XYdJxc<> ztPuvFHK=bff6bH7L|N71B%={HGqO}W*JLmnlu}Tp7J*PpUi=KX{c$|p)^)+{g=gFr z0U0=%BJ{x{Xz|`7rdL9M>VBfb(vMN``*iy2Tth0OSd_ZkCkyaHsXrx#^2ZkvC8VVX zwnEU%Fn_0q)>QxKlM`rLC?zXLLTVU1Ypbx~4@Q_T`%lUH**1!u|aXo3PO%`)@Uzs#eyg& zniBqcLoV-IHWtLe@Mmy$G^)zEa+IxL936l8TtC9*#}=^S3LV7`a+l=^d^Xub0IKzx zexsO|Ji9K#Sj2@gLF9Z*?pXNbl#PkB&#=_ukSmoceVx`ChCo!@G=N}vi7S4QA#0+L zZN=2~_doFucGm5e>{uw5E!q&#J3vUnawdwy2?g;s8vzK@q1;a6S``mHh~-M))S70G z-OYH21ioGWKm*-~#-rcximtyqKVbEhaan>bKfTED;X<4{n*A8o7$>!f@{a4ApAr(Y z-@I<*_u1__iMoB97UFn*y$Ucx<${gPCltx1Xz8VnJfSoi>42-MdP4@{R4r%I3r@ll z%&RSP&(`*CyZfEFH=P+TMZQtI=u%nuX;Vv$^~sBt4o7ex?`MJzuwMoJqwe4slpXlX z<6*ds3nV|J24|3XlPvZCpdIBz0SSFHTj!X6&u%F3x<7t))MF7)3KP2Y68ydt3+#xm z-`dDr-FjqDQia`|I-tcgIZN`XNtw7Te~hLV&*z!jppSlb^@{W3?{+cC>_p=s%Ae8C z247il8L@qUmJOjv6oB`8smkKPhI~()y^WZ+E+5<-lpO$Nmmz-H4l$O zAVDgnadG`0*m`O1x>}$>XPE$np$;G38E0#o1fgV}1$01fxNQsQy?!9*5_zcT^~d!y zPzmHR_!wfyYmsdF33xLXl0$t8N|E$yvdgqJGcjwjT+`f#Xv;zd2*Q$*PHtd8l&HYm zm^5@>Pc;+TG!&8)dL5HPKN{}OkWK~zBqa$W1)-G*8AX#gTF@Qt0icqC#5EB4j9a52 zS-0G4V$)*5HoRp1;<#i}_?08&Ow$>f6pQ-1K$f&A&;hgk$C`~@w@Cd}PljkBo*Q~{ z8HL1%>KQm&+4XuWH!;V%`i9P{gQgfYQH)KY3IgeEFCXT#JMZ3S5m;&Snl#Xnl_?=t zW{{-^5vK`n6fXyCVFX-s!A4OFL~Oeqrh6jMvab@k}Uiu&~Yq+W41Bsf9!VhNY#SN#jtq@*7puX!@IxrCj*Me%LLN=m@jT_dW z;g6;Yve3D8PVg=n`4qK{!rA3>Q2&s42h_q2NHsd{TZxjG3D^x()+Gq3En*zp4j)dX z8IP>_5DFi)n=^FO2e@|EL>BNhS+cLat=2fE+7D;aS4ma*?hvW9ah3YH<&(1(AG-#c zxF?dEYYr$ECRmQb&V^;z;5>%a4nv)4iTJX75i^TUgg=2GCl!?RD2guzc($DpUOh;@Hv?W`He~fF_cjE%mO9nsX^eh?F+bUiyG+H?}u+d;V21!4fkO^k1-@ zTKcF0(1aA79SHlzGXSX`Y9JY z{^&S2*(OV*UU!LYu@2aX0rR3(=f~amZ6))%*e40SC~mF;=|i(oJyo0TjzSo!4d=b> zbhTRgZh|K)*WY}$rZR40+UjaT!kCYT-P9hueG+1|D5~2|8|8%Nh!8lJG<8~;t}Pt* zwmC;A<6LTHCFtCq2Nh{E{ZX(V#JU7y9Tq2B^@>KoP$)6e)p_H3E1CaO1a*y+_l;!eh5t`B$NQXw3rK$4VT}iGT zeULj4f`I5&>%u=WSlu+FCl!$Y?KW;qm7cOc{4i z=GHt*o$s$gM|*loEXP(~_XF{KKIhIZ$UgYML~;ONLl8Ksd*&t9Kq395M_dy1OKqU% z(^=z?w%d+r-RuRFH)s}cm4i}izeZ(nshf`?MgGmOPIz;R-+omi9RFSmt;SA6Zh;#T zBw;1jyqd33I}UOXWHpkHBklkW)Uo}Dwa$8^VWdpcZ1wk^qm*&Wek+MSjF zsj1KT+KfT17?W{i1&rMl?ZJxQm%0KIGn$Nb*~eH~rgXAi9GD>4Cz8fd^A zUBD0CVVI&->!Jp{IIB7sCx*(%`nZLGeOxRVE@8-<&UsyD9YS4j`V?RwpgwDDDFf90 z(%>rC;UOI9(oSXLMH2z^7D8|LP9CzIch(83=;T9TxMOSaTUcyBFS~U7z&eNVy&&s~c$-3|1SOr$eGBovNTbJHsXphUFHGe? z9(Hs#2?OYPCY>$SXQcDJ)AF|#xFDvbMM#5*iHv(zeEKYI!~zkRysL^u5vOkK6$W-= zJC-aQO58}2tWRuu>IDQIg_w+?qlnzu9ZdlOySq0^D!p?3*nxBs)b70Yy|=o@+QN@-Udu02#VzjbFj}H77b{I;FcPo)JddGY=_)HZX#iDHUkUiRi z(CCR6LX{VjI zFzoCKE5cGc#)fn-_ibIO`p|A&e*Y#nZT340jcQiUYJi3YfY$^j-6nj9o6A35(G4vP zj$=DX)0<_73;=1>_+?@Ff90rUhmO*i>N6hGN6t%f?JnV@f-M7S6MMZu zlsuj^Bv81Xwxs=2(@nV!B(}Kn3Wemfn0s%2maS;@qf@S1feb02YfQVU(qp@IX{UhaL8#6$oJy@kN2md#d%H!) zHq9@fT79b1jEF-;*VI)M)e|Ud_6sNcvbBb;D?F&x4~Y|L0N5yr59>Mk+%h)~K{M!s zWDs%b$Bca0-w>y6uB>8UiRZOtyOt*O%zYBAze9G>Ev(-91KcBoL>X3GA>z$JPpL1Y zg5ZAF-06`@bXgDc$m`qGh;4i&OilQ9RGYG}NS>&Ki?@iXo+p2|>QX6rYwpe4byuc)LZfnrkeXV9t0xc;;qR40ZJBrUopH(TV3L{mEAJv+hRz0)boz>I0IgjMfb> zPJ21-4P8FloUBBXdV|60RC#vIpo0cx5sKl86JBA~(3e4>t|cRT12h}G*!Rm1S?S!P zBKQCf{C5sr>+9|Cu9jOC^Z^3~=2~XKO{K{+vUV@UI#t7O`<97-oa!Ia?$0Ul|Pk(`fy=o`lo=!lam3Fqq9DjK?9RDZ2XJWG@AR7T2fl zdh+2eMkyFCvofXas-?*cdfVrscb)~MV9C$L=|#)#toP;NuOMe|FRd9%xb=a@=F4v9 zNlFhBFQAI(zH6LVZfQo7O;*?L?^ypnh7>0LN~(kRO699`lgRBObZYlj{;gfWKA};w zOy7q_pEHi@l*qh9>@mA*i_={LtuMt}=3~CNY!JcrPR?=-gi%Q#VB}bPMuI`O3tU7; z@D;_6&wXQB{FJri%M&a`j~hg)hldctXqA-n;@OB-1wLUg@nYF4fw~eTg2nVw~)8pucPoK&yq^gh7GMV4Vts8TO5`_ zY5XFb`^El&yP?f|25$nxUzzLE5QOyPnWCyAuYw*2yFAK*C?Fn;nw(PUcY=AE7P@r{=a_2Vn_5s8iDxu#-vJ?TpG(71+ocK4I`lyb_$)($ zK{~>-QXS`zPE?pTkyEckGlLh@u?zwvXYQX87|SFXAflB4DfQ}q@w9FE*INydp=F=Z z0hE>OujS8jXqembfEEAtTUOaQVBuF84erMPsuvBS9Fu3;r7(B3;1QCRy%E%s8VQOiWpcYRX-l)?K_%B`1;WI6Jj(C^3=Hxhywto#ADxvsR zJ$0FDVo8=IKeAo2&xa%rf?hRP{mqHJ#_yv70nNVs340wrDv`e(i(y4sDb5O66k!J( zva_*JzK?gB&o?(Cg`%@eS_JFt0F-{ENurc7Txt$$*0jJ#z?8qm(U-4<37+L_z&gH2 z4fpUMBW9k-%V6LPFS(v3d-Xg9+&n*?u?KL{=j|)eczG04a|_|l%ZVB9PmLr{2zq_~3UV^X#&T2~TbGyygaQEN;X&6Z$6Q*a zm&XruC-psqhVJ)^slRc|f#9*}$dv^)d44zq5KQqAs)NyFU|ou#Zv!c!t8&vMB{IO8++$(Nlr>HA5|ORwRct%k0i zhzq*G?j9K~(sucoL?cNcS-+snsOrq+6I9((u7@*G$$>H@*>e`PeLnWK9761rD^!5c z^3+p#zHl?oDD4>ui|jiqVtjpDvobDfi@dkFUMCju`WKK*Rm>{~`A6z^({*x7se0O5 zMv;}khN%g-4d+Wxt(tGxC=7RqQVx+aK*8;mPlhlZtfJ|Q@`n8Nmw}?-5DydEQeE`r zZRaB1D|T2PZOj_to4FeSL$pVGXW9nJjocJFNQRyudfJGZ&*Iudq87j1km;{(^XZi{ z(?s6I3#qHN>*h>prWN<~jEEcS%$Xx)1;PKO+*Ss6uB{VkqT07FS>a8cRgI;Y8|G;M zh(YMed{>(yClUB~c0D>AkP`y0<+^t1c$$Xr17WnoBnSF~!DWZ;U4=Qk1OJNH~} zKVg>d;zgfTj7A(L4p6`!%(=9cRTHv2vo&e0h@t?o|I`H`EFr^*4=rqJNJOFl2r!4{3)PkW0O!QP>pG~k7+gCpOB5Qg?0Q`FfLe?** z@b@7>zN=I`v^St3!6e&6ei zn_>{fs;NSCA$Wp6m-qux2lVDl#ZRfht?eRw1(#%DOi|Fz%zrA`dA1cJ7CX_43_+sn z8$=sSn6E`S9{Febx^5a~6)6;&?ol^3*a z1*0@itcc|m3f=A?FIRM;_H7=So5k^3cZ+mlTE1HuyVz`Q9ne=8ZpI-MQl0Js$KeeR z0OKhAD-Fkm5Q_p@O$k<8mWV$d>fhpE!LTmJEM(i*r0K$NE)cz?Q?De zKmZ`H77_>jz+FMfvp6qzN@wYXv6nyZazB$@mM0?5KftAzz*|j%JPR6Sn`4U5pf}ie ztoCha; z8f-sivh6tgB&wDNQn|&E<&ETdBL&W?aou?(*{LZhn@`QK%nv$pWndt&hI@?ds}V0N zP)^UG&3W$@#667Dx5Kfj<%VM1m=k;?5w`tSVm)1l*U;vR1$VOUog!V*mpFsyf-07< zKRiBI&^|&T3?^2I?AM9JRD2}j6Tz}DdXu(%uV2JH< zohI5qs8rjCSk6X+-P_+$FSa8x`yGoNmz1`Nww|0|(AP^|@=33Vy%`*P&Ar%rdl!I= z%FkjKv__#{5%PR$hLwYFXWOIsDd@M<8Rcp>x?c)~mr5Nl51<*Pc+6O_s8V(n?ar+@ zey_^LQ_?2h17lY?@^$8f>8qhde!e=onh9U5a52Gyc+pF@7c0k0w(dd{-&zYnyea&d z^Q~0hn6m+bDhGu^{_4Trj~xzWnUd35k&Ei^XRAMV*sA<9pRLF0)$1{I{o&l91!4HG z*J%(HLw=VPl6y^4cjCK)9m2H|#s@1PF@6ZlHfEG@rAI$O-^-@$1f8BFGH)7Kr|EFG zy;z3fC_64Ebj%h-XQ2z$+UPf3w6{l1wa`8r*_z+A#XOWp4>*4PiC_+(tKeB=f%M$_zmaf0{&GcX2JH? z0;!iQu!6Dm!za7tj3LR=+HE*6k^{~^z^K-wv96QYbZ25*DZg-H2gMwvM2M0t{m%iPLb}qBYa+NCW z;2ZX(HM}@&Q|$7Irj2RY_16>C0u`canB`T9)IyVm7MG-GO4Qi7uc03w{Rm+Kew#>e zR-MWi^#8+4;^6l>j1`kliAISlPyU8$#g!*i;Hc=&)dc_&Xf)t1sWwXGvX-;(>INn2 z0y%{!k2WWLF$3@@Tja=o+8wRM%9fg;)>$ESd_i8jj!o6^cGnWop{G-GFF=HwttwdI zDH;tmp33uvHjdrMtVW_K33R(BP|_|?B;rm6Jlj8>W^o6?Ehfw!=ui-EhAha~Z&1hs z3gj}oEE;Nw&=%_V$)epnS-TowJwkXC*#6f)OPL<#1AW;Rh7ai<#R*Jj!BGF=q$L>t4y;pMP^zC0VW#Xcq&@L(54o2w5 zpA3t9uSavh0rRn%6LRC{@0e%`&se0=H}P1glv~fs9)w2ZYJjQwNT7K{h;XL~)Io~B zNNFz(vC8_x+zx>9j$}Hq;m;ON@KYnMP4EQ!s0-f17a0Qxx$4sKg*9rwYbzx<#(4Y-$6Z1$^F*QqlsZn%_EdF!_5(WV z1UBjMm(+yj?nuxJ&-vb`nHD1dUqJ`KiT|XWJvKTzRfEC68|YhHn3P()J?WZelyf7O zI=!YcSAl+48=%v@=Q@ObBZ}5PipV3+Vh&A@T`o7`@XMj_d(y;SY;F6^zk>w^)-!Lw zqX`@H3tQUJQ?uS}M&?g8bWJUw{K8MG;>jOgLLTBtCMuc`k`S$SHpc#XP4*!=xEU}1 z6N&EOozhxdZ&qy9& z$BkGGIsBIjS9kv{`5^R6V%A_i*w>~bQmD5J+Pw92Pwua*heLF zaOO_UX=oDg_LKled5?l-;8wRVq7oN*CJf>DlI!~ry$ry69AL(i2ff0Hgo7Mk)+s_# zaS^5DQk|9$U@bLWmgaBjSK$Y56B9F9In+}jxC3u%O=0(p+147(uM|=FsCpX`z&K}a z0AF|#7YuRPj+h2m!EqYiWFGppx^0wrfRHXV!XU2Oa=8!Hoi|`S8s>pYeYZL5%>$~%Sd2cyK)RhIucKz)%##nun?;2n_*%#;;q#yQ-E)rIwy|fa! z7;BG}D-q`O@rG#cWTV-9**f`JP5&7)3hd$&y@oAIzMuqL!y#RloS#O{vCQW0>|NGQ zMmd(0yAvo`m4E)@1J*O2L|gXQm(xSg^WaC16?aCsECQaj-u~wrC>J~Me{WZ73Wz!y z;n)b|f+Bv{le~`cu0U-Q<}1lHq@pZ4Ro1N|0PcIuxk|F$HTSw9Z?YMHImSNJ7ouhF z`MjxOnF5q9&HjI{F3~p|WF|sHbKIKPpPr8SPs{qpBBmg!qijy+P_8TdXTv8|WmGow zutt9U#eJ-^0&8zLJqP>%*@(l~0M|2-A^<8>8S?{aT6Yo-INt&?iYfcl5syFo?iGUq#VBC~IryT*kNTV^9D;3bwD}v#`GLO)VYnB(SPQ zXEjybbKSl^Ce^#6*gE4zf>Oa}f0Os&m-Z{{n~BBnR9HWjmEs!aSiage@4vq=yF9Wm z$fZN{B0MsGbcr}XU(mTLSdLsKL}Gu1W&%9$RMTsrmC8+?f_&nA185ipj}SoT6h@SP z-3AQ2-$WA5Vi-Nz?(IiuaJplz^jzs+91D?%;_EYe8ZVA?>2L{GME60R^4u6WUQPmK zJ$-iA?Orwz60%^u-lon!A{z=&Lt!O-wfePXLLJul5a^5!t2+r5Ac)v!r9lB1;S@)thh0iJyS7|A;U9{ObXo_pjp zh(z^7uzdjQ&XjD{`c1Y*c#^ zMw~HYAcoB8-F;`(5b+G{HyEr23Y-BW&Eo~{M~V(C`1f&6gK&Kb1B3Mdnan0NaTQD!~%M3eT&CTrO^P?IChVK>UokD-n#mo<`g^-7d>4 z6d?54ndtRpnSXf82pan&0#O*UNV ziE5)Wj`ee!3H%)D{K*R(u|3a7Brd@i=44tiYgJ2&KZwN7W-bD{F}fUj)t!N-7I1#} zPzzTP)E_oh@qD(MAf5OX2WWg|niE*(o#f-~0fl`FUaLHQ%-Ozd|UMg}CX+&4GT z(+>F9za}D6vqIlC=A=lDrjCTw^ZxLlewf~$Hl`M~I9ZHJsU3Tr!}1;FGS$TNweV_KRoloxY2c5= z23f3Fz+(O*uNK?q3M}k}hOFQiIec0K<5r37fCP{sWr$YBwy&o(ELthU`ueV}`OBH$ zco2#2wofjDv*}ZyZ19k^L*E}A<^Fq~0(-FUZ{YN@Jk zkW@t#x$yzYr{POSxX&ci41ygvf znc4TW;&-~8*B zp09eQuXOy&@@HG-8}g`RlKH`S5kOo?E!-R4*Y|o#%aLSuZpb5i{;a!qs5T%Fq2;g{ z1#mK^WJ&cbhpKfPS%Y5=1F6%Lc(0^+bmI~Oo6;A~2C}%L3}Gs2Rpfh**EV~Giq<8W zHDj?EQ`0x0S0Sama8TOAq!-{slg)5(JUzWTl;_*?{O8_Z?4~>ry`EIgu#7i`f5e-e z%%WfuQ3_7aQoZ)dHUm$iheKn1RV@ukJEFct9fJysjp|d zv2c_GFPM*OA<4qexRg$>Fh#HgsMEqek9KYJskQL3jj)YgBn*7l>%DHI88Ns6M5!3Z|HAJk z;)f>%We{OFuaWQYIS&l4ar#Z7`l$`B(`C?Y@Y}earMyYWR)R1n7vyM{HNXi9baI6X zsiPIQtOYOebkNtf-_0Gb*zfR%-4j*8qnM+Kvem1#dB(y%Oc9Jr84z##0-|Id-#}R) zi}EWR&6HjRd`*|35DI2`XFCxy$ZIVxeZIA2Sz>I{nEmb~ed4F@)jrfB*5rJTn-*=e z3c*+HvX*zSt_O$mrv$Ss8PAV1Mrje|`Y<^c@nk|!oSnr4PBFqx>~BkIb?tRhjb&jb z$gdK#&Ogz0Gk!^G+S$+5=keGQee?73km`?7bYA_2J86FE$1m}ow|^B8V}%D9+8m5~ zTd(Pa;ALtg0+&81{-aLYx^Ge0H^pwP$O*eU|Auu~7-Q44h0T;x-@@&wyhm6I%q#C* zjq-v`({_`BiDdg3y2~2-TZ~aAqJ8?~Hzz=lW9lW7ma!yUadK}>D*1*OH7uKoAG^f_ zi0XRdhe{5E={?;o$WAJErj$Z;wGZ)Yp#Fn=&e;a}rY}0ZqjOotU4Gum{Z8FGM51QF zjwH3c1N8IOv`a(=P#hU$FKau7#9sTNNiSZZOde;@8!gQ0h>V0$X>s8S99oWr++Ay; z+Pp>3b5XB#{ESGb_=SOeRZFup#EtnazZo#`+qjP_dRA3vO`O$a@v1|ai0G;Mv@7Je zK{j(_`-o;*K?SRUdU5W$U(gG1(oNkntPjS)m))U`o~7Mw=#|oRo_S3#PH76&L2oon z4X%W)Uh&^xORi395{Wjze7UFsBE()5vQFSOrqHlffoVim#QIg(R@F=kEz7#}(d}>K z2QVd)=b-#Z9(n?B$zI~ira!-Pm5gUy{Lt(miB(`_Pxg7*Vh+;C%XF#D2&MKfYG9fn zLTSx0*JCQEML^x$A|g9w0PeskCV;DcUhE#{$E@!0YHWGa@Ri&TIDGU+P;xxz+iKSdxs{74Wh3~wNVAX;U*Vij(pLq z_74rg77m;(WSV_qMt@SK^=*5*$dNg>5wE>Pn03{tf(Jyr4Z!J|Re-R(A3p@L0tnC* z4jtSpw{3)Y5e63(ze0?Zm>xTA)jtIX+vBa>~f$scdq+WA!a zSp8me4VA;kD)92c+> z54SIv=a;+48V`hSlxpINd5t`&SjptGNqxn(vs#WTq+3d&f;)sTj;R@fHa~DlF|%9A z#{%}Zs1|D&R}P9&??g18I8e!h1;i_mu!b`OgvdMMdO-3H;hj*q@T!#zplU(5eu~i7 zoz0BjVF@*o_Du1yzd`UkvA#_s5XEs8R{BEY0Gs6tln!D8;IVJIMyj^ zw$1Sx*0^(9wPaG;<2NrY&mu_D3GkqyKxd&a_GHb9EEL29Ju0%Jge-gi!{)9Zbl&2d z!&&p8DeaGr&?sjU6y06$!5on-#3^``IqeERoJNgE#yij{Mmjq7~o zb+he4UxmsbHV<&o7W)zsdb z&qS)=?d@YY_ImUGt+4^79&6st(&5`40WTJ`|Z zBcSmhE-Y04;9tA_CxOc_RO4mU4`S81py1+3<5X$5R#l#NEnjz3&P?zdF7kVs5#Its zfmMU{tPYAaEEv$qS|1E+TATI5URC)e#j!)hFZx^d_XnWOwEOUAez&|PHb{%IPr}>S zcL;D2cR6NvA#`I;+sXfLRH2Q3(Yfl$gWoxv&-PWI9D~S<#_<8KXy9_auP;{_`&)Uk zvuwa(%~%9_$+n+9EN#}MiPI_K(h}Ew`9w3jjP7)ab6Y3Sf(?bMuklm5=q)H=mgHTH zk#Jhm$MhI)iwtFQRwzOuH<|qmXtqn`+k-?UD$%HxFBXe;JjqgpI5tL7HC+$Vwc?S8 z<1fMX0`(rEzECHyQ7{UE*Z6#mBSL})d+hQrsMVem9sSC`}*B9j{tWE%lrAyPsnx0A$$z6##ETZyI&Py-cHz ze~F0Qi!#nG-`t-zXp?AT-E|o30lE0#ucuWlpW|25K)~L{xTF*WN>l9DOw00S><(PCGV2wy9iA5xadO{F%*@FEpfl0vpr!W~WH-nQ$XD6Gki@PcETYri zofCMHL5km@I;$^DhGA=w^>C&^tWgX;T{Q}IFt|=i3(!zYCT}Gr!On}PBU1Mh$&~F< zh9GJswPz11K~(Z_;~B_Np`RY3XOIAn1!OSc@%Tj$YWFtd4KbTlmHE;f#24K=wEcI< ztcp=TxkIbHfAKig0VfPw-}-Y@BF(l87HY!}|JLLWKC^=J96z{#EHF%bbW;`x4%O3p zdDm~8Jyw)2PQ-4q0fZug(=2Uh-4A?!3z3JJVig|D_|)!V#MY|uZl6GL{RPc_EYu?< zSV*R||4R0b)?m4b5y%9(v&!XM=d$x?iN&v^1*zLI3@ zSym}jfT}kuTREMz88)Rk$JbJUtZ?PUx+Wi$i*$Isdb{sZQ8Xy1m@pd3Lx$5K;F?_n z+rexvKV$RU2IJ;@O?5366pc9rnWY9{RyH(X@mN;039P)FnL^f|p_&}mQ+LU^@^hj8 zFJmdS8~`KuEgGpF>qIO1Rt>n?-A_6} zhC8X!+mEPN=@(KDfW+cE`qOf?+gc^!IYGC03gltIj+gZA2tw6G+`2AmXI^X1)z+g53IDa#+1|%!VmvUu@oix7Tm?H+D2iaYR1HiW3{U9; z8_gMTX-q9-t{y|TZ-hVuvltkTG^Nqp( zW#f`TE*3^p88Axe!!v1poD}!%`fE^WpLM2K63rXqw##vi)l6-qDkWo<7jT_!uV1(r z{5fd)KT<7IGsk5iE&Ewz>@Yik{ydqy(x%|Ogxi0U*OkEy_ZGEa+#v&mbLec4w_Xm_ zD!!@M6!Ww!rp}Gs8Z1cbH`*Otzc|#MIFAJhQ~5N^`ctG&Px8Hf34{_!UKw>8a@Ef>pfz%eGtG|IL#Q}pI z_hBuwG|1~83eA*)0BepRRL(W*<>gdz_2Svf#ILqaj_udYNI zO2(>b-zaY2nDLAR(AwGnF|A=WTsuneuSK!)uZo-dm1E($9&=L@L{`>9ZK$qcjo2tZu+|lw<^C zC<|#69mOT?z>l3foGOTaj(LFHx7#^7;QE$n5yQhMUQYPWAs3hkS+geqfj~7h)h!cU z!X|eFk)e}LI+r7bI==nU&i+rfcyndD;|NVOUoBccc!5|l{GuL$S*z3IN*O?_`f@{0 z0$7Bam4x!cIm=U;nlD2STo~FKs$jG=#|wCD_|u1S@qrGdJ4T?$V{y_8=}k2O)E*&u zW`KMB2zaaIF!IMLIY%_d^&}9^nwwW!8t%}6J$e#J$<8nde9qyD6r*^boLW4r&1^1* zSEu;twKVcxdfXjQLqa2)P&%yZtdwS%Nzcog%&0E#+qa*vOO(R6idx)iz#Ay@Gwqt` zO(rJ1Usszf!<_~gmSOU!L{~2z=ayoHo<(p%_Sb>MOd3O0;qfD3gd%U=H105UemE?a z9k$G&?{zrcr60PWi@odxG?!>o+DTx9g?$izZX94aHO*q$(>goH;SOE!%){IjnFxQQ zj7bP1{H5@{NjKjsbW&bm+;ZvtR2r>n&RoCZ|>NpuiruSD|loh>7Mk- z5;gaz!=!0#RL)NHk``94^@pr>&`%M`x?n9kQ&0O zV@=58r}KgU*Xl<%;Z!T_Tm6!!bu#ULWCPk#Cf||m+N(~5g3S`z_!IvQ&2>avX!08e zdn>iyVB-N*m;n0*y5xx|HM4Soy`3q^Y9k2ewXQ3Qyvk%I)_iyFgc1&LO&gzga$iY8 z5SP5B&$^3yqHN<)R7QqFEoy$ydYL2yuu|C`@^Q7rUQXSfu>8J3jaAD8JpncXZ$|=r z;QU{q%{kfc0GX0tmb}P08-3Dv@5Aqu5EK)i1+7MSliV~!LB%%ZkUJH(T!BwzT2KY{_zi>v$ETJ}g31#wpq;IS*TM9+`= zFap=1^tz;xBtE)22}D9V2kq$29Tg~%6aL!`|0DX>&rqFDti6UO(hl(6k@ZI_tf$-& z%yGP$Msi=VnsGOe%e!89*xmmDnuSTu<2^cZqLWS^5Z}`qV&(P&@}>KK#)kMGJj(_zZ2;QVkDbT@-*RF>#&E7zg%O~+e1%VC!y zXQ{2r@5yjQB$X(6Jgm1>l{W`|_;Z#L-2j`Jo!pL^Fr0Lf=-w(c1g^ts#8XDxOYUU$ zm{IuOw;y6JgCX;DH-lcPn2o|W5r`&suyjtX4?)qTbG_OEZn729Rph3ky6Rup+F1R~ zUg79_)!Z0q<5}p)Vq_u$d-P-T#>+%Ss@?wa4tBx1YXBYh*K#urO^p(Oi^p3Q3(}(h z+h<8(qMY5Q083J5=P}~^IS}T&#+3QgFL6vYFMgbz8}JDxg6Y-T!`0-NS~W!9Fyrhy z%C=Q##E@aZxIYdZbvo2Ps1sGy8EdDa_&`bTFVJ^DUvFy_7-i3X{YOv@R zs|#rCVgCay%vTU(Twlw&e}^vD>qK3{x~%UtaPC|xY|71y31$}3SVPV$D=e9c#rKA4f@vtw$6+tRV6J|e33NlmXh)!ODFgQ~#}8ft51Mxh5?o zlw*HZyv7PZuL(vL%wxT7$NuniZ8Dos)uNe98K@@|@6EEp|lx0ajgeTJ8H7~dx zE+wT8dj>*M5CN;scEZLin#X-kR|ir6FV`-Jj>o-g^9V=pgRv#`4mrhazUcl-0kGvb z#a)b;fdSZ7KE|>wZ_sSIqW*oJlpSoo-o57%FiwIzEwdVh>E0eHd@xJF%$uh}2xWg- zI<}Ws-?%t;Y10QEhZ0H@Vy2tCWv! z$)70OsS&QVLYzG7wmWask=W0sW3@tcj|1+Ci;&A~K=L$}8%z*ncfx@SqrfMgz0V5X z=Z-aI=k((si;_W`*le!DVOm^08591SPRfKC9HZptDf|p2<28CKhKHACBY#SaqShxW zSnA_*pBE!!q~0paL1RFci&Z^<@x+`Xoc5~^3SvNrkgl~s$#C^I&w7Z zk5rW*HD=@8SKe~%w(aZ$h=wKb)0in$hP@gn4=~LR3#5mj=2;Fl>)Dqx3SJ|fy|YPQ zDYyMqCCvfhzveeGo-S(T-~7HRq<#BCy$GY}_Sq+bWnr8VGSi|P6*igKrd1NU2d(H? z49LXlxE2F5TbWq4;@Ekf61MyLj=aE^8kzX0pqCKkKywjoLMNkwTS`+N)8?vsLB**D zQz4?HEmL$sPn8Ho>_MJzhMoZjP(_SP;`yU+69j-2CoN-7F^U%IZ>gkna! zV4D|(O8|f1M#j3q^j|VXbkT_c^%AuasVwzS^sC#fd(=V**40AJ$WrXDStCFe{L9n= zXeEueL<#Gj!~YWnHy%wn&Ywf#Cpn%Th>$PwM*3`a%jE50Ymm=OH=q85NpLxyNj+&( zo?z3*jzobOb_!9&wiK_T3=Fg>1GS~qCE5gXM@m`6sfJ{QHn}Pfmc$|3Y?~U@&Pu{N z#+}QHQmYI8OZR$5VN_FRPEq6#1z0Dps1U@1{Fe&pX4*7l7IYr&Wd)kgc%g9|+YUh| zAGTojOns^+c(VD)7k49SQ?GHgC)PXqtA zw}^ksN`$4BDziB0m#Hqua_cJ+xMwCRc4{{MCB|q$X~XMt*FFIoZ#4@!;J*&sDPFB< zwXqu76}0_}wCwJe>h5(i_+p$96!71UfJ!@Pr8%DglBZT?k>)dO4h2umcf&j(3Auo* zT1Vs^;-`Xr)h}Lq+dQKyzdNfpuvvJ&B@+xzS|EtlCdTy)?(rQ!n zB0lK#XTRE>!NnN#pG0#Om#Tzr1Mu)ThDy8D`2Cr#ZJy(c2YhIIU3>PnO%pI|_A+3+)8DqqUZXiO zTLXB05U44By^F@)dh+LSlc0i3y0dd?Im&g1rezf$+!<_P?Y9N%r$}GTK`Z(Wxyiw@ zpV)(i(BOo$nz>vgnMGyrap#)dE;J9#`x=zl3^rLBMg&RA z*7n?>YP5(N63kKS4mRk8I2y3(yUlJNeU2Nz|0HD=TARAP5uxWbH(Q}V6N^MYnw61rXPw%21Tf>=}Fl6FQ^4n|qAwoz%sK z7w-|{N`-vB*ZWRCe{tl8-WjIgObjGWHCKXH$$x;{l#l0-U<;a>oFwO6kxn&Z`!j`I zX>jug3Qd5n$3cy`$pb>ELlRf#LD=pMW6Q%AvQNom+sNlt>$GQXr;|PEf8YvhsZgnj zNnA3YX~z>~mBAiWNSqFtN-3$9KuSoQMZ>;60DnfpfGi~Cko82kmF3Cyr>7W7|l@1B}2 zZK}x0ywcWOx|m<}Am&>bN#d7X#~hb_bJQ%1!?QWAvvR<)pQ&IY@Z@mSi}cy|=;oeD z$Wa?l_|R{OWPWHYiA)3QbiO{uAVh@ggf^v48rCR3+|)&)DPMgO_IsAB@u_x`s@>>q z!v7$Zi06{fMI1O#ST2>V5E}jbLA(>X`Q}ocrJiyA3vbg%9D0P+$Dp2Rz6}n~19Cg? zIh%ocRu!ey8ssF=LN;t@ODc~2+YdEZa5`+LTrl=!l5YPI)UCD^6bWgRc|05r6WIC2 zQ}Z)n@l7YNS3M9r$am=INxIXIZa^Zm?&L=LaY$U$QNgTo~-=4mG4h-f;fH5-AT2ah$R9 zcu-4I5RSpSGY35{4mGlyxZ29&*YbZ_`^doFP4`r(E>sHQ9*0+&1FQ`_kJbFww4QHL z0Ll@oUBF+7Dwy_v(3whL*8=G@+_O7br}-pnT2KHv=ka)yo$wz9En6y_0t^5IclXk7 z0@cj_XD%tz=~Z7`;wAuS_4$rT0;wCo_|CUZIBA@}%uVu%qPSoiU4tU=&)V6Q{0vg7 zOLn-+^H?jYobsm^#af!VM&cOtneoJY_ zitRg4Y~yYH5)gV62?l8n^FjTqC*%y0tyK}uXuEQJh8XP+d?DE5e<59<-tf&j{ICC? zfIF1nV4Mcx&M@~)*zNfFnS)JtwbP;a4-OriTU7Ki`)|h!{3tFXYk>H%Q}P8da1N0I zB;zvkt4-XJry)_CH!tcez6`tHy|;>as2yMj{z7%bHLN|DLR48UHt+<6Rf(RC*iINo zZIs~A9A(yY$6M-1RA?1lCWE2GN|d-Sc$r6qyZQIML6e0;aELR@*4IIT@Fo@~tKK06 z@(j1i?1zy4#N{vtLS7FDHSx2Qf#uWzD5Sha+D{K+m`KEl z8-PEqACq0+mu*Bp>hH&M3#)gPa!T;h(t?%UIfC&Do2_ti2BAztv`lYQCXq_BNBPb$ z`2a|)6%$FtB-?5`DqSzpnjLk0a1b;R;p>br7Hg72HBQ-^u?OpIe!Kl8_SEGxvz+xH z=qN&3S2R0t^CpB--e6_6`)6-M^e|Fq3-we;;VLbjg#4tzC>9aj>1$uijXV*uVShvD6PEU{d9>hcej7ob~dT!e1RUS2S>`eEzCG@skPZy zz~>#2?sZJ^46j%`64`*OMjY3dTy79cByaX-FUB3O$9bHgcw*j&%UA_XG-(V*-NwCd zqZU@JOFGFft}y5*Xoei8IXNgZm;@kaK_79R% zWQh7;6Qj8z2W3K}>))bj+n2?7ZC^M|T;UP$3{`=7_xVMxWpi(qDy>MUJNI9AwKf(O zte4tBd!(jdC~fFNdigodJ|HNNC$gWeX!QNKz14PImb4kh)J5g%bujK7l_v+sX&rdHT|?d z^P&xf5GbITep#t|y>WrCSWM?F(3h|-tAbgy3!{1jKhHHa?GFvQ>eyYl*wPO|u*@r~BaCSI55sH0eXfgM=&?S@kw1WvZ!qil~tOV|`*(8xEN(BKkn7Thy)SPC{pcS0YC0pUW~t_NK)fCIgr+6hSZE6j;f{ZC|iNhz3C&RFQ6h${7v#kR; zNz};I@25vJm~OGg0V`$3!d`9=D75HL*1P@VR8QSQ-g}h(o0!fRJm~TAEm!fn`mN(7 z73{l4fQV>gSxIMCChl`%`0eHI7ad3rH}g9aj7#vN$diPKP%H+A>3^+Ijh%k{Ic;c;g{8MQx62v{MB;)UYDGN^)&ly&vlzN(O4l~M#nDgi z^a_LW8a(!{=91wlz!x!daY%$uBMZGHY$}GE5uZ{wI`36<Z^{doyRI z$yx;@viVD6`%p!FV@dRuH*4={`3$mSzy&-|W9m-W5^;oIWsz?L@VGq0pT|Y zWx(XeQcgSt0tmEfb)9dnTf@>1Qb|j5D>)yP3K@(Pa(EWbB z+0+ELVADxwD-Ph<4#RxeetKH3WD))YZNZoJ!I$KI3Y&6Ai2-0PABUiRp*`EPK-$+h zXMoXg3|i&pB8!8XqusL_6Ik5;uaBL)$Y0s2oBjr|KD=;)_Hnr2jG00Df6a{ZLa;I+ zobj(fxcME}-xCJk5)3w}&Z-8yiAWrjc zxnB)KN0ipNr^0QSgSjTToVwwXtqr*Gm91DRbAbQBDSAo+qmN2GJ)d>*5r(n(vw#aZG+~~ z8OVYD4T?a`R~($Z8$*3_(@WF=Wrv#p2nZCSL^hEoQ7_mExW=K(?HWd7T~nlhu+O31 zEYy}ERnBafoav&oe7w=MO{ioi`^cOwvS3iHRc})oRCg4w?){A9nXS!+fC3SWjzO2y zEV_GfPq|nERUmPUx-?G`xH1Vve)W=jnCNJ)O{vp_|__C!J4! z7%$i%tpFM{rPZduYQoHGOiz1$at)6Tskok?ahHOx^ueONfD=At(t{^^zs`hxDcOng z1)-Zq8g!&Kda%=A9eR}emA7x?-D`x9^NSc68RWg7p^~bla~>n!g5Hy25^ICXHUsVw zL2X0SS12D(<^1L+Q1ik$cD4xxD;kWc$pQJG8S=%8bxlObe66|o zTfSiXzUmTNTab!ejHgRLWYSuhOf^^H`Ydrey7z3*PNyjF_zjAtb^b>cSI->dcg5<* zd()WNhO>Y*jeuS2#-BJGzPjy6=h1KUYyzg+TidinH77~D5`{C6clSk&+92Z_;twq^ z-Cv>AHnHDqyB#F~nSrI=IlhVWeG15HGLJ1s^91H$lI5gJl-x->$Lfrhn8-t(QqoS; zt;}WbyY~eol}xg4wN?ieS*d&Q4JX_hyB!^QBkv{Rc@MOQX|*7nZ@z-DzAzt4i^2{> zI*x0}H7sG{31A0(Q^ax{dgq{nqZGfV6vcO6cRMWKHwT|(_L7K1xzkivLK}9j9yD2l z9Zp?EIikyySgvd!CP|NUdV@M|!O(LpZkIW1hHyAY`u?8qqO6QwMu~i{0-7r4O>hi) zF-9o}@kY+>4JC0^tXlVO`qbKt)5Wr)bubEF;t=HIU$p9ZnPvY55% zo*=|@I)-yi$YUJyiyg+>h?gjf3mh>lWH0xJs49qgd=$DMh$x0!A9P*~bhbrvPZ**0 zUUpP1iEO*K?I&h**oy#V-xciDwL}}2P2%x)9%1JL41~3O2CWSdJbu|!idDq;A|rZh z*DQCY>2R?a2s0o!vW_4z}h8$|Vo_bxX7u zU9M#)r4Xx@FlQ7FI2z)1dAVa#2gKlCs{fM7FNuqV?Iz0Iev`v9?EPEE3>r zymN#65Zs+Yx7;}^D~xjtj6Tv_VkS(#5;iJQun|mmcY?VWQ%fsHU8oqu6Kl((=jJX= zAUy>PyWx)s`oBapI(QDOiEO1{>6i2%3jj7rfQ{z4M>1(^1h~c$2xX7Cu>O&Uq`Izc zQF>BaI#hH&2mofIX0nUa_owr-*cC_%1)#+h zdM*~miB9W(qAkad$Nn3E-{ecY=!424y$`#5z!$21PTJ-3vN#h?EyCvNbbF%zJnNlK{YPeOv|PRT_R=myo&)p4_f=*RDs4E%aQ8+t&ob|K-o!bJgUGxl- zxMJ^5rq_sLyR^{y6f1&V2_X5uw@s{k{AO*sV+5hFfpk8d5@@xuO zhZVmBi4u2KzMeOxCyd{49;Zu^a)#$N$p4_i77X<3&oZ5teAnhmbbw|GL_xvm6k){p8pc*O z!tvIjJcu(GVu2a=WiVl#j0rTkDa0sD&iw1hGaol?PnTdu=9MSYPi|?aq+s7k3+&w4 zPBShYg`{N8*Rw7$M$3r#?S zCKH64XjX|Zq=V+N_S)g~u#$hJpI)-zT_(OvQdj(jd}rL`U#Y2ugUV1m_GlekX0Io1 zHOi;5Gj%bScUfgh5kxGOVsX=L3zrN0=drL7%vbems)`5o~%eYlpdIlgE3*G z>>B3Dt$~XH&oEQvbmq>`F0!MY3Ur~L^8Z0$XokjkCwC&7Ce1h|ySMv2huFRQdvnCy z=>`^KSB`d(`O1rDvP9EW)U#Kr5qWA*&pQo1k0t4OdJ%CFjp|rgy?bd@_o-wRjy#g& zmqz55kQUmRhB2X){kSamQ^J{P`>8KA%B-}N%4BUcwt5~X9Q|9jKCE&BN)9c=NB&1g ze8>{5O>+HJr?lRvg2#8+TQj+r8!r&Nz2)%O1kqQc@!m2pyq_D!e;%TXt_m5;R{!YJ zb-j|x{fN9aoKj=2nUAFQ1Bhwx+a&-qKI37Ticj0RV(%Igxd2EM<5^2%p2kj(u4bL7 zfb80`r)$l)4q1k(_UxA#thzx#2oB$AEZQ86k>k2zdOnGutwc}$UJsY9dN;Kl3 z?hmaVnt2Yw4u4Fa4gTZmIP!*Os+`#Qe^pTJp=b&qdHbwjO zxf3~`iJW%V5#@r3cJnn9*K-B(gHt|XpC(EE3P5T$JM@QOvu_Z)4H7x5mDD#Ny zZTELu$y>q;L2?JV-%*Q?te+hrqB$ecq2smrC?uiTDO#htZ^$z^*t%3|rU%zjh1bg$ zO0IK8k)T$MNI7+*6iOAVjp*}K)BIQ-LabbI;;RPp#Lc}T1f|L-u}19MoQy97mTW`C zLR28*MXUi)$*887IEcU8?V2}9BPpZ%yvwf^L+~QEPG;;HeqA>@;iR3ceG+SraFg{K z5f22>$#86sxh{!>o{8;mm4U_{JkpT)mKz0jOV@62x0ai7 zEM;vypmn|l`Fvh4S}_f?URSq|HYuk#z4>#^0By?n72Y>BrU{iN5*d-pk37M2STDjc z{>cy_1u}g3kSh2!5kz#4<8y#|P8FBtaHPt>J<~M|Oa_MjE#taS|Hh(^G!*F8iEW%O zm^c&TqVwqG{%hs|m(Y{9Jv8F(UD)lo_%sF&0Og{ycG@1y3Y8a_`*wxh>Bgi!DyzHF zUkJ;rfNAfpm_@HIjXk#>czu+hP%LoZ*eWo7vGxH;q?YzCCC*2u;(-Gl$y*f_&@9ll zQ&Vr8*mal53v#$Q-92$`1f*r)v!oDuhSYnW7%qB4;c2LjJkc?+?&|W7ZmX#TZ`u2b z_}e;JOP#dbN(vshOk}P=XK;MTe0v1)`N)jT{xqjDn!(ZQnxcP?mMlGAIyw(!Vq#Ac zSA0J}K@8`@!ViAr&WLU=h7VCqlzxa(9?$8EN&FaN>1iD)tVpNeY)W+c-yIpH#=X_b z#+H--W8YB{XV>^W<*dzQMX)&XfSI&dX)nwOfuhr$g^{8mB>ZST?kOsWNj6b*f+k6x zXYdZ?44N{#oWmSx5@^cdKHD>$oTflQa_E1s-V%bHuvX7 zZBZw&U*Fbb`V(YP$Ts1aub4g%nM?~Dey_~>l z#?Sbk+|&YXM?Mj?lpT4vZY?MmSagk5(Bk2h+@e|1hwH)qC&+rT@+YgJWmsoh(1|5Z z&?BZ+$+D&meF~~vO*wnZg2jh%?54+KErJX--5L_y4?W!oet4Zgac7MoWmR+`HLR?pOli=HvPgrbd zc2HhAdzEJdU*zx(UKqF?N3FRpx45HV+-{ymBo|&&=w?k;MQKsMR)qV44U%*U+2iNa zMAu-#Jz-i?&;%s=PtqShb2F$GAX5qS5ZL0?Dusd+>!)I&J8o(7L(CI6XplzHpG4tT z=1Y|(XOMFMb$UVpL~t59dGtDv98-MUy87~ICJ@DF!ciTXCR()Orn$=S#zL1qXy7Up z4%BN!)xlF8nf4K9r^Cq(zDrq5n3oe+Pgx*q6Bgp=V13#Pp+@i_kBlUSdHe<8i(uakcWz|+U>W= zy1b$>X=4!JPPw}~oJ-75^>chVwNWq~X99$p2?oPl0LbmNDsjuRj4ndKn_~!5U6PGl ztGe_J4FYM3irR`Yw`K2^ft{F_;oND-GFCz#;dwlOe-?#Dg?!(ZtWj-P{CD3TVUZUA=wC`K6_>v9 zHYaQyDlw45iX5Fv2Dmj(H+;J|6nTt-D~gp95hW=R6WF^ZtZV(Wz+6lh)DSuZq8GzZ zh2J^B?yv+P+NF+jP~|SHJLXTO%+}gqghiYR?wzkc1rD#yTXLSm3xoOjHG^rwNX_e) zu7e~$;P981w4aWB#Jc{)K?+!D^pYGDPl!rLh`T^PgUN~%RbEzy!rejs9xQU0?r|0M zE^Y_-M!|s6hMGbhgTk)gY46ydByZ!isXg@G^AccwC`Yg4t1`Aqs~mj_HaeV>b+aH2^_`udxoB=Z)r?G~RA}VKl>F`o&7K0z-kxDS=Ms#f z4|QwB&RGHetMCEUsi7w&%_@qX#DnlywZ(V(>YBpmqg|L+0bH2x?^TcQFN5Q!U$0tE z_@IR5M>GdR{k|X|A@-%cft(T2;FvK-D&q=EB4{$QFtBvUST>O7dbQ>-9;))E!GB2s zHN)XehWj}KN7P?P&=-u<`48`rS^fF?|7<-$eJx@Nh*aZ*HgKoUi7xvZw#_L_T%Z${ zIJ_IL#BCM8aA8rP(VryR#ORCrlh0b3aqK?eawJ6I3EZ(h&rO!y%+LG(S7> z&&-SOkfdIgDG;jb;-XC^{{j2FWkGrTIAXOOM~lSEawWxWlMRR5NV!Ic5u@SjdCS9F zaL|VCpyx@n$@Y}&8?wCrpgw9?-Q(K8B6-Ne9te60TaQ|#kvXg^4x<@l7DS4hfRVp% z=dA#o>&D&Gfn2LI8l_ti+mf`j=vo9wxJ)K8oj9d!C6tS=zOwTMLXdx(>#R1~&>3Ql zNWrNa8=98>-pD^eIpsbxl0U)Ix=JGh=61E&ur)6+RBX|Ne4A`SAT4%PyVpf=)=)TE zcC+p2;FotMC48pg01ag_FcFB$b6=1H^NxufJaX?Yug=Y0y~*hL(5gper4sS>TzjW| zg-OkA9R*NM0@E9TKOpKOo--2Z&4V#H3kVbsf%=c|aj_;WtT|x*qps&tK4q44kX*E~ zz(Jh4k411$`MjxBKo&XAa;7A3Lc^DkE7zxzEH1&@%j<2fPrE=IbsV}n{llOS?xua! zDgt<^Q)A~29UJnA2o0>!>K^oo3lavt;r2Xs7ITO|(RW%GEsW zth##jACpQMVP*y#vdEoINIhFGSm?|=JyNc>k?1;bz2foe%V zwP-8^51qfyy66h5CyFEFg2tRkt6L|{7smOK4>Vn)%fNt2ivdRJ=zaU*51h2J9lCLE z5g1{NkaBA{64nF2Eii7%j8mq=7E)fS=gXa7G6nAaWCl33>jhAZFQ|+NJjiJ=@Z-jZ zfCD>-DkF^Qb5%*Q{bIA484n{_1LD4$aex?dr3T1(1_%Fjb>*to#au6XYNUj?|4Lzi_mX z;(Nw@6t+t$vF61EgH=}7+P`s{cmZZh9Hx|YO1q`ap*7*fr)319Kt*6EH!oO@&+tdtJZsK!UM#aF0rHOSNB+})_ zZZ>&k^W^&yhYE!~{QvLX<)G!U5g)xL?bthFeZpY22L(j>s&>8>wq*bn^gRR`yV$!9 z{&Ir@&K+k=zJq2lvK)YYE`q3k^)=}|#ABo&)DEb>+7upi{ZR?Zc^H~kzykD4X4F2x zB-`$GTeYoMs;{Hve2e3@eB_f9INRK(`|s2?F!{g)`iGfaan=@YbX6X8oK z`ezZc8lp!RJ@zwYgPxS$bRF~;awk90SETPtif-k_b59z((`HDhC~YNM&#(?YP0eg* zU>8am3JwxXCD1d${831vecy%mP7DVQJ$PR5bLM?C^avaLAlx*Vp=jd*Rfh#6fL#Aa z2CUAc@t8_of0s^RfLzUO{}V2`p|Z1pFTk82B}5 zwCYmrmz9{(bUDcK9%7UJ3~r85)xDdd`Ws6F2(%m};YQ18#(f-q*iNjpK$q62%^wmD z`J6apI4G23${B|*n(jxY=s>?_T2#Ve0YL>2Wj3@j6YidZ=F=2B2Bp7*sij973`r=r z!b%Ny-btV&AIN))ahScME3b!t*P5XjMm!i-poO*D9xeib$X$)3;^jwxSqgzeMR}fe z{bNcW2P?Srb$2?25+(F`llBF^9m5s7Mf4H|hO1=UsOOt>lr`-l7ph7l znHIYzcu?5%Z;|#W!CVRdWgmEuQmlt>a zWTF>)wP&?`)~EXJSi^8&Vl4pPV=0RvO!3~8qL9h)S)hU1I0umD&V=K-!SoES#oZKP z_F38JzU{hTg3H76BcN1v77Iz^1D9c+)oUc4!h06Y)W32DBN6Djg%iqeRRS)Hu$FzW zBLCFPghi$Ylw!Dnj}jV0%stE78EzpEj_0KwmJuBkaakdUHD9>6{%=)~b>nr$n%esz zlAAZ$dZ)RaSGkR*Xo34z({_E+Wt#PtzU}JJv?6%*RuHxv+pXX>nRSXy?Fb;OB@pD%$y z&Czyyqxy~^Qq4LV{gSY*_SVjm7z&O>x$s%lmtgsP4T;&us4ZbRXiv-XshUA4t z<42>8N{d}Cl<}SB6dC+luZiM`>vugY0$OR)?|Ix*sK9ppr#T;fT4{*gS~O~OmG)lM zC=WBQ^vj03VnF&X)VQcMJR(v6zo(aG%dH~15%0!Xj3H9B0KhZ8+@4?! zo4ISQbU|Ps)SL24M~fU4y9^5PnngAF_LfeD%?O#u?|qQ9;JC}s`G-secQ*%J{-GaG z=REKjOgudu?L)tV7L?CM+@u1RAp(!I9-n^ zkATB{UXzm$rRQF0fkRn?2+U{lqGQ_#H&0WtrZ>iDS9*%s5~7z1F^@H4Q$~zq7=zwm zQ)F|BS23}+^0YuH4C)wQy{2aTm{|Y_)t0`F-{;6Co&;0F`d4_qx*bWZbIG@c*dh`X zSy3_m{OFt5z&RxDy)t}0ZtZaJn$1#8`{*2TFL!VrUk<;HB zMP>CwBKqopj=1$g4Jb_Wg8K2za;l2XnZ3#2qF8j?+=c$B@K$J;xQ7(1)p}4B&$CfI z%r4!p_>{u9`ps~)(8&uB+yK1di-bQVmqy-oQb6_h6G7_8`2J!f!jEgMNq$9>eT^l7 zmgn2D9b_#4{YdDrY?ob##Yc2hwdC7^fc2Ps?e+&wqt4K+X555-0*83vc7tCiE-AoO zlb)(rl~=7Sf5k#C-|*64z@khuG&8d-jPfBzt}G86ju(X_DrPmm_-js0yrx=k3xgL( zuK_8$t#K@oPWnZF9uE2|AEoQRAVKk7smQ4KB}K#85F60d?d=`O=Nz;UI!tw-<^Q`q z4f~nlzCG{gpQ-V@isn@rPotimf29}Glz87P^rgLR6_n){RRBpBMcgWual5UQ9`|DV zD;1rl5QGVHu5KJqWC^8`QoAnDOM`pxW&*!An@OLd$IXZQf# zj^@^HIG5iv?c|-Mu56lT5|{ysr!8a0B2%SDDO_pMCy`9mM^Ll}(;AV)Wu`XSZ)etb z-{Ao00OLi|T@NfnoIzsjva0CYU3__XYf;reWAsde{h*}1fle7iV=Bhbvqpbrx_bo) zQiv=3aH!uCbi5tY4*DEVP||-(ZFXY4vcFN6IboqTaOQ?wo?`UPIanE*LAz}CdFvbt zC)v^a+Lh@kqGieM@vxGh+h(26ey`@eVOM;0MvRZ%jhW3~%1&w7)|M`IaVr@?m&LN? z5lkDTel;~T8&hdot>A%1_IRfBLS@rX@~_3=c0Y#us4T~-CeppdMo$V+Li&}$2WD0Y z@2phmn+6og?C)`n7wfKI9Ip^exy?dxi5R3L(rw&eQ}t;Chr+C&&xHO#q`nxXWSY~; zQo7Pr9u0m0W|aA4J6hEDx9oY}iD=yw3I1_c%rK6OFg63urBBUf1x+^f7SwUP;oJYW z&HN;XFoR_Xr(ZdBe0U*uZg1}{Z05ir(1Yzs%#aH&ly3!&oBhf<;`53@2-Hbw@2A!) zD9bSU9yVWWZU+p-N-o3l@jEq1SP!Zw_`X{)~EXX|?Fi*GIn;MC?S|M&DV zv5`p3OpUtH7_3qCW|oxqmm-iuwVx}6Epjm~gulKWK{?8qyORTGC2EYRar;tNnkye8 zJUpKRng9ihui1NGW9;S^n`T5?F9cJ`u&elF07w9JO9(}iReMLvf`vHWye9i!grFCg z&%?q-ijDyi(Vvk{rCY-9K%fH0G?MP`IKF9r5@Hi2`jtWkREO^+H3N^IQE-wPFD`Ag zBO9JVc<#eg3*hCEIk(={RrAgAFvJfL5%Omq6y`<><0EZwRn#HBx;>K0u>sF@%XjMR zVEh8f9Ep(|2`?!)qi1H)U#J?qIrDeF)})4Z6#?Eca21%h-u4eHo1Gq~dU%n-4o8Sd zkQEN)i?L@R912&m-RPktAr0&jK6JOo%Z$owuxp(~jO1 zRYm9E3YV`os>^Xm?M7u!h7OQ(3<6X+OgB#Yu4Zz8#P{YhS0%9(B?<~aA_N<|?>6iK zH6Mb_5S?Nw(4VoYZ72z}jP`J?!xR8n;W1&9yGH!yQe!XESY0h(v@b-;0`GVVR6Gd~ zQ0tRcDYSddpR+xI6F6v5^OSI54jb3|%JrR;5Rx;!BSdQw*K7RF8f??qqqQ`#FRDuWrcOg8oS5= znwfKl)=uRz$pk>1mEsp-i0$OjRN}%KCF@iGb25mX)NF)F`nnp4=lcztFss#H1!%P8qs`m8Ij$d&}b{Bjd{KD&^~usECYz9OCS zEz^*~|B zj7W+w>J83Ni;3&ub;r}0eQ)P!ta(SzVt-camR#vK5#%_2VB9S$$VlIMW~zahieE;# zmI2XI_c_hdPc>x~@2%uj7eCEV&_K;cEs&xGS0ARRm~6x~rP*zAN8oN>YjB`38i;)U zeLK7aS9>(78xBkWgNps@j47eO5yqeYKnoB4#L`)WJu;WF`W8geq6@jIN2zj2M^#qh zQ2g0Iv0<(2^!{Qe8wNZyp9Y7aj@v83bsnvfF-%O=hz!4B|DZRIew{>TAG*xYyWPwd<)IPQ*=WxC(xPC9J5Ri3b4u3DeGo6&BrcsW&uS<|U9 z1ozEG`l8tb#FZ-`UMK}1KHR+1&=2uic*IiyUQ!-zpOOBAGr^Va1=H(w&8(bo%?yKb zHOmfbdw?%Mn!UDgiBuJ0L-;!xHs%U|YBcbUt&(itJNcjk*_3WB--r^doi7zJ-xq6^^){hG2ymvp?U~Z z%=T{=EW-hWtxdXz<3fg__~bTzKJ2-VdqRL)3sC}2oa%?prRH@46k*8PkTEK`ys!x5 zr}6rN;FZ8em=nd&QzRj)7D6HK>=q?{QosQnvGvG}#JAD#DO17h01Go#X+B%E)23;k z_DU>au_zG5hZzwH*}1VCd-D1K zjs7V}MB(nyCp)6(=kiE=o0maZ55)cnFWiVdu^?dO4k2i!67(x>V^S(8KTLQzX8EkS zA$mGyLOKI>XFau@EH7;e{DtXAGIC$tR<|(l4Mq6{wUJBel*{0Ye6EBBj7ogWmG9I( zK|C`caQ2KATJX-g|Cgw59t)NhD{`Hej1pc?a~@dxE@rCcl`rtWw4XHCINt_dmXtM# zQ;9p7{%o#5;D;Wd)6```{TCjp`Oro)FA)XEsiTHUtZQ^@2(LJ%DBLoy;7NNAk|;qx za8e?x?{=`F=&l|9DV@)=FR>t$Bnq8a^APOA2f4$6v6LQ|6>Os*;fVqg+MV18vbDgf zaa;9BB0Quzw`g65TkG9pr>LWmW#XSV{3Rk!c6@1F;Jq~&cwwY%Dedx_#kB-jW98}T zQ<6~Nt#+Wh<>gz+Aq`wFkdiuPEBGIw5Bc&AbvBUC-P+RKR?s`FuE)JaUI?NlvgjHK zblw2-E;}hi9BiDQL=6X){-Zo@tiE-Q99mAk-rMQ+Y#_>{ROZntk&^iU6aI0)1@?UD zLO|w;>Zj4R#N#u>ns|*5+c5VEu65;e@Waynk=I|L3b2o~U@OYhq~v1KLIlSStksrSycJ1#{`&VZa7P{WfxzOC&bH0FoEDPB)wasBjr_s?%QwItP*1VEgfztf0FN?+G5`Po literal 0 HcmV?d00001 From 7374b5b473b5c0a796dcb8d003d3a513212e2e80 Mon Sep 17 00:00:00 2001 From: "byunghwa.yun" Date: Sat, 24 Jul 2021 14:32:31 +0900 Subject: [PATCH 126/265] Add webp extension for resizing --- weed/server/volume_server_handlers_read.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/server/volume_server_handlers_read.go b/weed/server/volume_server_handlers_read.go index c5afd9545..cbad9c770 100644 --- a/weed/server/volume_server_handlers_read.go +++ b/weed/server/volume_server_handlers_read.go @@ -264,7 +264,7 @@ func conditionallyResizeImages(originalDataReaderSeeker io.ReadSeeker, ext strin } func shouldResizeImages(ext string, r *http.Request) (width, height int, mode string, shouldResize bool) { - if ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".gif" { + if ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".gif" || ext == ".webp" { if r.FormValue("width") != "" { width, _ = strconv.Atoi(r.FormValue("width")) } From 2b28a818f1170242527ea8a729507e2a69a824b1 Mon Sep 17 00:00:00 2001 From: "byunghwa.yun" Date: Sun, 25 Jul 2021 11:06:14 +0900 Subject: [PATCH 127/265] Fix mysql sql for batch delete --- weed/filer/mysql/mysql_sql_gen.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/filer/mysql/mysql_sql_gen.go b/weed/filer/mysql/mysql_sql_gen.go index 477baf66b..93d3e3f9e 100644 --- a/weed/filer/mysql/mysql_sql_gen.go +++ b/weed/filer/mysql/mysql_sql_gen.go @@ -38,7 +38,7 @@ func (gen *SqlGenMysql) GetSqlDelete(tableName string) string { } func (gen *SqlGenMysql) GetSqlDeleteFolderChildren(tableName string) string { - return fmt.Sprintf("DELETE FROM `%s` WHERE dirhash=? AND directory=? LIMIT ?", tableName) + return fmt.Sprintf("DELETE FROM `%s` WHERE dirhash=? AND directory=?", tableName) } func (gen *SqlGenMysql) GetSqlListExclusive(tableName string) string { From 72eec841670e72b0ff3371c5eb039714588b9950 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 25 Jul 2021 02:27:30 -0700 Subject: [PATCH 128/265] shell: add fs.mkdir --- weed/shell/command_fs_mkdir.go | 54 ++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 weed/shell/command_fs_mkdir.go diff --git a/weed/shell/command_fs_mkdir.go b/weed/shell/command_fs_mkdir.go new file mode 100644 index 000000000..71a9daece --- /dev/null +++ b/weed/shell/command_fs_mkdir.go @@ -0,0 +1,54 @@ +package shell + +import ( + "context" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/chrislusf/seaweedfs/weed/util" + "io" + "os" +) + +func init() { + Commands = append(Commands, &commandFsMkdir{}) +} + +type commandFsMkdir struct { +} + +func (c *commandFsMkdir) Name() string { + return "fs.mkdir" +} + +func (c *commandFsMkdir) Help() string { + return `create a directory + + fs.mkdir path/to/dir +` +} + +func (c *commandFsMkdir) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { + + path, err := commandEnv.parseUrl(findInputDirectory(args)) + if err != nil { + return err + } + + dir, name := util.FullPath(path).DirAndName() + + err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + + _, createErr := client.CreateEntry(context.Background(), &filer_pb.CreateEntryRequest{ + Directory: dir, + Entry: &filer_pb.Entry{ + Name: name, + IsDirectory: true, + Attributes: &filer_pb.FuseAttributes{ + FileMode: uint32(0777 | os.ModeDir), + }, + }, + }) + return createErr + }) + + return +} From 35f70c51b0ff1ca71fec6c0194086329ef9e3e86 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 25 Jul 2021 03:37:37 -0700 Subject: [PATCH 129/265] refactor --- weed/shell/command_fs_configure.go | 38 ++++++++++++++++++------------ 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/weed/shell/command_fs_configure.go b/weed/shell/command_fs_configure.go index 29cc54792..0aae51d74 100644 --- a/weed/shell/command_fs_configure.go +++ b/weed/shell/command_fs_configure.go @@ -62,20 +62,11 @@ func (c *commandFsConfigure) Do(args []string, commandEnv *CommandEnv, writer io return nil } - var buf bytes.Buffer - if err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { - return filer.ReadEntry(commandEnv.MasterClient, client, filer.DirectoryEtcSeaweedFS, filer.FilerConfName, &buf) - }); err != nil && err != filer_pb.ErrNotFound { + fc, err := readFilerConf(commandEnv) + if err != nil { return err } - fc := filer.NewFilerConf() - if buf.Len() > 0 { - if err = fc.LoadFromBytes(buf.Bytes()); err != nil { - return err - } - } - if *locationPrefix != "" { locConf := &filer_pb.FilerConf_PathConf{ LocationPrefix: *locationPrefix, @@ -112,16 +103,16 @@ func (c *commandFsConfigure) Do(args []string, commandEnv *CommandEnv, writer io } } - buf.Reset() - fc.ToText(&buf) + var buf2 bytes.Buffer + fc.ToText(&buf2) - fmt.Fprintf(writer, string(buf.Bytes())) + fmt.Fprintf(writer, string(buf2.Bytes())) fmt.Fprintln(writer) if *apply { if err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { - return filer.SaveInsideFiler(client, filer.DirectoryEtcSeaweedFS, filer.FilerConfName, buf.Bytes()) + return filer.SaveInsideFiler(client, filer.DirectoryEtcSeaweedFS, filer.FilerConfName, buf2.Bytes()) }); err != nil && err != filer_pb.ErrNotFound { return err } @@ -131,3 +122,20 @@ func (c *commandFsConfigure) Do(args []string, commandEnv *CommandEnv, writer io return nil } + +func readFilerConf(commandEnv *CommandEnv) (*filer.FilerConf, error) { + var buf bytes.Buffer + if err := commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + return filer.ReadEntry(commandEnv.MasterClient, client, filer.DirectoryEtcSeaweedFS, filer.FilerConfName, &buf) + }); err != nil && err != filer_pb.ErrNotFound { + return nil, fmt.Errorf("read %s/%s: %v", filer.DirectoryEtcSeaweedFS, filer.FilerConfName, err) + } + + fc := filer.NewFilerConf() + if buf.Len() > 0 { + if err := fc.LoadFromBytes(buf.Bytes()); err != nil { + return nil, fmt.Errorf("parse %s/%s: %v", filer.DirectoryEtcSeaweedFS, filer.FilerConfName, err) + } + } + return fc, nil +} From 5dede5d38dfc4c5e4ca330484062b8bedd7e1405 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 25 Jul 2021 22:09:09 -0700 Subject: [PATCH 130/265] 2.60 --- k8s/seaweedfs/Chart.yaml | 4 ++-- k8s/seaweedfs/values.yaml | 2 +- weed/util/constants.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/k8s/seaweedfs/Chart.yaml b/k8s/seaweedfs/Chart.yaml index c5805d99c..cc8e4bdca 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.59" -version: "2.59" +appVersion: "2.60" +version: "2.60" diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index 08cb9fddd..3f1c6da1c 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.59" - started using {.Chart.appVersion} + # imageTag: "2.60" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index 00774a83e..2636adf45 100644 --- a/weed/util/constants.go +++ b/weed/util/constants.go @@ -5,7 +5,7 @@ import ( ) var ( - VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 59) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 60) COMMIT = "" ) From 99b599aa8a674ccd584d612e8e871fdca7670620 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 26 Jul 2021 22:53:44 -0700 Subject: [PATCH 131/265] remote.mount --- other/java/client/src/main/proto/filer.proto | 13 +- weed/filer/entry.go | 6 +- weed/filer/filer_remote_storage.go | 47 + weed/pb/filer.proto | 13 +- weed/pb/filer_pb/filer.pb.go | 1694 +++++++++-------- weed/remote_storage/remote_storage.go | 50 + weed/remote_storage/s3/s3_storage_client.go | 94 + weed/replication/sink/filersink/filer_sink.go | 2 +- weed/shell/command_remote_mount.go | 200 ++ 9 files changed, 1262 insertions(+), 857 deletions(-) create mode 100644 weed/filer/filer_remote_storage.go create mode 100644 weed/remote_storage/remote_storage.go create mode 100644 weed/remote_storage/s3/s3_storage_client.go create mode 100644 weed/shell/command_remote_mount.go diff --git a/other/java/client/src/main/proto/filer.proto b/other/java/client/src/main/proto/filer.proto index 803a2ce32..23c841f18 100644 --- a/other/java/client/src/main/proto/filer.proto +++ b/other/java/client/src/main/proto/filer.proto @@ -92,6 +92,12 @@ message ListEntriesResponse { Entry entry = 1; } +message RemoteEntry { + int64 last_modified_at = 1; + int64 size = 2; + string e_tag = 3; + string storage_name = 4; +} message Entry { string name = 1; bool is_directory = 2; @@ -102,12 +108,7 @@ message Entry { int32 hard_link_counter = 8; // only exists in hard link meta data bytes content = 9; // if not empty, the file content - message Remote { - int64 last_modified_at = 1; - int64 size = 2; - string e_tag = 3; - } - Remote remote = 10; + RemoteEntry remote_entry = 10; } message FullEntry { diff --git a/weed/filer/entry.go b/weed/filer/entry.go index ede58a384..7673365fb 100644 --- a/weed/filer/entry.go +++ b/weed/filer/entry.go @@ -42,7 +42,7 @@ type Entry struct { HardLinkId HardLinkId HardLinkCounter int32 Content []byte - Remote *filer_pb.Entry_Remote + Remote *filer_pb.RemoteEntry } func (entry *Entry) Size() uint64 { @@ -78,7 +78,7 @@ func (entry *Entry) ToExistingProtoEntry(message *filer_pb.Entry) { message.HardLinkId = entry.HardLinkId message.HardLinkCounter = entry.HardLinkCounter message.Content = entry.Content - message.Remote = entry.Remote + message.RemoteEntry = entry.Remote } func FromPbEntryToExistingEntry(message *filer_pb.Entry, fsEntry *Entry) { @@ -88,7 +88,7 @@ func FromPbEntryToExistingEntry(message *filer_pb.Entry, fsEntry *Entry) { fsEntry.HardLinkId = HardLinkId(message.HardLinkId) fsEntry.HardLinkCounter = message.HardLinkCounter fsEntry.Content = message.Content - fsEntry.Remote = message.Remote + fsEntry.Remote = message.RemoteEntry } func (entry *Entry) ToProtoFullEntry() *filer_pb.FullEntry { diff --git a/weed/filer/filer_remote_storage.go b/weed/filer/filer_remote_storage.go new file mode 100644 index 000000000..8b136a763 --- /dev/null +++ b/weed/filer/filer_remote_storage.go @@ -0,0 +1,47 @@ +package filer + +import ( + "bytes" + "context" + "fmt" + "github.com/golang/protobuf/proto" + "io" + "math" + + "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/chrislusf/seaweedfs/weed/util" + "github.com/golang/protobuf/jsonpb" + "github.com/viant/ptrie" +) + +type FilerRemoteStorage struct { + rules ptrie.Trie +} + +func NewFilerRemoteStorage() (fc *FilerRemoteStorage) { + fc = &FilerRemoteStorage{ + rules: ptrie.New(), + } + return fc +} + +func (fc *FilerRemoteStorage) loadFromFiler(filer *Filer) (err error) { + entries, _, err := filer.ListDirectoryEntries(context.Background(), DirectoryEtcRemote, "", false, math.MaxInt64, "", "", "") + if err != nil { + if err == filer_pb.ErrNotFound { + return nil + } + glog.Errorf("read remote storage %s: %v", DirectoryEtcRemote, err) + return + } + + for _, entry := range entries { + conf := &filer_pb.RemoteConf{} + if err := proto.Unmarshal(entry.Content, conf); err != nil { + return fmt.Errorf("unmarshal %s/%s: %v", DirectoryEtcRemote, entry.Name, err) + } + fc.MountRemoteStorage(dir, conf) + } + return nil +} diff --git a/weed/pb/filer.proto b/weed/pb/filer.proto index 803a2ce32..23c841f18 100644 --- a/weed/pb/filer.proto +++ b/weed/pb/filer.proto @@ -92,6 +92,12 @@ message ListEntriesResponse { Entry entry = 1; } +message RemoteEntry { + int64 last_modified_at = 1; + int64 size = 2; + string e_tag = 3; + string storage_name = 4; +} message Entry { string name = 1; bool is_directory = 2; @@ -102,12 +108,7 @@ message Entry { int32 hard_link_counter = 8; // only exists in hard link meta data bytes content = 9; // if not empty, the file content - message Remote { - int64 last_modified_at = 1; - int64 size = 2; - string e_tag = 3; - } - Remote remote = 10; + RemoteEntry remote_entry = 10; } message FullEntry { diff --git a/weed/pb/filer_pb/filer.pb.go b/weed/pb/filer_pb/filer.pb.go index 2724bc7b0..972f7c0e9 100644 --- a/weed/pb/filer_pb/filer.pb.go +++ b/weed/pb/filer_pb/filer.pb.go @@ -257,6 +257,77 @@ func (x *ListEntriesResponse) GetEntry() *Entry { return nil } +type RemoteEntry struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + LastModifiedAt int64 `protobuf:"varint,1,opt,name=last_modified_at,json=lastModifiedAt,proto3" json:"last_modified_at,omitempty"` + Size int64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` + ETag string `protobuf:"bytes,3,opt,name=e_tag,json=eTag,proto3" json:"e_tag,omitempty"` + StorageName string `protobuf:"bytes,4,opt,name=storage_name,json=storageName,proto3" json:"storage_name,omitempty"` +} + +func (x *RemoteEntry) Reset() { + *x = RemoteEntry{} + if protoimpl.UnsafeEnabled { + mi := &file_filer_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoteEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoteEntry) ProtoMessage() {} + +func (x *RemoteEntry) ProtoReflect() protoreflect.Message { + mi := &file_filer_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoteEntry.ProtoReflect.Descriptor instead. +func (*RemoteEntry) Descriptor() ([]byte, []int) { + return file_filer_proto_rawDescGZIP(), []int{4} +} + +func (x *RemoteEntry) GetLastModifiedAt() int64 { + if x != nil { + return x.LastModifiedAt + } + return 0 +} + +func (x *RemoteEntry) GetSize() int64 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *RemoteEntry) GetETag() string { + if x != nil { + return x.ETag + } + return "" +} + +func (x *RemoteEntry) GetStorageName() string { + if x != nil { + return x.StorageName + } + return "" +} + type Entry struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -270,13 +341,13 @@ type Entry struct { HardLinkId []byte `protobuf:"bytes,7,opt,name=hard_link_id,json=hardLinkId,proto3" json:"hard_link_id,omitempty"` HardLinkCounter int32 `protobuf:"varint,8,opt,name=hard_link_counter,json=hardLinkCounter,proto3" json:"hard_link_counter,omitempty"` // only exists in hard link meta data Content []byte `protobuf:"bytes,9,opt,name=content,proto3" json:"content,omitempty"` // if not empty, the file content - Remote *Entry_Remote `protobuf:"bytes,10,opt,name=remote,proto3" json:"remote,omitempty"` + RemoteEntry *RemoteEntry `protobuf:"bytes,10,opt,name=remote_entry,json=remoteEntry,proto3" json:"remote_entry,omitempty"` } func (x *Entry) Reset() { *x = Entry{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[4] + mi := &file_filer_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -289,7 +360,7 @@ func (x *Entry) String() string { func (*Entry) ProtoMessage() {} func (x *Entry) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[4] + mi := &file_filer_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -302,7 +373,7 @@ func (x *Entry) ProtoReflect() protoreflect.Message { // Deprecated: Use Entry.ProtoReflect.Descriptor instead. func (*Entry) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{4} + return file_filer_proto_rawDescGZIP(), []int{5} } func (x *Entry) GetName() string { @@ -361,9 +432,9 @@ func (x *Entry) GetContent() []byte { return nil } -func (x *Entry) GetRemote() *Entry_Remote { +func (x *Entry) GetRemoteEntry() *RemoteEntry { if x != nil { - return x.Remote + return x.RemoteEntry } return nil } @@ -380,7 +451,7 @@ type FullEntry struct { func (x *FullEntry) Reset() { *x = FullEntry{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[5] + mi := &file_filer_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -393,7 +464,7 @@ func (x *FullEntry) String() string { func (*FullEntry) ProtoMessage() {} func (x *FullEntry) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[5] + mi := &file_filer_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -406,7 +477,7 @@ func (x *FullEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use FullEntry.ProtoReflect.Descriptor instead. func (*FullEntry) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{5} + return file_filer_proto_rawDescGZIP(), []int{6} } func (x *FullEntry) GetDir() string { @@ -439,7 +510,7 @@ type EventNotification struct { func (x *EventNotification) Reset() { *x = EventNotification{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[6] + mi := &file_filer_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -452,7 +523,7 @@ func (x *EventNotification) String() string { func (*EventNotification) ProtoMessage() {} func (x *EventNotification) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[6] + mi := &file_filer_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -465,7 +536,7 @@ func (x *EventNotification) ProtoReflect() protoreflect.Message { // Deprecated: Use EventNotification.ProtoReflect.Descriptor instead. func (*EventNotification) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{6} + return file_filer_proto_rawDescGZIP(), []int{7} } func (x *EventNotification) GetOldEntry() *Entry { @@ -531,7 +602,7 @@ type FileChunk struct { func (x *FileChunk) Reset() { *x = FileChunk{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[7] + mi := &file_filer_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -544,7 +615,7 @@ func (x *FileChunk) String() string { func (*FileChunk) ProtoMessage() {} func (x *FileChunk) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[7] + mi := &file_filer_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -557,7 +628,7 @@ func (x *FileChunk) ProtoReflect() protoreflect.Message { // Deprecated: Use FileChunk.ProtoReflect.Descriptor instead. func (*FileChunk) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{7} + return file_filer_proto_rawDescGZIP(), []int{8} } func (x *FileChunk) GetFileId() string { @@ -648,7 +719,7 @@ type FileChunkManifest struct { func (x *FileChunkManifest) Reset() { *x = FileChunkManifest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[8] + mi := &file_filer_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -661,7 +732,7 @@ func (x *FileChunkManifest) String() string { func (*FileChunkManifest) ProtoMessage() {} func (x *FileChunkManifest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[8] + mi := &file_filer_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -674,7 +745,7 @@ func (x *FileChunkManifest) ProtoReflect() protoreflect.Message { // Deprecated: Use FileChunkManifest.ProtoReflect.Descriptor instead. func (*FileChunkManifest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{8} + return file_filer_proto_rawDescGZIP(), []int{9} } func (x *FileChunkManifest) GetChunks() []*FileChunk { @@ -697,7 +768,7 @@ type FileId struct { func (x *FileId) Reset() { *x = FileId{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[9] + mi := &file_filer_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -710,7 +781,7 @@ func (x *FileId) String() string { func (*FileId) ProtoMessage() {} func (x *FileId) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[9] + mi := &file_filer_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -723,7 +794,7 @@ func (x *FileId) ProtoReflect() protoreflect.Message { // Deprecated: Use FileId.ProtoReflect.Descriptor instead. func (*FileId) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{9} + return file_filer_proto_rawDescGZIP(), []int{10} } func (x *FileId) GetVolumeId() uint32 { @@ -772,7 +843,7 @@ type FuseAttributes struct { func (x *FuseAttributes) Reset() { *x = FuseAttributes{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[10] + mi := &file_filer_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -785,7 +856,7 @@ func (x *FuseAttributes) String() string { func (*FuseAttributes) ProtoMessage() {} func (x *FuseAttributes) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[10] + mi := &file_filer_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -798,7 +869,7 @@ func (x *FuseAttributes) ProtoReflect() protoreflect.Message { // Deprecated: Use FuseAttributes.ProtoReflect.Descriptor instead. func (*FuseAttributes) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{10} + return file_filer_proto_rawDescGZIP(), []int{11} } func (x *FuseAttributes) GetFileSize() uint64 { @@ -921,7 +992,7 @@ type CreateEntryRequest struct { func (x *CreateEntryRequest) Reset() { *x = CreateEntryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[11] + mi := &file_filer_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -934,7 +1005,7 @@ func (x *CreateEntryRequest) String() string { func (*CreateEntryRequest) ProtoMessage() {} func (x *CreateEntryRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[11] + mi := &file_filer_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -947,7 +1018,7 @@ func (x *CreateEntryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateEntryRequest.ProtoReflect.Descriptor instead. func (*CreateEntryRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{11} + return file_filer_proto_rawDescGZIP(), []int{12} } func (x *CreateEntryRequest) GetDirectory() string { @@ -996,7 +1067,7 @@ type CreateEntryResponse struct { func (x *CreateEntryResponse) Reset() { *x = CreateEntryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[12] + mi := &file_filer_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1009,7 +1080,7 @@ func (x *CreateEntryResponse) String() string { func (*CreateEntryResponse) ProtoMessage() {} func (x *CreateEntryResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[12] + mi := &file_filer_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1022,7 +1093,7 @@ func (x *CreateEntryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateEntryResponse.ProtoReflect.Descriptor instead. func (*CreateEntryResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{12} + return file_filer_proto_rawDescGZIP(), []int{13} } func (x *CreateEntryResponse) GetError() string { @@ -1046,7 +1117,7 @@ type UpdateEntryRequest struct { func (x *UpdateEntryRequest) Reset() { *x = UpdateEntryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[13] + mi := &file_filer_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1059,7 +1130,7 @@ func (x *UpdateEntryRequest) String() string { func (*UpdateEntryRequest) ProtoMessage() {} func (x *UpdateEntryRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[13] + mi := &file_filer_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1072,7 +1143,7 @@ func (x *UpdateEntryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateEntryRequest.ProtoReflect.Descriptor instead. func (*UpdateEntryRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{13} + return file_filer_proto_rawDescGZIP(), []int{14} } func (x *UpdateEntryRequest) GetDirectory() string { @@ -1112,7 +1183,7 @@ type UpdateEntryResponse struct { func (x *UpdateEntryResponse) Reset() { *x = UpdateEntryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[14] + mi := &file_filer_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1125,7 +1196,7 @@ func (x *UpdateEntryResponse) String() string { func (*UpdateEntryResponse) ProtoMessage() {} func (x *UpdateEntryResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[14] + mi := &file_filer_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1138,7 +1209,7 @@ func (x *UpdateEntryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateEntryResponse.ProtoReflect.Descriptor instead. func (*UpdateEntryResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{14} + return file_filer_proto_rawDescGZIP(), []int{15} } type AppendToEntryRequest struct { @@ -1154,7 +1225,7 @@ type AppendToEntryRequest struct { func (x *AppendToEntryRequest) Reset() { *x = AppendToEntryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[15] + mi := &file_filer_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1167,7 +1238,7 @@ func (x *AppendToEntryRequest) String() string { func (*AppendToEntryRequest) ProtoMessage() {} func (x *AppendToEntryRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[15] + mi := &file_filer_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1180,7 +1251,7 @@ func (x *AppendToEntryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AppendToEntryRequest.ProtoReflect.Descriptor instead. func (*AppendToEntryRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{15} + return file_filer_proto_rawDescGZIP(), []int{16} } func (x *AppendToEntryRequest) GetDirectory() string { @@ -1213,7 +1284,7 @@ type AppendToEntryResponse struct { func (x *AppendToEntryResponse) Reset() { *x = AppendToEntryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[16] + mi := &file_filer_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1226,7 +1297,7 @@ func (x *AppendToEntryResponse) String() string { func (*AppendToEntryResponse) ProtoMessage() {} func (x *AppendToEntryResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[16] + mi := &file_filer_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1239,7 +1310,7 @@ func (x *AppendToEntryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AppendToEntryResponse.ProtoReflect.Descriptor instead. func (*AppendToEntryResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{16} + return file_filer_proto_rawDescGZIP(), []int{17} } type DeleteEntryRequest struct { @@ -1260,7 +1331,7 @@ type DeleteEntryRequest struct { func (x *DeleteEntryRequest) Reset() { *x = DeleteEntryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[17] + mi := &file_filer_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1273,7 +1344,7 @@ func (x *DeleteEntryRequest) String() string { func (*DeleteEntryRequest) ProtoMessage() {} func (x *DeleteEntryRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[17] + mi := &file_filer_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1286,7 +1357,7 @@ func (x *DeleteEntryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteEntryRequest.ProtoReflect.Descriptor instead. func (*DeleteEntryRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{17} + return file_filer_proto_rawDescGZIP(), []int{18} } func (x *DeleteEntryRequest) GetDirectory() string { @@ -1349,7 +1420,7 @@ type DeleteEntryResponse struct { func (x *DeleteEntryResponse) Reset() { *x = DeleteEntryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[18] + mi := &file_filer_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1362,7 +1433,7 @@ func (x *DeleteEntryResponse) String() string { func (*DeleteEntryResponse) ProtoMessage() {} func (x *DeleteEntryResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[18] + mi := &file_filer_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1375,7 +1446,7 @@ func (x *DeleteEntryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteEntryResponse.ProtoReflect.Descriptor instead. func (*DeleteEntryResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{18} + return file_filer_proto_rawDescGZIP(), []int{19} } func (x *DeleteEntryResponse) GetError() string { @@ -1400,7 +1471,7 @@ type AtomicRenameEntryRequest struct { func (x *AtomicRenameEntryRequest) Reset() { *x = AtomicRenameEntryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[19] + mi := &file_filer_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1413,7 +1484,7 @@ func (x *AtomicRenameEntryRequest) String() string { func (*AtomicRenameEntryRequest) ProtoMessage() {} func (x *AtomicRenameEntryRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[19] + mi := &file_filer_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1426,7 +1497,7 @@ func (x *AtomicRenameEntryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AtomicRenameEntryRequest.ProtoReflect.Descriptor instead. func (*AtomicRenameEntryRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{19} + return file_filer_proto_rawDescGZIP(), []int{20} } func (x *AtomicRenameEntryRequest) GetOldDirectory() string { @@ -1473,7 +1544,7 @@ type AtomicRenameEntryResponse struct { func (x *AtomicRenameEntryResponse) Reset() { *x = AtomicRenameEntryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[20] + mi := &file_filer_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1486,7 +1557,7 @@ func (x *AtomicRenameEntryResponse) String() string { func (*AtomicRenameEntryResponse) ProtoMessage() {} func (x *AtomicRenameEntryResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[20] + mi := &file_filer_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1499,7 +1570,7 @@ func (x *AtomicRenameEntryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AtomicRenameEntryResponse.ProtoReflect.Descriptor instead. func (*AtomicRenameEntryResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{20} + return file_filer_proto_rawDescGZIP(), []int{21} } type AssignVolumeRequest struct { @@ -1520,7 +1591,7 @@ type AssignVolumeRequest struct { func (x *AssignVolumeRequest) Reset() { *x = AssignVolumeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[21] + mi := &file_filer_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1533,7 +1604,7 @@ func (x *AssignVolumeRequest) String() string { func (*AssignVolumeRequest) ProtoMessage() {} func (x *AssignVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[21] + mi := &file_filer_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1546,7 +1617,7 @@ func (x *AssignVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AssignVolumeRequest.ProtoReflect.Descriptor instead. func (*AssignVolumeRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{21} + return file_filer_proto_rawDescGZIP(), []int{22} } func (x *AssignVolumeRequest) GetCount() int32 { @@ -1623,7 +1694,7 @@ type AssignVolumeResponse struct { func (x *AssignVolumeResponse) Reset() { *x = AssignVolumeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[22] + mi := &file_filer_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1636,7 +1707,7 @@ func (x *AssignVolumeResponse) String() string { func (*AssignVolumeResponse) ProtoMessage() {} func (x *AssignVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[22] + mi := &file_filer_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1649,7 +1720,7 @@ func (x *AssignVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AssignVolumeResponse.ProtoReflect.Descriptor instead. func (*AssignVolumeResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{22} + return file_filer_proto_rawDescGZIP(), []int{23} } func (x *AssignVolumeResponse) GetFileId() string { @@ -1719,7 +1790,7 @@ type LookupVolumeRequest struct { func (x *LookupVolumeRequest) Reset() { *x = LookupVolumeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[23] + mi := &file_filer_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1732,7 +1803,7 @@ func (x *LookupVolumeRequest) String() string { func (*LookupVolumeRequest) ProtoMessage() {} func (x *LookupVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[23] + mi := &file_filer_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1745,7 +1816,7 @@ func (x *LookupVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVolumeRequest.ProtoReflect.Descriptor instead. func (*LookupVolumeRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{23} + return file_filer_proto_rawDescGZIP(), []int{24} } func (x *LookupVolumeRequest) GetVolumeIds() []string { @@ -1766,7 +1837,7 @@ type Locations struct { func (x *Locations) Reset() { *x = Locations{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[24] + mi := &file_filer_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1779,7 +1850,7 @@ func (x *Locations) String() string { func (*Locations) ProtoMessage() {} func (x *Locations) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[24] + mi := &file_filer_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1792,7 +1863,7 @@ func (x *Locations) ProtoReflect() protoreflect.Message { // Deprecated: Use Locations.ProtoReflect.Descriptor instead. func (*Locations) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{24} + return file_filer_proto_rawDescGZIP(), []int{25} } func (x *Locations) GetLocations() []*Location { @@ -1814,7 +1885,7 @@ type Location struct { func (x *Location) Reset() { *x = Location{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[25] + mi := &file_filer_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1827,7 +1898,7 @@ func (x *Location) String() string { func (*Location) ProtoMessage() {} func (x *Location) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[25] + mi := &file_filer_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1840,7 +1911,7 @@ func (x *Location) ProtoReflect() protoreflect.Message { // Deprecated: Use Location.ProtoReflect.Descriptor instead. func (*Location) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{25} + return file_filer_proto_rawDescGZIP(), []int{26} } func (x *Location) GetUrl() string { @@ -1868,7 +1939,7 @@ type LookupVolumeResponse struct { func (x *LookupVolumeResponse) Reset() { *x = LookupVolumeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[26] + mi := &file_filer_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1881,7 +1952,7 @@ func (x *LookupVolumeResponse) String() string { func (*LookupVolumeResponse) ProtoMessage() {} func (x *LookupVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[26] + mi := &file_filer_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1894,7 +1965,7 @@ func (x *LookupVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVolumeResponse.ProtoReflect.Descriptor instead. func (*LookupVolumeResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{26} + return file_filer_proto_rawDescGZIP(), []int{27} } func (x *LookupVolumeResponse) GetLocationsMap() map[string]*Locations { @@ -1915,7 +1986,7 @@ type Collection struct { func (x *Collection) Reset() { *x = Collection{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[27] + mi := &file_filer_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1928,7 +1999,7 @@ func (x *Collection) String() string { func (*Collection) ProtoMessage() {} func (x *Collection) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[27] + mi := &file_filer_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1941,7 +2012,7 @@ func (x *Collection) ProtoReflect() protoreflect.Message { // Deprecated: Use Collection.ProtoReflect.Descriptor instead. func (*Collection) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{27} + return file_filer_proto_rawDescGZIP(), []int{28} } func (x *Collection) GetName() string { @@ -1963,7 +2034,7 @@ type CollectionListRequest struct { func (x *CollectionListRequest) Reset() { *x = CollectionListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[28] + mi := &file_filer_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1976,7 +2047,7 @@ func (x *CollectionListRequest) String() string { func (*CollectionListRequest) ProtoMessage() {} func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[28] + mi := &file_filer_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1989,7 +2060,7 @@ func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionListRequest.ProtoReflect.Descriptor instead. func (*CollectionListRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{28} + return file_filer_proto_rawDescGZIP(), []int{29} } func (x *CollectionListRequest) GetIncludeNormalVolumes() bool { @@ -2017,7 +2088,7 @@ type CollectionListResponse struct { func (x *CollectionListResponse) Reset() { *x = CollectionListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[29] + mi := &file_filer_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2030,7 +2101,7 @@ func (x *CollectionListResponse) String() string { func (*CollectionListResponse) ProtoMessage() {} func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[29] + mi := &file_filer_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2043,7 +2114,7 @@ func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionListResponse.ProtoReflect.Descriptor instead. func (*CollectionListResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{29} + return file_filer_proto_rawDescGZIP(), []int{30} } func (x *CollectionListResponse) GetCollections() []*Collection { @@ -2064,7 +2135,7 @@ type DeleteCollectionRequest struct { func (x *DeleteCollectionRequest) Reset() { *x = DeleteCollectionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[30] + mi := &file_filer_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2077,7 +2148,7 @@ func (x *DeleteCollectionRequest) String() string { func (*DeleteCollectionRequest) ProtoMessage() {} func (x *DeleteCollectionRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[30] + mi := &file_filer_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2090,7 +2161,7 @@ func (x *DeleteCollectionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteCollectionRequest.ProtoReflect.Descriptor instead. func (*DeleteCollectionRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{30} + return file_filer_proto_rawDescGZIP(), []int{31} } func (x *DeleteCollectionRequest) GetCollection() string { @@ -2109,7 +2180,7 @@ type DeleteCollectionResponse struct { func (x *DeleteCollectionResponse) Reset() { *x = DeleteCollectionResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[31] + mi := &file_filer_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2122,7 +2193,7 @@ func (x *DeleteCollectionResponse) String() string { func (*DeleteCollectionResponse) ProtoMessage() {} func (x *DeleteCollectionResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[31] + mi := &file_filer_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2135,7 +2206,7 @@ func (x *DeleteCollectionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteCollectionResponse.ProtoReflect.Descriptor instead. func (*DeleteCollectionResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{31} + return file_filer_proto_rawDescGZIP(), []int{32} } type StatisticsRequest struct { @@ -2152,7 +2223,7 @@ type StatisticsRequest struct { func (x *StatisticsRequest) Reset() { *x = StatisticsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[32] + mi := &file_filer_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2165,7 +2236,7 @@ func (x *StatisticsRequest) String() string { func (*StatisticsRequest) ProtoMessage() {} func (x *StatisticsRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[32] + mi := &file_filer_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2178,7 +2249,7 @@ func (x *StatisticsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StatisticsRequest.ProtoReflect.Descriptor instead. func (*StatisticsRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{32} + return file_filer_proto_rawDescGZIP(), []int{33} } func (x *StatisticsRequest) GetReplication() string { @@ -2222,7 +2293,7 @@ type StatisticsResponse struct { func (x *StatisticsResponse) Reset() { *x = StatisticsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[33] + mi := &file_filer_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2235,7 +2306,7 @@ func (x *StatisticsResponse) String() string { func (*StatisticsResponse) ProtoMessage() {} func (x *StatisticsResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[33] + mi := &file_filer_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2248,7 +2319,7 @@ func (x *StatisticsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StatisticsResponse.ProtoReflect.Descriptor instead. func (*StatisticsResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{33} + return file_filer_proto_rawDescGZIP(), []int{34} } func (x *StatisticsResponse) GetTotalSize() uint64 { @@ -2281,7 +2352,7 @@ type GetFilerConfigurationRequest struct { func (x *GetFilerConfigurationRequest) Reset() { *x = GetFilerConfigurationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[34] + mi := &file_filer_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2294,7 +2365,7 @@ func (x *GetFilerConfigurationRequest) String() string { func (*GetFilerConfigurationRequest) ProtoMessage() {} func (x *GetFilerConfigurationRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[34] + mi := &file_filer_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2307,7 +2378,7 @@ func (x *GetFilerConfigurationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFilerConfigurationRequest.ProtoReflect.Descriptor instead. func (*GetFilerConfigurationRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{34} + return file_filer_proto_rawDescGZIP(), []int{35} } type GetFilerConfigurationResponse struct { @@ -2330,7 +2401,7 @@ type GetFilerConfigurationResponse struct { func (x *GetFilerConfigurationResponse) Reset() { *x = GetFilerConfigurationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[35] + mi := &file_filer_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2343,7 +2414,7 @@ func (x *GetFilerConfigurationResponse) String() string { func (*GetFilerConfigurationResponse) ProtoMessage() {} func (x *GetFilerConfigurationResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[35] + mi := &file_filer_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2356,7 +2427,7 @@ func (x *GetFilerConfigurationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFilerConfigurationResponse.ProtoReflect.Descriptor instead. func (*GetFilerConfigurationResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{35} + return file_filer_proto_rawDescGZIP(), []int{36} } func (x *GetFilerConfigurationResponse) GetMasters() []string { @@ -2443,7 +2514,7 @@ type SubscribeMetadataRequest struct { func (x *SubscribeMetadataRequest) Reset() { *x = SubscribeMetadataRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[36] + mi := &file_filer_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2456,7 +2527,7 @@ func (x *SubscribeMetadataRequest) String() string { func (*SubscribeMetadataRequest) ProtoMessage() {} func (x *SubscribeMetadataRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[36] + mi := &file_filer_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2469,7 +2540,7 @@ func (x *SubscribeMetadataRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeMetadataRequest.ProtoReflect.Descriptor instead. func (*SubscribeMetadataRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{36} + return file_filer_proto_rawDescGZIP(), []int{37} } func (x *SubscribeMetadataRequest) GetClientName() string { @@ -2513,7 +2584,7 @@ type SubscribeMetadataResponse struct { func (x *SubscribeMetadataResponse) Reset() { *x = SubscribeMetadataResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[37] + mi := &file_filer_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2526,7 +2597,7 @@ func (x *SubscribeMetadataResponse) String() string { func (*SubscribeMetadataResponse) ProtoMessage() {} func (x *SubscribeMetadataResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[37] + mi := &file_filer_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2539,7 +2610,7 @@ func (x *SubscribeMetadataResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeMetadataResponse.ProtoReflect.Descriptor instead. func (*SubscribeMetadataResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{37} + return file_filer_proto_rawDescGZIP(), []int{38} } func (x *SubscribeMetadataResponse) GetDirectory() string { @@ -2576,7 +2647,7 @@ type LogEntry struct { func (x *LogEntry) Reset() { *x = LogEntry{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[38] + mi := &file_filer_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2589,7 +2660,7 @@ func (x *LogEntry) String() string { func (*LogEntry) ProtoMessage() {} func (x *LogEntry) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[38] + mi := &file_filer_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2602,7 +2673,7 @@ func (x *LogEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use LogEntry.ProtoReflect.Descriptor instead. func (*LogEntry) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{38} + return file_filer_proto_rawDescGZIP(), []int{39} } func (x *LogEntry) GetTsNs() int64 { @@ -2639,7 +2710,7 @@ type KeepConnectedRequest struct { func (x *KeepConnectedRequest) Reset() { *x = KeepConnectedRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[39] + mi := &file_filer_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2652,7 +2723,7 @@ func (x *KeepConnectedRequest) String() string { func (*KeepConnectedRequest) ProtoMessage() {} func (x *KeepConnectedRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[39] + mi := &file_filer_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2665,7 +2736,7 @@ func (x *KeepConnectedRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use KeepConnectedRequest.ProtoReflect.Descriptor instead. func (*KeepConnectedRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{39} + return file_filer_proto_rawDescGZIP(), []int{40} } func (x *KeepConnectedRequest) GetName() string { @@ -2698,7 +2769,7 @@ type KeepConnectedResponse struct { func (x *KeepConnectedResponse) Reset() { *x = KeepConnectedResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[40] + mi := &file_filer_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2711,7 +2782,7 @@ func (x *KeepConnectedResponse) String() string { func (*KeepConnectedResponse) ProtoMessage() {} func (x *KeepConnectedResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[40] + mi := &file_filer_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2724,7 +2795,7 @@ func (x *KeepConnectedResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use KeepConnectedResponse.ProtoReflect.Descriptor instead. func (*KeepConnectedResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{40} + return file_filer_proto_rawDescGZIP(), []int{41} } type LocateBrokerRequest struct { @@ -2738,7 +2809,7 @@ type LocateBrokerRequest struct { func (x *LocateBrokerRequest) Reset() { *x = LocateBrokerRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[41] + mi := &file_filer_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2751,7 +2822,7 @@ func (x *LocateBrokerRequest) String() string { func (*LocateBrokerRequest) ProtoMessage() {} func (x *LocateBrokerRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[41] + mi := &file_filer_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2764,7 +2835,7 @@ func (x *LocateBrokerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LocateBrokerRequest.ProtoReflect.Descriptor instead. func (*LocateBrokerRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{41} + return file_filer_proto_rawDescGZIP(), []int{42} } func (x *LocateBrokerRequest) GetResource() string { @@ -2786,7 +2857,7 @@ type LocateBrokerResponse struct { func (x *LocateBrokerResponse) Reset() { *x = LocateBrokerResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[42] + mi := &file_filer_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2799,7 +2870,7 @@ func (x *LocateBrokerResponse) String() string { func (*LocateBrokerResponse) ProtoMessage() {} func (x *LocateBrokerResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[42] + mi := &file_filer_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2812,7 +2883,7 @@ func (x *LocateBrokerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LocateBrokerResponse.ProtoReflect.Descriptor instead. func (*LocateBrokerResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{42} + return file_filer_proto_rawDescGZIP(), []int{43} } func (x *LocateBrokerResponse) GetFound() bool { @@ -2841,7 +2912,7 @@ type KvGetRequest struct { func (x *KvGetRequest) Reset() { *x = KvGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[43] + mi := &file_filer_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2854,7 +2925,7 @@ func (x *KvGetRequest) String() string { func (*KvGetRequest) ProtoMessage() {} func (x *KvGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[43] + mi := &file_filer_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2867,7 +2938,7 @@ func (x *KvGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use KvGetRequest.ProtoReflect.Descriptor instead. func (*KvGetRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{43} + return file_filer_proto_rawDescGZIP(), []int{44} } func (x *KvGetRequest) GetKey() []byte { @@ -2889,7 +2960,7 @@ type KvGetResponse struct { func (x *KvGetResponse) Reset() { *x = KvGetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[44] + mi := &file_filer_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2902,7 +2973,7 @@ func (x *KvGetResponse) String() string { func (*KvGetResponse) ProtoMessage() {} func (x *KvGetResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[44] + mi := &file_filer_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2915,7 +2986,7 @@ func (x *KvGetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use KvGetResponse.ProtoReflect.Descriptor instead. func (*KvGetResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{44} + return file_filer_proto_rawDescGZIP(), []int{45} } func (x *KvGetResponse) GetValue() []byte { @@ -2944,7 +3015,7 @@ type KvPutRequest struct { func (x *KvPutRequest) Reset() { *x = KvPutRequest{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[45] + mi := &file_filer_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2957,7 +3028,7 @@ func (x *KvPutRequest) String() string { func (*KvPutRequest) ProtoMessage() {} func (x *KvPutRequest) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[45] + mi := &file_filer_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2970,7 +3041,7 @@ func (x *KvPutRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use KvPutRequest.ProtoReflect.Descriptor instead. func (*KvPutRequest) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{45} + return file_filer_proto_rawDescGZIP(), []int{46} } func (x *KvPutRequest) GetKey() []byte { @@ -2998,7 +3069,7 @@ type KvPutResponse struct { func (x *KvPutResponse) Reset() { *x = KvPutResponse{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[46] + mi := &file_filer_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3011,7 +3082,7 @@ func (x *KvPutResponse) String() string { func (*KvPutResponse) ProtoMessage() {} func (x *KvPutResponse) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[46] + mi := &file_filer_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3024,7 +3095,7 @@ func (x *KvPutResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use KvPutResponse.ProtoReflect.Descriptor instead. func (*KvPutResponse) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{46} + return file_filer_proto_rawDescGZIP(), []int{47} } func (x *KvPutResponse) GetError() string { @@ -3047,7 +3118,7 @@ type FilerConf struct { func (x *FilerConf) Reset() { *x = FilerConf{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[47] + mi := &file_filer_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3060,7 +3131,7 @@ func (x *FilerConf) String() string { func (*FilerConf) ProtoMessage() {} func (x *FilerConf) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[47] + mi := &file_filer_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3073,7 +3144,7 @@ func (x *FilerConf) ProtoReflect() protoreflect.Message { // Deprecated: Use FilerConf.ProtoReflect.Descriptor instead. func (*FilerConf) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{47} + return file_filer_proto_rawDescGZIP(), []int{48} } func (x *FilerConf) GetVersion() int32 { @@ -3106,7 +3177,7 @@ type RemoteConf struct { func (x *RemoteConf) Reset() { *x = RemoteConf{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[48] + mi := &file_filer_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3119,7 +3190,7 @@ func (x *RemoteConf) String() string { func (*RemoteConf) ProtoMessage() {} func (x *RemoteConf) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[48] + mi := &file_filer_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3132,7 +3203,7 @@ func (x *RemoteConf) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoteConf.ProtoReflect.Descriptor instead. func (*RemoteConf) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{48} + return file_filer_proto_rawDescGZIP(), []int{49} } func (x *RemoteConf) GetType() string { @@ -3177,69 +3248,6 @@ func (x *RemoteConf) GetS3Endpoint() string { return "" } -type Entry_Remote struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - LastModifiedAt int64 `protobuf:"varint,1,opt,name=last_modified_at,json=lastModifiedAt,proto3" json:"last_modified_at,omitempty"` - Size int64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` - ETag string `protobuf:"bytes,3,opt,name=e_tag,json=eTag,proto3" json:"e_tag,omitempty"` -} - -func (x *Entry_Remote) Reset() { - *x = Entry_Remote{} - if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[50] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Entry_Remote) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Entry_Remote) ProtoMessage() {} - -func (x *Entry_Remote) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[50] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Entry_Remote.ProtoReflect.Descriptor instead. -func (*Entry_Remote) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{4, 1} -} - -func (x *Entry_Remote) GetLastModifiedAt() int64 { - if x != nil { - return x.LastModifiedAt - } - return 0 -} - -func (x *Entry_Remote) GetSize() int64 { - if x != nil { - return x.Size - } - return 0 -} - -func (x *Entry_Remote) GetETag() string { - if x != nil { - return x.ETag - } - return "" -} - // if found, send the exact address // if not found, send the full list of existing brokers type LocateBrokerResponse_Resource struct { @@ -3280,7 +3288,7 @@ func (x *LocateBrokerResponse_Resource) ProtoReflect() protoreflect.Message { // Deprecated: Use LocateBrokerResponse_Resource.ProtoReflect.Descriptor instead. func (*LocateBrokerResponse_Resource) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{42, 0} + return file_filer_proto_rawDescGZIP(), []int{43, 0} } func (x *LocateBrokerResponse_Resource) GetGrpcAddresses() string { @@ -3341,7 +3349,7 @@ func (x *FilerConf_PathConf) ProtoReflect() protoreflect.Message { // Deprecated: Use FilerConf_PathConf.ProtoReflect.Descriptor instead. func (*FilerConf_PathConf) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{47, 0} + return file_filer_proto_rawDescGZIP(), []int{48, 0} } func (x *FilerConf_PathConf) GetLocationPrefix() string { @@ -3429,508 +3437,512 @@ var file_filer_proto_rawDesc = []byte{ 0x22, 0x3c, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x92, - 0x04, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, - 0x69, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, - 0x2b, 0x0a, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x12, 0x38, 0x0a, 0x0a, - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x75, 0x73, 0x65, - 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, - 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, - 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, - 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x69, - 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x68, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6e, - 0x6b, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, - 0x68, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, - 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x06, 0x72, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x1a, 0x3b, 0x0a, 0x0d, 0x45, 0x78, 0x74, + 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x83, + 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x28, + 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x13, 0x0a, 0x05, + 0x65, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x54, 0x61, + 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xbf, 0x03, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x44, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x73, 0x12, 0x38, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x46, 0x75, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x08, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x68, 0x61, 0x72, 0x64, 0x5f, + 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x68, + 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x68, 0x61, 0x72, + 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x68, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, + 0x38, 0x0a, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x1a, 0x3b, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x13, - 0x0a, 0x05, 0x65, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, - 0x54, 0x61, 0x67, 0x22, 0x44, 0x0a, 0x09, 0x46, 0x75, 0x6c, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, - 0x69, 0x72, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x8f, 0x02, 0x0a, 0x11, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x2c, 0x0a, 0x09, 0x6f, 0x6c, 0x64, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x6f, 0x6c, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2c, 0x0a, - 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, - 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x50, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, - 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, - 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x05, 0x52, - 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0xe6, 0x02, 0x0a, 0x09, - 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, - 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6d, - 0x74, 0x69, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x65, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x54, 0x61, 0x67, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, - 0x22, 0x0a, 0x03, 0x66, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x03, - 0x66, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, - 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x09, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x46, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, - 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x43, 0x6f, - 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x61, 0x6e, 0x69, - 0x66, 0x65, 0x73, 0x74, 0x22, 0x40, 0x0a, 0x11, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x58, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, - 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, - 0x08, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6f, 0x6b, - 0x69, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x07, 0x52, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, - 0x22, 0x9d, 0x03, 0x0a, 0x0e, 0x46, 0x75, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, - 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4d, - 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x72, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x63, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x6d, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, - 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x74, 0x6c, 0x5f, 0x73, 0x65, 0x63, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x74, 0x74, 0x6c, 0x53, 0x65, 0x63, 0x12, 0x1b, - 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x79, - 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x64, 0x35, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, - 0x6d, 0x64, 0x35, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, - 0x22, 0xc3, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x44, 0x0a, 0x09, 0x46, 0x75, 0x6c, 0x6c, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x64, 0x69, 0x72, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x15, 0x0a, 0x06, - 0x6f, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x6f, 0x45, - 0x78, 0x63, 0x6c, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, - 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x22, 0xac, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x8f, 0x02, 0x0a, + 0x11, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x09, 0x6f, 0x6c, 0x64, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6f, 0x6c, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x2c, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x23, + 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, + 0x77, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x31, 0x0a, 0x15, 0x69, + 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, + 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, + 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0xe6, + 0x02, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x17, 0x0a, 0x07, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, + 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x65, 0x5f, 0x74, 0x61, 0x67, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x54, 0x61, 0x67, 0x12, 0x24, 0x0a, 0x0e, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, + 0x49, 0x64, 0x12, 0x22, 0x0a, 0x03, 0x66, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, + 0x64, 0x52, 0x03, 0x66, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x66, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x09, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, + 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x63, 0x69, 0x70, + 0x68, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, + 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x69, + 0x73, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, + 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x22, 0x40, 0x0a, 0x11, 0x46, 0x69, 0x6c, 0x65, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x06, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x52, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x58, 0x0a, 0x06, 0x46, 0x69, 0x6c, + 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, + 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, + 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x07, 0x52, 0x06, 0x63, 0x6f, 0x6f, + 0x6b, 0x69, 0x65, 0x22, 0x9d, 0x03, 0x0a, 0x0e, 0x46, 0x75, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, + 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x72, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x63, 0x72, 0x74, 0x69, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6d, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x74, 0x6c, 0x5f, + 0x73, 0x65, 0x63, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x74, 0x74, 0x6c, 0x53, 0x65, + 0x63, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, + 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, + 0x0e, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x64, 0x35, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x03, 0x6d, 0x64, 0x35, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, + 0x79, 0x70, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, - 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, - 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x14, 0x41, 0x70, - 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, - 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x2b, 0x0a, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x17, 0x0a, 0x15, - 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x98, 0x02, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, - 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x75, 0x72, - 0x73, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x52, 0x65, - 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x67, 0x6e, 0x6f, 0x72, - 0x65, 0x5f, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x52, - 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x31, 0x0a, - 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, - 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x08, - 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x22, 0x2b, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xba, 0x01, - 0x0a, 0x18, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x6c, - 0x64, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, - 0x19, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6f, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x65, - 0x77, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, - 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, - 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x1b, 0x0a, 0x19, 0x41, 0x74, - 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x13, 0x41, 0x73, 0x73, 0x69, - 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x74, 0x6c, 0x5f, 0x73, - 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x74, 0x74, 0x6c, 0x53, 0x65, 0x63, - 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, - 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x63, 0x6b, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, - 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, - 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0xe2, 0x01, 0x0a, 0x14, 0x41, 0x73, 0x73, 0x69, 0x67, - 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, - 0x75, 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x34, 0x0a, 0x13, 0x4c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, - 0x73, 0x22, 0x3d, 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, - 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x3b, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, - 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, - 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x72, 0x6c, 0x22, 0xc3, 0x01, - 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x61, 0x70, 0x1a, 0x54, 0x0a, - 0x11, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x20, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7b, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, - 0x0a, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, - 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x65, 0x63, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x73, 0x22, 0x50, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x39, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x11, - 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, - 0x70, 0x65, 0x22, 0x6f, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x64, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x75, 0x73, 0x65, 0x64, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x1e, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0xde, 0x02, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, - 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x6d, 0x61, 0x78, 0x4d, 0x62, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x72, 0x5f, - 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, - 0x69, 0x72, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x69, 0x70, - 0x68, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x63, 0x69, 0x70, 0x68, 0x65, - 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, - 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x95, 0x01, 0x0a, 0x18, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x73, 0x12, 0x1c, - 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x9a, 0x01, 0x0a, - 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x4a, 0x0a, 0x12, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x11, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, 0x73, 0x22, 0x61, 0x0a, 0x08, 0x4c, 0x6f, 0x67, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x68, 0x61, 0x73, 0x68, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x65, 0x0a, 0x14, - 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x70, 0x63, - 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x72, 0x70, - 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x0a, 0x13, - 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, - 0xcd, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x45, - 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x1a, 0x58, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x72, 0x70, 0x63, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x20, 0x0a, 0x0c, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x22, 0x3b, 0x0a, 0x0d, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x36, - 0x0a, 0x0c, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xeb, 0x02, - 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x2e, 0x50, 0x61, - 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x1a, 0x87, 0x02, 0x0a, 0x08, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x27, - 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x64, - 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x73, 0x79, 0x6e, - 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x2e, - 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0xba, 0x01, 0x0a, 0x0a, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x33, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x33, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x33, 0x5f, 0x73, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, - 0x33, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x33, - 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, - 0x33, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x33, 0x5f, 0x65, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x33, - 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x32, 0xdc, 0x0c, 0x0a, 0x0c, 0x53, 0x65, 0x61, - 0x77, 0x65, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, - 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, - 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x4c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, - 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, - 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, - 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x4f, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, - 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, - 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, - 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, + 0x15, 0x0a, 0x06, 0x6f, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x6f, 0x45, 0x78, 0x63, 0x6c, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, + 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, + 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x13, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xac, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x25, 0x0a, 0x05, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, + 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x80, 0x01, 0x0a, + 0x14, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, + 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, + 0x17, 0x0a, 0x15, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x98, 0x02, 0x0a, 0x12, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x72, 0x65, + 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, + 0x73, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x67, + 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x67, 0x6e, 0x6f, + 0x72, 0x65, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, + 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0xba, 0x01, 0x0a, 0x18, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, + 0x0d, 0x6f, 0x6c, 0x64, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x1b, 0x0a, + 0x19, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x13, 0x41, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x74, + 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x74, 0x74, 0x6c, + 0x53, 0x65, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x43, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x63, 0x6b, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, + 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0xe2, 0x01, 0x0a, 0x14, 0x41, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, + 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x34, + 0x0a, 0x13, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x49, 0x64, 0x73, 0x22, 0x3d, 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x3b, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, + 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x72, 0x6c, + 0x22, 0xc3, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x30, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, - 0x74, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, - 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x65, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, 0x6f, 0x63, 0x61, - 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x61, 0x70, + 0x1a, 0x54, 0x0a, 0x11, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x61, 0x70, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x20, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7b, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6e, 0x6f, 0x72, + 0x6d, 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x5f, 0x65, 0x63, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x45, 0x63, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x22, 0x50, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x36, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x39, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x84, + 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, + 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0x6f, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, + 0x65, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x66, 0x69, 0x6c, + 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1e, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xde, 0x02, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x62, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x61, 0x78, 0x4d, 0x62, 0x12, 0x1f, 0x0a, 0x0b, 0x64, + 0x69, 0x72, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x64, 0x69, 0x72, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x63, 0x69, + 0x70, 0x68, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, + 0x73, 0x65, 0x63, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x95, 0x01, 0x0a, 0x18, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x74, 0x68, + 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, + 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x4e, + 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, + 0x9a, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x4a, 0x0a, 0x12, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x73, 0x5f, 0x6e, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, 0x73, 0x22, 0x61, 0x0a, 0x08, + 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x73, 0x5f, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, 0x73, 0x12, 0x2c, 0x0a, + 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, + 0x65, 0x0a, 0x14, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x67, + 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, + 0x67, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x22, 0xcd, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, + 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, + 0x64, 0x12, 0x45, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x1a, 0x58, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x72, + 0x70, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0x20, 0x0a, 0x0c, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x22, 0x3b, 0x0a, 0x0d, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x36, 0x0a, 0x0c, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4b, 0x76, 0x50, + 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0xeb, 0x02, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x18, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x2e, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x87, 0x02, 0x0a, 0x08, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, + 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, + 0x74, 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, + 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x73, 0x79, 0x6e, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x73, 0x79, 0x6e, + 0x63, 0x12, 0x2e, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x77, + 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0xba, + 0x01, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x33, 0x5f, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x33, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x33, 0x5f, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x73, 0x33, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1b, 0x0a, + 0x09, 0x73, 0x33, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x73, 0x33, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x33, + 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x73, 0x33, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x32, 0xdc, 0x0c, 0x0a, 0x0c, + 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x14, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x21, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4f, - 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x12, 0x1d, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, - 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, - 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, - 0x76, 0x50, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, 0x61, 0x77, 0x65, - 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x46, 0x69, 0x6c, - 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, - 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x65, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0d, 0x4b, 0x65, 0x65, + 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, + 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, + 0x72, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, + 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, + 0x0a, 0x05, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, + 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, + 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, + 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, + 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -3951,118 +3963,118 @@ var file_filer_proto_goTypes = []interface{}{ (*LookupDirectoryEntryResponse)(nil), // 1: filer_pb.LookupDirectoryEntryResponse (*ListEntriesRequest)(nil), // 2: filer_pb.ListEntriesRequest (*ListEntriesResponse)(nil), // 3: filer_pb.ListEntriesResponse - (*Entry)(nil), // 4: filer_pb.Entry - (*FullEntry)(nil), // 5: filer_pb.FullEntry - (*EventNotification)(nil), // 6: filer_pb.EventNotification - (*FileChunk)(nil), // 7: filer_pb.FileChunk - (*FileChunkManifest)(nil), // 8: filer_pb.FileChunkManifest - (*FileId)(nil), // 9: filer_pb.FileId - (*FuseAttributes)(nil), // 10: filer_pb.FuseAttributes - (*CreateEntryRequest)(nil), // 11: filer_pb.CreateEntryRequest - (*CreateEntryResponse)(nil), // 12: filer_pb.CreateEntryResponse - (*UpdateEntryRequest)(nil), // 13: filer_pb.UpdateEntryRequest - (*UpdateEntryResponse)(nil), // 14: filer_pb.UpdateEntryResponse - (*AppendToEntryRequest)(nil), // 15: filer_pb.AppendToEntryRequest - (*AppendToEntryResponse)(nil), // 16: filer_pb.AppendToEntryResponse - (*DeleteEntryRequest)(nil), // 17: filer_pb.DeleteEntryRequest - (*DeleteEntryResponse)(nil), // 18: filer_pb.DeleteEntryResponse - (*AtomicRenameEntryRequest)(nil), // 19: filer_pb.AtomicRenameEntryRequest - (*AtomicRenameEntryResponse)(nil), // 20: filer_pb.AtomicRenameEntryResponse - (*AssignVolumeRequest)(nil), // 21: filer_pb.AssignVolumeRequest - (*AssignVolumeResponse)(nil), // 22: filer_pb.AssignVolumeResponse - (*LookupVolumeRequest)(nil), // 23: filer_pb.LookupVolumeRequest - (*Locations)(nil), // 24: filer_pb.Locations - (*Location)(nil), // 25: filer_pb.Location - (*LookupVolumeResponse)(nil), // 26: filer_pb.LookupVolumeResponse - (*Collection)(nil), // 27: filer_pb.Collection - (*CollectionListRequest)(nil), // 28: filer_pb.CollectionListRequest - (*CollectionListResponse)(nil), // 29: filer_pb.CollectionListResponse - (*DeleteCollectionRequest)(nil), // 30: filer_pb.DeleteCollectionRequest - (*DeleteCollectionResponse)(nil), // 31: filer_pb.DeleteCollectionResponse - (*StatisticsRequest)(nil), // 32: filer_pb.StatisticsRequest - (*StatisticsResponse)(nil), // 33: filer_pb.StatisticsResponse - (*GetFilerConfigurationRequest)(nil), // 34: filer_pb.GetFilerConfigurationRequest - (*GetFilerConfigurationResponse)(nil), // 35: filer_pb.GetFilerConfigurationResponse - (*SubscribeMetadataRequest)(nil), // 36: filer_pb.SubscribeMetadataRequest - (*SubscribeMetadataResponse)(nil), // 37: filer_pb.SubscribeMetadataResponse - (*LogEntry)(nil), // 38: filer_pb.LogEntry - (*KeepConnectedRequest)(nil), // 39: filer_pb.KeepConnectedRequest - (*KeepConnectedResponse)(nil), // 40: filer_pb.KeepConnectedResponse - (*LocateBrokerRequest)(nil), // 41: filer_pb.LocateBrokerRequest - (*LocateBrokerResponse)(nil), // 42: filer_pb.LocateBrokerResponse - (*KvGetRequest)(nil), // 43: filer_pb.KvGetRequest - (*KvGetResponse)(nil), // 44: filer_pb.KvGetResponse - (*KvPutRequest)(nil), // 45: filer_pb.KvPutRequest - (*KvPutResponse)(nil), // 46: filer_pb.KvPutResponse - (*FilerConf)(nil), // 47: filer_pb.FilerConf - (*RemoteConf)(nil), // 48: filer_pb.RemoteConf - nil, // 49: filer_pb.Entry.ExtendedEntry - (*Entry_Remote)(nil), // 50: filer_pb.Entry.Remote + (*RemoteEntry)(nil), // 4: filer_pb.RemoteEntry + (*Entry)(nil), // 5: filer_pb.Entry + (*FullEntry)(nil), // 6: filer_pb.FullEntry + (*EventNotification)(nil), // 7: filer_pb.EventNotification + (*FileChunk)(nil), // 8: filer_pb.FileChunk + (*FileChunkManifest)(nil), // 9: filer_pb.FileChunkManifest + (*FileId)(nil), // 10: filer_pb.FileId + (*FuseAttributes)(nil), // 11: filer_pb.FuseAttributes + (*CreateEntryRequest)(nil), // 12: filer_pb.CreateEntryRequest + (*CreateEntryResponse)(nil), // 13: filer_pb.CreateEntryResponse + (*UpdateEntryRequest)(nil), // 14: filer_pb.UpdateEntryRequest + (*UpdateEntryResponse)(nil), // 15: filer_pb.UpdateEntryResponse + (*AppendToEntryRequest)(nil), // 16: filer_pb.AppendToEntryRequest + (*AppendToEntryResponse)(nil), // 17: filer_pb.AppendToEntryResponse + (*DeleteEntryRequest)(nil), // 18: filer_pb.DeleteEntryRequest + (*DeleteEntryResponse)(nil), // 19: filer_pb.DeleteEntryResponse + (*AtomicRenameEntryRequest)(nil), // 20: filer_pb.AtomicRenameEntryRequest + (*AtomicRenameEntryResponse)(nil), // 21: filer_pb.AtomicRenameEntryResponse + (*AssignVolumeRequest)(nil), // 22: filer_pb.AssignVolumeRequest + (*AssignVolumeResponse)(nil), // 23: filer_pb.AssignVolumeResponse + (*LookupVolumeRequest)(nil), // 24: filer_pb.LookupVolumeRequest + (*Locations)(nil), // 25: filer_pb.Locations + (*Location)(nil), // 26: filer_pb.Location + (*LookupVolumeResponse)(nil), // 27: filer_pb.LookupVolumeResponse + (*Collection)(nil), // 28: filer_pb.Collection + (*CollectionListRequest)(nil), // 29: filer_pb.CollectionListRequest + (*CollectionListResponse)(nil), // 30: filer_pb.CollectionListResponse + (*DeleteCollectionRequest)(nil), // 31: filer_pb.DeleteCollectionRequest + (*DeleteCollectionResponse)(nil), // 32: filer_pb.DeleteCollectionResponse + (*StatisticsRequest)(nil), // 33: filer_pb.StatisticsRequest + (*StatisticsResponse)(nil), // 34: filer_pb.StatisticsResponse + (*GetFilerConfigurationRequest)(nil), // 35: filer_pb.GetFilerConfigurationRequest + (*GetFilerConfigurationResponse)(nil), // 36: filer_pb.GetFilerConfigurationResponse + (*SubscribeMetadataRequest)(nil), // 37: filer_pb.SubscribeMetadataRequest + (*SubscribeMetadataResponse)(nil), // 38: filer_pb.SubscribeMetadataResponse + (*LogEntry)(nil), // 39: filer_pb.LogEntry + (*KeepConnectedRequest)(nil), // 40: filer_pb.KeepConnectedRequest + (*KeepConnectedResponse)(nil), // 41: filer_pb.KeepConnectedResponse + (*LocateBrokerRequest)(nil), // 42: filer_pb.LocateBrokerRequest + (*LocateBrokerResponse)(nil), // 43: filer_pb.LocateBrokerResponse + (*KvGetRequest)(nil), // 44: filer_pb.KvGetRequest + (*KvGetResponse)(nil), // 45: filer_pb.KvGetResponse + (*KvPutRequest)(nil), // 46: filer_pb.KvPutRequest + (*KvPutResponse)(nil), // 47: filer_pb.KvPutResponse + (*FilerConf)(nil), // 48: filer_pb.FilerConf + (*RemoteConf)(nil), // 49: filer_pb.RemoteConf + nil, // 50: filer_pb.Entry.ExtendedEntry nil, // 51: filer_pb.LookupVolumeResponse.LocationsMapEntry (*LocateBrokerResponse_Resource)(nil), // 52: filer_pb.LocateBrokerResponse.Resource (*FilerConf_PathConf)(nil), // 53: filer_pb.FilerConf.PathConf } var file_filer_proto_depIdxs = []int32{ - 4, // 0: filer_pb.LookupDirectoryEntryResponse.entry:type_name -> filer_pb.Entry - 4, // 1: filer_pb.ListEntriesResponse.entry:type_name -> filer_pb.Entry - 7, // 2: filer_pb.Entry.chunks:type_name -> filer_pb.FileChunk - 10, // 3: filer_pb.Entry.attributes:type_name -> filer_pb.FuseAttributes - 49, // 4: filer_pb.Entry.extended:type_name -> filer_pb.Entry.ExtendedEntry - 50, // 5: filer_pb.Entry.remote:type_name -> filer_pb.Entry.Remote - 4, // 6: filer_pb.FullEntry.entry:type_name -> filer_pb.Entry - 4, // 7: filer_pb.EventNotification.old_entry:type_name -> filer_pb.Entry - 4, // 8: filer_pb.EventNotification.new_entry:type_name -> filer_pb.Entry - 9, // 9: filer_pb.FileChunk.fid:type_name -> filer_pb.FileId - 9, // 10: filer_pb.FileChunk.source_fid:type_name -> filer_pb.FileId - 7, // 11: filer_pb.FileChunkManifest.chunks:type_name -> filer_pb.FileChunk - 4, // 12: filer_pb.CreateEntryRequest.entry:type_name -> filer_pb.Entry - 4, // 13: filer_pb.UpdateEntryRequest.entry:type_name -> filer_pb.Entry - 7, // 14: filer_pb.AppendToEntryRequest.chunks:type_name -> filer_pb.FileChunk - 25, // 15: filer_pb.Locations.locations:type_name -> filer_pb.Location + 5, // 0: filer_pb.LookupDirectoryEntryResponse.entry:type_name -> filer_pb.Entry + 5, // 1: filer_pb.ListEntriesResponse.entry:type_name -> filer_pb.Entry + 8, // 2: filer_pb.Entry.chunks:type_name -> filer_pb.FileChunk + 11, // 3: filer_pb.Entry.attributes:type_name -> filer_pb.FuseAttributes + 50, // 4: filer_pb.Entry.extended:type_name -> filer_pb.Entry.ExtendedEntry + 4, // 5: filer_pb.Entry.remote_entry:type_name -> filer_pb.RemoteEntry + 5, // 6: filer_pb.FullEntry.entry:type_name -> filer_pb.Entry + 5, // 7: filer_pb.EventNotification.old_entry:type_name -> filer_pb.Entry + 5, // 8: filer_pb.EventNotification.new_entry:type_name -> filer_pb.Entry + 10, // 9: filer_pb.FileChunk.fid:type_name -> filer_pb.FileId + 10, // 10: filer_pb.FileChunk.source_fid:type_name -> filer_pb.FileId + 8, // 11: filer_pb.FileChunkManifest.chunks:type_name -> filer_pb.FileChunk + 5, // 12: filer_pb.CreateEntryRequest.entry:type_name -> filer_pb.Entry + 5, // 13: filer_pb.UpdateEntryRequest.entry:type_name -> filer_pb.Entry + 8, // 14: filer_pb.AppendToEntryRequest.chunks:type_name -> filer_pb.FileChunk + 26, // 15: filer_pb.Locations.locations:type_name -> filer_pb.Location 51, // 16: filer_pb.LookupVolumeResponse.locations_map:type_name -> filer_pb.LookupVolumeResponse.LocationsMapEntry - 27, // 17: filer_pb.CollectionListResponse.collections:type_name -> filer_pb.Collection - 6, // 18: filer_pb.SubscribeMetadataResponse.event_notification:type_name -> filer_pb.EventNotification + 28, // 17: filer_pb.CollectionListResponse.collections:type_name -> filer_pb.Collection + 7, // 18: filer_pb.SubscribeMetadataResponse.event_notification:type_name -> filer_pb.EventNotification 52, // 19: filer_pb.LocateBrokerResponse.resources:type_name -> filer_pb.LocateBrokerResponse.Resource 53, // 20: filer_pb.FilerConf.locations:type_name -> filer_pb.FilerConf.PathConf - 24, // 21: filer_pb.LookupVolumeResponse.LocationsMapEntry.value:type_name -> filer_pb.Locations + 25, // 21: filer_pb.LookupVolumeResponse.LocationsMapEntry.value:type_name -> filer_pb.Locations 0, // 22: filer_pb.SeaweedFiler.LookupDirectoryEntry:input_type -> filer_pb.LookupDirectoryEntryRequest 2, // 23: filer_pb.SeaweedFiler.ListEntries:input_type -> filer_pb.ListEntriesRequest - 11, // 24: filer_pb.SeaweedFiler.CreateEntry:input_type -> filer_pb.CreateEntryRequest - 13, // 25: filer_pb.SeaweedFiler.UpdateEntry:input_type -> filer_pb.UpdateEntryRequest - 15, // 26: filer_pb.SeaweedFiler.AppendToEntry:input_type -> filer_pb.AppendToEntryRequest - 17, // 27: filer_pb.SeaweedFiler.DeleteEntry:input_type -> filer_pb.DeleteEntryRequest - 19, // 28: filer_pb.SeaweedFiler.AtomicRenameEntry:input_type -> filer_pb.AtomicRenameEntryRequest - 21, // 29: filer_pb.SeaweedFiler.AssignVolume:input_type -> filer_pb.AssignVolumeRequest - 23, // 30: filer_pb.SeaweedFiler.LookupVolume:input_type -> filer_pb.LookupVolumeRequest - 28, // 31: filer_pb.SeaweedFiler.CollectionList:input_type -> filer_pb.CollectionListRequest - 30, // 32: filer_pb.SeaweedFiler.DeleteCollection:input_type -> filer_pb.DeleteCollectionRequest - 32, // 33: filer_pb.SeaweedFiler.Statistics:input_type -> filer_pb.StatisticsRequest - 34, // 34: filer_pb.SeaweedFiler.GetFilerConfiguration:input_type -> filer_pb.GetFilerConfigurationRequest - 36, // 35: filer_pb.SeaweedFiler.SubscribeMetadata:input_type -> filer_pb.SubscribeMetadataRequest - 36, // 36: filer_pb.SeaweedFiler.SubscribeLocalMetadata:input_type -> filer_pb.SubscribeMetadataRequest - 39, // 37: filer_pb.SeaweedFiler.KeepConnected:input_type -> filer_pb.KeepConnectedRequest - 41, // 38: filer_pb.SeaweedFiler.LocateBroker:input_type -> filer_pb.LocateBrokerRequest - 43, // 39: filer_pb.SeaweedFiler.KvGet:input_type -> filer_pb.KvGetRequest - 45, // 40: filer_pb.SeaweedFiler.KvPut:input_type -> filer_pb.KvPutRequest + 12, // 24: filer_pb.SeaweedFiler.CreateEntry:input_type -> filer_pb.CreateEntryRequest + 14, // 25: filer_pb.SeaweedFiler.UpdateEntry:input_type -> filer_pb.UpdateEntryRequest + 16, // 26: filer_pb.SeaweedFiler.AppendToEntry:input_type -> filer_pb.AppendToEntryRequest + 18, // 27: filer_pb.SeaweedFiler.DeleteEntry:input_type -> filer_pb.DeleteEntryRequest + 20, // 28: filer_pb.SeaweedFiler.AtomicRenameEntry:input_type -> filer_pb.AtomicRenameEntryRequest + 22, // 29: filer_pb.SeaweedFiler.AssignVolume:input_type -> filer_pb.AssignVolumeRequest + 24, // 30: filer_pb.SeaweedFiler.LookupVolume:input_type -> filer_pb.LookupVolumeRequest + 29, // 31: filer_pb.SeaweedFiler.CollectionList:input_type -> filer_pb.CollectionListRequest + 31, // 32: filer_pb.SeaweedFiler.DeleteCollection:input_type -> filer_pb.DeleteCollectionRequest + 33, // 33: filer_pb.SeaweedFiler.Statistics:input_type -> filer_pb.StatisticsRequest + 35, // 34: filer_pb.SeaweedFiler.GetFilerConfiguration:input_type -> filer_pb.GetFilerConfigurationRequest + 37, // 35: filer_pb.SeaweedFiler.SubscribeMetadata:input_type -> filer_pb.SubscribeMetadataRequest + 37, // 36: filer_pb.SeaweedFiler.SubscribeLocalMetadata:input_type -> filer_pb.SubscribeMetadataRequest + 40, // 37: filer_pb.SeaweedFiler.KeepConnected:input_type -> filer_pb.KeepConnectedRequest + 42, // 38: filer_pb.SeaweedFiler.LocateBroker:input_type -> filer_pb.LocateBrokerRequest + 44, // 39: filer_pb.SeaweedFiler.KvGet:input_type -> filer_pb.KvGetRequest + 46, // 40: filer_pb.SeaweedFiler.KvPut:input_type -> filer_pb.KvPutRequest 1, // 41: filer_pb.SeaweedFiler.LookupDirectoryEntry:output_type -> filer_pb.LookupDirectoryEntryResponse 3, // 42: filer_pb.SeaweedFiler.ListEntries:output_type -> filer_pb.ListEntriesResponse - 12, // 43: filer_pb.SeaweedFiler.CreateEntry:output_type -> filer_pb.CreateEntryResponse - 14, // 44: filer_pb.SeaweedFiler.UpdateEntry:output_type -> filer_pb.UpdateEntryResponse - 16, // 45: filer_pb.SeaweedFiler.AppendToEntry:output_type -> filer_pb.AppendToEntryResponse - 18, // 46: filer_pb.SeaweedFiler.DeleteEntry:output_type -> filer_pb.DeleteEntryResponse - 20, // 47: filer_pb.SeaweedFiler.AtomicRenameEntry:output_type -> filer_pb.AtomicRenameEntryResponse - 22, // 48: filer_pb.SeaweedFiler.AssignVolume:output_type -> filer_pb.AssignVolumeResponse - 26, // 49: filer_pb.SeaweedFiler.LookupVolume:output_type -> filer_pb.LookupVolumeResponse - 29, // 50: filer_pb.SeaweedFiler.CollectionList:output_type -> filer_pb.CollectionListResponse - 31, // 51: filer_pb.SeaweedFiler.DeleteCollection:output_type -> filer_pb.DeleteCollectionResponse - 33, // 52: filer_pb.SeaweedFiler.Statistics:output_type -> filer_pb.StatisticsResponse - 35, // 53: filer_pb.SeaweedFiler.GetFilerConfiguration:output_type -> filer_pb.GetFilerConfigurationResponse - 37, // 54: filer_pb.SeaweedFiler.SubscribeMetadata:output_type -> filer_pb.SubscribeMetadataResponse - 37, // 55: filer_pb.SeaweedFiler.SubscribeLocalMetadata:output_type -> filer_pb.SubscribeMetadataResponse - 40, // 56: filer_pb.SeaweedFiler.KeepConnected:output_type -> filer_pb.KeepConnectedResponse - 42, // 57: filer_pb.SeaweedFiler.LocateBroker:output_type -> filer_pb.LocateBrokerResponse - 44, // 58: filer_pb.SeaweedFiler.KvGet:output_type -> filer_pb.KvGetResponse - 46, // 59: filer_pb.SeaweedFiler.KvPut:output_type -> filer_pb.KvPutResponse + 13, // 43: filer_pb.SeaweedFiler.CreateEntry:output_type -> filer_pb.CreateEntryResponse + 15, // 44: filer_pb.SeaweedFiler.UpdateEntry:output_type -> filer_pb.UpdateEntryResponse + 17, // 45: filer_pb.SeaweedFiler.AppendToEntry:output_type -> filer_pb.AppendToEntryResponse + 19, // 46: filer_pb.SeaweedFiler.DeleteEntry:output_type -> filer_pb.DeleteEntryResponse + 21, // 47: filer_pb.SeaweedFiler.AtomicRenameEntry:output_type -> filer_pb.AtomicRenameEntryResponse + 23, // 48: filer_pb.SeaweedFiler.AssignVolume:output_type -> filer_pb.AssignVolumeResponse + 27, // 49: filer_pb.SeaweedFiler.LookupVolume:output_type -> filer_pb.LookupVolumeResponse + 30, // 50: filer_pb.SeaweedFiler.CollectionList:output_type -> filer_pb.CollectionListResponse + 32, // 51: filer_pb.SeaweedFiler.DeleteCollection:output_type -> filer_pb.DeleteCollectionResponse + 34, // 52: filer_pb.SeaweedFiler.Statistics:output_type -> filer_pb.StatisticsResponse + 36, // 53: filer_pb.SeaweedFiler.GetFilerConfiguration:output_type -> filer_pb.GetFilerConfigurationResponse + 38, // 54: filer_pb.SeaweedFiler.SubscribeMetadata:output_type -> filer_pb.SubscribeMetadataResponse + 38, // 55: filer_pb.SeaweedFiler.SubscribeLocalMetadata:output_type -> filer_pb.SubscribeMetadataResponse + 41, // 56: filer_pb.SeaweedFiler.KeepConnected:output_type -> filer_pb.KeepConnectedResponse + 43, // 57: filer_pb.SeaweedFiler.LocateBroker:output_type -> filer_pb.LocateBrokerResponse + 45, // 58: filer_pb.SeaweedFiler.KvGet:output_type -> filer_pb.KvGetResponse + 47, // 59: filer_pb.SeaweedFiler.KvPut:output_type -> filer_pb.KvPutResponse 41, // [41:60] is the sub-list for method output_type 22, // [22:41] is the sub-list for method input_type 22, // [22:22] is the sub-list for extension type_name @@ -4125,7 +4137,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Entry); i { + switch v := v.(*RemoteEntry); i { case 0: return &v.state case 1: @@ -4137,7 +4149,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FullEntry); i { + switch v := v.(*Entry); i { case 0: return &v.state case 1: @@ -4149,7 +4161,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EventNotification); i { + switch v := v.(*FullEntry); i { case 0: return &v.state case 1: @@ -4161,7 +4173,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FileChunk); i { + switch v := v.(*EventNotification); i { case 0: return &v.state case 1: @@ -4173,7 +4185,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FileChunkManifest); i { + switch v := v.(*FileChunk); i { case 0: return &v.state case 1: @@ -4185,7 +4197,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FileId); i { + switch v := v.(*FileChunkManifest); i { case 0: return &v.state case 1: @@ -4197,7 +4209,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FuseAttributes); i { + switch v := v.(*FileId); i { case 0: return &v.state case 1: @@ -4209,7 +4221,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateEntryRequest); i { + switch v := v.(*FuseAttributes); i { case 0: return &v.state case 1: @@ -4221,7 +4233,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateEntryResponse); i { + switch v := v.(*CreateEntryRequest); i { case 0: return &v.state case 1: @@ -4233,7 +4245,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateEntryRequest); i { + switch v := v.(*CreateEntryResponse); i { case 0: return &v.state case 1: @@ -4245,7 +4257,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateEntryResponse); i { + switch v := v.(*UpdateEntryRequest); i { case 0: return &v.state case 1: @@ -4257,7 +4269,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppendToEntryRequest); i { + switch v := v.(*UpdateEntryResponse); i { case 0: return &v.state case 1: @@ -4269,7 +4281,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppendToEntryResponse); i { + switch v := v.(*AppendToEntryRequest); i { case 0: return &v.state case 1: @@ -4281,7 +4293,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteEntryRequest); i { + switch v := v.(*AppendToEntryResponse); i { case 0: return &v.state case 1: @@ -4293,7 +4305,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteEntryResponse); i { + switch v := v.(*DeleteEntryRequest); i { case 0: return &v.state case 1: @@ -4305,7 +4317,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AtomicRenameEntryRequest); i { + switch v := v.(*DeleteEntryResponse); i { case 0: return &v.state case 1: @@ -4317,7 +4329,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AtomicRenameEntryResponse); i { + switch v := v.(*AtomicRenameEntryRequest); i { case 0: return &v.state case 1: @@ -4329,7 +4341,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AssignVolumeRequest); i { + switch v := v.(*AtomicRenameEntryResponse); i { case 0: return &v.state case 1: @@ -4341,7 +4353,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AssignVolumeResponse); i { + switch v := v.(*AssignVolumeRequest); i { case 0: return &v.state case 1: @@ -4353,7 +4365,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LookupVolumeRequest); i { + switch v := v.(*AssignVolumeResponse); i { case 0: return &v.state case 1: @@ -4365,7 +4377,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Locations); i { + switch v := v.(*LookupVolumeRequest); i { case 0: return &v.state case 1: @@ -4377,7 +4389,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Location); i { + switch v := v.(*Locations); i { case 0: return &v.state case 1: @@ -4389,7 +4401,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LookupVolumeResponse); i { + switch v := v.(*Location); i { case 0: return &v.state case 1: @@ -4401,7 +4413,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Collection); i { + switch v := v.(*LookupVolumeResponse); i { case 0: return &v.state case 1: @@ -4413,7 +4425,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionListRequest); i { + switch v := v.(*Collection); i { case 0: return &v.state case 1: @@ -4425,7 +4437,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectionListResponse); i { + switch v := v.(*CollectionListRequest); i { case 0: return &v.state case 1: @@ -4437,7 +4449,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteCollectionRequest); i { + switch v := v.(*CollectionListResponse); i { case 0: return &v.state case 1: @@ -4449,7 +4461,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteCollectionResponse); i { + switch v := v.(*DeleteCollectionRequest); i { case 0: return &v.state case 1: @@ -4461,7 +4473,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatisticsRequest); i { + switch v := v.(*DeleteCollectionResponse); i { case 0: return &v.state case 1: @@ -4473,7 +4485,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatisticsResponse); i { + switch v := v.(*StatisticsRequest); i { case 0: return &v.state case 1: @@ -4485,7 +4497,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetFilerConfigurationRequest); i { + switch v := v.(*StatisticsResponse); i { case 0: return &v.state case 1: @@ -4497,7 +4509,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetFilerConfigurationResponse); i { + switch v := v.(*GetFilerConfigurationRequest); i { case 0: return &v.state case 1: @@ -4509,7 +4521,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeMetadataRequest); i { + switch v := v.(*GetFilerConfigurationResponse); i { case 0: return &v.state case 1: @@ -4521,7 +4533,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeMetadataResponse); i { + switch v := v.(*SubscribeMetadataRequest); i { case 0: return &v.state case 1: @@ -4533,7 +4545,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogEntry); i { + switch v := v.(*SubscribeMetadataResponse); i { case 0: return &v.state case 1: @@ -4545,7 +4557,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KeepConnectedRequest); i { + switch v := v.(*LogEntry); i { case 0: return &v.state case 1: @@ -4557,7 +4569,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KeepConnectedResponse); i { + switch v := v.(*KeepConnectedRequest); i { case 0: return &v.state case 1: @@ -4569,7 +4581,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LocateBrokerRequest); i { + switch v := v.(*KeepConnectedResponse); i { case 0: return &v.state case 1: @@ -4581,7 +4593,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LocateBrokerResponse); i { + switch v := v.(*LocateBrokerRequest); i { case 0: return &v.state case 1: @@ -4593,7 +4605,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KvGetRequest); i { + switch v := v.(*LocateBrokerResponse); i { case 0: return &v.state case 1: @@ -4605,7 +4617,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KvGetResponse); i { + switch v := v.(*KvGetRequest); i { case 0: return &v.state case 1: @@ -4617,7 +4629,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KvPutRequest); i { + switch v := v.(*KvGetResponse); i { case 0: return &v.state case 1: @@ -4629,7 +4641,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KvPutResponse); i { + switch v := v.(*KvPutRequest); i { case 0: return &v.state case 1: @@ -4641,7 +4653,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FilerConf); i { + switch v := v.(*KvPutResponse); i { case 0: return &v.state case 1: @@ -4653,7 +4665,7 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoteConf); i { + switch v := v.(*FilerConf); i { case 0: return &v.state case 1: @@ -4664,8 +4676,8 @@ func file_filer_proto_init() { return nil } } - file_filer_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Entry_Remote); i { + file_filer_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoteConf); i { case 0: return &v.state case 1: diff --git a/weed/remote_storage/remote_storage.go b/weed/remote_storage/remote_storage.go new file mode 100644 index 000000000..79f71001b --- /dev/null +++ b/weed/remote_storage/remote_storage.go @@ -0,0 +1,50 @@ +package remote_storage + +import ( + "fmt" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "sync" +) + +type VisitFunc func(dir string, name string, isDirectory bool, remoteEntry *filer_pb.RemoteEntry) error + +type RemoteStorageClient interface { + Traverse(rootDir string, visitFn VisitFunc) error +} + +type RemoteStorageClientMaker interface { + Make(remoteConf *filer_pb.RemoteConf) (RemoteStorageClient, error) +} + +var ( + RemoteStorageClientMakers = make(map[string]RemoteStorageClientMaker) + remoteStorageClients = make(map[string]RemoteStorageClient) + remoteStorageClientsLock sync.Mutex +) + +func makeRemoteStorageClient(remoteConf *filer_pb.RemoteConf) (RemoteStorageClient, error) { + maker, found := RemoteStorageClientMakers[remoteConf.Type] + if !found { + return nil, fmt.Errorf("remote storage type %s not found", remoteConf.Type) + } + return maker.Make(remoteConf) +} + +func GetRemoteStorage(remoteConf *filer_pb.RemoteConf) (RemoteStorageClient, error) { + remoteStorageClientsLock.Lock() + defer remoteStorageClientsLock.Unlock() + + existingRemoteStorageClient, found := remoteStorageClients[remoteConf.Name] + if found { + return existingRemoteStorageClient, nil + } + + newRemoteStorageClient, err := makeRemoteStorageClient(remoteConf) + if err != nil { + return nil, fmt.Errorf("make remote storage client %s: %v", remoteConf.Name, err) + } + + remoteStorageClients[remoteConf.Name] = newRemoteStorageClient + + return newRemoteStorageClient, nil +} diff --git a/weed/remote_storage/s3/s3_storage_client.go b/weed/remote_storage/s3/s3_storage_client.go new file mode 100644 index 000000000..625d6e0e6 --- /dev/null +++ b/weed/remote_storage/s3/s3_storage_client.go @@ -0,0 +1,94 @@ +package s3 + +import ( + "fmt" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/s3" + "github.com/aws/aws-sdk-go/service/s3/s3iface" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/chrislusf/seaweedfs/weed/remote_storage" + "github.com/chrislusf/seaweedfs/weed/util" + "strings" +) + +func init() { + remote_storage.RemoteStorageClientMakers["s3"] = new(s3RemoteStorageMaker) +} + +type s3RemoteStorageMaker struct{} + +func (s s3RemoteStorageMaker) Make(conf *filer_pb.RemoteConf) (remote_storage.RemoteStorageClient, error) { + client := &s3RemoteStorageClient{ + conf: conf, + } + config := &aws.Config{ + Region: aws.String(conf.S3Region), + Endpoint: aws.String(conf.S3Endpoint), + S3ForcePathStyle: aws.Bool(true), + } + if conf.S3AccessKey != "" && conf.S3SecretKey != "" { + config.Credentials = credentials.NewStaticCredentials(conf.S3AccessKey, conf.S3SecretKey, "") + } + + sess, err := session.NewSession(config) + if err != nil { + return nil, fmt.Errorf("create aws session: %v", err) + } + client.conn = s3.New(sess) + return client, nil +} + +type s3RemoteStorageClient struct { + conf *filer_pb.RemoteConf + conn s3iface.S3API +} + +func (s s3RemoteStorageClient) Traverse(rootDir string, visitFn remote_storage.VisitFunc) (err error) { + if !strings.HasPrefix(rootDir, "/") { + return fmt.Errorf("remote directory %s should start with /", rootDir) + } + bucket := strings.Split(rootDir[1:], "/")[0] + prefix := rootDir[1+len(bucket):] + if len(prefix) > 0 && strings.HasPrefix(prefix, "/") { + prefix = prefix[1:] + } + + listInput := &s3.ListObjectsV2Input{ + Bucket: aws.String(bucket), + ContinuationToken: nil, + Delimiter: nil, // not aws.String("/"), iterate through all entries + EncodingType: nil, + ExpectedBucketOwner: nil, + FetchOwner: nil, + MaxKeys: nil, // aws.Int64(1000), + Prefix: aws.String(prefix), + RequestPayer: nil, + StartAfter: nil, + } + isLastPage := false + for !isLastPage && err == nil { + listErr := s.conn.ListObjectsV2Pages(listInput, func(page *s3.ListObjectsV2Output, lastPage bool) bool { + for _, content := range page.Contents { + key := *content.Key + dir, name := util.FullPath("/" + key).DirAndName() + if err := visitFn(dir, name, false, &filer_pb.RemoteEntry{ + LastModifiedAt: (*content.LastModified).Unix(), + Size: *content.Size, + ETag: *content.ETag, + StorageName: s.conf.Name, + }); err != nil { + return false + } + } + listInput.ContinuationToken = page.NextContinuationToken + isLastPage = lastPage + return true + }) + if listErr != nil { + err = fmt.Errorf("list %v: %v", rootDir, listErr) + } + } + return +} diff --git a/weed/replication/sink/filersink/filer_sink.go b/weed/replication/sink/filersink/filer_sink.go index 2b526cc52..d42ca63a8 100644 --- a/weed/replication/sink/filersink/filer_sink.go +++ b/weed/replication/sink/filersink/filer_sink.go @@ -134,7 +134,7 @@ func (fs *FilerSink) CreateEntry(key string, entry *filer_pb.Entry, signatures [ Attributes: entry.Attributes, Chunks: replicatedChunks, Content: entry.Content, - Remote: entry.Remote, + RemoteEntry: entry.RemoteEntry, }, IsFromOtherCluster: true, Signatures: signatures, diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go new file mode 100644 index 000000000..22d92ef8b --- /dev/null +++ b/weed/shell/command_remote_mount.go @@ -0,0 +1,200 @@ +package shell + +import ( + "context" + "flag" + "fmt" + "github.com/chrislusf/seaweedfs/weed/filer" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/chrislusf/seaweedfs/weed/remote_storage" + _ "github.com/chrislusf/seaweedfs/weed/remote_storage/s3" + "github.com/chrislusf/seaweedfs/weed/util" + "github.com/golang/protobuf/proto" + "io" + "strings" +) + +func init() { + Commands = append(Commands, &commandRemoteMount{}) +} + +type commandRemoteMount struct { +} + +func (c *commandRemoteMount) Name() string { + return "remote.mount" +} + +func (c *commandRemoteMount) Help() string { + return `mount remote storage and pull its metadata + + # assume a remote storage is configured to name "s3_1" + remote.configure -name=s3_1 -type=s3 -access_key=xxx -secret_key=yyy + + # mount and pull one bucket + remote.mount -dir=xxx -remote=s3_1/bucket + # mount and pull one directory in the bucket + remote.mount -dir=xxx -remote=s3_1/bucket/dir1 + +` +} + +func (c *commandRemoteMount) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { + + remoteMountCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) + + dir := remoteMountCommand.String("dir", "", "a directory in filer") + nonEmpty := remoteMountCommand.Bool("nonempty", false, "allows the mounting over a non-empty directory") + remote := remoteMountCommand.String("remote", "", "a directory in remote storage, ex. //path/to/dir") + + if err = remoteMountCommand.Parse(args); err != nil { + return nil + } + + // find configuration for remote storage + remoteConf, remotePath, err := c.findRemoteStorageConfiguration(commandEnv, writer, *remote) + if err != nil { + return fmt.Errorf("find configuration for %s: %v", *remote, err) + } + + // pull metadata from remote + if err = c.pullMetadata(commandEnv, writer, *dir, *nonEmpty, remoteConf, remotePath); err != nil { + return fmt.Errorf("pull metadata: %v", err) + } + + // store a mount configuration in filer + + + return nil +} + +func (c *commandRemoteMount) findRemoteStorageConfiguration(commandEnv *CommandEnv, writer io.Writer, remote string) (conf *filer_pb.RemoteConf, remotePath string, err error) { + + // find remote configuration + parts := strings.Split(remote, "/") + if len(parts) == 0 { + err = fmt.Errorf("wrong remote storage location %s", remote) + return + } + storageName := parts[0] + remotePath = remote[len(storageName):] + + // read storage configuration data + var confBytes []byte + err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + confBytes, err = filer.ReadInsideFiler(client, filer.DirectoryEtcRemote, storageName) + return err + }) + if err != nil { + err = fmt.Errorf("no remote storage configuration for %s : %v", storageName, err) + return + } + + // unmarshal storage configuration + conf = &filer_pb.RemoteConf{} + if unMarshalErr := proto.Unmarshal(confBytes, conf); unMarshalErr != nil { + err = fmt.Errorf("unmarshal %s/%s: %v", filer.DirectoryEtcRemote, storageName, unMarshalErr) + return + } + + return +} + +func (c *commandRemoteMount) pullMetadata(commandEnv *CommandEnv, writer io.Writer, dir string, nonEmpty bool, remoteConf *filer_pb.RemoteConf, remotePath string) error { + + // find existing directory, and ensure the directory is empty + var mountToDir *filer_pb.Entry + err := commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + parent, name := util.FullPath(dir).DirAndName() + resp, lookupErr := client.LookupDirectoryEntry(context.Background(), &filer_pb.LookupDirectoryEntryRequest{ + Directory: parent, + Name: name, + }) + if lookupErr != nil { + return fmt.Errorf("lookup %s: %v", dir, lookupErr) + } + mountToDir = resp.Entry + + mountToDirIsEmpty := false + listErr := filer_pb.SeaweedList(client, dir, "", func(entry *filer_pb.Entry, isLast bool) error { + mountToDirIsEmpty = false + return nil + }, "", false, 1) + + if listErr != nil { + return fmt.Errorf("list %s: %v", dir, listErr) + } + + if !mountToDirIsEmpty { + if !nonEmpty { + return fmt.Errorf("dir %s is not empty", dir) + } + } + + return nil + }) + if err != nil { + return err + } + + // visit remote storage + remoteStorage, err := remote_storage.GetRemoteStorage(remoteConf) + if err != nil { + return err + } + + err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + ctx := context.Background() + err = remoteStorage.Traverse(remotePath, func(remoteDir, name string, isDirectory bool, remoteEntry *filer_pb.RemoteEntry) error { + localDir := dir + remoteDir + println(util.NewFullPath(localDir, name)) + + lookupResponse, lookupErr := filer_pb.LookupEntry(client, &filer_pb.LookupDirectoryEntryRequest{ + Directory: localDir, + Name: name, + }) + if lookupErr != nil { + if lookupErr != filer_pb.ErrNotFound { + return lookupErr + } + } + existingEntry := lookupResponse.Entry + + if existingEntry == nil { + _, createErr := client.CreateEntry(ctx, &filer_pb.CreateEntryRequest{ + Directory: localDir, + Entry: &filer_pb.Entry{ + Name: name, + IsDirectory: isDirectory, + Attributes: &filer_pb.FuseAttributes{ + FileSize: uint64(remoteEntry.Size), + Mtime: remoteEntry.LastModifiedAt, + FileMode: uint32(0644), + }, + RemoteEntry: remoteEntry, + }, + }) + return createErr + } else { + if existingEntry.RemoteEntry.ETag != remoteEntry.ETag { + existingEntry.RemoteEntry = remoteEntry + existingEntry.Attributes.FileSize = uint64(remoteEntry.Size) + existingEntry.Attributes.Mtime = remoteEntry.LastModifiedAt + _, updateErr := client.UpdateEntry(ctx, &filer_pb.UpdateEntryRequest{ + Directory: localDir, + Entry: existingEntry, + }) + return updateErr + } + } + return nil + }) + return err + }) + + if err != nil { + return err + } + + return nil +} From 4b94b03d90a97dfd6fecc55e7091055bf5fc329c Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 27 Jul 2021 01:16:28 -0700 Subject: [PATCH 132/265] directory to remote storage mapping --- other/java/client/src/main/proto/filer.proto | 15 + weed/filer/filer_remote_storage.go | 76 ++- weed/filer/filer_remote_storage_test.go | 30 ++ weed/pb/filer.proto | 15 + weed/pb/filer_pb/filer.pb.go | 483 ++++++++++++------- weed/shell/command_remote_configure.go | 8 +- weed/shell/command_remote_mount.go | 3 +- 7 files changed, 446 insertions(+), 184 deletions(-) create mode 100644 weed/filer/filer_remote_storage_test.go diff --git a/other/java/client/src/main/proto/filer.proto b/other/java/client/src/main/proto/filer.proto index 23c841f18..12f9a8505 100644 --- a/other/java/client/src/main/proto/filer.proto +++ b/other/java/client/src/main/proto/filer.proto @@ -344,7 +344,9 @@ message LocateBrokerResponse { repeated Resource resources = 2; } +///////////////////////// // Key-Value operations +///////////////////////// message KvGetRequest { bytes key = 1; } @@ -360,7 +362,9 @@ message KvPutResponse { string error = 1; } +///////////////////////// // path-based configurations +///////////////////////// message FilerConf { int32 version = 1; message PathConf { @@ -376,6 +380,9 @@ message FilerConf { repeated PathConf locations = 2; } +///////////////////////// +// Remote Storage related +///////////////////////// message RemoteConf { string type = 1; string name = 2; @@ -384,3 +391,11 @@ message RemoteConf { string s3_region = 6; string s3_endpoint = 7; } + +message RemoteStorageMappingList { + repeated RemoteStorageMapping mappings = 1; +} +message RemoteStorageMapping { + string dir = 1; + string remote_storage_name = 2; +} diff --git a/weed/filer/filer_remote_storage.go b/weed/filer/filer_remote_storage.go index 8b136a763..dbb0363a5 100644 --- a/weed/filer/filer_remote_storage.go +++ b/weed/filer/filer_remote_storage.go @@ -1,32 +1,39 @@ package filer import ( - "bytes" "context" "fmt" + "github.com/chrislusf/seaweedfs/weed/remote_storage" + _ "github.com/chrislusf/seaweedfs/weed/remote_storage/s3" + "github.com/chrislusf/seaweedfs/weed/util" "github.com/golang/protobuf/proto" - "io" "math" + "strings" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" - "github.com/chrislusf/seaweedfs/weed/util" - "github.com/golang/protobuf/jsonpb" "github.com/viant/ptrie" ) +const REMOTE_STORAGE_CONF_SUFFIX = ".conf" +const REMOTE_STORAGE_MOUNT_FILE = "mount.mapping" + type FilerRemoteStorage struct { - rules ptrie.Trie + rules ptrie.Trie + storageNameToConf map[string]*filer_pb.RemoteConf } -func NewFilerRemoteStorage() (fc *FilerRemoteStorage) { - fc = &FilerRemoteStorage{ - rules: ptrie.New(), +func NewFilerRemoteStorage() (rs *FilerRemoteStorage) { + rs = &FilerRemoteStorage{ + rules: ptrie.New(), + storageNameToConf: make(map[string]*filer_pb.RemoteConf), } - return fc + return rs } -func (fc *FilerRemoteStorage) loadFromFiler(filer *Filer) (err error) { +func (rs *FilerRemoteStorage) loadRemoteStorageConfigurations(filer *Filer) (err error) { + // execute this on filer + entries, _, err := filer.ListDirectoryEntries(context.Background(), DirectoryEtcRemote, "", false, math.MaxInt64, "", "", "") if err != nil { if err == filer_pb.ErrNotFound { @@ -37,11 +44,56 @@ func (fc *FilerRemoteStorage) loadFromFiler(filer *Filer) (err error) { } for _, entry := range entries { + if entry.Name() == REMOTE_STORAGE_MOUNT_FILE { + rs.loadRemoteStorageMountMapping(entry.Content) + } + if !strings.HasSuffix(entry.Name(), REMOTE_STORAGE_CONF_SUFFIX) { + return nil + } conf := &filer_pb.RemoteConf{} if err := proto.Unmarshal(entry.Content, conf); err != nil { - return fmt.Errorf("unmarshal %s/%s: %v", DirectoryEtcRemote, entry.Name, err) + return fmt.Errorf("unmarshal %s/%s: %v", DirectoryEtcRemote, entry.Name(), err) } - fc.MountRemoteStorage(dir, conf) + rs.storageNameToConf[conf.Name] = conf } return nil } + +func (rs *FilerRemoteStorage) loadRemoteStorageMountMapping(data []byte) (err error) { + mappings := &filer_pb.RemoteStorageMappingList{} + if err := proto.Unmarshal(data, mappings); err != nil { + return fmt.Errorf("unmarshal %s/%s: %v", DirectoryEtcRemote, REMOTE_STORAGE_MOUNT_FILE, err) + } + for _, mapping := range mappings.Mappings { + rs.mapDirectoryToRemoteStorage(util.FullPath(mapping.Dir), mapping.RemoteStorageName) + } + return nil +} + +func (rs *FilerRemoteStorage) mapDirectoryToRemoteStorage(dir util.FullPath, remoteStorageName string) { + rs.rules.Put([]byte(dir+"/"), remoteStorageName) +} + +func (rs *FilerRemoteStorage) FindRemoteStorageClient(p util.FullPath) (client remote_storage.RemoteStorageClient, found bool) { + var storageName string + rs.rules.MatchPrefix([]byte(p), func(key []byte, value interface{}) bool { + storageName = value.(string) + return true + }) + + if storageName == "" { + return + } + + remoteConf, ok := rs.storageNameToConf[storageName] + if !ok { + return + } + + var err error + if client, err = remote_storage.GetRemoteStorage(remoteConf); err == nil { + found = true + return + } + return +} diff --git a/weed/filer/filer_remote_storage_test.go b/weed/filer/filer_remote_storage_test.go new file mode 100644 index 000000000..1a41c6e63 --- /dev/null +++ b/weed/filer/filer_remote_storage_test.go @@ -0,0 +1,30 @@ +package filer + +import ( + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestFilerRemoteStorage_FindRemoteStorageClient(t *testing.T) { + conf := &filer_pb.RemoteConf{ + Name: "s7", + Type: "s3", + } + rs := NewFilerRemoteStorage() + rs.storageNameToConf[conf.Name] = conf + + rs.mapDirectoryToRemoteStorage("/a/b/c", "s7") + + _, found := rs.FindRemoteStorageClient("/a/b/c/d/e/f") + assert.Equal(t, true, found, "find storage client") + + _, found2 := rs.FindRemoteStorageClient("/a/b") + assert.Equal(t, false, found2, "should not find storage client") + + _, found3 := rs.FindRemoteStorageClient("/a/b/c") + assert.Equal(t, false, found3, "should not find storage client") + + _, found4 := rs.FindRemoteStorageClient("/a/b/cc") + assert.Equal(t, false, found4, "should not find storage client") +} \ No newline at end of file diff --git a/weed/pb/filer.proto b/weed/pb/filer.proto index 23c841f18..12f9a8505 100644 --- a/weed/pb/filer.proto +++ b/weed/pb/filer.proto @@ -344,7 +344,9 @@ message LocateBrokerResponse { repeated Resource resources = 2; } +///////////////////////// // Key-Value operations +///////////////////////// message KvGetRequest { bytes key = 1; } @@ -360,7 +362,9 @@ message KvPutResponse { string error = 1; } +///////////////////////// // path-based configurations +///////////////////////// message FilerConf { int32 version = 1; message PathConf { @@ -376,6 +380,9 @@ message FilerConf { repeated PathConf locations = 2; } +///////////////////////// +// Remote Storage related +///////////////////////// message RemoteConf { string type = 1; string name = 2; @@ -384,3 +391,11 @@ message RemoteConf { string s3_region = 6; string s3_endpoint = 7; } + +message RemoteStorageMappingList { + repeated RemoteStorageMapping mappings = 1; +} +message RemoteStorageMapping { + string dir = 1; + string remote_storage_name = 2; +} diff --git a/weed/pb/filer_pb/filer.pb.go b/weed/pb/filer_pb/filer.pb.go index 972f7c0e9..65b882a6c 100644 --- a/weed/pb/filer_pb/filer.pb.go +++ b/weed/pb/filer_pb/filer.pb.go @@ -2900,7 +2900,9 @@ func (x *LocateBrokerResponse) GetResources() []*LocateBrokerResponse_Resource { return nil } +///////////////////////// // Key-Value operations +///////////////////////// type KvGetRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3105,7 +3107,9 @@ func (x *KvPutResponse) GetError() string { return "" } +///////////////////////// // path-based configurations +///////////////////////// type FilerConf struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3161,6 +3165,9 @@ func (x *FilerConf) GetLocations() []*FilerConf_PathConf { return nil } +///////////////////////// +// Remote Storage related +///////////////////////// type RemoteConf struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3248,6 +3255,108 @@ func (x *RemoteConf) GetS3Endpoint() string { return "" } +type RemoteStorageMappingList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Mappings []*RemoteStorageMapping `protobuf:"bytes,1,rep,name=mappings,proto3" json:"mappings,omitempty"` +} + +func (x *RemoteStorageMappingList) Reset() { + *x = RemoteStorageMappingList{} + if protoimpl.UnsafeEnabled { + mi := &file_filer_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoteStorageMappingList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoteStorageMappingList) ProtoMessage() {} + +func (x *RemoteStorageMappingList) ProtoReflect() protoreflect.Message { + mi := &file_filer_proto_msgTypes[50] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoteStorageMappingList.ProtoReflect.Descriptor instead. +func (*RemoteStorageMappingList) Descriptor() ([]byte, []int) { + return file_filer_proto_rawDescGZIP(), []int{50} +} + +func (x *RemoteStorageMappingList) GetMappings() []*RemoteStorageMapping { + if x != nil { + return x.Mappings + } + return nil +} + +type RemoteStorageMapping struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Dir string `protobuf:"bytes,1,opt,name=dir,proto3" json:"dir,omitempty"` + RemoteStorageName string `protobuf:"bytes,2,opt,name=remote_storage_name,json=remoteStorageName,proto3" json:"remote_storage_name,omitempty"` +} + +func (x *RemoteStorageMapping) Reset() { + *x = RemoteStorageMapping{} + if protoimpl.UnsafeEnabled { + mi := &file_filer_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoteStorageMapping) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoteStorageMapping) ProtoMessage() {} + +func (x *RemoteStorageMapping) ProtoReflect() protoreflect.Message { + mi := &file_filer_proto_msgTypes[51] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoteStorageMapping.ProtoReflect.Descriptor instead. +func (*RemoteStorageMapping) Descriptor() ([]byte, []int) { + return file_filer_proto_rawDescGZIP(), []int{51} +} + +func (x *RemoteStorageMapping) GetDir() string { + if x != nil { + return x.Dir + } + return "" +} + +func (x *RemoteStorageMapping) GetRemoteStorageName() string { + if x != nil { + return x.RemoteStorageName + } + return "" +} + // if found, send the exact address // if not found, send the full list of existing brokers type LocateBrokerResponse_Resource struct { @@ -3262,7 +3371,7 @@ type LocateBrokerResponse_Resource struct { func (x *LocateBrokerResponse_Resource) Reset() { *x = LocateBrokerResponse_Resource{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[52] + mi := &file_filer_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3275,7 +3384,7 @@ func (x *LocateBrokerResponse_Resource) String() string { func (*LocateBrokerResponse_Resource) ProtoMessage() {} func (x *LocateBrokerResponse_Resource) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[52] + mi := &file_filer_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3323,7 +3432,7 @@ type FilerConf_PathConf struct { func (x *FilerConf_PathConf) Reset() { *x = FilerConf_PathConf{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[53] + mi := &file_filer_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3336,7 +3445,7 @@ func (x *FilerConf_PathConf) String() string { func (*FilerConf_PathConf) ProtoMessage() {} func (x *FilerConf_PathConf) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[53] + mi := &file_filer_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3834,115 +3943,126 @@ var file_filer_proto_rawDesc = []byte{ 0x09, 0x73, 0x33, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x33, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x33, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x73, 0x33, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x32, 0xdc, 0x0c, 0x0a, 0x0c, - 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x14, - 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, + 0x0a, 0x73, 0x33, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x56, 0x0a, 0x18, 0x52, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x73, 0x22, 0x58, 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x64, + 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x72, 0x12, 0x2e, 0x0a, + 0x13, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x32, 0xdc, 0x0c, + 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x67, + 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, - 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, - 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, - 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x21, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, 0x53, 0x74, 0x61, - 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, - 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x65, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, - 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0d, 0x4b, 0x65, 0x65, - 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, - 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, - 0x72, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, - 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, - 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, - 0x0a, 0x05, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, - 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, - 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, - 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, - 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, + 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, + 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, 0x53, + 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0d, 0x4b, + 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, + 0x01, 0x30, 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, + 0x6b, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, + 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, + 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4f, 0x0a, 0x10, + 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x42, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2f, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, + 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, + 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3957,7 +4077,7 @@ func file_filer_proto_rawDescGZIP() []byte { return file_filer_proto_rawDescData } -var file_filer_proto_msgTypes = make([]protoimpl.MessageInfo, 54) +var file_filer_proto_msgTypes = make([]protoimpl.MessageInfo, 56) var file_filer_proto_goTypes = []interface{}{ (*LookupDirectoryEntryRequest)(nil), // 0: filer_pb.LookupDirectoryEntryRequest (*LookupDirectoryEntryResponse)(nil), // 1: filer_pb.LookupDirectoryEntryResponse @@ -4009,17 +4129,19 @@ var file_filer_proto_goTypes = []interface{}{ (*KvPutResponse)(nil), // 47: filer_pb.KvPutResponse (*FilerConf)(nil), // 48: filer_pb.FilerConf (*RemoteConf)(nil), // 49: filer_pb.RemoteConf - nil, // 50: filer_pb.Entry.ExtendedEntry - nil, // 51: filer_pb.LookupVolumeResponse.LocationsMapEntry - (*LocateBrokerResponse_Resource)(nil), // 52: filer_pb.LocateBrokerResponse.Resource - (*FilerConf_PathConf)(nil), // 53: filer_pb.FilerConf.PathConf + (*RemoteStorageMappingList)(nil), // 50: filer_pb.RemoteStorageMappingList + (*RemoteStorageMapping)(nil), // 51: filer_pb.RemoteStorageMapping + nil, // 52: filer_pb.Entry.ExtendedEntry + nil, // 53: filer_pb.LookupVolumeResponse.LocationsMapEntry + (*LocateBrokerResponse_Resource)(nil), // 54: filer_pb.LocateBrokerResponse.Resource + (*FilerConf_PathConf)(nil), // 55: filer_pb.FilerConf.PathConf } var file_filer_proto_depIdxs = []int32{ 5, // 0: filer_pb.LookupDirectoryEntryResponse.entry:type_name -> filer_pb.Entry 5, // 1: filer_pb.ListEntriesResponse.entry:type_name -> filer_pb.Entry 8, // 2: filer_pb.Entry.chunks:type_name -> filer_pb.FileChunk 11, // 3: filer_pb.Entry.attributes:type_name -> filer_pb.FuseAttributes - 50, // 4: filer_pb.Entry.extended:type_name -> filer_pb.Entry.ExtendedEntry + 52, // 4: filer_pb.Entry.extended:type_name -> filer_pb.Entry.ExtendedEntry 4, // 5: filer_pb.Entry.remote_entry:type_name -> filer_pb.RemoteEntry 5, // 6: filer_pb.FullEntry.entry:type_name -> filer_pb.Entry 5, // 7: filer_pb.EventNotification.old_entry:type_name -> filer_pb.Entry @@ -4031,55 +4153,56 @@ var file_filer_proto_depIdxs = []int32{ 5, // 13: filer_pb.UpdateEntryRequest.entry:type_name -> filer_pb.Entry 8, // 14: filer_pb.AppendToEntryRequest.chunks:type_name -> filer_pb.FileChunk 26, // 15: filer_pb.Locations.locations:type_name -> filer_pb.Location - 51, // 16: filer_pb.LookupVolumeResponse.locations_map:type_name -> filer_pb.LookupVolumeResponse.LocationsMapEntry + 53, // 16: filer_pb.LookupVolumeResponse.locations_map:type_name -> filer_pb.LookupVolumeResponse.LocationsMapEntry 28, // 17: filer_pb.CollectionListResponse.collections:type_name -> filer_pb.Collection 7, // 18: filer_pb.SubscribeMetadataResponse.event_notification:type_name -> filer_pb.EventNotification - 52, // 19: filer_pb.LocateBrokerResponse.resources:type_name -> filer_pb.LocateBrokerResponse.Resource - 53, // 20: filer_pb.FilerConf.locations:type_name -> filer_pb.FilerConf.PathConf - 25, // 21: filer_pb.LookupVolumeResponse.LocationsMapEntry.value:type_name -> filer_pb.Locations - 0, // 22: filer_pb.SeaweedFiler.LookupDirectoryEntry:input_type -> filer_pb.LookupDirectoryEntryRequest - 2, // 23: filer_pb.SeaweedFiler.ListEntries:input_type -> filer_pb.ListEntriesRequest - 12, // 24: filer_pb.SeaweedFiler.CreateEntry:input_type -> filer_pb.CreateEntryRequest - 14, // 25: filer_pb.SeaweedFiler.UpdateEntry:input_type -> filer_pb.UpdateEntryRequest - 16, // 26: filer_pb.SeaweedFiler.AppendToEntry:input_type -> filer_pb.AppendToEntryRequest - 18, // 27: filer_pb.SeaweedFiler.DeleteEntry:input_type -> filer_pb.DeleteEntryRequest - 20, // 28: filer_pb.SeaweedFiler.AtomicRenameEntry:input_type -> filer_pb.AtomicRenameEntryRequest - 22, // 29: filer_pb.SeaweedFiler.AssignVolume:input_type -> filer_pb.AssignVolumeRequest - 24, // 30: filer_pb.SeaweedFiler.LookupVolume:input_type -> filer_pb.LookupVolumeRequest - 29, // 31: filer_pb.SeaweedFiler.CollectionList:input_type -> filer_pb.CollectionListRequest - 31, // 32: filer_pb.SeaweedFiler.DeleteCollection:input_type -> filer_pb.DeleteCollectionRequest - 33, // 33: filer_pb.SeaweedFiler.Statistics:input_type -> filer_pb.StatisticsRequest - 35, // 34: filer_pb.SeaweedFiler.GetFilerConfiguration:input_type -> filer_pb.GetFilerConfigurationRequest - 37, // 35: filer_pb.SeaweedFiler.SubscribeMetadata:input_type -> filer_pb.SubscribeMetadataRequest - 37, // 36: filer_pb.SeaweedFiler.SubscribeLocalMetadata:input_type -> filer_pb.SubscribeMetadataRequest - 40, // 37: filer_pb.SeaweedFiler.KeepConnected:input_type -> filer_pb.KeepConnectedRequest - 42, // 38: filer_pb.SeaweedFiler.LocateBroker:input_type -> filer_pb.LocateBrokerRequest - 44, // 39: filer_pb.SeaweedFiler.KvGet:input_type -> filer_pb.KvGetRequest - 46, // 40: filer_pb.SeaweedFiler.KvPut:input_type -> filer_pb.KvPutRequest - 1, // 41: filer_pb.SeaweedFiler.LookupDirectoryEntry:output_type -> filer_pb.LookupDirectoryEntryResponse - 3, // 42: filer_pb.SeaweedFiler.ListEntries:output_type -> filer_pb.ListEntriesResponse - 13, // 43: filer_pb.SeaweedFiler.CreateEntry:output_type -> filer_pb.CreateEntryResponse - 15, // 44: filer_pb.SeaweedFiler.UpdateEntry:output_type -> filer_pb.UpdateEntryResponse - 17, // 45: filer_pb.SeaweedFiler.AppendToEntry:output_type -> filer_pb.AppendToEntryResponse - 19, // 46: filer_pb.SeaweedFiler.DeleteEntry:output_type -> filer_pb.DeleteEntryResponse - 21, // 47: filer_pb.SeaweedFiler.AtomicRenameEntry:output_type -> filer_pb.AtomicRenameEntryResponse - 23, // 48: filer_pb.SeaweedFiler.AssignVolume:output_type -> filer_pb.AssignVolumeResponse - 27, // 49: filer_pb.SeaweedFiler.LookupVolume:output_type -> filer_pb.LookupVolumeResponse - 30, // 50: filer_pb.SeaweedFiler.CollectionList:output_type -> filer_pb.CollectionListResponse - 32, // 51: filer_pb.SeaweedFiler.DeleteCollection:output_type -> filer_pb.DeleteCollectionResponse - 34, // 52: filer_pb.SeaweedFiler.Statistics:output_type -> filer_pb.StatisticsResponse - 36, // 53: filer_pb.SeaweedFiler.GetFilerConfiguration:output_type -> filer_pb.GetFilerConfigurationResponse - 38, // 54: filer_pb.SeaweedFiler.SubscribeMetadata:output_type -> filer_pb.SubscribeMetadataResponse - 38, // 55: filer_pb.SeaweedFiler.SubscribeLocalMetadata:output_type -> filer_pb.SubscribeMetadataResponse - 41, // 56: filer_pb.SeaweedFiler.KeepConnected:output_type -> filer_pb.KeepConnectedResponse - 43, // 57: filer_pb.SeaweedFiler.LocateBroker:output_type -> filer_pb.LocateBrokerResponse - 45, // 58: filer_pb.SeaweedFiler.KvGet:output_type -> filer_pb.KvGetResponse - 47, // 59: filer_pb.SeaweedFiler.KvPut:output_type -> filer_pb.KvPutResponse - 41, // [41:60] is the sub-list for method output_type - 22, // [22:41] is the sub-list for method input_type - 22, // [22:22] is the sub-list for extension type_name - 22, // [22:22] is the sub-list for extension extendee - 0, // [0:22] is the sub-list for field type_name + 54, // 19: filer_pb.LocateBrokerResponse.resources:type_name -> filer_pb.LocateBrokerResponse.Resource + 55, // 20: filer_pb.FilerConf.locations:type_name -> filer_pb.FilerConf.PathConf + 51, // 21: filer_pb.RemoteStorageMappingList.mappings:type_name -> filer_pb.RemoteStorageMapping + 25, // 22: filer_pb.LookupVolumeResponse.LocationsMapEntry.value:type_name -> filer_pb.Locations + 0, // 23: filer_pb.SeaweedFiler.LookupDirectoryEntry:input_type -> filer_pb.LookupDirectoryEntryRequest + 2, // 24: filer_pb.SeaweedFiler.ListEntries:input_type -> filer_pb.ListEntriesRequest + 12, // 25: filer_pb.SeaweedFiler.CreateEntry:input_type -> filer_pb.CreateEntryRequest + 14, // 26: filer_pb.SeaweedFiler.UpdateEntry:input_type -> filer_pb.UpdateEntryRequest + 16, // 27: filer_pb.SeaweedFiler.AppendToEntry:input_type -> filer_pb.AppendToEntryRequest + 18, // 28: filer_pb.SeaweedFiler.DeleteEntry:input_type -> filer_pb.DeleteEntryRequest + 20, // 29: filer_pb.SeaweedFiler.AtomicRenameEntry:input_type -> filer_pb.AtomicRenameEntryRequest + 22, // 30: filer_pb.SeaweedFiler.AssignVolume:input_type -> filer_pb.AssignVolumeRequest + 24, // 31: filer_pb.SeaweedFiler.LookupVolume:input_type -> filer_pb.LookupVolumeRequest + 29, // 32: filer_pb.SeaweedFiler.CollectionList:input_type -> filer_pb.CollectionListRequest + 31, // 33: filer_pb.SeaweedFiler.DeleteCollection:input_type -> filer_pb.DeleteCollectionRequest + 33, // 34: filer_pb.SeaweedFiler.Statistics:input_type -> filer_pb.StatisticsRequest + 35, // 35: filer_pb.SeaweedFiler.GetFilerConfiguration:input_type -> filer_pb.GetFilerConfigurationRequest + 37, // 36: filer_pb.SeaweedFiler.SubscribeMetadata:input_type -> filer_pb.SubscribeMetadataRequest + 37, // 37: filer_pb.SeaweedFiler.SubscribeLocalMetadata:input_type -> filer_pb.SubscribeMetadataRequest + 40, // 38: filer_pb.SeaweedFiler.KeepConnected:input_type -> filer_pb.KeepConnectedRequest + 42, // 39: filer_pb.SeaweedFiler.LocateBroker:input_type -> filer_pb.LocateBrokerRequest + 44, // 40: filer_pb.SeaweedFiler.KvGet:input_type -> filer_pb.KvGetRequest + 46, // 41: filer_pb.SeaweedFiler.KvPut:input_type -> filer_pb.KvPutRequest + 1, // 42: filer_pb.SeaweedFiler.LookupDirectoryEntry:output_type -> filer_pb.LookupDirectoryEntryResponse + 3, // 43: filer_pb.SeaweedFiler.ListEntries:output_type -> filer_pb.ListEntriesResponse + 13, // 44: filer_pb.SeaweedFiler.CreateEntry:output_type -> filer_pb.CreateEntryResponse + 15, // 45: filer_pb.SeaweedFiler.UpdateEntry:output_type -> filer_pb.UpdateEntryResponse + 17, // 46: filer_pb.SeaweedFiler.AppendToEntry:output_type -> filer_pb.AppendToEntryResponse + 19, // 47: filer_pb.SeaweedFiler.DeleteEntry:output_type -> filer_pb.DeleteEntryResponse + 21, // 48: filer_pb.SeaweedFiler.AtomicRenameEntry:output_type -> filer_pb.AtomicRenameEntryResponse + 23, // 49: filer_pb.SeaweedFiler.AssignVolume:output_type -> filer_pb.AssignVolumeResponse + 27, // 50: filer_pb.SeaweedFiler.LookupVolume:output_type -> filer_pb.LookupVolumeResponse + 30, // 51: filer_pb.SeaweedFiler.CollectionList:output_type -> filer_pb.CollectionListResponse + 32, // 52: filer_pb.SeaweedFiler.DeleteCollection:output_type -> filer_pb.DeleteCollectionResponse + 34, // 53: filer_pb.SeaweedFiler.Statistics:output_type -> filer_pb.StatisticsResponse + 36, // 54: filer_pb.SeaweedFiler.GetFilerConfiguration:output_type -> filer_pb.GetFilerConfigurationResponse + 38, // 55: filer_pb.SeaweedFiler.SubscribeMetadata:output_type -> filer_pb.SubscribeMetadataResponse + 38, // 56: filer_pb.SeaweedFiler.SubscribeLocalMetadata:output_type -> filer_pb.SubscribeMetadataResponse + 41, // 57: filer_pb.SeaweedFiler.KeepConnected:output_type -> filer_pb.KeepConnectedResponse + 43, // 58: filer_pb.SeaweedFiler.LocateBroker:output_type -> filer_pb.LocateBrokerResponse + 45, // 59: filer_pb.SeaweedFiler.KvGet:output_type -> filer_pb.KvGetResponse + 47, // 60: filer_pb.SeaweedFiler.KvPut:output_type -> filer_pb.KvPutResponse + 42, // [42:61] is the sub-list for method output_type + 23, // [23:42] is the sub-list for method input_type + 23, // [23:23] is the sub-list for extension type_name + 23, // [23:23] is the sub-list for extension extendee + 0, // [0:23] is the sub-list for field type_name } func init() { file_filer_proto_init() } @@ -4688,7 +4811,31 @@ func file_filer_proto_init() { return nil } } - file_filer_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_filer_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoteStorageMappingList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_filer_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoteStorageMapping); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_filer_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LocateBrokerResponse_Resource); i { case 0: return &v.state @@ -4700,7 +4847,7 @@ func file_filer_proto_init() { return nil } } - file_filer_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_filer_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FilerConf_PathConf); i { case 0: return &v.state @@ -4719,7 +4866,7 @@ func file_filer_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_filer_proto_rawDesc, NumEnums: 0, - NumMessages: 54, + NumMessages: 56, NumExtensions: 0, NumServices: 1, }, diff --git a/weed/shell/command_remote_configure.go b/weed/shell/command_remote_configure.go index 567143ce1..20ded5f5b 100644 --- a/weed/shell/command_remote_configure.go +++ b/weed/shell/command_remote_configure.go @@ -10,6 +10,7 @@ import ( "github.com/golang/protobuf/proto" "io" "regexp" + "strings" ) func init() { @@ -84,6 +85,9 @@ func (c *commandRemoteConfigure) listExistingRemoteStorages(commandEnv *CommandE fmt.Fprintf(writer, "skipping %s\n", entry.Name) return nil } + if !strings.HasSuffix(entry.Name, filer.REMOTE_STORAGE_CONF_SUFFIX) { + return nil + } conf := &filer_pb.RemoteConf{} if err := proto.Unmarshal(entry.Content, conf); err != nil { @@ -105,7 +109,7 @@ func (c *commandRemoteConfigure) deleteRemoteStorage(commandEnv *CommandEnv, wri request := &filer_pb.DeleteEntryRequest{ Directory: filer.DirectoryEtcRemote, - Name: storageName, + Name: storageName + filer.REMOTE_STORAGE_CONF_SUFFIX, IgnoreRecursiveError: false, IsDeleteData: true, IsRecursive: true, @@ -132,7 +136,7 @@ func (c *commandRemoteConfigure) saveRemoteStorage(commandEnv *CommandEnv, write } if err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { - return filer.SaveInsideFiler(client, filer.DirectoryEtcRemote, conf.Name, data) + return filer.SaveInsideFiler(client, filer.DirectoryEtcRemote, conf.Name+filer.REMOTE_STORAGE_CONF_SUFFIX, data) }); err != nil && err != filer_pb.ErrNotFound { return err } diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go index 22d92ef8b..10541092a 100644 --- a/weed/shell/command_remote_mount.go +++ b/weed/shell/command_remote_mount.go @@ -7,7 +7,6 @@ import ( "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/remote_storage" - _ "github.com/chrislusf/seaweedfs/weed/remote_storage/s3" "github.com/chrislusf/seaweedfs/weed/util" "github.com/golang/protobuf/proto" "io" @@ -82,7 +81,7 @@ func (c *commandRemoteMount) findRemoteStorageConfiguration(commandEnv *CommandE // read storage configuration data var confBytes []byte err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { - confBytes, err = filer.ReadInsideFiler(client, filer.DirectoryEtcRemote, storageName) + confBytes, err = filer.ReadInsideFiler(client, filer.DirectoryEtcRemote, storageName+filer.REMOTE_STORAGE_CONF_SUFFIX) return err }) if err != nil { From 1752eeb53803736f72d85d35f504997744288716 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 27 Jul 2021 03:26:35 -0700 Subject: [PATCH 133/265] remote.mount saves the mapping --- other/java/client/src/main/proto/filer.proto | 6 +- weed/filer/filer_remote_storage.go | 34 +- weed/pb/filer.proto | 6 +- weed/pb/filer_pb/filer.pb.go | 352 ++++++++----------- weed/remote_storage/remote_storage.go | 23 +- weed/remote_storage/s3/s3_storage_client.go | 26 +- weed/shell/command_remote_mount.go | 65 +++- 7 files changed, 254 insertions(+), 258 deletions(-) diff --git a/other/java/client/src/main/proto/filer.proto b/other/java/client/src/main/proto/filer.proto index 12f9a8505..efecc4e97 100644 --- a/other/java/client/src/main/proto/filer.proto +++ b/other/java/client/src/main/proto/filer.proto @@ -392,10 +392,6 @@ message RemoteConf { string s3_endpoint = 7; } -message RemoteStorageMappingList { - repeated RemoteStorageMapping mappings = 1; -} message RemoteStorageMapping { - string dir = 1; - string remote_storage_name = 2; + map mappings = 1; } diff --git a/weed/filer/filer_remote_storage.go b/weed/filer/filer_remote_storage.go index dbb0363a5..f6f3adb22 100644 --- a/weed/filer/filer_remote_storage.go +++ b/weed/filer/filer_remote_storage.go @@ -60,12 +60,12 @@ func (rs *FilerRemoteStorage) loadRemoteStorageConfigurations(filer *Filer) (err } func (rs *FilerRemoteStorage) loadRemoteStorageMountMapping(data []byte) (err error) { - mappings := &filer_pb.RemoteStorageMappingList{} + mappings := &filer_pb.RemoteStorageMapping{} if err := proto.Unmarshal(data, mappings); err != nil { return fmt.Errorf("unmarshal %s/%s: %v", DirectoryEtcRemote, REMOTE_STORAGE_MOUNT_FILE, err) } - for _, mapping := range mappings.Mappings { - rs.mapDirectoryToRemoteStorage(util.FullPath(mapping.Dir), mapping.RemoteStorageName) + for dir, storageLocation := range mappings.Mappings { + rs.mapDirectoryToRemoteStorage(util.FullPath(dir), storageLocation) } return nil } @@ -75,16 +75,18 @@ func (rs *FilerRemoteStorage) mapDirectoryToRemoteStorage(dir util.FullPath, rem } func (rs *FilerRemoteStorage) FindRemoteStorageClient(p util.FullPath) (client remote_storage.RemoteStorageClient, found bool) { - var storageName string + var storageLocation string rs.rules.MatchPrefix([]byte(p), func(key []byte, value interface{}) bool { - storageName = value.(string) + storageLocation = value.(string) return true }) - if storageName == "" { + if storageLocation == "" { return } + storageName, _, _ := remote_storage.RemoteStorageLocation(storageLocation).NameBucketPath() + remoteConf, ok := rs.storageNameToConf[storageName] if !ok { return @@ -97,3 +99,23 @@ func (rs *FilerRemoteStorage) FindRemoteStorageClient(p util.FullPath) (client r } return } + +func AddMapping(oldContent []byte, dir string, storageLocation remote_storage.RemoteStorageLocation) (newContent []byte, err error) { + mappings := &filer_pb.RemoteStorageMapping{ + Mappings: make(map[string]string), + } + if len(oldContent) > 0 { + if err = proto.Unmarshal(oldContent, mappings); err != nil { + return oldContent, fmt.Errorf("unmarshal existing mappings: %v", err) + } + } + + // set the new mapping + mappings.Mappings[dir] = string(storageLocation) + + if newContent, err = proto.Marshal(mappings); err != nil { + return oldContent, fmt.Errorf("unmarshal existing mappings: %v", err) + } + + return +} \ No newline at end of file diff --git a/weed/pb/filer.proto b/weed/pb/filer.proto index 12f9a8505..efecc4e97 100644 --- a/weed/pb/filer.proto +++ b/weed/pb/filer.proto @@ -392,10 +392,6 @@ message RemoteConf { string s3_endpoint = 7; } -message RemoteStorageMappingList { - repeated RemoteStorageMapping mappings = 1; -} message RemoteStorageMapping { - string dir = 1; - string remote_storage_name = 2; + map mappings = 1; } diff --git a/weed/pb/filer_pb/filer.pb.go b/weed/pb/filer_pb/filer.pb.go index 65b882a6c..7739f65e8 100644 --- a/weed/pb/filer_pb/filer.pb.go +++ b/weed/pb/filer_pb/filer.pb.go @@ -3255,66 +3255,18 @@ func (x *RemoteConf) GetS3Endpoint() string { return "" } -type RemoteStorageMappingList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Mappings []*RemoteStorageMapping `protobuf:"bytes,1,rep,name=mappings,proto3" json:"mappings,omitempty"` -} - -func (x *RemoteStorageMappingList) Reset() { - *x = RemoteStorageMappingList{} - if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[50] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RemoteStorageMappingList) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RemoteStorageMappingList) ProtoMessage() {} - -func (x *RemoteStorageMappingList) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[50] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RemoteStorageMappingList.ProtoReflect.Descriptor instead. -func (*RemoteStorageMappingList) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{50} -} - -func (x *RemoteStorageMappingList) GetMappings() []*RemoteStorageMapping { - if x != nil { - return x.Mappings - } - return nil -} - type RemoteStorageMapping struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Dir string `protobuf:"bytes,1,opt,name=dir,proto3" json:"dir,omitempty"` - RemoteStorageName string `protobuf:"bytes,2,opt,name=remote_storage_name,json=remoteStorageName,proto3" json:"remote_storage_name,omitempty"` + Mappings map[string]string `protobuf:"bytes,1,rep,name=mappings,proto3" json:"mappings,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *RemoteStorageMapping) Reset() { *x = RemoteStorageMapping{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[51] + mi := &file_filer_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3327,7 +3279,7 @@ func (x *RemoteStorageMapping) String() string { func (*RemoteStorageMapping) ProtoMessage() {} func (x *RemoteStorageMapping) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[51] + mi := &file_filer_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3340,21 +3292,14 @@ func (x *RemoteStorageMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoteStorageMapping.ProtoReflect.Descriptor instead. func (*RemoteStorageMapping) Descriptor() ([]byte, []int) { - return file_filer_proto_rawDescGZIP(), []int{51} + return file_filer_proto_rawDescGZIP(), []int{50} } -func (x *RemoteStorageMapping) GetDir() string { +func (x *RemoteStorageMapping) GetMappings() map[string]string { if x != nil { - return x.Dir + return x.Mappings } - return "" -} - -func (x *RemoteStorageMapping) GetRemoteStorageName() string { - if x != nil { - return x.RemoteStorageName - } - return "" + return nil } // if found, send the exact address @@ -3371,7 +3316,7 @@ type LocateBrokerResponse_Resource struct { func (x *LocateBrokerResponse_Resource) Reset() { *x = LocateBrokerResponse_Resource{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[54] + mi := &file_filer_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3384,7 +3329,7 @@ func (x *LocateBrokerResponse_Resource) String() string { func (*LocateBrokerResponse_Resource) ProtoMessage() {} func (x *LocateBrokerResponse_Resource) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[54] + mi := &file_filer_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3432,7 +3377,7 @@ type FilerConf_PathConf struct { func (x *FilerConf_PathConf) Reset() { *x = FilerConf_PathConf{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[55] + mi := &file_filer_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3445,7 +3390,7 @@ func (x *FilerConf_PathConf) String() string { func (*FilerConf_PathConf) ProtoMessage() {} func (x *FilerConf_PathConf) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[55] + mi := &file_filer_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3943,126 +3888,125 @@ var file_filer_proto_rawDesc = []byte{ 0x09, 0x73, 0x33, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x33, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x33, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x73, 0x33, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x56, 0x0a, 0x18, 0x52, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4d, 0x61, 0x70, 0x70, - 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, - 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, - 0x6e, 0x67, 0x73, 0x22, 0x58, 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x64, - 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x72, 0x12, 0x2e, 0x0a, - 0x13, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x32, 0xdc, 0x0c, - 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x67, - 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, + 0x0a, 0x73, 0x33, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x9d, 0x01, 0x0a, 0x14, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x12, 0x48, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4d, + 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x3b, + 0x0a, 0x0d, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x32, 0xdc, 0x0c, 0x0a, 0x0c, + 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x14, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, - 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, - 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, 0x53, - 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0d, 0x4b, - 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, - 0x01, 0x30, 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, - 0x6b, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, - 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, - 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4f, 0x0a, 0x10, - 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x42, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2f, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, - 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, - 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x21, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x65, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0d, 0x4b, 0x65, 0x65, + 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, + 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, + 0x72, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, + 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, + 0x0a, 0x05, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, + 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, + 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, + 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, + 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -4129,19 +4073,19 @@ var file_filer_proto_goTypes = []interface{}{ (*KvPutResponse)(nil), // 47: filer_pb.KvPutResponse (*FilerConf)(nil), // 48: filer_pb.FilerConf (*RemoteConf)(nil), // 49: filer_pb.RemoteConf - (*RemoteStorageMappingList)(nil), // 50: filer_pb.RemoteStorageMappingList - (*RemoteStorageMapping)(nil), // 51: filer_pb.RemoteStorageMapping - nil, // 52: filer_pb.Entry.ExtendedEntry - nil, // 53: filer_pb.LookupVolumeResponse.LocationsMapEntry - (*LocateBrokerResponse_Resource)(nil), // 54: filer_pb.LocateBrokerResponse.Resource - (*FilerConf_PathConf)(nil), // 55: filer_pb.FilerConf.PathConf + (*RemoteStorageMapping)(nil), // 50: filer_pb.RemoteStorageMapping + nil, // 51: filer_pb.Entry.ExtendedEntry + nil, // 52: filer_pb.LookupVolumeResponse.LocationsMapEntry + (*LocateBrokerResponse_Resource)(nil), // 53: filer_pb.LocateBrokerResponse.Resource + (*FilerConf_PathConf)(nil), // 54: filer_pb.FilerConf.PathConf + nil, // 55: filer_pb.RemoteStorageMapping.MappingsEntry } var file_filer_proto_depIdxs = []int32{ 5, // 0: filer_pb.LookupDirectoryEntryResponse.entry:type_name -> filer_pb.Entry 5, // 1: filer_pb.ListEntriesResponse.entry:type_name -> filer_pb.Entry 8, // 2: filer_pb.Entry.chunks:type_name -> filer_pb.FileChunk 11, // 3: filer_pb.Entry.attributes:type_name -> filer_pb.FuseAttributes - 52, // 4: filer_pb.Entry.extended:type_name -> filer_pb.Entry.ExtendedEntry + 51, // 4: filer_pb.Entry.extended:type_name -> filer_pb.Entry.ExtendedEntry 4, // 5: filer_pb.Entry.remote_entry:type_name -> filer_pb.RemoteEntry 5, // 6: filer_pb.FullEntry.entry:type_name -> filer_pb.Entry 5, // 7: filer_pb.EventNotification.old_entry:type_name -> filer_pb.Entry @@ -4153,12 +4097,12 @@ var file_filer_proto_depIdxs = []int32{ 5, // 13: filer_pb.UpdateEntryRequest.entry:type_name -> filer_pb.Entry 8, // 14: filer_pb.AppendToEntryRequest.chunks:type_name -> filer_pb.FileChunk 26, // 15: filer_pb.Locations.locations:type_name -> filer_pb.Location - 53, // 16: filer_pb.LookupVolumeResponse.locations_map:type_name -> filer_pb.LookupVolumeResponse.LocationsMapEntry + 52, // 16: filer_pb.LookupVolumeResponse.locations_map:type_name -> filer_pb.LookupVolumeResponse.LocationsMapEntry 28, // 17: filer_pb.CollectionListResponse.collections:type_name -> filer_pb.Collection 7, // 18: filer_pb.SubscribeMetadataResponse.event_notification:type_name -> filer_pb.EventNotification - 54, // 19: filer_pb.LocateBrokerResponse.resources:type_name -> filer_pb.LocateBrokerResponse.Resource - 55, // 20: filer_pb.FilerConf.locations:type_name -> filer_pb.FilerConf.PathConf - 51, // 21: filer_pb.RemoteStorageMappingList.mappings:type_name -> filer_pb.RemoteStorageMapping + 53, // 19: filer_pb.LocateBrokerResponse.resources:type_name -> filer_pb.LocateBrokerResponse.Resource + 54, // 20: filer_pb.FilerConf.locations:type_name -> filer_pb.FilerConf.PathConf + 55, // 21: filer_pb.RemoteStorageMapping.mappings:type_name -> filer_pb.RemoteStorageMapping.MappingsEntry 25, // 22: filer_pb.LookupVolumeResponse.LocationsMapEntry.value:type_name -> filer_pb.Locations 0, // 23: filer_pb.SeaweedFiler.LookupDirectoryEntry:input_type -> filer_pb.LookupDirectoryEntryRequest 2, // 24: filer_pb.SeaweedFiler.ListEntries:input_type -> filer_pb.ListEntriesRequest @@ -4812,18 +4756,6 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoteStorageMappingList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_filer_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoteStorageMapping); i { case 0: return &v.state @@ -4835,7 +4767,7 @@ func file_filer_proto_init() { return nil } } - file_filer_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_filer_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LocateBrokerResponse_Resource); i { case 0: return &v.state @@ -4847,7 +4779,7 @@ func file_filer_proto_init() { return nil } } - file_filer_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_filer_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FilerConf_PathConf); i { case 0: return &v.state diff --git a/weed/remote_storage/remote_storage.go b/weed/remote_storage/remote_storage.go index 79f71001b..8794e7268 100644 --- a/weed/remote_storage/remote_storage.go +++ b/weed/remote_storage/remote_storage.go @@ -3,13 +3,34 @@ package remote_storage import ( "fmt" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "strings" "sync" ) +type RemoteStorageLocation string + +func (remote RemoteStorageLocation) NameBucketPath() (storageName, bucket, remotePath string) { + if strings.HasSuffix(string(remote), "/") { + remote = remote[:len(remote)-1] + } + parts := strings.SplitN(string(remote), "/", 3) + if len(parts)>=1 { + storageName = parts[0] + } + if len(parts)>=2 { + bucket = parts[1] + } + remotePath = string(remote[len(storageName)+1+len(bucket):]) + if remotePath == "" { + remotePath = "/" + } + return +} + type VisitFunc func(dir string, name string, isDirectory bool, remoteEntry *filer_pb.RemoteEntry) error type RemoteStorageClient interface { - Traverse(rootDir string, visitFn VisitFunc) error + Traverse(remote RemoteStorageLocation, visitFn VisitFunc) error } type RemoteStorageClientMaker interface { diff --git a/weed/remote_storage/s3/s3_storage_client.go b/weed/remote_storage/s3/s3_storage_client.go index 625d6e0e6..99fa21515 100644 --- a/weed/remote_storage/s3/s3_storage_client.go +++ b/weed/remote_storage/s3/s3_storage_client.go @@ -10,7 +10,6 @@ import ( "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/remote_storage" "github.com/chrislusf/seaweedfs/weed/util" - "strings" ) func init() { @@ -45,15 +44,9 @@ type s3RemoteStorageClient struct { conn s3iface.S3API } -func (s s3RemoteStorageClient) Traverse(rootDir string, visitFn remote_storage.VisitFunc) (err error) { - if !strings.HasPrefix(rootDir, "/") { - return fmt.Errorf("remote directory %s should start with /", rootDir) - } - bucket := strings.Split(rootDir[1:], "/")[0] - prefix := rootDir[1+len(bucket):] - if len(prefix) > 0 && strings.HasPrefix(prefix, "/") { - prefix = prefix[1:] - } +func (s s3RemoteStorageClient) Traverse(remote remote_storage.RemoteStorageLocation, visitFn remote_storage.VisitFunc) (err error) { + + _, bucket, pathKey := remote.NameBucketPath() listInput := &s3.ListObjectsV2Input{ Bucket: aws.String(bucket), @@ -63,7 +56,7 @@ func (s s3RemoteStorageClient) Traverse(rootDir string, visitFn remote_storage.V ExpectedBucketOwner: nil, FetchOwner: nil, MaxKeys: nil, // aws.Int64(1000), - Prefix: aws.String(prefix), + Prefix: aws.String(pathKey[1:]), RequestPayer: nil, StartAfter: nil, } @@ -71,8 +64,13 @@ func (s s3RemoteStorageClient) Traverse(rootDir string, visitFn remote_storage.V for !isLastPage && err == nil { listErr := s.conn.ListObjectsV2Pages(listInput, func(page *s3.ListObjectsV2Output, lastPage bool) bool { for _, content := range page.Contents { - key := *content.Key - dir, name := util.FullPath("/" + key).DirAndName() + key := (*content.Key) + if len(pathKey) == 1 { + key = "/" + key + } else { + key = key[len(pathKey)-1:] + } + dir, name := util.FullPath(key).DirAndName() if err := visitFn(dir, name, false, &filer_pb.RemoteEntry{ LastModifiedAt: (*content.LastModified).Unix(), Size: *content.Size, @@ -87,7 +85,7 @@ func (s s3RemoteStorageClient) Traverse(rootDir string, visitFn remote_storage.V return true }) if listErr != nil { - err = fmt.Errorf("list %v: %v", rootDir, listErr) + err = fmt.Errorf("list %v: %v", remote, listErr) } } return diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go index 10541092a..217be8cef 100644 --- a/weed/shell/command_remote_mount.go +++ b/weed/shell/command_remote_mount.go @@ -10,7 +10,6 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" "github.com/golang/protobuf/proto" "io" - "strings" ) func init() { @@ -50,33 +49,32 @@ func (c *commandRemoteMount) Do(args []string, commandEnv *CommandEnv, writer io return nil } + remoteStorageLocation := remote_storage.RemoteStorageLocation(*remote) + // find configuration for remote storage - remoteConf, remotePath, err := c.findRemoteStorageConfiguration(commandEnv, writer, *remote) + // remotePath is //path/to/dir + remoteConf, err := c.findRemoteStorageConfiguration(commandEnv, writer, remoteStorageLocation) if err != nil { return fmt.Errorf("find configuration for %s: %v", *remote, err) } // pull metadata from remote - if err = c.pullMetadata(commandEnv, writer, *dir, *nonEmpty, remoteConf, remotePath); err != nil { + if err = c.pullMetadata(commandEnv, writer, *dir, *nonEmpty, remoteConf, remoteStorageLocation); err != nil { return fmt.Errorf("pull metadata: %v", err) } // store a mount configuration in filer - + if err = c.saveMountMapping(commandEnv, writer, *dir, remoteStorageLocation); err != nil { + return fmt.Errorf("save mount mapping: %v", err) + } return nil } -func (c *commandRemoteMount) findRemoteStorageConfiguration(commandEnv *CommandEnv, writer io.Writer, remote string) (conf *filer_pb.RemoteConf, remotePath string, err error) { +func (c *commandRemoteMount) findRemoteStorageConfiguration(commandEnv *CommandEnv, writer io.Writer, remote remote_storage.RemoteStorageLocation) (conf *filer_pb.RemoteConf, err error) { // find remote configuration - parts := strings.Split(remote, "/") - if len(parts) == 0 { - err = fmt.Errorf("wrong remote storage location %s", remote) - return - } - storageName := parts[0] - remotePath = remote[len(storageName):] + storageName, _, _ := remote.NameBucketPath() // read storage configuration data var confBytes []byte @@ -99,7 +97,7 @@ func (c *commandRemoteMount) findRemoteStorageConfiguration(commandEnv *CommandE return } -func (c *commandRemoteMount) pullMetadata(commandEnv *CommandEnv, writer io.Writer, dir string, nonEmpty bool, remoteConf *filer_pb.RemoteConf, remotePath string) error { +func (c *commandRemoteMount) pullMetadata(commandEnv *CommandEnv, writer io.Writer, dir string, nonEmpty bool, remoteConf *filer_pb.RemoteConf, remote remote_storage.RemoteStorageLocation) error { // find existing directory, and ensure the directory is empty var mountToDir *filer_pb.Entry @@ -114,7 +112,7 @@ func (c *commandRemoteMount) pullMetadata(commandEnv *CommandEnv, writer io.Writ } mountToDir = resp.Entry - mountToDirIsEmpty := false + mountToDirIsEmpty := true listErr := filer_pb.SeaweedList(client, dir, "", func(entry *filer_pb.Entry, isLast bool) error { mountToDirIsEmpty = false return nil @@ -144,7 +142,7 @@ func (c *commandRemoteMount) pullMetadata(commandEnv *CommandEnv, writer io.Writ err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { ctx := context.Background() - err = remoteStorage.Traverse(remotePath, func(remoteDir, name string, isDirectory bool, remoteEntry *filer_pb.RemoteEntry) error { + err = remoteStorage.Traverse(remote, func(remoteDir, name string, isDirectory bool, remoteEntry *filer_pb.RemoteEntry) error { localDir := dir + remoteDir println(util.NewFullPath(localDir, name)) @@ -152,12 +150,14 @@ func (c *commandRemoteMount) pullMetadata(commandEnv *CommandEnv, writer io.Writ Directory: localDir, Name: name, }) + var existingEntry *filer_pb.Entry if lookupErr != nil { if lookupErr != filer_pb.ErrNotFound { return lookupErr } + } else { + existingEntry = lookupResponse.Entry } - existingEntry := lookupResponse.Entry if existingEntry == nil { _, createErr := client.CreateEntry(ctx, &filer_pb.CreateEntryRequest{ @@ -175,7 +175,7 @@ func (c *commandRemoteMount) pullMetadata(commandEnv *CommandEnv, writer io.Writ }) return createErr } else { - if existingEntry.RemoteEntry.ETag != remoteEntry.ETag { + if existingEntry.RemoteEntry == nil || existingEntry.RemoteEntry.ETag != remoteEntry.ETag { existingEntry.RemoteEntry = remoteEntry existingEntry.Attributes.FileSize = uint64(remoteEntry.Size) existingEntry.Attributes.Mtime = remoteEntry.LastModifiedAt @@ -197,3 +197,34 @@ func (c *commandRemoteMount) pullMetadata(commandEnv *CommandEnv, writer io.Writ return nil } + +func (c *commandRemoteMount) saveMountMapping(commandEnv *CommandEnv, writer io.Writer, dir string, remoteStorageLocation remote_storage.RemoteStorageLocation) (err error) { + + // read current mapping + var oldContent, newContent []byte + err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + oldContent, err = filer.ReadInsideFiler(client, filer.DirectoryEtcRemote, filer.REMOTE_STORAGE_MOUNT_FILE) + return err + }) + if err != nil { + if err != filer_pb.ErrNotFound { + return fmt.Errorf("read existing mapping: %v", err) + } + } + + // add new mapping + newContent, err = filer.AddMapping(oldContent, dir, remoteStorageLocation) + if err != nil { + return fmt.Errorf("add mapping %s~%s: %v", dir, remoteStorageLocation, err) + } + + // save back + err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + return filer.SaveInsideFiler(client, filer.DirectoryEtcRemote, filer.REMOTE_STORAGE_MOUNT_FILE, newContent) + }) + if err != nil { + return fmt.Errorf("save mapping: %v", err) + } + + return nil +} From 035b0bae2982921f4de158308103f9e893ee9cc2 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 27 Jul 2021 03:32:24 -0700 Subject: [PATCH 134/265] refactor --- weed/remote_storage/s3/s3_storage_client.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/weed/remote_storage/s3/s3_storage_client.go b/weed/remote_storage/s3/s3_storage_client.go index 99fa21515..f994eb69f 100644 --- a/weed/remote_storage/s3/s3_storage_client.go +++ b/weed/remote_storage/s3/s3_storage_client.go @@ -47,6 +47,7 @@ type s3RemoteStorageClient struct { func (s s3RemoteStorageClient) Traverse(remote remote_storage.RemoteStorageLocation, visitFn remote_storage.VisitFunc) (err error) { _, bucket, pathKey := remote.NameBucketPath() + pathKey = pathKey[1:] listInput := &s3.ListObjectsV2Input{ Bucket: aws.String(bucket), @@ -56,7 +57,7 @@ func (s s3RemoteStorageClient) Traverse(remote remote_storage.RemoteStorageLocat ExpectedBucketOwner: nil, FetchOwner: nil, MaxKeys: nil, // aws.Int64(1000), - Prefix: aws.String(pathKey[1:]), + Prefix: aws.String(pathKey), RequestPayer: nil, StartAfter: nil, } @@ -65,10 +66,10 @@ func (s s3RemoteStorageClient) Traverse(remote remote_storage.RemoteStorageLocat listErr := s.conn.ListObjectsV2Pages(listInput, func(page *s3.ListObjectsV2Output, lastPage bool) bool { for _, content := range page.Contents { key := (*content.Key) - if len(pathKey) == 1 { + if len(pathKey) == 0 { key = "/" + key } else { - key = key[len(pathKey)-1:] + key = key[len(pathKey):] } dir, name := util.FullPath(key).DirAndName() if err := visitFn(dir, name, false, &filer_pb.RemoteEntry{ From 5c6270a93a878c2e15d44d1df732c75266c61fca Mon Sep 17 00:00:00 2001 From: divanikus <3438036+divanikus@users.noreply.github.com> Date: Tue, 27 Jul 2021 23:53:01 +0300 Subject: [PATCH 135/265] shell: ability to use wildcards for collections, all collections if ommited --- weed/shell/command_volume_tier_move.go | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/weed/shell/command_volume_tier_move.go b/weed/shell/command_volume_tier_move.go index d6a49d6e1..9e38c936d 100644 --- a/weed/shell/command_volume_tier_move.go +++ b/weed/shell/command_volume_tier_move.go @@ -7,6 +7,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/storage/types" "github.com/chrislusf/seaweedfs/weed/wdclient" "io" + "path/filepath" "time" "github.com/chrislusf/seaweedfs/weed/storage/needle" @@ -26,7 +27,7 @@ func (c *commandVolumeTierMove) Name() string { func (c *commandVolumeTierMove) Help() string { return `change a volume from one disk type to another - volume.tier.move -fromDiskType=hdd -toDiskType=ssd [-collection=""] [-fullPercent=95] [-quietFor=1h] + volume.tier.move -fromDiskType=hdd -toDiskType=ssd [-collectionPattern=""] [-fullPercent=95] [-quietFor=1h] Even if the volume is replicated, only one replica will be changed and the rest replicas will be dropped. So "volume.fix.replication" and "volume.balance" should be followed. @@ -41,7 +42,7 @@ func (c *commandVolumeTierMove) Do(args []string, commandEnv *CommandEnv, writer } tierCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) - collection := tierCommand.String("collection", "", "the collection name") + collectionPattern := tierCommand.String("collectionPattern", "", "match with wildcard characters '*' and '?'") fullPercentage := tierCommand.Float64("fullPercent", 95, "the volume reaches the percentage of max volume size") quietPeriod := tierCommand.Duration("quietFor", 24*time.Hour, "select volumes without no writes for this period") source := tierCommand.String("fromDiskType", "", "the source disk type") @@ -65,7 +66,7 @@ func (c *commandVolumeTierMove) Do(args []string, commandEnv *CommandEnv, writer } // collect all volumes that should change - volumeIds, err := collectVolumeIdsForTierChange(commandEnv, topologyInfo, volumeSizeLimitMb, fromDiskType, *collection, *fullPercentage, *quietPeriod) + volumeIds, err := collectVolumeIdsForTierChange(commandEnv, topologyInfo, volumeSizeLimitMb, fromDiskType, *collectionPattern, *fullPercentage, *quietPeriod) if err != nil { return err } @@ -73,7 +74,7 @@ func (c *commandVolumeTierMove) Do(args []string, commandEnv *CommandEnv, writer _, allLocations := collectVolumeReplicaLocations(topologyInfo) for _, vid := range volumeIds { - if err = doVolumeTierMove(commandEnv, writer, *collection, vid, toDiskType, allLocations, *applyChange); err != nil { + if err = doVolumeTierMove(commandEnv, writer, vid, toDiskType, allLocations, *applyChange); err != nil { fmt.Printf("tier move volume %d: %v\n", vid, err) } } @@ -90,7 +91,7 @@ func isOneOf(server string, locations []wdclient.Location) bool { return false } -func doVolumeTierMove(commandEnv *CommandEnv, writer io.Writer, collection string, vid needle.VolumeId, toDiskType types.DiskType, allLocations []location, applyChanges bool) (err error) { +func doVolumeTierMove(commandEnv *CommandEnv, writer io.Writer, vid needle.VolumeId, toDiskType types.DiskType, allLocations []location, applyChanges bool) (err error) { // find volume location locations, found := commandEnv.MasterClient.GetLocations(uint32(vid)) if !found { @@ -149,7 +150,7 @@ func doVolumeTierMove(commandEnv *CommandEnv, writer io.Writer, collection strin return nil } -func collectVolumeIdsForTierChange(commandEnv *CommandEnv, topologyInfo *master_pb.TopologyInfo, volumeSizeLimitMb uint64, sourceTier types.DiskType, selectedCollection string, fullPercentage float64, quietPeriod time.Duration) (vids []needle.VolumeId, err error) { +func collectVolumeIdsForTierChange(commandEnv *CommandEnv, topologyInfo *master_pb.TopologyInfo, volumeSizeLimitMb uint64, sourceTier types.DiskType, collectionPattern string, fullPercentage float64, quietPeriod time.Duration) (vids []needle.VolumeId, err error) { quietSeconds := int64(quietPeriod / time.Second) nowUnixSeconds := time.Now().Unix() @@ -160,7 +161,18 @@ func collectVolumeIdsForTierChange(commandEnv *CommandEnv, topologyInfo *master_ eachDataNode(topologyInfo, func(dc string, rack RackId, dn *master_pb.DataNodeInfo) { for _, diskInfo := range dn.DiskInfos { for _, v := range diskInfo.VolumeInfos { - if v.Collection == selectedCollection && v.ModifiedAtSecond+quietSeconds < nowUnixSeconds && types.ToDiskType(v.DiskType) == sourceTier { + // check collection name pattern + if collectionPattern != "" { + matched, err := filepath.Match(collectionPattern, v.Collection) + if err != nil { + return + } + if !matched { + continue + } + } + + if v.ModifiedAtSecond+quietSeconds < nowUnixSeconds && types.ToDiskType(v.DiskType) == sourceTier { if float64(v.Size) > fullPercentage/100*float64(volumeSizeLimitMb)*1024*1024 { vidMap[v.Id] = true } From 4deac06da0fc2dd283530b4763793116042ccbde Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 28 Jul 2021 22:25:04 -0700 Subject: [PATCH 136/265] log fix --- weed/shell/command_volume_fsck.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/shell/command_volume_fsck.go b/weed/shell/command_volume_fsck.go index bd3be4d89..27c253209 100644 --- a/weed/shell/command_volume_fsck.go +++ b/weed/shell/command_volume_fsck.go @@ -103,7 +103,7 @@ func (c *commandVolumeFsck) Do(args []string, commandEnv *CommandEnv, writer io. } // for each volume, check filer file ids if err = c.findFilerChunksMissingInVolumeServers(volumeIdToVInfo, tempFolder, writer, *verbose, applyPurging); err != nil { - return fmt.Errorf("findExtraChunksInVolumeServers: %v", err) + return fmt.Errorf("findFilerChunksMissingInVolumeServers: %v", err) } } else { // collect all filer file ids From c090d6bb254b7d5666d0158fc8d7d54c10161c11 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 28 Jul 2021 22:43:12 -0700 Subject: [PATCH 137/265] add ReadRemote(), add read remote setup when filer starts --- weed/filer/filer.go | 2 ++ weed/filer/filer_on_meta_event.go | 14 ++++++++++++ weed/filer/filer_remote_storage.go | 26 ++++++++++++++++++---- weed/filer/filer_remote_storage_test.go | 8 +++---- weed/filer/read_remote.go | 27 +++++++++++++++++++++++ weed/remote_storage/remote_storage.go | 6 +++-- weed/server/filer_server.go | 2 ++ weed/server/filer_server_handlers_read.go | 15 +++++++++---- 8 files changed, 86 insertions(+), 14 deletions(-) create mode 100644 weed/filer/read_remote.go diff --git a/weed/filer/filer.go b/weed/filer/filer.go index d4c0b4eef..162db175a 100644 --- a/weed/filer/filer.go +++ b/weed/filer/filer.go @@ -42,6 +42,7 @@ type Filer struct { MetaAggregator *MetaAggregator Signature int32 FilerConf *FilerConf + RemoteStorage *FilerRemoteStorage } func NewFiler(masters []string, grpcDialOption grpc.DialOption, @@ -51,6 +52,7 @@ func NewFiler(masters []string, grpcDialOption grpc.DialOption, fileIdDeletionQueue: util.NewUnboundedQueue(), GrpcDialOption: grpcDialOption, FilerConf: NewFilerConf(), + RemoteStorage: NewFilerRemoteStorage(), } f.LocalMetaLogBuffer = log_buffer.NewLogBuffer("local", LogFlushInterval, f.logFlushFunc, notifyFn) f.metaLogCollection = collection diff --git a/weed/filer/filer_on_meta_event.go b/weed/filer/filer_on_meta_event.go index c9f75a5ca..32be4f180 100644 --- a/weed/filer/filer_on_meta_event.go +++ b/weed/filer/filer_on_meta_event.go @@ -12,6 +12,7 @@ import ( // onMetadataChangeEvent is triggered after filer processed change events from local or remote filers func (f *Filer) onMetadataChangeEvent(event *filer_pb.SubscribeMetadataResponse) { f.maybeReloadFilerConfiguration(event) + f.maybeReloadRemoteStorageConfigurationAndMapping(event) f.onBucketEvents(event) } @@ -80,3 +81,16 @@ func (f *Filer) LoadFilerConf() { } f.FilerConf = fc } + +//////////////////////////////////// +// load and maintain remote storages +//////////////////////////////////// +func (f *Filer) LoadRemoteStorageConfAndMapping() { + if err := f.RemoteStorage.LoadRemoteStorageConfigurationsAndMapping(f); err != nil { + glog.Errorf("read remote conf and mapping: %v", err) + return + } +} +func (f *Filer) maybeReloadRemoteStorageConfigurationAndMapping(event *filer_pb.SubscribeMetadataResponse) { + // FIXME add reloading +} diff --git a/weed/filer/filer_remote_storage.go b/weed/filer/filer_remote_storage.go index f6f3adb22..18b2676bc 100644 --- a/weed/filer/filer_remote_storage.go +++ b/weed/filer/filer_remote_storage.go @@ -31,7 +31,7 @@ func NewFilerRemoteStorage() (rs *FilerRemoteStorage) { return rs } -func (rs *FilerRemoteStorage) loadRemoteStorageConfigurations(filer *Filer) (err error) { +func (rs *FilerRemoteStorage) LoadRemoteStorageConfigurationsAndMapping(filer *Filer) (err error) { // execute this on filer entries, _, err := filer.ListDirectoryEntries(context.Background(), DirectoryEtcRemote, "", false, math.MaxInt64, "", "", "") @@ -74,7 +74,21 @@ func (rs *FilerRemoteStorage) mapDirectoryToRemoteStorage(dir util.FullPath, rem rs.rules.Put([]byte(dir+"/"), remoteStorageName) } -func (rs *FilerRemoteStorage) FindRemoteStorageClient(p util.FullPath) (client remote_storage.RemoteStorageClient, found bool) { +func (rs *FilerRemoteStorage) FindMountDirectory(p util.FullPath) (mountDir util.FullPath, remoteLocation remote_storage.RemoteStorageLocation) { + var storageLocation string + rs.rules.MatchPrefix([]byte(p), func(key []byte, value interface{}) bool { + mountDir = util.FullPath(string(key)) + storageLocation = value.(string) + return true + }) + if storageLocation == "" { + return + } + remoteLocation = remote_storage.RemoteStorageLocation(storageLocation) + return +} + +func (rs *FilerRemoteStorage) FindRemoteStorageClient(p util.FullPath) (client remote_storage.RemoteStorageClient, remoteConf *filer_pb.RemoteConf, found bool) { var storageLocation string rs.rules.MatchPrefix([]byte(p), func(key []byte, value interface{}) bool { storageLocation = value.(string) @@ -87,8 +101,12 @@ func (rs *FilerRemoteStorage) FindRemoteStorageClient(p util.FullPath) (client r storageName, _, _ := remote_storage.RemoteStorageLocation(storageLocation).NameBucketPath() - remoteConf, ok := rs.storageNameToConf[storageName] - if !ok { + return rs.GetRemoteStorageClient(storageName) +} + +func (rs *FilerRemoteStorage) GetRemoteStorageClient(storageName string) (client remote_storage.RemoteStorageClient, remoteConf *filer_pb.RemoteConf, found bool) { + remoteConf, found = rs.storageNameToConf[storageName] + if !found { return } diff --git a/weed/filer/filer_remote_storage_test.go b/weed/filer/filer_remote_storage_test.go index 1a41c6e63..e5996475e 100644 --- a/weed/filer/filer_remote_storage_test.go +++ b/weed/filer/filer_remote_storage_test.go @@ -16,15 +16,15 @@ func TestFilerRemoteStorage_FindRemoteStorageClient(t *testing.T) { rs.mapDirectoryToRemoteStorage("/a/b/c", "s7") - _, found := rs.FindRemoteStorageClient("/a/b/c/d/e/f") + _, _, found := rs.FindRemoteStorageClient("/a/b/c/d/e/f") assert.Equal(t, true, found, "find storage client") - _, found2 := rs.FindRemoteStorageClient("/a/b") + _, _, found2 := rs.FindRemoteStorageClient("/a/b") assert.Equal(t, false, found2, "should not find storage client") - _, found3 := rs.FindRemoteStorageClient("/a/b/c") + _, _, found3 := rs.FindRemoteStorageClient("/a/b/c") assert.Equal(t, false, found3, "should not find storage client") - _, found4 := rs.FindRemoteStorageClient("/a/b/cc") + _, _, found4 := rs.FindRemoteStorageClient("/a/b/cc") assert.Equal(t, false, found4, "should not find storage client") } \ No newline at end of file diff --git a/weed/filer/read_remote.go b/weed/filer/read_remote.go new file mode 100644 index 000000000..57450d6d8 --- /dev/null +++ b/weed/filer/read_remote.go @@ -0,0 +1,27 @@ +package filer + +import ( + "fmt" + "io" +) + +func (entry *Entry) IsRemoteOnly() bool { + return len(entry.Chunks) == 0 && entry.Remote != nil && entry.Remote.Size > 0 +} + +func (f *Filer) ReadRemote(w io.Writer, entry *Entry, offset int64, size int64) error { + client, _, found := f.RemoteStorage.GetRemoteStorageClient(remoteEntry.Remote.StorageName) + if !found { + return fmt.Errorf("remote storage %v not found", entry.Remote.StorageName) + } + + mountDir, remoteLoation := f.RemoteStorage.FindMountDirectory(entry.FullPath) + _, bucket, path := remoteLoation.NameBucketPath() + + remoteFullPath := path + string(entry.FullPath[len(mountDir):]) + + client.ReadFile(bucket, remoteFullPath[1:], offset, size, func(w io.Writer) error { + + }) + return nil +} diff --git a/weed/remote_storage/remote_storage.go b/weed/remote_storage/remote_storage.go index 8794e7268..b8c2b55ea 100644 --- a/weed/remote_storage/remote_storage.go +++ b/weed/remote_storage/remote_storage.go @@ -3,6 +3,7 @@ package remote_storage import ( "fmt" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "io" "strings" "sync" ) @@ -14,10 +15,10 @@ func (remote RemoteStorageLocation) NameBucketPath() (storageName, bucket, remot remote = remote[:len(remote)-1] } parts := strings.SplitN(string(remote), "/", 3) - if len(parts)>=1 { + if len(parts) >= 1 { storageName = parts[0] } - if len(parts)>=2 { + if len(parts) >= 2 { bucket = parts[1] } remotePath = string(remote[len(storageName)+1+len(bucket):]) @@ -31,6 +32,7 @@ type VisitFunc func(dir string, name string, isDirectory bool, remoteEntry *file type RemoteStorageClient interface { Traverse(remote RemoteStorageLocation, visitFn VisitFunc) error + ReadFile(bucket, key string, offset int64, size int64, writeFn func(w io.Writer) error) error } type RemoteStorageClientMaker interface { diff --git a/weed/server/filer_server.go b/weed/server/filer_server.go index d7afaa65a..534bc4840 100644 --- a/weed/server/filer_server.go +++ b/weed/server/filer_server.go @@ -149,6 +149,8 @@ func NewFilerServer(defaultMux, readonlyMux *http.ServeMux, option *FilerOption) fs.filer.LoadFilerConf() + fs.filer.LoadRemoteStorageConfAndMapping() + grace.OnInterrupt(func() { fs.filer.Shutdown() }) diff --git a/weed/server/filer_server_handlers_read.go b/weed/server/filer_server_handlers_read.go index 957e08855..add0be1f4 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -101,7 +101,7 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) //Seaweed custom header are not visible to Vue or javascript seaweedHeaders := []string{} - for header, _ := range w.Header() { + for header := range w.Header() { if strings.HasPrefix(header, "Seaweed-") { seaweedHeaders = append(seaweedHeaders, header) } @@ -163,9 +163,16 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) } return err } - err = filer.StreamContent(fs.filer.MasterClient, writer, entry.Chunks, offset, size) - if err != nil { - glog.Errorf("failed to stream content %s: %v", r.URL, err) + if entry.IsRemoteOnly() { + err = fs.filer.ReadRemote(writer, entry, offset, size) + if err != nil { + glog.Errorf("failed to read remote %s: %v", r.URL, err) + } + } else { + err = filer.StreamContent(fs.filer.MasterClient, writer, entry.Chunks, offset, size) + if err != nil { + glog.Errorf("failed to stream content %s: %v", r.URL, err) + } } return err }) From 285fdd2dd58cd215ae3f157f2acef2c28811ff64 Mon Sep 17 00:00:00 2001 From: "byunghwa.yun" Date: Thu, 29 Jul 2021 17:43:17 +0900 Subject: [PATCH 138/265] Add the additional meta log --- unmaintained/see_meta/see_meta.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unmaintained/see_meta/see_meta.go b/unmaintained/see_meta/see_meta.go index 452badfd6..9e496430c 100644 --- a/unmaintained/see_meta/see_meta.go +++ b/unmaintained/see_meta/see_meta.go @@ -60,7 +60,7 @@ func walkMetaFile(dst *os.File) error { fmt.Fprintf(os.Stdout, "file %s %v\n", util.FullPath(fullEntry.Dir).Child(fullEntry.Entry.Name), fullEntry.Entry.Attributes.String()) for i, chunk := range fullEntry.Entry.Chunks { - fmt.Fprintf(os.Stdout, " chunk %d %v\n", i+1, chunk.String()) + fmt.Fprintf(os.Stdout, " chunk: %d %v %d,%x%08x\n", i+1, chunk, chunk.Fid.VolumeId, chunk.Fid.FileKey, chunk.Fid.Cookie) } } From 899963ac20556f6a48aad431eec8ec995e982dd3 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 29 Jul 2021 02:08:55 -0700 Subject: [PATCH 139/265] remote storage location changed to struct --- other/java/client/src/main/proto/filer.proto | 7 +- weed/filer/filer_remote_storage.go | 22 +- weed/filer/filer_search.go | 5 + weed/filer/read_remote.go | 14 +- weed/pb/filer.proto | 7 +- weed/pb/filer_pb/filer.pb.go | 434 +++++++++++-------- weed/remote_storage/remote_storage.go | 19 +- weed/remote_storage/s3/s3_storage_client.go | 11 +- weed/shell/command_remote_mount.go | 17 +- 9 files changed, 320 insertions(+), 216 deletions(-) diff --git a/other/java/client/src/main/proto/filer.proto b/other/java/client/src/main/proto/filer.proto index efecc4e97..1a5cfe79b 100644 --- a/other/java/client/src/main/proto/filer.proto +++ b/other/java/client/src/main/proto/filer.proto @@ -393,5 +393,10 @@ message RemoteConf { } message RemoteStorageMapping { - map mappings = 1; + map mappings = 1; +} +message RemoteStorageLocation { + string name = 1; + string bucket = 2; + string path = 3; } diff --git a/weed/filer/filer_remote_storage.go b/weed/filer/filer_remote_storage.go index 18b2676bc..df0b6d26b 100644 --- a/weed/filer/filer_remote_storage.go +++ b/weed/filer/filer_remote_storage.go @@ -70,11 +70,11 @@ func (rs *FilerRemoteStorage) loadRemoteStorageMountMapping(data []byte) (err er return nil } -func (rs *FilerRemoteStorage) mapDirectoryToRemoteStorage(dir util.FullPath, remoteStorageName string) { - rs.rules.Put([]byte(dir+"/"), remoteStorageName) +func (rs *FilerRemoteStorage) mapDirectoryToRemoteStorage(dir util.FullPath, loc *filer_pb.RemoteStorageLocation) { + rs.rules.Put([]byte(dir+"/"), loc) } -func (rs *FilerRemoteStorage) FindMountDirectory(p util.FullPath) (mountDir util.FullPath, remoteLocation remote_storage.RemoteStorageLocation) { +func (rs *FilerRemoteStorage) FindMountDirectory(p util.FullPath) (mountDir util.FullPath, remoteLocation *filer_pb.RemoteStorageLocation) { var storageLocation string rs.rules.MatchPrefix([]byte(p), func(key []byte, value interface{}) bool { mountDir = util.FullPath(string(key)) @@ -84,7 +84,7 @@ func (rs *FilerRemoteStorage) FindMountDirectory(p util.FullPath) (mountDir util if storageLocation == "" { return } - remoteLocation = remote_storage.RemoteStorageLocation(storageLocation) + remoteLocation = remote_storage.ParseLocation(storageLocation) return } @@ -99,9 +99,9 @@ func (rs *FilerRemoteStorage) FindRemoteStorageClient(p util.FullPath) (client r return } - storageName, _, _ := remote_storage.RemoteStorageLocation(storageLocation).NameBucketPath() + loc := remote_storage.ParseLocation(storageLocation) - return rs.GetRemoteStorageClient(storageName) + return rs.GetRemoteStorageClient(loc.Name) } func (rs *FilerRemoteStorage) GetRemoteStorageClient(storageName string) (client remote_storage.RemoteStorageClient, remoteConf *filer_pb.RemoteConf, found bool) { @@ -118,21 +118,21 @@ func (rs *FilerRemoteStorage) GetRemoteStorageClient(storageName string) (client return } -func AddMapping(oldContent []byte, dir string, storageLocation remote_storage.RemoteStorageLocation) (newContent []byte, err error) { +func AddMapping(oldContent []byte, dir string, storageLocation *filer_pb.RemoteStorageLocation) (newContent []byte, err error) { mappings := &filer_pb.RemoteStorageMapping{ - Mappings: make(map[string]string), + Mappings: make(map[string]*filer_pb.RemoteStorageLocation), } if len(oldContent) > 0 { if err = proto.Unmarshal(oldContent, mappings); err != nil { - return oldContent, fmt.Errorf("unmarshal existing mappings: %v", err) + glog.Warningf("unmarshal existing mappings: %v", err) } } // set the new mapping - mappings.Mappings[dir] = string(storageLocation) + mappings.Mappings[dir] = storageLocation if newContent, err = proto.Marshal(mappings); err != nil { - return oldContent, fmt.Errorf("unmarshal existing mappings: %v", err) + return oldContent, fmt.Errorf("marshal mappings: %v", err) } return diff --git a/weed/filer/filer_search.go b/weed/filer/filer_search.go index 2ee29be25..2e0336da8 100644 --- a/weed/filer/filer_search.go +++ b/weed/filer/filer_search.go @@ -3,6 +3,7 @@ package filer import ( "context" "github.com/chrislusf/seaweedfs/weed/util" + "math" "path/filepath" "strings" ) @@ -27,6 +28,10 @@ func (f *Filer) ListDirectoryEntries(ctx context.Context, p util.FullPath, start return true }) + if limit == math.MaxInt64 { + limit = math.MaxInt64 - 1 + } + hasMore = int64(len(entries)) >= limit+1 if hasMore { entries = entries[:limit] diff --git a/weed/filer/read_remote.go b/weed/filer/read_remote.go index 57450d6d8..4f02ba26b 100644 --- a/weed/filer/read_remote.go +++ b/weed/filer/read_remote.go @@ -2,6 +2,7 @@ package filer import ( "fmt" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "io" ) @@ -10,18 +11,23 @@ func (entry *Entry) IsRemoteOnly() bool { } func (f *Filer) ReadRemote(w io.Writer, entry *Entry, offset int64, size int64) error { - client, _, found := f.RemoteStorage.GetRemoteStorageClient(remoteEntry.Remote.StorageName) + client, _, found := f.RemoteStorage.GetRemoteStorageClient(entry.Remote.StorageName) if !found { return fmt.Errorf("remote storage %v not found", entry.Remote.StorageName) } mountDir, remoteLoation := f.RemoteStorage.FindMountDirectory(entry.FullPath) - _, bucket, path := remoteLoation.NameBucketPath() - remoteFullPath := path + string(entry.FullPath[len(mountDir):]) + remoteFullPath := remoteLoation.Path + string(entry.FullPath[len(mountDir):]) - client.ReadFile(bucket, remoteFullPath[1:], offset, size, func(w io.Writer) error { + sourceLoc := &filer_pb.RemoteStorageLocation{ + Name: remoteLoation.Name, + Bucket: remoteLoation.Bucket, + Path: remoteFullPath, + } + client.ReadFile(sourceLoc, offset, size, func(w io.Writer) error { + return nil }) return nil } diff --git a/weed/pb/filer.proto b/weed/pb/filer.proto index efecc4e97..1a5cfe79b 100644 --- a/weed/pb/filer.proto +++ b/weed/pb/filer.proto @@ -393,5 +393,10 @@ message RemoteConf { } message RemoteStorageMapping { - map mappings = 1; + map mappings = 1; +} +message RemoteStorageLocation { + string name = 1; + string bucket = 2; + string path = 3; } diff --git a/weed/pb/filer_pb/filer.pb.go b/weed/pb/filer_pb/filer.pb.go index 7739f65e8..495afb21a 100644 --- a/weed/pb/filer_pb/filer.pb.go +++ b/weed/pb/filer_pb/filer.pb.go @@ -3260,7 +3260,7 @@ type RemoteStorageMapping struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Mappings map[string]string `protobuf:"bytes,1,rep,name=mappings,proto3" json:"mappings,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Mappings map[string]*RemoteStorageLocation `protobuf:"bytes,1,rep,name=mappings,proto3" json:"mappings,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *RemoteStorageMapping) Reset() { @@ -3295,13 +3295,76 @@ func (*RemoteStorageMapping) Descriptor() ([]byte, []int) { return file_filer_proto_rawDescGZIP(), []int{50} } -func (x *RemoteStorageMapping) GetMappings() map[string]string { +func (x *RemoteStorageMapping) GetMappings() map[string]*RemoteStorageLocation { if x != nil { return x.Mappings } return nil } +type RemoteStorageLocation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` +} + +func (x *RemoteStorageLocation) Reset() { + *x = RemoteStorageLocation{} + if protoimpl.UnsafeEnabled { + mi := &file_filer_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoteStorageLocation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoteStorageLocation) ProtoMessage() {} + +func (x *RemoteStorageLocation) ProtoReflect() protoreflect.Message { + mi := &file_filer_proto_msgTypes[51] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoteStorageLocation.ProtoReflect.Descriptor instead. +func (*RemoteStorageLocation) Descriptor() ([]byte, []int) { + return file_filer_proto_rawDescGZIP(), []int{51} +} + +func (x *RemoteStorageLocation) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RemoteStorageLocation) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *RemoteStorageLocation) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + // if found, send the exact address // if not found, send the full list of existing brokers type LocateBrokerResponse_Resource struct { @@ -3316,7 +3379,7 @@ type LocateBrokerResponse_Resource struct { func (x *LocateBrokerResponse_Resource) Reset() { *x = LocateBrokerResponse_Resource{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[53] + mi := &file_filer_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3329,7 +3392,7 @@ func (x *LocateBrokerResponse_Resource) String() string { func (*LocateBrokerResponse_Resource) ProtoMessage() {} func (x *LocateBrokerResponse_Resource) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[53] + mi := &file_filer_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3377,7 +3440,7 @@ type FilerConf_PathConf struct { func (x *FilerConf_PathConf) Reset() { *x = FilerConf_PathConf{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[54] + mi := &file_filer_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3390,7 +3453,7 @@ func (x *FilerConf_PathConf) String() string { func (*FilerConf_PathConf) ProtoMessage() {} func (x *FilerConf_PathConf) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[54] + mi := &file_filer_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3888,125 +3951,132 @@ var file_filer_proto_rawDesc = []byte{ 0x09, 0x73, 0x33, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x33, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x33, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x73, 0x33, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x9d, 0x01, 0x0a, 0x14, + 0x0a, 0x73, 0x33, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0xbe, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x48, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x3b, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x5c, 0x0a, 0x0d, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x32, 0xdc, 0x0c, 0x0a, 0x0c, - 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x14, - 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, - 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, - 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, - 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, - 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x21, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, 0x53, 0x74, 0x61, - 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, - 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x65, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, - 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0d, 0x4b, 0x65, 0x65, - 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, - 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, - 0x72, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, - 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, - 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, - 0x0a, 0x05, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, - 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, - 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, - 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, - 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x57, 0x0a, 0x15, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x32, 0xdc, 0x0c, 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, + 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, + 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, + 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1c, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, + 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x41, + 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x4c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, + 0x11, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, + 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, + 0x0c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, + 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, + 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x16, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, + 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, + 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, + 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x50, 0x75, + 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, + 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, + 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, + 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4021,7 +4091,7 @@ func file_filer_proto_rawDescGZIP() []byte { return file_filer_proto_rawDescData } -var file_filer_proto_msgTypes = make([]protoimpl.MessageInfo, 56) +var file_filer_proto_msgTypes = make([]protoimpl.MessageInfo, 57) var file_filer_proto_goTypes = []interface{}{ (*LookupDirectoryEntryRequest)(nil), // 0: filer_pb.LookupDirectoryEntryRequest (*LookupDirectoryEntryResponse)(nil), // 1: filer_pb.LookupDirectoryEntryResponse @@ -4074,18 +4144,19 @@ var file_filer_proto_goTypes = []interface{}{ (*FilerConf)(nil), // 48: filer_pb.FilerConf (*RemoteConf)(nil), // 49: filer_pb.RemoteConf (*RemoteStorageMapping)(nil), // 50: filer_pb.RemoteStorageMapping - nil, // 51: filer_pb.Entry.ExtendedEntry - nil, // 52: filer_pb.LookupVolumeResponse.LocationsMapEntry - (*LocateBrokerResponse_Resource)(nil), // 53: filer_pb.LocateBrokerResponse.Resource - (*FilerConf_PathConf)(nil), // 54: filer_pb.FilerConf.PathConf - nil, // 55: filer_pb.RemoteStorageMapping.MappingsEntry + (*RemoteStorageLocation)(nil), // 51: filer_pb.RemoteStorageLocation + nil, // 52: filer_pb.Entry.ExtendedEntry + nil, // 53: filer_pb.LookupVolumeResponse.LocationsMapEntry + (*LocateBrokerResponse_Resource)(nil), // 54: filer_pb.LocateBrokerResponse.Resource + (*FilerConf_PathConf)(nil), // 55: filer_pb.FilerConf.PathConf + nil, // 56: filer_pb.RemoteStorageMapping.MappingsEntry } var file_filer_proto_depIdxs = []int32{ 5, // 0: filer_pb.LookupDirectoryEntryResponse.entry:type_name -> filer_pb.Entry 5, // 1: filer_pb.ListEntriesResponse.entry:type_name -> filer_pb.Entry 8, // 2: filer_pb.Entry.chunks:type_name -> filer_pb.FileChunk 11, // 3: filer_pb.Entry.attributes:type_name -> filer_pb.FuseAttributes - 51, // 4: filer_pb.Entry.extended:type_name -> filer_pb.Entry.ExtendedEntry + 52, // 4: filer_pb.Entry.extended:type_name -> filer_pb.Entry.ExtendedEntry 4, // 5: filer_pb.Entry.remote_entry:type_name -> filer_pb.RemoteEntry 5, // 6: filer_pb.FullEntry.entry:type_name -> filer_pb.Entry 5, // 7: filer_pb.EventNotification.old_entry:type_name -> filer_pb.Entry @@ -4097,56 +4168,57 @@ var file_filer_proto_depIdxs = []int32{ 5, // 13: filer_pb.UpdateEntryRequest.entry:type_name -> filer_pb.Entry 8, // 14: filer_pb.AppendToEntryRequest.chunks:type_name -> filer_pb.FileChunk 26, // 15: filer_pb.Locations.locations:type_name -> filer_pb.Location - 52, // 16: filer_pb.LookupVolumeResponse.locations_map:type_name -> filer_pb.LookupVolumeResponse.LocationsMapEntry + 53, // 16: filer_pb.LookupVolumeResponse.locations_map:type_name -> filer_pb.LookupVolumeResponse.LocationsMapEntry 28, // 17: filer_pb.CollectionListResponse.collections:type_name -> filer_pb.Collection 7, // 18: filer_pb.SubscribeMetadataResponse.event_notification:type_name -> filer_pb.EventNotification - 53, // 19: filer_pb.LocateBrokerResponse.resources:type_name -> filer_pb.LocateBrokerResponse.Resource - 54, // 20: filer_pb.FilerConf.locations:type_name -> filer_pb.FilerConf.PathConf - 55, // 21: filer_pb.RemoteStorageMapping.mappings:type_name -> filer_pb.RemoteStorageMapping.MappingsEntry + 54, // 19: filer_pb.LocateBrokerResponse.resources:type_name -> filer_pb.LocateBrokerResponse.Resource + 55, // 20: filer_pb.FilerConf.locations:type_name -> filer_pb.FilerConf.PathConf + 56, // 21: filer_pb.RemoteStorageMapping.mappings:type_name -> filer_pb.RemoteStorageMapping.MappingsEntry 25, // 22: filer_pb.LookupVolumeResponse.LocationsMapEntry.value:type_name -> filer_pb.Locations - 0, // 23: filer_pb.SeaweedFiler.LookupDirectoryEntry:input_type -> filer_pb.LookupDirectoryEntryRequest - 2, // 24: filer_pb.SeaweedFiler.ListEntries:input_type -> filer_pb.ListEntriesRequest - 12, // 25: filer_pb.SeaweedFiler.CreateEntry:input_type -> filer_pb.CreateEntryRequest - 14, // 26: filer_pb.SeaweedFiler.UpdateEntry:input_type -> filer_pb.UpdateEntryRequest - 16, // 27: filer_pb.SeaweedFiler.AppendToEntry:input_type -> filer_pb.AppendToEntryRequest - 18, // 28: filer_pb.SeaweedFiler.DeleteEntry:input_type -> filer_pb.DeleteEntryRequest - 20, // 29: filer_pb.SeaweedFiler.AtomicRenameEntry:input_type -> filer_pb.AtomicRenameEntryRequest - 22, // 30: filer_pb.SeaweedFiler.AssignVolume:input_type -> filer_pb.AssignVolumeRequest - 24, // 31: filer_pb.SeaweedFiler.LookupVolume:input_type -> filer_pb.LookupVolumeRequest - 29, // 32: filer_pb.SeaweedFiler.CollectionList:input_type -> filer_pb.CollectionListRequest - 31, // 33: filer_pb.SeaweedFiler.DeleteCollection:input_type -> filer_pb.DeleteCollectionRequest - 33, // 34: filer_pb.SeaweedFiler.Statistics:input_type -> filer_pb.StatisticsRequest - 35, // 35: filer_pb.SeaweedFiler.GetFilerConfiguration:input_type -> filer_pb.GetFilerConfigurationRequest - 37, // 36: filer_pb.SeaweedFiler.SubscribeMetadata:input_type -> filer_pb.SubscribeMetadataRequest - 37, // 37: filer_pb.SeaweedFiler.SubscribeLocalMetadata:input_type -> filer_pb.SubscribeMetadataRequest - 40, // 38: filer_pb.SeaweedFiler.KeepConnected:input_type -> filer_pb.KeepConnectedRequest - 42, // 39: filer_pb.SeaweedFiler.LocateBroker:input_type -> filer_pb.LocateBrokerRequest - 44, // 40: filer_pb.SeaweedFiler.KvGet:input_type -> filer_pb.KvGetRequest - 46, // 41: filer_pb.SeaweedFiler.KvPut:input_type -> filer_pb.KvPutRequest - 1, // 42: filer_pb.SeaweedFiler.LookupDirectoryEntry:output_type -> filer_pb.LookupDirectoryEntryResponse - 3, // 43: filer_pb.SeaweedFiler.ListEntries:output_type -> filer_pb.ListEntriesResponse - 13, // 44: filer_pb.SeaweedFiler.CreateEntry:output_type -> filer_pb.CreateEntryResponse - 15, // 45: filer_pb.SeaweedFiler.UpdateEntry:output_type -> filer_pb.UpdateEntryResponse - 17, // 46: filer_pb.SeaweedFiler.AppendToEntry:output_type -> filer_pb.AppendToEntryResponse - 19, // 47: filer_pb.SeaweedFiler.DeleteEntry:output_type -> filer_pb.DeleteEntryResponse - 21, // 48: filer_pb.SeaweedFiler.AtomicRenameEntry:output_type -> filer_pb.AtomicRenameEntryResponse - 23, // 49: filer_pb.SeaweedFiler.AssignVolume:output_type -> filer_pb.AssignVolumeResponse - 27, // 50: filer_pb.SeaweedFiler.LookupVolume:output_type -> filer_pb.LookupVolumeResponse - 30, // 51: filer_pb.SeaweedFiler.CollectionList:output_type -> filer_pb.CollectionListResponse - 32, // 52: filer_pb.SeaweedFiler.DeleteCollection:output_type -> filer_pb.DeleteCollectionResponse - 34, // 53: filer_pb.SeaweedFiler.Statistics:output_type -> filer_pb.StatisticsResponse - 36, // 54: filer_pb.SeaweedFiler.GetFilerConfiguration:output_type -> filer_pb.GetFilerConfigurationResponse - 38, // 55: filer_pb.SeaweedFiler.SubscribeMetadata:output_type -> filer_pb.SubscribeMetadataResponse - 38, // 56: filer_pb.SeaweedFiler.SubscribeLocalMetadata:output_type -> filer_pb.SubscribeMetadataResponse - 41, // 57: filer_pb.SeaweedFiler.KeepConnected:output_type -> filer_pb.KeepConnectedResponse - 43, // 58: filer_pb.SeaweedFiler.LocateBroker:output_type -> filer_pb.LocateBrokerResponse - 45, // 59: filer_pb.SeaweedFiler.KvGet:output_type -> filer_pb.KvGetResponse - 47, // 60: filer_pb.SeaweedFiler.KvPut:output_type -> filer_pb.KvPutResponse - 42, // [42:61] is the sub-list for method output_type - 23, // [23:42] is the sub-list for method input_type - 23, // [23:23] is the sub-list for extension type_name - 23, // [23:23] is the sub-list for extension extendee - 0, // [0:23] is the sub-list for field type_name + 51, // 23: filer_pb.RemoteStorageMapping.MappingsEntry.value:type_name -> filer_pb.RemoteStorageLocation + 0, // 24: filer_pb.SeaweedFiler.LookupDirectoryEntry:input_type -> filer_pb.LookupDirectoryEntryRequest + 2, // 25: filer_pb.SeaweedFiler.ListEntries:input_type -> filer_pb.ListEntriesRequest + 12, // 26: filer_pb.SeaweedFiler.CreateEntry:input_type -> filer_pb.CreateEntryRequest + 14, // 27: filer_pb.SeaweedFiler.UpdateEntry:input_type -> filer_pb.UpdateEntryRequest + 16, // 28: filer_pb.SeaweedFiler.AppendToEntry:input_type -> filer_pb.AppendToEntryRequest + 18, // 29: filer_pb.SeaweedFiler.DeleteEntry:input_type -> filer_pb.DeleteEntryRequest + 20, // 30: filer_pb.SeaweedFiler.AtomicRenameEntry:input_type -> filer_pb.AtomicRenameEntryRequest + 22, // 31: filer_pb.SeaweedFiler.AssignVolume:input_type -> filer_pb.AssignVolumeRequest + 24, // 32: filer_pb.SeaweedFiler.LookupVolume:input_type -> filer_pb.LookupVolumeRequest + 29, // 33: filer_pb.SeaweedFiler.CollectionList:input_type -> filer_pb.CollectionListRequest + 31, // 34: filer_pb.SeaweedFiler.DeleteCollection:input_type -> filer_pb.DeleteCollectionRequest + 33, // 35: filer_pb.SeaweedFiler.Statistics:input_type -> filer_pb.StatisticsRequest + 35, // 36: filer_pb.SeaweedFiler.GetFilerConfiguration:input_type -> filer_pb.GetFilerConfigurationRequest + 37, // 37: filer_pb.SeaweedFiler.SubscribeMetadata:input_type -> filer_pb.SubscribeMetadataRequest + 37, // 38: filer_pb.SeaweedFiler.SubscribeLocalMetadata:input_type -> filer_pb.SubscribeMetadataRequest + 40, // 39: filer_pb.SeaweedFiler.KeepConnected:input_type -> filer_pb.KeepConnectedRequest + 42, // 40: filer_pb.SeaweedFiler.LocateBroker:input_type -> filer_pb.LocateBrokerRequest + 44, // 41: filer_pb.SeaweedFiler.KvGet:input_type -> filer_pb.KvGetRequest + 46, // 42: filer_pb.SeaweedFiler.KvPut:input_type -> filer_pb.KvPutRequest + 1, // 43: filer_pb.SeaweedFiler.LookupDirectoryEntry:output_type -> filer_pb.LookupDirectoryEntryResponse + 3, // 44: filer_pb.SeaweedFiler.ListEntries:output_type -> filer_pb.ListEntriesResponse + 13, // 45: filer_pb.SeaweedFiler.CreateEntry:output_type -> filer_pb.CreateEntryResponse + 15, // 46: filer_pb.SeaweedFiler.UpdateEntry:output_type -> filer_pb.UpdateEntryResponse + 17, // 47: filer_pb.SeaweedFiler.AppendToEntry:output_type -> filer_pb.AppendToEntryResponse + 19, // 48: filer_pb.SeaweedFiler.DeleteEntry:output_type -> filer_pb.DeleteEntryResponse + 21, // 49: filer_pb.SeaweedFiler.AtomicRenameEntry:output_type -> filer_pb.AtomicRenameEntryResponse + 23, // 50: filer_pb.SeaweedFiler.AssignVolume:output_type -> filer_pb.AssignVolumeResponse + 27, // 51: filer_pb.SeaweedFiler.LookupVolume:output_type -> filer_pb.LookupVolumeResponse + 30, // 52: filer_pb.SeaweedFiler.CollectionList:output_type -> filer_pb.CollectionListResponse + 32, // 53: filer_pb.SeaweedFiler.DeleteCollection:output_type -> filer_pb.DeleteCollectionResponse + 34, // 54: filer_pb.SeaweedFiler.Statistics:output_type -> filer_pb.StatisticsResponse + 36, // 55: filer_pb.SeaweedFiler.GetFilerConfiguration:output_type -> filer_pb.GetFilerConfigurationResponse + 38, // 56: filer_pb.SeaweedFiler.SubscribeMetadata:output_type -> filer_pb.SubscribeMetadataResponse + 38, // 57: filer_pb.SeaweedFiler.SubscribeLocalMetadata:output_type -> filer_pb.SubscribeMetadataResponse + 41, // 58: filer_pb.SeaweedFiler.KeepConnected:output_type -> filer_pb.KeepConnectedResponse + 43, // 59: filer_pb.SeaweedFiler.LocateBroker:output_type -> filer_pb.LocateBrokerResponse + 45, // 60: filer_pb.SeaweedFiler.KvGet:output_type -> filer_pb.KvGetResponse + 47, // 61: filer_pb.SeaweedFiler.KvPut:output_type -> filer_pb.KvPutResponse + 43, // [43:62] is the sub-list for method output_type + 24, // [24:43] is the sub-list for method input_type + 24, // [24:24] is the sub-list for extension type_name + 24, // [24:24] is the sub-list for extension extendee + 0, // [0:24] is the sub-list for field type_name } func init() { file_filer_proto_init() } @@ -4767,8 +4839,8 @@ func file_filer_proto_init() { return nil } } - file_filer_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LocateBrokerResponse_Resource); i { + file_filer_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoteStorageLocation); i { case 0: return &v.state case 1: @@ -4780,6 +4852,18 @@ func file_filer_proto_init() { } } file_filer_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LocateBrokerResponse_Resource); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_filer_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FilerConf_PathConf); i { case 0: return &v.state @@ -4798,7 +4882,7 @@ func file_filer_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_filer_proto_rawDesc, NumEnums: 0, - NumMessages: 56, + NumMessages: 57, NumExtensions: 0, NumServices: 1, }, diff --git a/weed/remote_storage/remote_storage.go b/weed/remote_storage/remote_storage.go index b8c2b55ea..1b4847e63 100644 --- a/weed/remote_storage/remote_storage.go +++ b/weed/remote_storage/remote_storage.go @@ -8,22 +8,21 @@ import ( "sync" ) -type RemoteStorageLocation string - -func (remote RemoteStorageLocation) NameBucketPath() (storageName, bucket, remotePath string) { +func ParseLocation(remote string) (loc *filer_pb.RemoteStorageLocation) { + loc = &filer_pb.RemoteStorageLocation{} if strings.HasSuffix(string(remote), "/") { remote = remote[:len(remote)-1] } parts := strings.SplitN(string(remote), "/", 3) if len(parts) >= 1 { - storageName = parts[0] + loc.Name = parts[0] } if len(parts) >= 2 { - bucket = parts[1] + loc.Bucket = parts[1] } - remotePath = string(remote[len(storageName)+1+len(bucket):]) - if remotePath == "" { - remotePath = "/" + loc.Path = string(remote[len(loc.Name)+1+len(loc.Bucket):]) + if loc.Path == "" { + loc.Path = "/" } return } @@ -31,8 +30,8 @@ func (remote RemoteStorageLocation) NameBucketPath() (storageName, bucket, remot type VisitFunc func(dir string, name string, isDirectory bool, remoteEntry *filer_pb.RemoteEntry) error type RemoteStorageClient interface { - Traverse(remote RemoteStorageLocation, visitFn VisitFunc) error - ReadFile(bucket, key string, offset int64, size int64, writeFn func(w io.Writer) error) error + Traverse(loc *filer_pb.RemoteStorageLocation, visitFn VisitFunc) error + ReadFile(loc *filer_pb.RemoteStorageLocation, offset int64, size int64, writeFn func(w io.Writer) error) error } type RemoteStorageClientMaker interface { diff --git a/weed/remote_storage/s3/s3_storage_client.go b/weed/remote_storage/s3/s3_storage_client.go index f994eb69f..d7d050842 100644 --- a/weed/remote_storage/s3/s3_storage_client.go +++ b/weed/remote_storage/s3/s3_storage_client.go @@ -10,6 +10,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/remote_storage" "github.com/chrislusf/seaweedfs/weed/util" + "io" ) func init() { @@ -44,13 +45,12 @@ type s3RemoteStorageClient struct { conn s3iface.S3API } -func (s s3RemoteStorageClient) Traverse(remote remote_storage.RemoteStorageLocation, visitFn remote_storage.VisitFunc) (err error) { +func (s s3RemoteStorageClient) Traverse(remote *filer_pb.RemoteStorageLocation, visitFn remote_storage.VisitFunc) (err error) { - _, bucket, pathKey := remote.NameBucketPath() - pathKey = pathKey[1:] + pathKey := remote.Path[1:] listInput := &s3.ListObjectsV2Input{ - Bucket: aws.String(bucket), + Bucket: aws.String(remote.Bucket), ContinuationToken: nil, Delimiter: nil, // not aws.String("/"), iterate through all entries EncodingType: nil, @@ -91,3 +91,6 @@ func (s s3RemoteStorageClient) Traverse(remote remote_storage.RemoteStorageLocat } return } +func (s s3RemoteStorageClient) ReadFile(loc *filer_pb.RemoteStorageLocation, offset int64, size int64, writeFn func(w io.Writer) error) error { + return nil +} diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go index 217be8cef..8f16d27c8 100644 --- a/weed/shell/command_remote_mount.go +++ b/weed/shell/command_remote_mount.go @@ -49,7 +49,7 @@ func (c *commandRemoteMount) Do(args []string, commandEnv *CommandEnv, writer io return nil } - remoteStorageLocation := remote_storage.RemoteStorageLocation(*remote) + remoteStorageLocation := remote_storage.ParseLocation(*remote) // find configuration for remote storage // remotePath is //path/to/dir @@ -71,33 +71,30 @@ func (c *commandRemoteMount) Do(args []string, commandEnv *CommandEnv, writer io return nil } -func (c *commandRemoteMount) findRemoteStorageConfiguration(commandEnv *CommandEnv, writer io.Writer, remote remote_storage.RemoteStorageLocation) (conf *filer_pb.RemoteConf, err error) { - - // find remote configuration - storageName, _, _ := remote.NameBucketPath() +func (c *commandRemoteMount) findRemoteStorageConfiguration(commandEnv *CommandEnv, writer io.Writer, remote *filer_pb.RemoteStorageLocation) (conf *filer_pb.RemoteConf, err error) { // read storage configuration data var confBytes []byte err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { - confBytes, err = filer.ReadInsideFiler(client, filer.DirectoryEtcRemote, storageName+filer.REMOTE_STORAGE_CONF_SUFFIX) + confBytes, err = filer.ReadInsideFiler(client, filer.DirectoryEtcRemote, remote.Name+filer.REMOTE_STORAGE_CONF_SUFFIX) return err }) if err != nil { - err = fmt.Errorf("no remote storage configuration for %s : %v", storageName, err) + err = fmt.Errorf("no remote storage configuration for %s : %v", remote.Name, err) return } // unmarshal storage configuration conf = &filer_pb.RemoteConf{} if unMarshalErr := proto.Unmarshal(confBytes, conf); unMarshalErr != nil { - err = fmt.Errorf("unmarshal %s/%s: %v", filer.DirectoryEtcRemote, storageName, unMarshalErr) + err = fmt.Errorf("unmarshal %s/%s: %v", filer.DirectoryEtcRemote, remote.Name, unMarshalErr) return } return } -func (c *commandRemoteMount) pullMetadata(commandEnv *CommandEnv, writer io.Writer, dir string, nonEmpty bool, remoteConf *filer_pb.RemoteConf, remote remote_storage.RemoteStorageLocation) error { +func (c *commandRemoteMount) pullMetadata(commandEnv *CommandEnv, writer io.Writer, dir string, nonEmpty bool, remoteConf *filer_pb.RemoteConf, remote *filer_pb.RemoteStorageLocation) error { // find existing directory, and ensure the directory is empty var mountToDir *filer_pb.Entry @@ -198,7 +195,7 @@ func (c *commandRemoteMount) pullMetadata(commandEnv *CommandEnv, writer io.Writ return nil } -func (c *commandRemoteMount) saveMountMapping(commandEnv *CommandEnv, writer io.Writer, dir string, remoteStorageLocation remote_storage.RemoteStorageLocation) (err error) { +func (c *commandRemoteMount) saveMountMapping(commandEnv *CommandEnv, writer io.Writer, dir string, remoteStorageLocation *filer_pb.RemoteStorageLocation) (err error) { // read current mapping var oldContent, newContent []byte From c6f992b2a363b97b0a0b64a8e44424a4f0b805b0 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 30 Jul 2021 15:18:01 -0700 Subject: [PATCH 140/265] remove dead code --- weed/shell/command_ec_decode.go | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/weed/shell/command_ec_decode.go b/weed/shell/command_ec_decode.go index dafdb041a..e4d597d84 100644 --- a/weed/shell/command_ec_decode.go +++ b/weed/shell/command_ec_decode.go @@ -223,21 +223,6 @@ func collectTopologyInfo(commandEnv *CommandEnv) (topoInfo *master_pb.TopologyIn } -func collectEcShardInfos(topoInfo *master_pb.TopologyInfo, selectedCollection string, vid needle.VolumeId) (ecShardInfos []*master_pb.VolumeEcShardInformationMessage) { - - eachDataNode(topoInfo, func(dc string, rack RackId, dn *master_pb.DataNodeInfo) { - if diskInfo, found := dn.DiskInfos[string(types.HardDriveType)]; found { - for _, v := range diskInfo.EcShardInfos { - if v.Collection == selectedCollection && v.Id == uint32(vid) { - ecShardInfos = append(ecShardInfos, v) - } - } - } - }) - - return -} - func collectEcShardIds(topoInfo *master_pb.TopologyInfo, selectedCollection string) (vids []needle.VolumeId) { vidMap := make(map[uint32]bool) From a3290faf17cccc0ed22486e391953afe04dec6b9 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 30 Jul 2021 15:49:46 -0700 Subject: [PATCH 141/265] shell command to calculate size / number of volumes in a collection fix https://github.com/chrislusf/seaweedfs/issues/2224 --- weed/shell/command_collection_list.go | 54 ++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/weed/shell/command_collection_list.go b/weed/shell/command_collection_list.go index 2a114e61b..ba502a6b9 100644 --- a/weed/shell/command_collection_list.go +++ b/weed/shell/command_collection_list.go @@ -22,6 +22,14 @@ func (c *commandCollectionList) Help() string { return `list all collections` } +type CollectionInfo struct { + FileCount uint64 + DeleteCount uint64 + DeletedByteCount uint64 + Size uint64 + VolumeCount int +} + func (c *commandCollectionList) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { collections, err := ListCollectionNames(commandEnv, true, true) @@ -30,8 +38,21 @@ func (c *commandCollectionList) Do(args []string, commandEnv *CommandEnv, writer return err } + topologyInfo, _, err := collectTopologyInfo(commandEnv) + if err != nil { + return err + } + + collectionInfos := make(map[string]*CollectionInfo) + + writeCollectionInfo(writer, topologyInfo, collectionInfos) + for _, c := range collections { - fmt.Fprintf(writer, "collection:\"%s\"\n", c) + cif, found := collectionInfos[c] + if !found { + continue + } + fmt.Fprintf(writer, "collection:\"%s\"\tvolumeCount:%d\tsize:%d\tfileCount:%d\tdeletedBytes:%d\tdeletion:%d\n", c, cif.VolumeCount, cif.Size, cif.FileCount, cif.DeletedByteCount, cif.DeleteCount) } fmt.Fprintf(writer, "Total %d collections.\n", len(collections)) @@ -56,3 +77,34 @@ func ListCollectionNames(commandEnv *CommandEnv, includeNormalVolumes, includeEc } return } + +func addToCollection(collectionInfos map[string]*CollectionInfo, vif *master_pb.VolumeInformationMessage) { + c := vif.Collection + cif, found := collectionInfos[c] + if !found { + cif = &CollectionInfo{} + collectionInfos[c] = cif + } + cif.Size += vif.Size + cif.DeleteCount += vif.DeleteCount + cif.FileCount += vif.FileCount + cif.DeletedByteCount += vif.DeletedByteCount + cif.VolumeCount++ +} + +func writeCollectionInfo(writer io.Writer, t *master_pb.TopologyInfo, collectionInfos map[string]*CollectionInfo) { + for _, dc := range t.DataCenterInfos { + for _, r := range dc.RackInfos { + for _, dn := range r.DataNodeInfos { + for _, diskInfo := range dn.DiskInfos { + for _, vi := range diskInfo.VolumeInfos { + addToCollection(collectionInfos, vi) + } + //for _, ecShardInfo := range diskInfo.EcShardInfos { + // + //} + } + } + } + } +} From 0d6f45cb464e2dc91dc392447f7af23c744a119d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 31 Jul 2021 02:00:01 -0700 Subject: [PATCH 142/265] add debug option to generate full goroutine stack dump --- weed/command/filer.go | 6 ++++++ weed/command/server.go | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/weed/command/filer.go b/weed/command/filer.go index a723b4d8a..eb7078a9d 100644 --- a/weed/command/filer.go +++ b/weed/command/filer.go @@ -3,6 +3,7 @@ package command import ( "fmt" "net/http" + _ "net/http/pprof" "os" "strconv" "strings" @@ -50,6 +51,7 @@ type FilerOptions struct { saveToFilerLimit *int defaultLevelDbDirectory *string concurrentUploadLimitMB *int + debug *bool } func init() { @@ -73,6 +75,7 @@ func init() { f.saveToFilerLimit = cmdFiler.Flag.Int("saveToFilerLimit", 0, "files smaller than this limit will be saved in filer store") f.defaultLevelDbDirectory = cmdFiler.Flag.String("defaultStoreDir", ".", "if filer.toml is empty, use an embedded filer store in the directory") f.concurrentUploadLimitMB = cmdFiler.Flag.Int("concurrentUploadLimitMB", 128, "limit total concurrent upload size") + f.debug = cmdFiler.Flag.Bool("debug", false, "generate full goroutine stack dump http://localhost:6060/debug/pprof/goroutine?debug=2") // start s3 on filer filerStartS3 = cmdFiler.Flag.Bool("s3", false, "whether to start S3 gateway") @@ -122,6 +125,9 @@ var cmdFiler = &Command{ } func runFiler(cmd *Command, args []string) bool { + if *f.debug { + go http.ListenAndServe("localhost:6060", nil) + } util.LoadConfiguration("security", false) diff --git a/weed/command/server.go b/weed/command/server.go index 97f117665..83aa5e84c 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -3,6 +3,7 @@ package command import ( "fmt" "github.com/chrislusf/seaweedfs/weed/util/grace" + "net/http" "os" "strings" "time" @@ -16,6 +17,7 @@ import ( type ServerOptions struct { cpuprofile *string memprofile *string + debug *bool v VolumeServerOptions } @@ -78,6 +80,7 @@ var ( func init() { serverOptions.cpuprofile = cmdServer.Flag.String("cpuprofile", "", "cpu profile output file") serverOptions.memprofile = cmdServer.Flag.String("memprofile", "", "memory profile output file") + serverOptions.debug = cmdServer.Flag.Bool("debug", false, "generate full goroutine stack dump http://localhost:6060/debug/pprof/goroutine?debug=2") masterOptions.port = cmdServer.Flag.Int("master.port", 9333, "master server http listen port") masterOptions.metaFolder = cmdServer.Flag.String("master.dir", "", "data directory to store meta data, default to same as -dir specified") @@ -139,6 +142,10 @@ func init() { func runServer(cmd *Command, args []string) bool { + if *serverOptions.debug { + go http.ListenAndServe("localhost:6060", nil) + } + util.LoadConfiguration("security", false) util.LoadConfiguration("master", false) From 1ff8285d82b7028f9ebe14bc180ddf33fc36dbaf Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 31 Jul 2021 02:13:21 -0700 Subject: [PATCH 143/265] debug from any server --- weed/command/filer.go | 2 +- weed/command/server.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/weed/command/filer.go b/weed/command/filer.go index eb7078a9d..0f1e63df6 100644 --- a/weed/command/filer.go +++ b/weed/command/filer.go @@ -126,7 +126,7 @@ var cmdFiler = &Command{ func runFiler(cmd *Command, args []string) bool { if *f.debug { - go http.ListenAndServe("localhost:6060", nil) + go http.ListenAndServe(":6060", nil) } util.LoadConfiguration("security", false) diff --git a/weed/command/server.go b/weed/command/server.go index 83aa5e84c..19fe8607b 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -143,7 +143,7 @@ func init() { func runServer(cmd *Command, args []string) bool { if *serverOptions.debug { - go http.ListenAndServe("localhost:6060", nil) + go http.ListenAndServe(":6060", nil) } util.LoadConfiguration("security", false) From 5d4438a72fe9cdf813bc7f3ee62ddc5f44eb737c Mon Sep 17 00:00:00 2001 From: "byunghwa.yun" Date: Sat, 31 Jul 2021 22:23:52 +0900 Subject: [PATCH 144/265] Fix typo --- weed/shell/command_volume_check_disk.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/shell/command_volume_check_disk.go b/weed/shell/command_volume_check_disk.go index f76555bed..7e060f3d3 100644 --- a/weed/shell/command_volume_check_disk.go +++ b/weed/shell/command_volume_check_disk.go @@ -90,7 +90,7 @@ func (c *commandVolumeCheckDisk) Do(args []string, commandEnv *CommandEnv, write } if err := c.syncTwoReplicas(aDB, bDB, a, verbose, writer, b, err, applyChanges, nonRepairThreshold); err != nil { - fmt.Fprintf(writer, "snyc volume %d on %s and %s: %v\n", a.info.Id, a.location.dataNode.Id, b.location.dataNode.Id, err) + fmt.Fprintf(writer, "sync volume %d on %s and %s: %v\n", a.info.Id, a.location.dataNode.Id, b.location.dataNode.Id, err) } replicas = replicas[1:] } From 6ba65c3382d8e6e73bfa5312ed9c04c5b17aece5 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 31 Jul 2021 09:18:41 -0700 Subject: [PATCH 145/265] customizable debug port --- weed/command/filer.go | 6 ++++-- weed/command/server.go | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/weed/command/filer.go b/weed/command/filer.go index 0f1e63df6..4fd2f9c72 100644 --- a/weed/command/filer.go +++ b/weed/command/filer.go @@ -52,6 +52,7 @@ type FilerOptions struct { defaultLevelDbDirectory *string concurrentUploadLimitMB *int debug *bool + debugPort *int } func init() { @@ -75,7 +76,8 @@ func init() { f.saveToFilerLimit = cmdFiler.Flag.Int("saveToFilerLimit", 0, "files smaller than this limit will be saved in filer store") f.defaultLevelDbDirectory = cmdFiler.Flag.String("defaultStoreDir", ".", "if filer.toml is empty, use an embedded filer store in the directory") f.concurrentUploadLimitMB = cmdFiler.Flag.Int("concurrentUploadLimitMB", 128, "limit total concurrent upload size") - f.debug = cmdFiler.Flag.Bool("debug", false, "generate full goroutine stack dump http://localhost:6060/debug/pprof/goroutine?debug=2") + f.debug = cmdFiler.Flag.Bool("debug", false, "serves runtime profiling data, e.g., http://localhost:/debug/pprof/goroutine?debug=2") + f.debugPort = cmdFiler.Flag.Int("debug.port", 6060, "http port for debugging") // start s3 on filer filerStartS3 = cmdFiler.Flag.Bool("s3", false, "whether to start S3 gateway") @@ -126,7 +128,7 @@ var cmdFiler = &Command{ func runFiler(cmd *Command, args []string) bool { if *f.debug { - go http.ListenAndServe(":6060", nil) + go http.ListenAndServe(fmt.Sprintf(":%d", *f.debugPort), nil) } util.LoadConfiguration("security", false) diff --git a/weed/command/server.go b/weed/command/server.go index 19fe8607b..9bac2be97 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -18,6 +18,7 @@ type ServerOptions struct { cpuprofile *string memprofile *string debug *bool + debugPort *int v VolumeServerOptions } @@ -80,7 +81,8 @@ var ( func init() { serverOptions.cpuprofile = cmdServer.Flag.String("cpuprofile", "", "cpu profile output file") serverOptions.memprofile = cmdServer.Flag.String("memprofile", "", "memory profile output file") - serverOptions.debug = cmdServer.Flag.Bool("debug", false, "generate full goroutine stack dump http://localhost:6060/debug/pprof/goroutine?debug=2") + serverOptions.debug = cmdServer.Flag.Bool("debug", false, "serves runtime profiling data, e.g., http://localhost:6060/debug/pprof/goroutine?debug=2") + serverOptions.debugPort = cmdServer.Flag.Int("debug.port", 6060, "http port for debugging") masterOptions.port = cmdServer.Flag.Int("master.port", 9333, "master server http listen port") masterOptions.metaFolder = cmdServer.Flag.String("master.dir", "", "data directory to store meta data, default to same as -dir specified") @@ -143,7 +145,7 @@ func init() { func runServer(cmd *Command, args []string) bool { if *serverOptions.debug { - go http.ListenAndServe(":6060", nil) + go http.ListenAndServe(fmt.Sprintf(":%d", *serverOptions.debugPort), nil) } util.LoadConfiguration("security", false) From 9df7d16791351f85ecb364b4b11caca1ee9bcd59 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 31 Jul 2021 22:39:38 -0700 Subject: [PATCH 146/265] read <- remote_storage --- weed/filer/filer_remote_storage.go | 26 +- weed/filer/read_remote.go | 10 +- weed/pb/filer_pb/filer_pb_helper.go | 4 + weed/pb/volume_server.proto | 19 + weed/pb/volume_server_pb/volume_server.pb.go | 1146 +++++++++++------- weed/remote_storage/remote_storage.go | 3 +- weed/remote_storage/s3/s3_storage_client.go | 25 +- weed/server/filer_server_handlers_read.go | 4 +- weed/server/volume_grpc_read_write.go | 40 + weed/shell/command_remote_mount.go | 37 +- 10 files changed, 851 insertions(+), 463 deletions(-) diff --git a/weed/filer/filer_remote_storage.go b/weed/filer/filer_remote_storage.go index df0b6d26b..0967de1a6 100644 --- a/weed/filer/filer_remote_storage.go +++ b/weed/filer/filer_remote_storage.go @@ -45,7 +45,10 @@ func (rs *FilerRemoteStorage) LoadRemoteStorageConfigurationsAndMapping(filer *F for _, entry := range entries { if entry.Name() == REMOTE_STORAGE_MOUNT_FILE { - rs.loadRemoteStorageMountMapping(entry.Content) + if err := rs.loadRemoteStorageMountMapping(entry.Content); err != nil { + return err + } + continue } if !strings.HasSuffix(entry.Name(), REMOTE_STORAGE_CONF_SUFFIX) { return nil @@ -75,16 +78,11 @@ func (rs *FilerRemoteStorage) mapDirectoryToRemoteStorage(dir util.FullPath, loc } func (rs *FilerRemoteStorage) FindMountDirectory(p util.FullPath) (mountDir util.FullPath, remoteLocation *filer_pb.RemoteStorageLocation) { - var storageLocation string rs.rules.MatchPrefix([]byte(p), func(key []byte, value interface{}) bool { - mountDir = util.FullPath(string(key)) - storageLocation = value.(string) + mountDir = util.FullPath(string(key[:len(key)-1])) + remoteLocation = value.(*filer_pb.RemoteStorageLocation) return true }) - if storageLocation == "" { - return - } - remoteLocation = remote_storage.ParseLocation(storageLocation) return } @@ -118,8 +116,8 @@ func (rs *FilerRemoteStorage) GetRemoteStorageClient(storageName string) (client return } -func AddMapping(oldContent []byte, dir string, storageLocation *filer_pb.RemoteStorageLocation) (newContent []byte, err error) { - mappings := &filer_pb.RemoteStorageMapping{ +func UnmarshalRemoteStorageMappings(oldContent []byte) (mappings *filer_pb.RemoteStorageMapping, err error) { + mappings = &filer_pb.RemoteStorageMapping{ Mappings: make(map[string]*filer_pb.RemoteStorageLocation), } if len(oldContent) > 0 { @@ -127,6 +125,14 @@ func AddMapping(oldContent []byte, dir string, storageLocation *filer_pb.RemoteS glog.Warningf("unmarshal existing mappings: %v", err) } } + return +} + +func AddRemoteStorageMapping(oldContent []byte, dir string, storageLocation *filer_pb.RemoteStorageLocation) (newContent []byte, err error) { + mappings, unmarshalErr := UnmarshalRemoteStorageMappings(oldContent) + if unmarshalErr != nil { + // skip + } // set the new mapping mappings.Mappings[dir] = storageLocation diff --git a/weed/filer/read_remote.go b/weed/filer/read_remote.go index 4f02ba26b..26e220445 100644 --- a/weed/filer/read_remote.go +++ b/weed/filer/read_remote.go @@ -3,17 +3,16 @@ package filer import ( "fmt" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" - "io" ) func (entry *Entry) IsRemoteOnly() bool { return len(entry.Chunks) == 0 && entry.Remote != nil && entry.Remote.Size > 0 } -func (f *Filer) ReadRemote(w io.Writer, entry *Entry, offset int64, size int64) error { +func (f *Filer) ReadRemote(entry *Entry, offset int64, size int64) (data[]byte, err error) { client, _, found := f.RemoteStorage.GetRemoteStorageClient(entry.Remote.StorageName) if !found { - return fmt.Errorf("remote storage %v not found", entry.Remote.StorageName) + return nil, fmt.Errorf("remote storage %v not found", entry.Remote.StorageName) } mountDir, remoteLoation := f.RemoteStorage.FindMountDirectory(entry.FullPath) @@ -26,8 +25,5 @@ func (f *Filer) ReadRemote(w io.Writer, entry *Entry, offset int64, size int64) Path: remoteFullPath, } - client.ReadFile(sourceLoc, offset, size, func(w io.Writer) error { - return nil - }) - return nil + return client.ReadFile(sourceLoc, offset, size) } diff --git a/weed/pb/filer_pb/filer_pb_helper.go b/weed/pb/filer_pb/filer_pb_helper.go index b46385c8f..ae282db75 100644 --- a/weed/pb/filer_pb/filer_pb_helper.go +++ b/weed/pb/filer_pb/filer_pb_helper.go @@ -147,3 +147,7 @@ func (fp *FilerConf_PathConf) Key() interface{} { key, _ := proto.Marshal(fp) return string(key) } +func (fp *RemoteStorageLocation) Key() interface{} { + key, _ := proto.Marshal(fp) + return string(key) +} diff --git a/weed/pb/volume_server.proto b/weed/pb/volume_server.proto index f9836c402..dd263ae38 100644 --- a/weed/pb/volume_server.proto +++ b/weed/pb/volume_server.proto @@ -56,6 +56,8 @@ service VolumeServer { } rpc WriteNeedleBlob (WriteNeedleBlobRequest) returns (WriteNeedleBlobResponse) { } + rpc FetchAndWriteNeedle (FetchAndWriteNeedleRequest) returns (FetchAndWriteNeedleResponse) { + } rpc VolumeTailSender (VolumeTailSenderRequest) returns (stream VolumeTailSenderResponse) { } @@ -276,6 +278,23 @@ message WriteNeedleBlobRequest { } message WriteNeedleBlobResponse { } +message FetchAndWriteNeedleRequest { + uint32 volume_id = 1; + uint64 needle_id = 2; + int64 offset = 3; + int64 size = 4; + // remote info + string remote_type = 5; + string remote_name = 6; + string s3_access_key = 8; + string s3_secret_key = 9; + string s3_region = 10; + string s3_endpoint = 11; + string remote_bucket = 12; + string remote_key = 13; +} +message FetchAndWriteNeedleResponse { +} message VolumeTailSenderRequest { uint32 volume_id = 1; diff --git a/weed/pb/volume_server_pb/volume_server.pb.go b/weed/pb/volume_server_pb/volume_server.pb.go index c642142ba..730751d84 100644 --- a/weed/pb/volume_server_pb/volume_server.pb.go +++ b/weed/pb/volume_server_pb/volume_server.pb.go @@ -2200,6 +2200,180 @@ func (*WriteNeedleBlobResponse) Descriptor() ([]byte, []int) { return file_volume_server_proto_rawDescGZIP(), []int{41} } +type FetchAndWriteNeedleRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + NeedleId uint64 `protobuf:"varint,2,opt,name=needle_id,json=needleId,proto3" json:"needle_id,omitempty"` + Offset int64 `protobuf:"varint,3,opt,name=offset,proto3" json:"offset,omitempty"` + Size int64 `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"` + // remote info + RemoteType string `protobuf:"bytes,5,opt,name=remote_type,json=remoteType,proto3" json:"remote_type,omitempty"` + RemoteName string `protobuf:"bytes,6,opt,name=remote_name,json=remoteName,proto3" json:"remote_name,omitempty"` + S3AccessKey string `protobuf:"bytes,8,opt,name=s3_access_key,json=s3AccessKey,proto3" json:"s3_access_key,omitempty"` + S3SecretKey string `protobuf:"bytes,9,opt,name=s3_secret_key,json=s3SecretKey,proto3" json:"s3_secret_key,omitempty"` + S3Region string `protobuf:"bytes,10,opt,name=s3_region,json=s3Region,proto3" json:"s3_region,omitempty"` + S3Endpoint string `protobuf:"bytes,11,opt,name=s3_endpoint,json=s3Endpoint,proto3" json:"s3_endpoint,omitempty"` + RemoteBucket string `protobuf:"bytes,12,opt,name=remote_bucket,json=remoteBucket,proto3" json:"remote_bucket,omitempty"` + RemoteKey string `protobuf:"bytes,13,opt,name=remote_key,json=remoteKey,proto3" json:"remote_key,omitempty"` +} + +func (x *FetchAndWriteNeedleRequest) Reset() { + *x = FetchAndWriteNeedleRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FetchAndWriteNeedleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FetchAndWriteNeedleRequest) ProtoMessage() {} + +func (x *FetchAndWriteNeedleRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[42] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FetchAndWriteNeedleRequest.ProtoReflect.Descriptor instead. +func (*FetchAndWriteNeedleRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{42} +} + +func (x *FetchAndWriteNeedleRequest) GetVolumeId() uint32 { + if x != nil { + return x.VolumeId + } + return 0 +} + +func (x *FetchAndWriteNeedleRequest) GetNeedleId() uint64 { + if x != nil { + return x.NeedleId + } + return 0 +} + +func (x *FetchAndWriteNeedleRequest) GetOffset() int64 { + if x != nil { + return x.Offset + } + return 0 +} + +func (x *FetchAndWriteNeedleRequest) GetSize() int64 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *FetchAndWriteNeedleRequest) GetRemoteType() string { + if x != nil { + return x.RemoteType + } + return "" +} + +func (x *FetchAndWriteNeedleRequest) GetRemoteName() string { + if x != nil { + return x.RemoteName + } + return "" +} + +func (x *FetchAndWriteNeedleRequest) GetS3AccessKey() string { + if x != nil { + return x.S3AccessKey + } + return "" +} + +func (x *FetchAndWriteNeedleRequest) GetS3SecretKey() string { + if x != nil { + return x.S3SecretKey + } + return "" +} + +func (x *FetchAndWriteNeedleRequest) GetS3Region() string { + if x != nil { + return x.S3Region + } + return "" +} + +func (x *FetchAndWriteNeedleRequest) GetS3Endpoint() string { + if x != nil { + return x.S3Endpoint + } + return "" +} + +func (x *FetchAndWriteNeedleRequest) GetRemoteBucket() string { + if x != nil { + return x.RemoteBucket + } + return "" +} + +func (x *FetchAndWriteNeedleRequest) GetRemoteKey() string { + if x != nil { + return x.RemoteKey + } + return "" +} + +type FetchAndWriteNeedleResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *FetchAndWriteNeedleResponse) Reset() { + *x = FetchAndWriteNeedleResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FetchAndWriteNeedleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FetchAndWriteNeedleResponse) ProtoMessage() {} + +func (x *FetchAndWriteNeedleResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FetchAndWriteNeedleResponse.ProtoReflect.Descriptor instead. +func (*FetchAndWriteNeedleResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{43} +} + type VolumeTailSenderRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2213,7 +2387,7 @@ type VolumeTailSenderRequest struct { func (x *VolumeTailSenderRequest) Reset() { *x = VolumeTailSenderRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[42] + mi := &file_volume_server_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2226,7 +2400,7 @@ func (x *VolumeTailSenderRequest) String() string { func (*VolumeTailSenderRequest) ProtoMessage() {} func (x *VolumeTailSenderRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[42] + mi := &file_volume_server_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2239,7 +2413,7 @@ func (x *VolumeTailSenderRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeTailSenderRequest.ProtoReflect.Descriptor instead. func (*VolumeTailSenderRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{42} + return file_volume_server_proto_rawDescGZIP(), []int{44} } func (x *VolumeTailSenderRequest) GetVolumeId() uint32 { @@ -2276,7 +2450,7 @@ type VolumeTailSenderResponse struct { func (x *VolumeTailSenderResponse) Reset() { *x = VolumeTailSenderResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[43] + mi := &file_volume_server_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2289,7 +2463,7 @@ func (x *VolumeTailSenderResponse) String() string { func (*VolumeTailSenderResponse) ProtoMessage() {} func (x *VolumeTailSenderResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[43] + mi := &file_volume_server_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2302,7 +2476,7 @@ func (x *VolumeTailSenderResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeTailSenderResponse.ProtoReflect.Descriptor instead. func (*VolumeTailSenderResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{43} + return file_volume_server_proto_rawDescGZIP(), []int{45} } func (x *VolumeTailSenderResponse) GetNeedleHeader() []byte { @@ -2340,7 +2514,7 @@ type VolumeTailReceiverRequest struct { func (x *VolumeTailReceiverRequest) Reset() { *x = VolumeTailReceiverRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[44] + mi := &file_volume_server_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2353,7 +2527,7 @@ func (x *VolumeTailReceiverRequest) String() string { func (*VolumeTailReceiverRequest) ProtoMessage() {} func (x *VolumeTailReceiverRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[44] + mi := &file_volume_server_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2366,7 +2540,7 @@ func (x *VolumeTailReceiverRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeTailReceiverRequest.ProtoReflect.Descriptor instead. func (*VolumeTailReceiverRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{44} + return file_volume_server_proto_rawDescGZIP(), []int{46} } func (x *VolumeTailReceiverRequest) GetVolumeId() uint32 { @@ -2406,7 +2580,7 @@ type VolumeTailReceiverResponse struct { func (x *VolumeTailReceiverResponse) Reset() { *x = VolumeTailReceiverResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[45] + mi := &file_volume_server_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2419,7 +2593,7 @@ func (x *VolumeTailReceiverResponse) String() string { func (*VolumeTailReceiverResponse) ProtoMessage() {} func (x *VolumeTailReceiverResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[45] + mi := &file_volume_server_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2432,7 +2606,7 @@ func (x *VolumeTailReceiverResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeTailReceiverResponse.ProtoReflect.Descriptor instead. func (*VolumeTailReceiverResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{45} + return file_volume_server_proto_rawDescGZIP(), []int{47} } type VolumeEcShardsGenerateRequest struct { @@ -2447,7 +2621,7 @@ type VolumeEcShardsGenerateRequest struct { func (x *VolumeEcShardsGenerateRequest) Reset() { *x = VolumeEcShardsGenerateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[46] + mi := &file_volume_server_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2460,7 +2634,7 @@ func (x *VolumeEcShardsGenerateRequest) String() string { func (*VolumeEcShardsGenerateRequest) ProtoMessage() {} func (x *VolumeEcShardsGenerateRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[46] + mi := &file_volume_server_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2473,7 +2647,7 @@ func (x *VolumeEcShardsGenerateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcShardsGenerateRequest.ProtoReflect.Descriptor instead. func (*VolumeEcShardsGenerateRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{46} + return file_volume_server_proto_rawDescGZIP(), []int{48} } func (x *VolumeEcShardsGenerateRequest) GetVolumeId() uint32 { @@ -2499,7 +2673,7 @@ type VolumeEcShardsGenerateResponse struct { func (x *VolumeEcShardsGenerateResponse) Reset() { *x = VolumeEcShardsGenerateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[47] + mi := &file_volume_server_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2512,7 +2686,7 @@ func (x *VolumeEcShardsGenerateResponse) String() string { func (*VolumeEcShardsGenerateResponse) ProtoMessage() {} func (x *VolumeEcShardsGenerateResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[47] + mi := &file_volume_server_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2525,7 +2699,7 @@ func (x *VolumeEcShardsGenerateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcShardsGenerateResponse.ProtoReflect.Descriptor instead. func (*VolumeEcShardsGenerateResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{47} + return file_volume_server_proto_rawDescGZIP(), []int{49} } type VolumeEcShardsRebuildRequest struct { @@ -2540,7 +2714,7 @@ type VolumeEcShardsRebuildRequest struct { func (x *VolumeEcShardsRebuildRequest) Reset() { *x = VolumeEcShardsRebuildRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[48] + mi := &file_volume_server_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2553,7 +2727,7 @@ func (x *VolumeEcShardsRebuildRequest) String() string { func (*VolumeEcShardsRebuildRequest) ProtoMessage() {} func (x *VolumeEcShardsRebuildRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[48] + mi := &file_volume_server_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2566,7 +2740,7 @@ func (x *VolumeEcShardsRebuildRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcShardsRebuildRequest.ProtoReflect.Descriptor instead. func (*VolumeEcShardsRebuildRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{48} + return file_volume_server_proto_rawDescGZIP(), []int{50} } func (x *VolumeEcShardsRebuildRequest) GetVolumeId() uint32 { @@ -2594,7 +2768,7 @@ type VolumeEcShardsRebuildResponse struct { func (x *VolumeEcShardsRebuildResponse) Reset() { *x = VolumeEcShardsRebuildResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[49] + mi := &file_volume_server_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2607,7 +2781,7 @@ func (x *VolumeEcShardsRebuildResponse) String() string { func (*VolumeEcShardsRebuildResponse) ProtoMessage() {} func (x *VolumeEcShardsRebuildResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[49] + mi := &file_volume_server_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2620,7 +2794,7 @@ func (x *VolumeEcShardsRebuildResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcShardsRebuildResponse.ProtoReflect.Descriptor instead. func (*VolumeEcShardsRebuildResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{49} + return file_volume_server_proto_rawDescGZIP(), []int{51} } func (x *VolumeEcShardsRebuildResponse) GetRebuiltShardIds() []uint32 { @@ -2647,7 +2821,7 @@ type VolumeEcShardsCopyRequest struct { func (x *VolumeEcShardsCopyRequest) Reset() { *x = VolumeEcShardsCopyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[50] + mi := &file_volume_server_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2660,7 +2834,7 @@ func (x *VolumeEcShardsCopyRequest) String() string { func (*VolumeEcShardsCopyRequest) ProtoMessage() {} func (x *VolumeEcShardsCopyRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[50] + mi := &file_volume_server_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2673,7 +2847,7 @@ func (x *VolumeEcShardsCopyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcShardsCopyRequest.ProtoReflect.Descriptor instead. func (*VolumeEcShardsCopyRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{50} + return file_volume_server_proto_rawDescGZIP(), []int{52} } func (x *VolumeEcShardsCopyRequest) GetVolumeId() uint32 { @@ -2734,7 +2908,7 @@ type VolumeEcShardsCopyResponse struct { func (x *VolumeEcShardsCopyResponse) Reset() { *x = VolumeEcShardsCopyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[51] + mi := &file_volume_server_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2747,7 +2921,7 @@ func (x *VolumeEcShardsCopyResponse) String() string { func (*VolumeEcShardsCopyResponse) ProtoMessage() {} func (x *VolumeEcShardsCopyResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[51] + mi := &file_volume_server_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2760,7 +2934,7 @@ func (x *VolumeEcShardsCopyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcShardsCopyResponse.ProtoReflect.Descriptor instead. func (*VolumeEcShardsCopyResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{51} + return file_volume_server_proto_rawDescGZIP(), []int{53} } type VolumeEcShardsDeleteRequest struct { @@ -2776,7 +2950,7 @@ type VolumeEcShardsDeleteRequest struct { func (x *VolumeEcShardsDeleteRequest) Reset() { *x = VolumeEcShardsDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[52] + mi := &file_volume_server_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2789,7 +2963,7 @@ func (x *VolumeEcShardsDeleteRequest) String() string { func (*VolumeEcShardsDeleteRequest) ProtoMessage() {} func (x *VolumeEcShardsDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[52] + mi := &file_volume_server_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2802,7 +2976,7 @@ func (x *VolumeEcShardsDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcShardsDeleteRequest.ProtoReflect.Descriptor instead. func (*VolumeEcShardsDeleteRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{52} + return file_volume_server_proto_rawDescGZIP(), []int{54} } func (x *VolumeEcShardsDeleteRequest) GetVolumeId() uint32 { @@ -2835,7 +3009,7 @@ type VolumeEcShardsDeleteResponse struct { func (x *VolumeEcShardsDeleteResponse) Reset() { *x = VolumeEcShardsDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[53] + mi := &file_volume_server_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2848,7 +3022,7 @@ func (x *VolumeEcShardsDeleteResponse) String() string { func (*VolumeEcShardsDeleteResponse) ProtoMessage() {} func (x *VolumeEcShardsDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[53] + mi := &file_volume_server_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2861,7 +3035,7 @@ func (x *VolumeEcShardsDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcShardsDeleteResponse.ProtoReflect.Descriptor instead. func (*VolumeEcShardsDeleteResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{53} + return file_volume_server_proto_rawDescGZIP(), []int{55} } type VolumeEcShardsMountRequest struct { @@ -2877,7 +3051,7 @@ type VolumeEcShardsMountRequest struct { func (x *VolumeEcShardsMountRequest) Reset() { *x = VolumeEcShardsMountRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[54] + mi := &file_volume_server_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2890,7 +3064,7 @@ func (x *VolumeEcShardsMountRequest) String() string { func (*VolumeEcShardsMountRequest) ProtoMessage() {} func (x *VolumeEcShardsMountRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[54] + mi := &file_volume_server_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2903,7 +3077,7 @@ func (x *VolumeEcShardsMountRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcShardsMountRequest.ProtoReflect.Descriptor instead. func (*VolumeEcShardsMountRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{54} + return file_volume_server_proto_rawDescGZIP(), []int{56} } func (x *VolumeEcShardsMountRequest) GetVolumeId() uint32 { @@ -2936,7 +3110,7 @@ type VolumeEcShardsMountResponse struct { func (x *VolumeEcShardsMountResponse) Reset() { *x = VolumeEcShardsMountResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[55] + mi := &file_volume_server_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2949,7 +3123,7 @@ func (x *VolumeEcShardsMountResponse) String() string { func (*VolumeEcShardsMountResponse) ProtoMessage() {} func (x *VolumeEcShardsMountResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[55] + mi := &file_volume_server_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2962,7 +3136,7 @@ func (x *VolumeEcShardsMountResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcShardsMountResponse.ProtoReflect.Descriptor instead. func (*VolumeEcShardsMountResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{55} + return file_volume_server_proto_rawDescGZIP(), []int{57} } type VolumeEcShardsUnmountRequest struct { @@ -2977,7 +3151,7 @@ type VolumeEcShardsUnmountRequest struct { func (x *VolumeEcShardsUnmountRequest) Reset() { *x = VolumeEcShardsUnmountRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[56] + mi := &file_volume_server_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2990,7 +3164,7 @@ func (x *VolumeEcShardsUnmountRequest) String() string { func (*VolumeEcShardsUnmountRequest) ProtoMessage() {} func (x *VolumeEcShardsUnmountRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[56] + mi := &file_volume_server_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3003,7 +3177,7 @@ func (x *VolumeEcShardsUnmountRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcShardsUnmountRequest.ProtoReflect.Descriptor instead. func (*VolumeEcShardsUnmountRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{56} + return file_volume_server_proto_rawDescGZIP(), []int{58} } func (x *VolumeEcShardsUnmountRequest) GetVolumeId() uint32 { @@ -3029,7 +3203,7 @@ type VolumeEcShardsUnmountResponse struct { func (x *VolumeEcShardsUnmountResponse) Reset() { *x = VolumeEcShardsUnmountResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[57] + mi := &file_volume_server_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3042,7 +3216,7 @@ func (x *VolumeEcShardsUnmountResponse) String() string { func (*VolumeEcShardsUnmountResponse) ProtoMessage() {} func (x *VolumeEcShardsUnmountResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[57] + mi := &file_volume_server_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3055,7 +3229,7 @@ func (x *VolumeEcShardsUnmountResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcShardsUnmountResponse.ProtoReflect.Descriptor instead. func (*VolumeEcShardsUnmountResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{57} + return file_volume_server_proto_rawDescGZIP(), []int{59} } type VolumeEcShardReadRequest struct { @@ -3073,7 +3247,7 @@ type VolumeEcShardReadRequest struct { func (x *VolumeEcShardReadRequest) Reset() { *x = VolumeEcShardReadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[58] + mi := &file_volume_server_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3086,7 +3260,7 @@ func (x *VolumeEcShardReadRequest) String() string { func (*VolumeEcShardReadRequest) ProtoMessage() {} func (x *VolumeEcShardReadRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[58] + mi := &file_volume_server_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3099,7 +3273,7 @@ func (x *VolumeEcShardReadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcShardReadRequest.ProtoReflect.Descriptor instead. func (*VolumeEcShardReadRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{58} + return file_volume_server_proto_rawDescGZIP(), []int{60} } func (x *VolumeEcShardReadRequest) GetVolumeId() uint32 { @@ -3149,7 +3323,7 @@ type VolumeEcShardReadResponse struct { func (x *VolumeEcShardReadResponse) Reset() { *x = VolumeEcShardReadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[59] + mi := &file_volume_server_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3162,7 +3336,7 @@ func (x *VolumeEcShardReadResponse) String() string { func (*VolumeEcShardReadResponse) ProtoMessage() {} func (x *VolumeEcShardReadResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[59] + mi := &file_volume_server_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3175,7 +3349,7 @@ func (x *VolumeEcShardReadResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcShardReadResponse.ProtoReflect.Descriptor instead. func (*VolumeEcShardReadResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{59} + return file_volume_server_proto_rawDescGZIP(), []int{61} } func (x *VolumeEcShardReadResponse) GetData() []byte { @@ -3206,7 +3380,7 @@ type VolumeEcBlobDeleteRequest struct { func (x *VolumeEcBlobDeleteRequest) Reset() { *x = VolumeEcBlobDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[60] + mi := &file_volume_server_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3219,7 +3393,7 @@ func (x *VolumeEcBlobDeleteRequest) String() string { func (*VolumeEcBlobDeleteRequest) ProtoMessage() {} func (x *VolumeEcBlobDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[60] + mi := &file_volume_server_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3232,7 +3406,7 @@ func (x *VolumeEcBlobDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcBlobDeleteRequest.ProtoReflect.Descriptor instead. func (*VolumeEcBlobDeleteRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{60} + return file_volume_server_proto_rawDescGZIP(), []int{62} } func (x *VolumeEcBlobDeleteRequest) GetVolumeId() uint32 { @@ -3272,7 +3446,7 @@ type VolumeEcBlobDeleteResponse struct { func (x *VolumeEcBlobDeleteResponse) Reset() { *x = VolumeEcBlobDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[61] + mi := &file_volume_server_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3285,7 +3459,7 @@ func (x *VolumeEcBlobDeleteResponse) String() string { func (*VolumeEcBlobDeleteResponse) ProtoMessage() {} func (x *VolumeEcBlobDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[61] + mi := &file_volume_server_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3298,7 +3472,7 @@ func (x *VolumeEcBlobDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcBlobDeleteResponse.ProtoReflect.Descriptor instead. func (*VolumeEcBlobDeleteResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{61} + return file_volume_server_proto_rawDescGZIP(), []int{63} } type VolumeEcShardsToVolumeRequest struct { @@ -3313,7 +3487,7 @@ type VolumeEcShardsToVolumeRequest struct { func (x *VolumeEcShardsToVolumeRequest) Reset() { *x = VolumeEcShardsToVolumeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[62] + mi := &file_volume_server_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3326,7 +3500,7 @@ func (x *VolumeEcShardsToVolumeRequest) String() string { func (*VolumeEcShardsToVolumeRequest) ProtoMessage() {} func (x *VolumeEcShardsToVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[62] + mi := &file_volume_server_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3339,7 +3513,7 @@ func (x *VolumeEcShardsToVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcShardsToVolumeRequest.ProtoReflect.Descriptor instead. func (*VolumeEcShardsToVolumeRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{62} + return file_volume_server_proto_rawDescGZIP(), []int{64} } func (x *VolumeEcShardsToVolumeRequest) GetVolumeId() uint32 { @@ -3365,7 +3539,7 @@ type VolumeEcShardsToVolumeResponse struct { func (x *VolumeEcShardsToVolumeResponse) Reset() { *x = VolumeEcShardsToVolumeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[63] + mi := &file_volume_server_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3378,7 +3552,7 @@ func (x *VolumeEcShardsToVolumeResponse) String() string { func (*VolumeEcShardsToVolumeResponse) ProtoMessage() {} func (x *VolumeEcShardsToVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[63] + mi := &file_volume_server_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3391,7 +3565,7 @@ func (x *VolumeEcShardsToVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcShardsToVolumeResponse.ProtoReflect.Descriptor instead. func (*VolumeEcShardsToVolumeResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{63} + return file_volume_server_proto_rawDescGZIP(), []int{65} } type ReadVolumeFileStatusRequest struct { @@ -3405,7 +3579,7 @@ type ReadVolumeFileStatusRequest struct { func (x *ReadVolumeFileStatusRequest) Reset() { *x = ReadVolumeFileStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[64] + mi := &file_volume_server_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3418,7 +3592,7 @@ func (x *ReadVolumeFileStatusRequest) String() string { func (*ReadVolumeFileStatusRequest) ProtoMessage() {} func (x *ReadVolumeFileStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[64] + mi := &file_volume_server_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3431,7 +3605,7 @@ func (x *ReadVolumeFileStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReadVolumeFileStatusRequest.ProtoReflect.Descriptor instead. func (*ReadVolumeFileStatusRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{64} + return file_volume_server_proto_rawDescGZIP(), []int{66} } func (x *ReadVolumeFileStatusRequest) GetVolumeId() uint32 { @@ -3460,7 +3634,7 @@ type ReadVolumeFileStatusResponse struct { func (x *ReadVolumeFileStatusResponse) Reset() { *x = ReadVolumeFileStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[65] + mi := &file_volume_server_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3473,7 +3647,7 @@ func (x *ReadVolumeFileStatusResponse) String() string { func (*ReadVolumeFileStatusResponse) ProtoMessage() {} func (x *ReadVolumeFileStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[65] + mi := &file_volume_server_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3486,7 +3660,7 @@ func (x *ReadVolumeFileStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReadVolumeFileStatusResponse.ProtoReflect.Descriptor instead. func (*ReadVolumeFileStatusResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{65} + return file_volume_server_proto_rawDescGZIP(), []int{67} } func (x *ReadVolumeFileStatusResponse) GetVolumeId() uint32 { @@ -3569,7 +3743,7 @@ type DiskStatus struct { func (x *DiskStatus) Reset() { *x = DiskStatus{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[66] + mi := &file_volume_server_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3582,7 +3756,7 @@ func (x *DiskStatus) String() string { func (*DiskStatus) ProtoMessage() {} func (x *DiskStatus) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[66] + mi := &file_volume_server_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3595,7 +3769,7 @@ func (x *DiskStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use DiskStatus.ProtoReflect.Descriptor instead. func (*DiskStatus) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{66} + return file_volume_server_proto_rawDescGZIP(), []int{68} } func (x *DiskStatus) GetDir() string { @@ -3664,7 +3838,7 @@ type MemStatus struct { func (x *MemStatus) Reset() { *x = MemStatus{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[67] + mi := &file_volume_server_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3677,7 +3851,7 @@ func (x *MemStatus) String() string { func (*MemStatus) ProtoMessage() {} func (x *MemStatus) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[67] + mi := &file_volume_server_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3690,7 +3864,7 @@ func (x *MemStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use MemStatus.ProtoReflect.Descriptor instead. func (*MemStatus) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{67} + return file_volume_server_proto_rawDescGZIP(), []int{69} } func (x *MemStatus) GetGoroutines() int32 { @@ -3760,7 +3934,7 @@ type RemoteFile struct { func (x *RemoteFile) Reset() { *x = RemoteFile{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[68] + mi := &file_volume_server_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3773,7 +3947,7 @@ func (x *RemoteFile) String() string { func (*RemoteFile) ProtoMessage() {} func (x *RemoteFile) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[68] + mi := &file_volume_server_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3786,7 +3960,7 @@ func (x *RemoteFile) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoteFile.ProtoReflect.Descriptor instead. func (*RemoteFile) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{68} + return file_volume_server_proto_rawDescGZIP(), []int{70} } func (x *RemoteFile) GetBackendType() string { @@ -3851,7 +4025,7 @@ type VolumeInfo struct { func (x *VolumeInfo) Reset() { *x = VolumeInfo{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[69] + mi := &file_volume_server_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3864,7 +4038,7 @@ func (x *VolumeInfo) String() string { func (*VolumeInfo) ProtoMessage() {} func (x *VolumeInfo) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[69] + mi := &file_volume_server_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3877,7 +4051,7 @@ func (x *VolumeInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeInfo.ProtoReflect.Descriptor instead. func (*VolumeInfo) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{69} + return file_volume_server_proto_rawDescGZIP(), []int{71} } func (x *VolumeInfo) GetFiles() []*RemoteFile { @@ -3915,7 +4089,7 @@ type VolumeTierMoveDatToRemoteRequest struct { func (x *VolumeTierMoveDatToRemoteRequest) Reset() { *x = VolumeTierMoveDatToRemoteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[70] + mi := &file_volume_server_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3928,7 +4102,7 @@ func (x *VolumeTierMoveDatToRemoteRequest) String() string { func (*VolumeTierMoveDatToRemoteRequest) ProtoMessage() {} func (x *VolumeTierMoveDatToRemoteRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[70] + mi := &file_volume_server_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3941,7 +4115,7 @@ func (x *VolumeTierMoveDatToRemoteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeTierMoveDatToRemoteRequest.ProtoReflect.Descriptor instead. func (*VolumeTierMoveDatToRemoteRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{70} + return file_volume_server_proto_rawDescGZIP(), []int{72} } func (x *VolumeTierMoveDatToRemoteRequest) GetVolumeId() uint32 { @@ -3984,7 +4158,7 @@ type VolumeTierMoveDatToRemoteResponse struct { func (x *VolumeTierMoveDatToRemoteResponse) Reset() { *x = VolumeTierMoveDatToRemoteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[71] + mi := &file_volume_server_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3997,7 +4171,7 @@ func (x *VolumeTierMoveDatToRemoteResponse) String() string { func (*VolumeTierMoveDatToRemoteResponse) ProtoMessage() {} func (x *VolumeTierMoveDatToRemoteResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[71] + mi := &file_volume_server_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4010,7 +4184,7 @@ func (x *VolumeTierMoveDatToRemoteResponse) ProtoReflect() protoreflect.Message // Deprecated: Use VolumeTierMoveDatToRemoteResponse.ProtoReflect.Descriptor instead. func (*VolumeTierMoveDatToRemoteResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{71} + return file_volume_server_proto_rawDescGZIP(), []int{73} } func (x *VolumeTierMoveDatToRemoteResponse) GetProcessed() int64 { @@ -4040,7 +4214,7 @@ type VolumeTierMoveDatFromRemoteRequest struct { func (x *VolumeTierMoveDatFromRemoteRequest) Reset() { *x = VolumeTierMoveDatFromRemoteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[72] + mi := &file_volume_server_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4053,7 +4227,7 @@ func (x *VolumeTierMoveDatFromRemoteRequest) String() string { func (*VolumeTierMoveDatFromRemoteRequest) ProtoMessage() {} func (x *VolumeTierMoveDatFromRemoteRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[72] + mi := &file_volume_server_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4066,7 +4240,7 @@ func (x *VolumeTierMoveDatFromRemoteRequest) ProtoReflect() protoreflect.Message // Deprecated: Use VolumeTierMoveDatFromRemoteRequest.ProtoReflect.Descriptor instead. func (*VolumeTierMoveDatFromRemoteRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{72} + return file_volume_server_proto_rawDescGZIP(), []int{74} } func (x *VolumeTierMoveDatFromRemoteRequest) GetVolumeId() uint32 { @@ -4102,7 +4276,7 @@ type VolumeTierMoveDatFromRemoteResponse struct { func (x *VolumeTierMoveDatFromRemoteResponse) Reset() { *x = VolumeTierMoveDatFromRemoteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[73] + mi := &file_volume_server_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4115,7 +4289,7 @@ func (x *VolumeTierMoveDatFromRemoteResponse) String() string { func (*VolumeTierMoveDatFromRemoteResponse) ProtoMessage() {} func (x *VolumeTierMoveDatFromRemoteResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[73] + mi := &file_volume_server_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4128,7 +4302,7 @@ func (x *VolumeTierMoveDatFromRemoteResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use VolumeTierMoveDatFromRemoteResponse.ProtoReflect.Descriptor instead. func (*VolumeTierMoveDatFromRemoteResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{73} + return file_volume_server_proto_rawDescGZIP(), []int{75} } func (x *VolumeTierMoveDatFromRemoteResponse) GetProcessed() int64 { @@ -4154,7 +4328,7 @@ type VolumeServerStatusRequest struct { func (x *VolumeServerStatusRequest) Reset() { *x = VolumeServerStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[74] + mi := &file_volume_server_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4167,7 +4341,7 @@ func (x *VolumeServerStatusRequest) String() string { func (*VolumeServerStatusRequest) ProtoMessage() {} func (x *VolumeServerStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[74] + mi := &file_volume_server_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4180,7 +4354,7 @@ func (x *VolumeServerStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeServerStatusRequest.ProtoReflect.Descriptor instead. func (*VolumeServerStatusRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{74} + return file_volume_server_proto_rawDescGZIP(), []int{76} } type VolumeServerStatusResponse struct { @@ -4195,7 +4369,7 @@ type VolumeServerStatusResponse struct { func (x *VolumeServerStatusResponse) Reset() { *x = VolumeServerStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[75] + mi := &file_volume_server_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4208,7 +4382,7 @@ func (x *VolumeServerStatusResponse) String() string { func (*VolumeServerStatusResponse) ProtoMessage() {} func (x *VolumeServerStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[75] + mi := &file_volume_server_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4221,7 +4395,7 @@ func (x *VolumeServerStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeServerStatusResponse.ProtoReflect.Descriptor instead. func (*VolumeServerStatusResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{75} + return file_volume_server_proto_rawDescGZIP(), []int{77} } func (x *VolumeServerStatusResponse) GetDiskStatuses() []*DiskStatus { @@ -4247,7 +4421,7 @@ type VolumeServerLeaveRequest struct { func (x *VolumeServerLeaveRequest) Reset() { *x = VolumeServerLeaveRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[76] + mi := &file_volume_server_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4260,7 +4434,7 @@ func (x *VolumeServerLeaveRequest) String() string { func (*VolumeServerLeaveRequest) ProtoMessage() {} func (x *VolumeServerLeaveRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[76] + mi := &file_volume_server_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4273,7 +4447,7 @@ func (x *VolumeServerLeaveRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeServerLeaveRequest.ProtoReflect.Descriptor instead. func (*VolumeServerLeaveRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{76} + return file_volume_server_proto_rawDescGZIP(), []int{78} } type VolumeServerLeaveResponse struct { @@ -4285,7 +4459,7 @@ type VolumeServerLeaveResponse struct { func (x *VolumeServerLeaveResponse) Reset() { *x = VolumeServerLeaveResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[77] + mi := &file_volume_server_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4298,7 +4472,7 @@ func (x *VolumeServerLeaveResponse) String() string { func (*VolumeServerLeaveResponse) ProtoMessage() {} func (x *VolumeServerLeaveResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[77] + mi := &file_volume_server_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4311,7 +4485,7 @@ func (x *VolumeServerLeaveResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeServerLeaveResponse.ProtoReflect.Descriptor instead. func (*VolumeServerLeaveResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{77} + return file_volume_server_proto_rawDescGZIP(), []int{79} } // select on volume servers @@ -4330,7 +4504,7 @@ type QueryRequest struct { func (x *QueryRequest) Reset() { *x = QueryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[78] + mi := &file_volume_server_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4343,7 +4517,7 @@ func (x *QueryRequest) String() string { func (*QueryRequest) ProtoMessage() {} func (x *QueryRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[78] + mi := &file_volume_server_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4356,7 +4530,7 @@ func (x *QueryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRequest.ProtoReflect.Descriptor instead. func (*QueryRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{78} + return file_volume_server_proto_rawDescGZIP(), []int{80} } func (x *QueryRequest) GetSelections() []string { @@ -4405,7 +4579,7 @@ type QueriedStripe struct { func (x *QueriedStripe) Reset() { *x = QueriedStripe{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[79] + mi := &file_volume_server_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4418,7 +4592,7 @@ func (x *QueriedStripe) String() string { func (*QueriedStripe) ProtoMessage() {} func (x *QueriedStripe) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[79] + mi := &file_volume_server_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4431,7 +4605,7 @@ func (x *QueriedStripe) ProtoReflect() protoreflect.Message { // Deprecated: Use QueriedStripe.ProtoReflect.Descriptor instead. func (*QueriedStripe) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{79} + return file_volume_server_proto_rawDescGZIP(), []int{81} } func (x *QueriedStripe) GetRecords() []byte { @@ -4453,7 +4627,7 @@ type VolumeNeedleStatusRequest struct { func (x *VolumeNeedleStatusRequest) Reset() { *x = VolumeNeedleStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[80] + mi := &file_volume_server_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4466,7 +4640,7 @@ func (x *VolumeNeedleStatusRequest) String() string { func (*VolumeNeedleStatusRequest) ProtoMessage() {} func (x *VolumeNeedleStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[80] + mi := &file_volume_server_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4479,7 +4653,7 @@ func (x *VolumeNeedleStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeNeedleStatusRequest.ProtoReflect.Descriptor instead. func (*VolumeNeedleStatusRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{80} + return file_volume_server_proto_rawDescGZIP(), []int{82} } func (x *VolumeNeedleStatusRequest) GetVolumeId() uint32 { @@ -4512,7 +4686,7 @@ type VolumeNeedleStatusResponse struct { func (x *VolumeNeedleStatusResponse) Reset() { *x = VolumeNeedleStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[81] + mi := &file_volume_server_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4525,7 +4699,7 @@ func (x *VolumeNeedleStatusResponse) String() string { func (*VolumeNeedleStatusResponse) ProtoMessage() {} func (x *VolumeNeedleStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[81] + mi := &file_volume_server_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4538,7 +4712,7 @@ func (x *VolumeNeedleStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeNeedleStatusResponse.ProtoReflect.Descriptor instead. func (*VolumeNeedleStatusResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{81} + return file_volume_server_proto_rawDescGZIP(), []int{83} } func (x *VolumeNeedleStatusResponse) GetNeedleId() uint64 { @@ -4596,7 +4770,7 @@ type QueryRequest_Filter struct { func (x *QueryRequest_Filter) Reset() { *x = QueryRequest_Filter{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[82] + mi := &file_volume_server_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4609,7 +4783,7 @@ func (x *QueryRequest_Filter) String() string { func (*QueryRequest_Filter) ProtoMessage() {} func (x *QueryRequest_Filter) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[82] + mi := &file_volume_server_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4622,7 +4796,7 @@ func (x *QueryRequest_Filter) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRequest_Filter.ProtoReflect.Descriptor instead. func (*QueryRequest_Filter) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{78, 0} + return file_volume_server_proto_rawDescGZIP(), []int{80, 0} } func (x *QueryRequest_Filter) GetField() string { @@ -4661,7 +4835,7 @@ type QueryRequest_InputSerialization struct { func (x *QueryRequest_InputSerialization) Reset() { *x = QueryRequest_InputSerialization{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[83] + mi := &file_volume_server_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4674,7 +4848,7 @@ func (x *QueryRequest_InputSerialization) String() string { func (*QueryRequest_InputSerialization) ProtoMessage() {} func (x *QueryRequest_InputSerialization) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[83] + mi := &file_volume_server_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4687,7 +4861,7 @@ func (x *QueryRequest_InputSerialization) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRequest_InputSerialization.ProtoReflect.Descriptor instead. func (*QueryRequest_InputSerialization) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{78, 1} + return file_volume_server_proto_rawDescGZIP(), []int{80, 1} } func (x *QueryRequest_InputSerialization) GetCompressionType() string { @@ -4730,7 +4904,7 @@ type QueryRequest_OutputSerialization struct { func (x *QueryRequest_OutputSerialization) Reset() { *x = QueryRequest_OutputSerialization{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[84] + mi := &file_volume_server_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4743,7 +4917,7 @@ func (x *QueryRequest_OutputSerialization) String() string { func (*QueryRequest_OutputSerialization) ProtoMessage() {} func (x *QueryRequest_OutputSerialization) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[84] + mi := &file_volume_server_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4756,7 +4930,7 @@ func (x *QueryRequest_OutputSerialization) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRequest_OutputSerialization.ProtoReflect.Descriptor instead. func (*QueryRequest_OutputSerialization) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{78, 2} + return file_volume_server_proto_rawDescGZIP(), []int{80, 2} } func (x *QueryRequest_OutputSerialization) GetCsvOutput() *QueryRequest_OutputSerialization_CSVOutput { @@ -4791,7 +4965,7 @@ type QueryRequest_InputSerialization_CSVInput struct { func (x *QueryRequest_InputSerialization_CSVInput) Reset() { *x = QueryRequest_InputSerialization_CSVInput{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[85] + mi := &file_volume_server_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4804,7 +4978,7 @@ func (x *QueryRequest_InputSerialization_CSVInput) String() string { func (*QueryRequest_InputSerialization_CSVInput) ProtoMessage() {} func (x *QueryRequest_InputSerialization_CSVInput) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[85] + mi := &file_volume_server_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4817,7 +4991,7 @@ func (x *QueryRequest_InputSerialization_CSVInput) ProtoReflect() protoreflect.M // Deprecated: Use QueryRequest_InputSerialization_CSVInput.ProtoReflect.Descriptor instead. func (*QueryRequest_InputSerialization_CSVInput) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{78, 1, 0} + return file_volume_server_proto_rawDescGZIP(), []int{80, 1, 0} } func (x *QueryRequest_InputSerialization_CSVInput) GetFileHeaderInfo() string { @@ -4880,7 +5054,7 @@ type QueryRequest_InputSerialization_JSONInput struct { func (x *QueryRequest_InputSerialization_JSONInput) Reset() { *x = QueryRequest_InputSerialization_JSONInput{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[86] + mi := &file_volume_server_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4893,7 +5067,7 @@ func (x *QueryRequest_InputSerialization_JSONInput) String() string { func (*QueryRequest_InputSerialization_JSONInput) ProtoMessage() {} func (x *QueryRequest_InputSerialization_JSONInput) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[86] + mi := &file_volume_server_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4906,7 +5080,7 @@ func (x *QueryRequest_InputSerialization_JSONInput) ProtoReflect() protoreflect. // Deprecated: Use QueryRequest_InputSerialization_JSONInput.ProtoReflect.Descriptor instead. func (*QueryRequest_InputSerialization_JSONInput) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{78, 1, 1} + return file_volume_server_proto_rawDescGZIP(), []int{80, 1, 1} } func (x *QueryRequest_InputSerialization_JSONInput) GetType() string { @@ -4925,7 +5099,7 @@ type QueryRequest_InputSerialization_ParquetInput struct { func (x *QueryRequest_InputSerialization_ParquetInput) Reset() { *x = QueryRequest_InputSerialization_ParquetInput{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[87] + mi := &file_volume_server_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4938,7 +5112,7 @@ func (x *QueryRequest_InputSerialization_ParquetInput) String() string { func (*QueryRequest_InputSerialization_ParquetInput) ProtoMessage() {} func (x *QueryRequest_InputSerialization_ParquetInput) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[87] + mi := &file_volume_server_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4951,7 +5125,7 @@ func (x *QueryRequest_InputSerialization_ParquetInput) ProtoReflect() protorefle // Deprecated: Use QueryRequest_InputSerialization_ParquetInput.ProtoReflect.Descriptor instead. func (*QueryRequest_InputSerialization_ParquetInput) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{78, 1, 2} + return file_volume_server_proto_rawDescGZIP(), []int{80, 1, 2} } type QueryRequest_OutputSerialization_CSVOutput struct { @@ -4969,7 +5143,7 @@ type QueryRequest_OutputSerialization_CSVOutput struct { func (x *QueryRequest_OutputSerialization_CSVOutput) Reset() { *x = QueryRequest_OutputSerialization_CSVOutput{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[88] + mi := &file_volume_server_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4982,7 +5156,7 @@ func (x *QueryRequest_OutputSerialization_CSVOutput) String() string { func (*QueryRequest_OutputSerialization_CSVOutput) ProtoMessage() {} func (x *QueryRequest_OutputSerialization_CSVOutput) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[88] + mi := &file_volume_server_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4995,7 +5169,7 @@ func (x *QueryRequest_OutputSerialization_CSVOutput) ProtoReflect() protoreflect // Deprecated: Use QueryRequest_OutputSerialization_CSVOutput.ProtoReflect.Descriptor instead. func (*QueryRequest_OutputSerialization_CSVOutput) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{78, 2, 0} + return file_volume_server_proto_rawDescGZIP(), []int{80, 2, 0} } func (x *QueryRequest_OutputSerialization_CSVOutput) GetQuoteFields() string { @@ -5044,7 +5218,7 @@ type QueryRequest_OutputSerialization_JSONOutput struct { func (x *QueryRequest_OutputSerialization_JSONOutput) Reset() { *x = QueryRequest_OutputSerialization_JSONOutput{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[89] + mi := &file_volume_server_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5057,7 +5231,7 @@ func (x *QueryRequest_OutputSerialization_JSONOutput) String() string { func (*QueryRequest_OutputSerialization_JSONOutput) ProtoMessage() {} func (x *QueryRequest_OutputSerialization_JSONOutput) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[89] + mi := &file_volume_server_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5070,7 +5244,7 @@ func (x *QueryRequest_OutputSerialization_JSONOutput) ProtoReflect() protoreflec // Deprecated: Use QueryRequest_OutputSerialization_JSONOutput.ProtoReflect.Descriptor instead. func (*QueryRequest_OutputSerialization_JSONOutput) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{78, 2, 1} + return file_volume_server_proto_rawDescGZIP(), []int{80, 2, 1} } func (x *QueryRequest_OutputSerialization_JSONOutput) GetRecordDelimiter() string { @@ -5286,6 +5460,33 @@ var file_volume_server_proto_rawDesc = []byte{ 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x22, 0x19, 0x0a, 0x17, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8e, 0x03, 0x0a, 0x1a, 0x46, 0x65, 0x74, + 0x63, 0x68, 0x41, 0x6e, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x49, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, + 0x0a, 0x0b, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x22, 0x0a, 0x0d, 0x73, 0x33, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x33, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x33, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x33, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x33, 0x52, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x33, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x33, 0x45, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x22, 0x1d, 0x0a, 0x1b, 0x46, 0x65, 0x74, + 0x63, 0x68, 0x41, 0x6e, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x83, 0x01, 0x0a, 0x17, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, @@ -5662,7 +5863,7 @@ var file_volume_server_proto_rawDesc = []byte{ 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x72, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x63, 0x72, 0x63, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, - 0x74, 0x6c, 0x32, 0xa9, 0x21, 0x0a, 0x0c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, + 0x74, 0x6c, 0x32, 0x9f, 0x22, 0x0a, 0x0c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x5c, 0x0a, 0x0b, 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x65, 0x6c, 0x65, 0x74, @@ -5803,137 +6004,144 @@ var file_volume_server_proto_rawDesc = []byte{ 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x6d, 0x0a, 0x10, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x6e, - 0x64, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, - 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, - 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x6e, 0x64, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x71, - 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x63, 0x65, - 0x69, 0x76, 0x65, 0x72, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, + 0x74, 0x0a, 0x13, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x12, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, + 0x6e, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x10, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, + 0x61, 0x69, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, - 0x69, 0x6c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x7d, 0x0a, 0x16, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x2e, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x7a, 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x73, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x2e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x62, 0x75, 0x69, - 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x62, 0x75, 0x69, - 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x12, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, - 0x70, 0x79, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, 0x70, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x43, 0x6f, 0x70, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x77, 0x0a, 0x14, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x4d, - 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, - 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, - 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x11, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x61, 0x64, 0x12, - 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x61, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x71, 0x0a, 0x12, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x42, 0x6c, 0x6f, 0x62, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x42, 0x6c, - 0x6f, 0x62, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x42, 0x6c, 0x6f, 0x62, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x7d, 0x0a, 0x16, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x54, 0x6f, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x54, 0x6f, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x76, 0x6f, 0x6c, + 0x69, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, + 0x69, 0x6c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x54, 0x6f, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x88, - 0x01, 0x0a, 0x19, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, - 0x65, 0x44, 0x61, 0x74, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x32, 0x2e, 0x76, + 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x16, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x12, 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, + 0x2e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, 0x70, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, + 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, 0x70, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x14, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, + 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2d, 0x2e, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, - 0x74, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x33, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, - 0x76, 0x65, 0x44, 0x61, 0x74, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x8e, 0x01, 0x0a, 0x1b, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x46, - 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x34, 0x2e, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x46, 0x72, - 0x6f, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x35, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, + 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, + 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, + 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x73, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x2e, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x55, + 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x55, + 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x70, 0x0a, 0x11, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x61, 0x64, 0x12, 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, + 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x42, 0x6c, + 0x6f, 0x62, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x45, 0x63, 0x42, 0x6c, 0x6f, 0x62, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, + 0x63, 0x42, 0x6c, 0x6f, 0x62, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x16, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, + 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x54, 0x6f, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, + 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x54, 0x6f, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x30, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x73, 0x54, 0x6f, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x88, 0x01, 0x0a, 0x19, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, + 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x12, 0x32, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, + 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x54, 0x6f, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x8e, 0x01, 0x0a, 0x1b, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, + 0x76, 0x65, 0x44, 0x61, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, + 0x34, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, - 0x11, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, 0x65, 0x61, - 0x76, 0x65, 0x12, 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, - 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, 0x65, - 0x61, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, - 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, - 0x64, 0x53, 0x74, 0x72, 0x69, 0x70, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x71, 0x0a, 0x12, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, - 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x39, - 0x5a, 0x37, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, - 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, - 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, + 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x11, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x70, 0x65, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x65, + 0x65, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x42, 0x39, 0x5a, 0x37, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, + 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5948,7 +6156,7 @@ func file_volume_server_proto_rawDescGZIP() []byte { return file_volume_server_proto_rawDescData } -var file_volume_server_proto_msgTypes = make([]protoimpl.MessageInfo, 90) +var file_volume_server_proto_msgTypes = make([]protoimpl.MessageInfo, 92) var file_volume_server_proto_goTypes = []interface{}{ (*BatchDeleteRequest)(nil), // 0: volume_server_pb.BatchDeleteRequest (*BatchDeleteResponse)(nil), // 1: volume_server_pb.BatchDeleteResponse @@ -5992,68 +6200,70 @@ var file_volume_server_proto_goTypes = []interface{}{ (*ReadNeedleBlobResponse)(nil), // 39: volume_server_pb.ReadNeedleBlobResponse (*WriteNeedleBlobRequest)(nil), // 40: volume_server_pb.WriteNeedleBlobRequest (*WriteNeedleBlobResponse)(nil), // 41: volume_server_pb.WriteNeedleBlobResponse - (*VolumeTailSenderRequest)(nil), // 42: volume_server_pb.VolumeTailSenderRequest - (*VolumeTailSenderResponse)(nil), // 43: volume_server_pb.VolumeTailSenderResponse - (*VolumeTailReceiverRequest)(nil), // 44: volume_server_pb.VolumeTailReceiverRequest - (*VolumeTailReceiverResponse)(nil), // 45: volume_server_pb.VolumeTailReceiverResponse - (*VolumeEcShardsGenerateRequest)(nil), // 46: volume_server_pb.VolumeEcShardsGenerateRequest - (*VolumeEcShardsGenerateResponse)(nil), // 47: volume_server_pb.VolumeEcShardsGenerateResponse - (*VolumeEcShardsRebuildRequest)(nil), // 48: volume_server_pb.VolumeEcShardsRebuildRequest - (*VolumeEcShardsRebuildResponse)(nil), // 49: volume_server_pb.VolumeEcShardsRebuildResponse - (*VolumeEcShardsCopyRequest)(nil), // 50: volume_server_pb.VolumeEcShardsCopyRequest - (*VolumeEcShardsCopyResponse)(nil), // 51: volume_server_pb.VolumeEcShardsCopyResponse - (*VolumeEcShardsDeleteRequest)(nil), // 52: volume_server_pb.VolumeEcShardsDeleteRequest - (*VolumeEcShardsDeleteResponse)(nil), // 53: volume_server_pb.VolumeEcShardsDeleteResponse - (*VolumeEcShardsMountRequest)(nil), // 54: volume_server_pb.VolumeEcShardsMountRequest - (*VolumeEcShardsMountResponse)(nil), // 55: volume_server_pb.VolumeEcShardsMountResponse - (*VolumeEcShardsUnmountRequest)(nil), // 56: volume_server_pb.VolumeEcShardsUnmountRequest - (*VolumeEcShardsUnmountResponse)(nil), // 57: volume_server_pb.VolumeEcShardsUnmountResponse - (*VolumeEcShardReadRequest)(nil), // 58: volume_server_pb.VolumeEcShardReadRequest - (*VolumeEcShardReadResponse)(nil), // 59: volume_server_pb.VolumeEcShardReadResponse - (*VolumeEcBlobDeleteRequest)(nil), // 60: volume_server_pb.VolumeEcBlobDeleteRequest - (*VolumeEcBlobDeleteResponse)(nil), // 61: volume_server_pb.VolumeEcBlobDeleteResponse - (*VolumeEcShardsToVolumeRequest)(nil), // 62: volume_server_pb.VolumeEcShardsToVolumeRequest - (*VolumeEcShardsToVolumeResponse)(nil), // 63: volume_server_pb.VolumeEcShardsToVolumeResponse - (*ReadVolumeFileStatusRequest)(nil), // 64: volume_server_pb.ReadVolumeFileStatusRequest - (*ReadVolumeFileStatusResponse)(nil), // 65: volume_server_pb.ReadVolumeFileStatusResponse - (*DiskStatus)(nil), // 66: volume_server_pb.DiskStatus - (*MemStatus)(nil), // 67: volume_server_pb.MemStatus - (*RemoteFile)(nil), // 68: volume_server_pb.RemoteFile - (*VolumeInfo)(nil), // 69: volume_server_pb.VolumeInfo - (*VolumeTierMoveDatToRemoteRequest)(nil), // 70: volume_server_pb.VolumeTierMoveDatToRemoteRequest - (*VolumeTierMoveDatToRemoteResponse)(nil), // 71: volume_server_pb.VolumeTierMoveDatToRemoteResponse - (*VolumeTierMoveDatFromRemoteRequest)(nil), // 72: volume_server_pb.VolumeTierMoveDatFromRemoteRequest - (*VolumeTierMoveDatFromRemoteResponse)(nil), // 73: volume_server_pb.VolumeTierMoveDatFromRemoteResponse - (*VolumeServerStatusRequest)(nil), // 74: volume_server_pb.VolumeServerStatusRequest - (*VolumeServerStatusResponse)(nil), // 75: volume_server_pb.VolumeServerStatusResponse - (*VolumeServerLeaveRequest)(nil), // 76: volume_server_pb.VolumeServerLeaveRequest - (*VolumeServerLeaveResponse)(nil), // 77: volume_server_pb.VolumeServerLeaveResponse - (*QueryRequest)(nil), // 78: volume_server_pb.QueryRequest - (*QueriedStripe)(nil), // 79: volume_server_pb.QueriedStripe - (*VolumeNeedleStatusRequest)(nil), // 80: volume_server_pb.VolumeNeedleStatusRequest - (*VolumeNeedleStatusResponse)(nil), // 81: volume_server_pb.VolumeNeedleStatusResponse - (*QueryRequest_Filter)(nil), // 82: volume_server_pb.QueryRequest.Filter - (*QueryRequest_InputSerialization)(nil), // 83: volume_server_pb.QueryRequest.InputSerialization - (*QueryRequest_OutputSerialization)(nil), // 84: volume_server_pb.QueryRequest.OutputSerialization - (*QueryRequest_InputSerialization_CSVInput)(nil), // 85: volume_server_pb.QueryRequest.InputSerialization.CSVInput - (*QueryRequest_InputSerialization_JSONInput)(nil), // 86: volume_server_pb.QueryRequest.InputSerialization.JSONInput - (*QueryRequest_InputSerialization_ParquetInput)(nil), // 87: volume_server_pb.QueryRequest.InputSerialization.ParquetInput - (*QueryRequest_OutputSerialization_CSVOutput)(nil), // 88: volume_server_pb.QueryRequest.OutputSerialization.CSVOutput - (*QueryRequest_OutputSerialization_JSONOutput)(nil), // 89: volume_server_pb.QueryRequest.OutputSerialization.JSONOutput + (*FetchAndWriteNeedleRequest)(nil), // 42: volume_server_pb.FetchAndWriteNeedleRequest + (*FetchAndWriteNeedleResponse)(nil), // 43: volume_server_pb.FetchAndWriteNeedleResponse + (*VolumeTailSenderRequest)(nil), // 44: volume_server_pb.VolumeTailSenderRequest + (*VolumeTailSenderResponse)(nil), // 45: volume_server_pb.VolumeTailSenderResponse + (*VolumeTailReceiverRequest)(nil), // 46: volume_server_pb.VolumeTailReceiverRequest + (*VolumeTailReceiverResponse)(nil), // 47: volume_server_pb.VolumeTailReceiverResponse + (*VolumeEcShardsGenerateRequest)(nil), // 48: volume_server_pb.VolumeEcShardsGenerateRequest + (*VolumeEcShardsGenerateResponse)(nil), // 49: volume_server_pb.VolumeEcShardsGenerateResponse + (*VolumeEcShardsRebuildRequest)(nil), // 50: volume_server_pb.VolumeEcShardsRebuildRequest + (*VolumeEcShardsRebuildResponse)(nil), // 51: volume_server_pb.VolumeEcShardsRebuildResponse + (*VolumeEcShardsCopyRequest)(nil), // 52: volume_server_pb.VolumeEcShardsCopyRequest + (*VolumeEcShardsCopyResponse)(nil), // 53: volume_server_pb.VolumeEcShardsCopyResponse + (*VolumeEcShardsDeleteRequest)(nil), // 54: volume_server_pb.VolumeEcShardsDeleteRequest + (*VolumeEcShardsDeleteResponse)(nil), // 55: volume_server_pb.VolumeEcShardsDeleteResponse + (*VolumeEcShardsMountRequest)(nil), // 56: volume_server_pb.VolumeEcShardsMountRequest + (*VolumeEcShardsMountResponse)(nil), // 57: volume_server_pb.VolumeEcShardsMountResponse + (*VolumeEcShardsUnmountRequest)(nil), // 58: volume_server_pb.VolumeEcShardsUnmountRequest + (*VolumeEcShardsUnmountResponse)(nil), // 59: volume_server_pb.VolumeEcShardsUnmountResponse + (*VolumeEcShardReadRequest)(nil), // 60: volume_server_pb.VolumeEcShardReadRequest + (*VolumeEcShardReadResponse)(nil), // 61: volume_server_pb.VolumeEcShardReadResponse + (*VolumeEcBlobDeleteRequest)(nil), // 62: volume_server_pb.VolumeEcBlobDeleteRequest + (*VolumeEcBlobDeleteResponse)(nil), // 63: volume_server_pb.VolumeEcBlobDeleteResponse + (*VolumeEcShardsToVolumeRequest)(nil), // 64: volume_server_pb.VolumeEcShardsToVolumeRequest + (*VolumeEcShardsToVolumeResponse)(nil), // 65: volume_server_pb.VolumeEcShardsToVolumeResponse + (*ReadVolumeFileStatusRequest)(nil), // 66: volume_server_pb.ReadVolumeFileStatusRequest + (*ReadVolumeFileStatusResponse)(nil), // 67: volume_server_pb.ReadVolumeFileStatusResponse + (*DiskStatus)(nil), // 68: volume_server_pb.DiskStatus + (*MemStatus)(nil), // 69: volume_server_pb.MemStatus + (*RemoteFile)(nil), // 70: volume_server_pb.RemoteFile + (*VolumeInfo)(nil), // 71: volume_server_pb.VolumeInfo + (*VolumeTierMoveDatToRemoteRequest)(nil), // 72: volume_server_pb.VolumeTierMoveDatToRemoteRequest + (*VolumeTierMoveDatToRemoteResponse)(nil), // 73: volume_server_pb.VolumeTierMoveDatToRemoteResponse + (*VolumeTierMoveDatFromRemoteRequest)(nil), // 74: volume_server_pb.VolumeTierMoveDatFromRemoteRequest + (*VolumeTierMoveDatFromRemoteResponse)(nil), // 75: volume_server_pb.VolumeTierMoveDatFromRemoteResponse + (*VolumeServerStatusRequest)(nil), // 76: volume_server_pb.VolumeServerStatusRequest + (*VolumeServerStatusResponse)(nil), // 77: volume_server_pb.VolumeServerStatusResponse + (*VolumeServerLeaveRequest)(nil), // 78: volume_server_pb.VolumeServerLeaveRequest + (*VolumeServerLeaveResponse)(nil), // 79: volume_server_pb.VolumeServerLeaveResponse + (*QueryRequest)(nil), // 80: volume_server_pb.QueryRequest + (*QueriedStripe)(nil), // 81: volume_server_pb.QueriedStripe + (*VolumeNeedleStatusRequest)(nil), // 82: volume_server_pb.VolumeNeedleStatusRequest + (*VolumeNeedleStatusResponse)(nil), // 83: volume_server_pb.VolumeNeedleStatusResponse + (*QueryRequest_Filter)(nil), // 84: volume_server_pb.QueryRequest.Filter + (*QueryRequest_InputSerialization)(nil), // 85: volume_server_pb.QueryRequest.InputSerialization + (*QueryRequest_OutputSerialization)(nil), // 86: volume_server_pb.QueryRequest.OutputSerialization + (*QueryRequest_InputSerialization_CSVInput)(nil), // 87: volume_server_pb.QueryRequest.InputSerialization.CSVInput + (*QueryRequest_InputSerialization_JSONInput)(nil), // 88: volume_server_pb.QueryRequest.InputSerialization.JSONInput + (*QueryRequest_InputSerialization_ParquetInput)(nil), // 89: volume_server_pb.QueryRequest.InputSerialization.ParquetInput + (*QueryRequest_OutputSerialization_CSVOutput)(nil), // 90: volume_server_pb.QueryRequest.OutputSerialization.CSVOutput + (*QueryRequest_OutputSerialization_JSONOutput)(nil), // 91: volume_server_pb.QueryRequest.OutputSerialization.JSONOutput } var file_volume_server_proto_depIdxs = []int32{ 2, // 0: volume_server_pb.BatchDeleteResponse.results:type_name -> volume_server_pb.DeleteResult - 68, // 1: volume_server_pb.VolumeInfo.files:type_name -> volume_server_pb.RemoteFile - 66, // 2: volume_server_pb.VolumeServerStatusResponse.disk_statuses:type_name -> volume_server_pb.DiskStatus - 67, // 3: volume_server_pb.VolumeServerStatusResponse.memory_status:type_name -> volume_server_pb.MemStatus - 82, // 4: volume_server_pb.QueryRequest.filter:type_name -> volume_server_pb.QueryRequest.Filter - 83, // 5: volume_server_pb.QueryRequest.input_serialization:type_name -> volume_server_pb.QueryRequest.InputSerialization - 84, // 6: volume_server_pb.QueryRequest.output_serialization:type_name -> volume_server_pb.QueryRequest.OutputSerialization - 85, // 7: volume_server_pb.QueryRequest.InputSerialization.csv_input:type_name -> volume_server_pb.QueryRequest.InputSerialization.CSVInput - 86, // 8: volume_server_pb.QueryRequest.InputSerialization.json_input:type_name -> volume_server_pb.QueryRequest.InputSerialization.JSONInput - 87, // 9: volume_server_pb.QueryRequest.InputSerialization.parquet_input:type_name -> volume_server_pb.QueryRequest.InputSerialization.ParquetInput - 88, // 10: volume_server_pb.QueryRequest.OutputSerialization.csv_output:type_name -> volume_server_pb.QueryRequest.OutputSerialization.CSVOutput - 89, // 11: volume_server_pb.QueryRequest.OutputSerialization.json_output:type_name -> volume_server_pb.QueryRequest.OutputSerialization.JSONOutput + 70, // 1: volume_server_pb.VolumeInfo.files:type_name -> volume_server_pb.RemoteFile + 68, // 2: volume_server_pb.VolumeServerStatusResponse.disk_statuses:type_name -> volume_server_pb.DiskStatus + 69, // 3: volume_server_pb.VolumeServerStatusResponse.memory_status:type_name -> volume_server_pb.MemStatus + 84, // 4: volume_server_pb.QueryRequest.filter:type_name -> volume_server_pb.QueryRequest.Filter + 85, // 5: volume_server_pb.QueryRequest.input_serialization:type_name -> volume_server_pb.QueryRequest.InputSerialization + 86, // 6: volume_server_pb.QueryRequest.output_serialization:type_name -> volume_server_pb.QueryRequest.OutputSerialization + 87, // 7: volume_server_pb.QueryRequest.InputSerialization.csv_input:type_name -> volume_server_pb.QueryRequest.InputSerialization.CSVInput + 88, // 8: volume_server_pb.QueryRequest.InputSerialization.json_input:type_name -> volume_server_pb.QueryRequest.InputSerialization.JSONInput + 89, // 9: volume_server_pb.QueryRequest.InputSerialization.parquet_input:type_name -> volume_server_pb.QueryRequest.InputSerialization.ParquetInput + 90, // 10: volume_server_pb.QueryRequest.OutputSerialization.csv_output:type_name -> volume_server_pb.QueryRequest.OutputSerialization.CSVOutput + 91, // 11: volume_server_pb.QueryRequest.OutputSerialization.json_output:type_name -> volume_server_pb.QueryRequest.OutputSerialization.JSONOutput 0, // 12: volume_server_pb.VolumeServer.BatchDelete:input_type -> volume_server_pb.BatchDeleteRequest 4, // 13: volume_server_pb.VolumeServer.VacuumVolumeCheck:input_type -> volume_server_pb.VacuumVolumeCheckRequest 6, // 14: volume_server_pb.VolumeServer.VacuumVolumeCompact:input_type -> volume_server_pb.VacuumVolumeCompactRequest @@ -6071,67 +6281,69 @@ var file_volume_server_proto_depIdxs = []int32{ 30, // 26: volume_server_pb.VolumeServer.VolumeConfigure:input_type -> volume_server_pb.VolumeConfigureRequest 32, // 27: volume_server_pb.VolumeServer.VolumeStatus:input_type -> volume_server_pb.VolumeStatusRequest 34, // 28: volume_server_pb.VolumeServer.VolumeCopy:input_type -> volume_server_pb.VolumeCopyRequest - 64, // 29: volume_server_pb.VolumeServer.ReadVolumeFileStatus:input_type -> volume_server_pb.ReadVolumeFileStatusRequest + 66, // 29: volume_server_pb.VolumeServer.ReadVolumeFileStatus:input_type -> volume_server_pb.ReadVolumeFileStatusRequest 36, // 30: volume_server_pb.VolumeServer.CopyFile:input_type -> volume_server_pb.CopyFileRequest 38, // 31: volume_server_pb.VolumeServer.ReadNeedleBlob:input_type -> volume_server_pb.ReadNeedleBlobRequest 40, // 32: volume_server_pb.VolumeServer.WriteNeedleBlob:input_type -> volume_server_pb.WriteNeedleBlobRequest - 42, // 33: volume_server_pb.VolumeServer.VolumeTailSender:input_type -> volume_server_pb.VolumeTailSenderRequest - 44, // 34: volume_server_pb.VolumeServer.VolumeTailReceiver:input_type -> volume_server_pb.VolumeTailReceiverRequest - 46, // 35: volume_server_pb.VolumeServer.VolumeEcShardsGenerate:input_type -> volume_server_pb.VolumeEcShardsGenerateRequest - 48, // 36: volume_server_pb.VolumeServer.VolumeEcShardsRebuild:input_type -> volume_server_pb.VolumeEcShardsRebuildRequest - 50, // 37: volume_server_pb.VolumeServer.VolumeEcShardsCopy:input_type -> volume_server_pb.VolumeEcShardsCopyRequest - 52, // 38: volume_server_pb.VolumeServer.VolumeEcShardsDelete:input_type -> volume_server_pb.VolumeEcShardsDeleteRequest - 54, // 39: volume_server_pb.VolumeServer.VolumeEcShardsMount:input_type -> volume_server_pb.VolumeEcShardsMountRequest - 56, // 40: volume_server_pb.VolumeServer.VolumeEcShardsUnmount:input_type -> volume_server_pb.VolumeEcShardsUnmountRequest - 58, // 41: volume_server_pb.VolumeServer.VolumeEcShardRead:input_type -> volume_server_pb.VolumeEcShardReadRequest - 60, // 42: volume_server_pb.VolumeServer.VolumeEcBlobDelete:input_type -> volume_server_pb.VolumeEcBlobDeleteRequest - 62, // 43: volume_server_pb.VolumeServer.VolumeEcShardsToVolume:input_type -> volume_server_pb.VolumeEcShardsToVolumeRequest - 70, // 44: volume_server_pb.VolumeServer.VolumeTierMoveDatToRemote:input_type -> volume_server_pb.VolumeTierMoveDatToRemoteRequest - 72, // 45: volume_server_pb.VolumeServer.VolumeTierMoveDatFromRemote:input_type -> volume_server_pb.VolumeTierMoveDatFromRemoteRequest - 74, // 46: volume_server_pb.VolumeServer.VolumeServerStatus:input_type -> volume_server_pb.VolumeServerStatusRequest - 76, // 47: volume_server_pb.VolumeServer.VolumeServerLeave:input_type -> volume_server_pb.VolumeServerLeaveRequest - 78, // 48: volume_server_pb.VolumeServer.Query:input_type -> volume_server_pb.QueryRequest - 80, // 49: volume_server_pb.VolumeServer.VolumeNeedleStatus:input_type -> volume_server_pb.VolumeNeedleStatusRequest - 1, // 50: volume_server_pb.VolumeServer.BatchDelete:output_type -> volume_server_pb.BatchDeleteResponse - 5, // 51: volume_server_pb.VolumeServer.VacuumVolumeCheck:output_type -> volume_server_pb.VacuumVolumeCheckResponse - 7, // 52: volume_server_pb.VolumeServer.VacuumVolumeCompact:output_type -> volume_server_pb.VacuumVolumeCompactResponse - 9, // 53: volume_server_pb.VolumeServer.VacuumVolumeCommit:output_type -> volume_server_pb.VacuumVolumeCommitResponse - 11, // 54: volume_server_pb.VolumeServer.VacuumVolumeCleanup:output_type -> volume_server_pb.VacuumVolumeCleanupResponse - 13, // 55: volume_server_pb.VolumeServer.DeleteCollection:output_type -> volume_server_pb.DeleteCollectionResponse - 15, // 56: volume_server_pb.VolumeServer.AllocateVolume:output_type -> volume_server_pb.AllocateVolumeResponse - 17, // 57: volume_server_pb.VolumeServer.VolumeSyncStatus:output_type -> volume_server_pb.VolumeSyncStatusResponse - 19, // 58: volume_server_pb.VolumeServer.VolumeIncrementalCopy:output_type -> volume_server_pb.VolumeIncrementalCopyResponse - 21, // 59: volume_server_pb.VolumeServer.VolumeMount:output_type -> volume_server_pb.VolumeMountResponse - 23, // 60: volume_server_pb.VolumeServer.VolumeUnmount:output_type -> volume_server_pb.VolumeUnmountResponse - 25, // 61: volume_server_pb.VolumeServer.VolumeDelete:output_type -> volume_server_pb.VolumeDeleteResponse - 27, // 62: volume_server_pb.VolumeServer.VolumeMarkReadonly:output_type -> volume_server_pb.VolumeMarkReadonlyResponse - 29, // 63: volume_server_pb.VolumeServer.VolumeMarkWritable:output_type -> volume_server_pb.VolumeMarkWritableResponse - 31, // 64: volume_server_pb.VolumeServer.VolumeConfigure:output_type -> volume_server_pb.VolumeConfigureResponse - 33, // 65: volume_server_pb.VolumeServer.VolumeStatus:output_type -> volume_server_pb.VolumeStatusResponse - 35, // 66: volume_server_pb.VolumeServer.VolumeCopy:output_type -> volume_server_pb.VolumeCopyResponse - 65, // 67: volume_server_pb.VolumeServer.ReadVolumeFileStatus:output_type -> volume_server_pb.ReadVolumeFileStatusResponse - 37, // 68: volume_server_pb.VolumeServer.CopyFile:output_type -> volume_server_pb.CopyFileResponse - 39, // 69: volume_server_pb.VolumeServer.ReadNeedleBlob:output_type -> volume_server_pb.ReadNeedleBlobResponse - 41, // 70: volume_server_pb.VolumeServer.WriteNeedleBlob:output_type -> volume_server_pb.WriteNeedleBlobResponse - 43, // 71: volume_server_pb.VolumeServer.VolumeTailSender:output_type -> volume_server_pb.VolumeTailSenderResponse - 45, // 72: volume_server_pb.VolumeServer.VolumeTailReceiver:output_type -> volume_server_pb.VolumeTailReceiverResponse - 47, // 73: volume_server_pb.VolumeServer.VolumeEcShardsGenerate:output_type -> volume_server_pb.VolumeEcShardsGenerateResponse - 49, // 74: volume_server_pb.VolumeServer.VolumeEcShardsRebuild:output_type -> volume_server_pb.VolumeEcShardsRebuildResponse - 51, // 75: volume_server_pb.VolumeServer.VolumeEcShardsCopy:output_type -> volume_server_pb.VolumeEcShardsCopyResponse - 53, // 76: volume_server_pb.VolumeServer.VolumeEcShardsDelete:output_type -> volume_server_pb.VolumeEcShardsDeleteResponse - 55, // 77: volume_server_pb.VolumeServer.VolumeEcShardsMount:output_type -> volume_server_pb.VolumeEcShardsMountResponse - 57, // 78: volume_server_pb.VolumeServer.VolumeEcShardsUnmount:output_type -> volume_server_pb.VolumeEcShardsUnmountResponse - 59, // 79: volume_server_pb.VolumeServer.VolumeEcShardRead:output_type -> volume_server_pb.VolumeEcShardReadResponse - 61, // 80: volume_server_pb.VolumeServer.VolumeEcBlobDelete:output_type -> volume_server_pb.VolumeEcBlobDeleteResponse - 63, // 81: volume_server_pb.VolumeServer.VolumeEcShardsToVolume:output_type -> volume_server_pb.VolumeEcShardsToVolumeResponse - 71, // 82: volume_server_pb.VolumeServer.VolumeTierMoveDatToRemote:output_type -> volume_server_pb.VolumeTierMoveDatToRemoteResponse - 73, // 83: volume_server_pb.VolumeServer.VolumeTierMoveDatFromRemote:output_type -> volume_server_pb.VolumeTierMoveDatFromRemoteResponse - 75, // 84: volume_server_pb.VolumeServer.VolumeServerStatus:output_type -> volume_server_pb.VolumeServerStatusResponse - 77, // 85: volume_server_pb.VolumeServer.VolumeServerLeave:output_type -> volume_server_pb.VolumeServerLeaveResponse - 79, // 86: volume_server_pb.VolumeServer.Query:output_type -> volume_server_pb.QueriedStripe - 81, // 87: volume_server_pb.VolumeServer.VolumeNeedleStatus:output_type -> volume_server_pb.VolumeNeedleStatusResponse - 50, // [50:88] is the sub-list for method output_type - 12, // [12:50] is the sub-list for method input_type + 42, // 33: volume_server_pb.VolumeServer.FetchAndWriteNeedle:input_type -> volume_server_pb.FetchAndWriteNeedleRequest + 44, // 34: volume_server_pb.VolumeServer.VolumeTailSender:input_type -> volume_server_pb.VolumeTailSenderRequest + 46, // 35: volume_server_pb.VolumeServer.VolumeTailReceiver:input_type -> volume_server_pb.VolumeTailReceiverRequest + 48, // 36: volume_server_pb.VolumeServer.VolumeEcShardsGenerate:input_type -> volume_server_pb.VolumeEcShardsGenerateRequest + 50, // 37: volume_server_pb.VolumeServer.VolumeEcShardsRebuild:input_type -> volume_server_pb.VolumeEcShardsRebuildRequest + 52, // 38: volume_server_pb.VolumeServer.VolumeEcShardsCopy:input_type -> volume_server_pb.VolumeEcShardsCopyRequest + 54, // 39: volume_server_pb.VolumeServer.VolumeEcShardsDelete:input_type -> volume_server_pb.VolumeEcShardsDeleteRequest + 56, // 40: volume_server_pb.VolumeServer.VolumeEcShardsMount:input_type -> volume_server_pb.VolumeEcShardsMountRequest + 58, // 41: volume_server_pb.VolumeServer.VolumeEcShardsUnmount:input_type -> volume_server_pb.VolumeEcShardsUnmountRequest + 60, // 42: volume_server_pb.VolumeServer.VolumeEcShardRead:input_type -> volume_server_pb.VolumeEcShardReadRequest + 62, // 43: volume_server_pb.VolumeServer.VolumeEcBlobDelete:input_type -> volume_server_pb.VolumeEcBlobDeleteRequest + 64, // 44: volume_server_pb.VolumeServer.VolumeEcShardsToVolume:input_type -> volume_server_pb.VolumeEcShardsToVolumeRequest + 72, // 45: volume_server_pb.VolumeServer.VolumeTierMoveDatToRemote:input_type -> volume_server_pb.VolumeTierMoveDatToRemoteRequest + 74, // 46: volume_server_pb.VolumeServer.VolumeTierMoveDatFromRemote:input_type -> volume_server_pb.VolumeTierMoveDatFromRemoteRequest + 76, // 47: volume_server_pb.VolumeServer.VolumeServerStatus:input_type -> volume_server_pb.VolumeServerStatusRequest + 78, // 48: volume_server_pb.VolumeServer.VolumeServerLeave:input_type -> volume_server_pb.VolumeServerLeaveRequest + 80, // 49: volume_server_pb.VolumeServer.Query:input_type -> volume_server_pb.QueryRequest + 82, // 50: volume_server_pb.VolumeServer.VolumeNeedleStatus:input_type -> volume_server_pb.VolumeNeedleStatusRequest + 1, // 51: volume_server_pb.VolumeServer.BatchDelete:output_type -> volume_server_pb.BatchDeleteResponse + 5, // 52: volume_server_pb.VolumeServer.VacuumVolumeCheck:output_type -> volume_server_pb.VacuumVolumeCheckResponse + 7, // 53: volume_server_pb.VolumeServer.VacuumVolumeCompact:output_type -> volume_server_pb.VacuumVolumeCompactResponse + 9, // 54: volume_server_pb.VolumeServer.VacuumVolumeCommit:output_type -> volume_server_pb.VacuumVolumeCommitResponse + 11, // 55: volume_server_pb.VolumeServer.VacuumVolumeCleanup:output_type -> volume_server_pb.VacuumVolumeCleanupResponse + 13, // 56: volume_server_pb.VolumeServer.DeleteCollection:output_type -> volume_server_pb.DeleteCollectionResponse + 15, // 57: volume_server_pb.VolumeServer.AllocateVolume:output_type -> volume_server_pb.AllocateVolumeResponse + 17, // 58: volume_server_pb.VolumeServer.VolumeSyncStatus:output_type -> volume_server_pb.VolumeSyncStatusResponse + 19, // 59: volume_server_pb.VolumeServer.VolumeIncrementalCopy:output_type -> volume_server_pb.VolumeIncrementalCopyResponse + 21, // 60: volume_server_pb.VolumeServer.VolumeMount:output_type -> volume_server_pb.VolumeMountResponse + 23, // 61: volume_server_pb.VolumeServer.VolumeUnmount:output_type -> volume_server_pb.VolumeUnmountResponse + 25, // 62: volume_server_pb.VolumeServer.VolumeDelete:output_type -> volume_server_pb.VolumeDeleteResponse + 27, // 63: volume_server_pb.VolumeServer.VolumeMarkReadonly:output_type -> volume_server_pb.VolumeMarkReadonlyResponse + 29, // 64: volume_server_pb.VolumeServer.VolumeMarkWritable:output_type -> volume_server_pb.VolumeMarkWritableResponse + 31, // 65: volume_server_pb.VolumeServer.VolumeConfigure:output_type -> volume_server_pb.VolumeConfigureResponse + 33, // 66: volume_server_pb.VolumeServer.VolumeStatus:output_type -> volume_server_pb.VolumeStatusResponse + 35, // 67: volume_server_pb.VolumeServer.VolumeCopy:output_type -> volume_server_pb.VolumeCopyResponse + 67, // 68: volume_server_pb.VolumeServer.ReadVolumeFileStatus:output_type -> volume_server_pb.ReadVolumeFileStatusResponse + 37, // 69: volume_server_pb.VolumeServer.CopyFile:output_type -> volume_server_pb.CopyFileResponse + 39, // 70: volume_server_pb.VolumeServer.ReadNeedleBlob:output_type -> volume_server_pb.ReadNeedleBlobResponse + 41, // 71: volume_server_pb.VolumeServer.WriteNeedleBlob:output_type -> volume_server_pb.WriteNeedleBlobResponse + 43, // 72: volume_server_pb.VolumeServer.FetchAndWriteNeedle:output_type -> volume_server_pb.FetchAndWriteNeedleResponse + 45, // 73: volume_server_pb.VolumeServer.VolumeTailSender:output_type -> volume_server_pb.VolumeTailSenderResponse + 47, // 74: volume_server_pb.VolumeServer.VolumeTailReceiver:output_type -> volume_server_pb.VolumeTailReceiverResponse + 49, // 75: volume_server_pb.VolumeServer.VolumeEcShardsGenerate:output_type -> volume_server_pb.VolumeEcShardsGenerateResponse + 51, // 76: volume_server_pb.VolumeServer.VolumeEcShardsRebuild:output_type -> volume_server_pb.VolumeEcShardsRebuildResponse + 53, // 77: volume_server_pb.VolumeServer.VolumeEcShardsCopy:output_type -> volume_server_pb.VolumeEcShardsCopyResponse + 55, // 78: volume_server_pb.VolumeServer.VolumeEcShardsDelete:output_type -> volume_server_pb.VolumeEcShardsDeleteResponse + 57, // 79: volume_server_pb.VolumeServer.VolumeEcShardsMount:output_type -> volume_server_pb.VolumeEcShardsMountResponse + 59, // 80: volume_server_pb.VolumeServer.VolumeEcShardsUnmount:output_type -> volume_server_pb.VolumeEcShardsUnmountResponse + 61, // 81: volume_server_pb.VolumeServer.VolumeEcShardRead:output_type -> volume_server_pb.VolumeEcShardReadResponse + 63, // 82: volume_server_pb.VolumeServer.VolumeEcBlobDelete:output_type -> volume_server_pb.VolumeEcBlobDeleteResponse + 65, // 83: volume_server_pb.VolumeServer.VolumeEcShardsToVolume:output_type -> volume_server_pb.VolumeEcShardsToVolumeResponse + 73, // 84: volume_server_pb.VolumeServer.VolumeTierMoveDatToRemote:output_type -> volume_server_pb.VolumeTierMoveDatToRemoteResponse + 75, // 85: volume_server_pb.VolumeServer.VolumeTierMoveDatFromRemote:output_type -> volume_server_pb.VolumeTierMoveDatFromRemoteResponse + 77, // 86: volume_server_pb.VolumeServer.VolumeServerStatus:output_type -> volume_server_pb.VolumeServerStatusResponse + 79, // 87: volume_server_pb.VolumeServer.VolumeServerLeave:output_type -> volume_server_pb.VolumeServerLeaveResponse + 81, // 88: volume_server_pb.VolumeServer.Query:output_type -> volume_server_pb.QueriedStripe + 83, // 89: volume_server_pb.VolumeServer.VolumeNeedleStatus:output_type -> volume_server_pb.VolumeNeedleStatusResponse + 51, // [51:90] is the sub-list for method output_type + 12, // [12:51] is the sub-list for method input_type 12, // [12:12] is the sub-list for extension type_name 12, // [12:12] is the sub-list for extension extendee 0, // [0:12] is the sub-list for field type_name @@ -6648,7 +6860,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeTailSenderRequest); i { + switch v := v.(*FetchAndWriteNeedleRequest); i { case 0: return &v.state case 1: @@ -6660,7 +6872,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeTailSenderResponse); i { + switch v := v.(*FetchAndWriteNeedleResponse); i { case 0: return &v.state case 1: @@ -6672,7 +6884,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeTailReceiverRequest); i { + switch v := v.(*VolumeTailSenderRequest); i { case 0: return &v.state case 1: @@ -6684,7 +6896,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeTailReceiverResponse); i { + switch v := v.(*VolumeTailSenderResponse); i { case 0: return &v.state case 1: @@ -6696,7 +6908,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsGenerateRequest); i { + switch v := v.(*VolumeTailReceiverRequest); i { case 0: return &v.state case 1: @@ -6708,7 +6920,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsGenerateResponse); i { + switch v := v.(*VolumeTailReceiverResponse); i { case 0: return &v.state case 1: @@ -6720,7 +6932,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsRebuildRequest); i { + switch v := v.(*VolumeEcShardsGenerateRequest); i { case 0: return &v.state case 1: @@ -6732,7 +6944,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsRebuildResponse); i { + switch v := v.(*VolumeEcShardsGenerateResponse); i { case 0: return &v.state case 1: @@ -6744,7 +6956,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsCopyRequest); i { + switch v := v.(*VolumeEcShardsRebuildRequest); i { case 0: return &v.state case 1: @@ -6756,7 +6968,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsCopyResponse); i { + switch v := v.(*VolumeEcShardsRebuildResponse); i { case 0: return &v.state case 1: @@ -6768,7 +6980,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsDeleteRequest); i { + switch v := v.(*VolumeEcShardsCopyRequest); i { case 0: return &v.state case 1: @@ -6780,7 +6992,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsDeleteResponse); i { + switch v := v.(*VolumeEcShardsCopyResponse); i { case 0: return &v.state case 1: @@ -6792,7 +7004,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsMountRequest); i { + switch v := v.(*VolumeEcShardsDeleteRequest); i { case 0: return &v.state case 1: @@ -6804,7 +7016,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsMountResponse); i { + switch v := v.(*VolumeEcShardsDeleteResponse); i { case 0: return &v.state case 1: @@ -6816,7 +7028,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsUnmountRequest); i { + switch v := v.(*VolumeEcShardsMountRequest); i { case 0: return &v.state case 1: @@ -6828,7 +7040,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsUnmountResponse); i { + switch v := v.(*VolumeEcShardsMountResponse); i { case 0: return &v.state case 1: @@ -6840,7 +7052,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardReadRequest); i { + switch v := v.(*VolumeEcShardsUnmountRequest); i { case 0: return &v.state case 1: @@ -6852,7 +7064,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardReadResponse); i { + switch v := v.(*VolumeEcShardsUnmountResponse); i { case 0: return &v.state case 1: @@ -6864,7 +7076,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcBlobDeleteRequest); i { + switch v := v.(*VolumeEcShardReadRequest); i { case 0: return &v.state case 1: @@ -6876,7 +7088,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcBlobDeleteResponse); i { + switch v := v.(*VolumeEcShardReadResponse); i { case 0: return &v.state case 1: @@ -6888,7 +7100,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsToVolumeRequest); i { + switch v := v.(*VolumeEcBlobDeleteRequest); i { case 0: return &v.state case 1: @@ -6900,7 +7112,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsToVolumeResponse); i { + switch v := v.(*VolumeEcBlobDeleteResponse); i { case 0: return &v.state case 1: @@ -6912,7 +7124,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReadVolumeFileStatusRequest); i { + switch v := v.(*VolumeEcShardsToVolumeRequest); i { case 0: return &v.state case 1: @@ -6924,7 +7136,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReadVolumeFileStatusResponse); i { + switch v := v.(*VolumeEcShardsToVolumeResponse); i { case 0: return &v.state case 1: @@ -6936,7 +7148,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DiskStatus); i { + switch v := v.(*ReadVolumeFileStatusRequest); i { case 0: return &v.state case 1: @@ -6948,7 +7160,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MemStatus); i { + switch v := v.(*ReadVolumeFileStatusResponse); i { case 0: return &v.state case 1: @@ -6960,7 +7172,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoteFile); i { + switch v := v.(*DiskStatus); i { case 0: return &v.state case 1: @@ -6972,7 +7184,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeInfo); i { + switch v := v.(*MemStatus); i { case 0: return &v.state case 1: @@ -6984,7 +7196,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeTierMoveDatToRemoteRequest); i { + switch v := v.(*RemoteFile); i { case 0: return &v.state case 1: @@ -6996,7 +7208,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeTierMoveDatToRemoteResponse); i { + switch v := v.(*VolumeInfo); i { case 0: return &v.state case 1: @@ -7008,7 +7220,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeTierMoveDatFromRemoteRequest); i { + switch v := v.(*VolumeTierMoveDatToRemoteRequest); i { case 0: return &v.state case 1: @@ -7020,7 +7232,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeTierMoveDatFromRemoteResponse); i { + switch v := v.(*VolumeTierMoveDatToRemoteResponse); i { case 0: return &v.state case 1: @@ -7032,7 +7244,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeServerStatusRequest); i { + switch v := v.(*VolumeTierMoveDatFromRemoteRequest); i { case 0: return &v.state case 1: @@ -7044,7 +7256,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeServerStatusResponse); i { + switch v := v.(*VolumeTierMoveDatFromRemoteResponse); i { case 0: return &v.state case 1: @@ -7056,7 +7268,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeServerLeaveRequest); i { + switch v := v.(*VolumeServerStatusRequest); i { case 0: return &v.state case 1: @@ -7068,7 +7280,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeServerLeaveResponse); i { + switch v := v.(*VolumeServerStatusResponse); i { case 0: return &v.state case 1: @@ -7080,7 +7292,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryRequest); i { + switch v := v.(*VolumeServerLeaveRequest); i { case 0: return &v.state case 1: @@ -7092,7 +7304,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueriedStripe); i { + switch v := v.(*VolumeServerLeaveResponse); i { case 0: return &v.state case 1: @@ -7104,7 +7316,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeNeedleStatusRequest); i { + switch v := v.(*QueryRequest); i { case 0: return &v.state case 1: @@ -7116,7 +7328,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeNeedleStatusResponse); i { + switch v := v.(*QueriedStripe); i { case 0: return &v.state case 1: @@ -7128,7 +7340,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryRequest_Filter); i { + switch v := v.(*VolumeNeedleStatusRequest); i { case 0: return &v.state case 1: @@ -7140,7 +7352,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryRequest_InputSerialization); i { + switch v := v.(*VolumeNeedleStatusResponse); i { case 0: return &v.state case 1: @@ -7152,7 +7364,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryRequest_OutputSerialization); i { + switch v := v.(*QueryRequest_Filter); i { case 0: return &v.state case 1: @@ -7164,7 +7376,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryRequest_InputSerialization_CSVInput); i { + switch v := v.(*QueryRequest_InputSerialization); i { case 0: return &v.state case 1: @@ -7176,7 +7388,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryRequest_InputSerialization_JSONInput); i { + switch v := v.(*QueryRequest_OutputSerialization); i { case 0: return &v.state case 1: @@ -7188,7 +7400,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryRequest_InputSerialization_ParquetInput); i { + switch v := v.(*QueryRequest_InputSerialization_CSVInput); i { case 0: return &v.state case 1: @@ -7200,7 +7412,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryRequest_OutputSerialization_CSVOutput); i { + switch v := v.(*QueryRequest_InputSerialization_JSONInput); i { case 0: return &v.state case 1: @@ -7212,6 +7424,30 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryRequest_InputSerialization_ParquetInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_volume_server_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryRequest_OutputSerialization_CSVOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_volume_server_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryRequest_OutputSerialization_JSONOutput); i { case 0: return &v.state @@ -7230,7 +7466,7 @@ func file_volume_server_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_volume_server_proto_rawDesc, NumEnums: 0, - NumMessages: 90, + NumMessages: 92, NumExtensions: 0, NumServices: 1, }, @@ -7279,6 +7515,7 @@ type VolumeServerClient interface { CopyFile(ctx context.Context, in *CopyFileRequest, opts ...grpc.CallOption) (VolumeServer_CopyFileClient, error) ReadNeedleBlob(ctx context.Context, in *ReadNeedleBlobRequest, opts ...grpc.CallOption) (*ReadNeedleBlobResponse, error) WriteNeedleBlob(ctx context.Context, in *WriteNeedleBlobRequest, opts ...grpc.CallOption) (*WriteNeedleBlobResponse, error) + FetchAndWriteNeedle(ctx context.Context, in *FetchAndWriteNeedleRequest, opts ...grpc.CallOption) (*FetchAndWriteNeedleResponse, error) VolumeTailSender(ctx context.Context, in *VolumeTailSenderRequest, opts ...grpc.CallOption) (VolumeServer_VolumeTailSenderClient, error) VolumeTailReceiver(ctx context.Context, in *VolumeTailReceiverRequest, opts ...grpc.CallOption) (*VolumeTailReceiverResponse, error) // erasure coding @@ -7544,6 +7781,15 @@ func (c *volumeServerClient) WriteNeedleBlob(ctx context.Context, in *WriteNeedl return out, nil } +func (c *volumeServerClient) FetchAndWriteNeedle(ctx context.Context, in *FetchAndWriteNeedleRequest, opts ...grpc.CallOption) (*FetchAndWriteNeedleResponse, error) { + out := new(FetchAndWriteNeedleResponse) + err := c.cc.Invoke(ctx, "/volume_server_pb.VolumeServer/FetchAndWriteNeedle", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *volumeServerClient) VolumeTailSender(ctx context.Context, in *VolumeTailSenderRequest, opts ...grpc.CallOption) (VolumeServer_VolumeTailSenderClient, error) { stream, err := c.cc.NewStream(ctx, &_VolumeServer_serviceDesc.Streams[2], "/volume_server_pb.VolumeServer/VolumeTailSender", opts...) if err != nil { @@ -7837,6 +8083,7 @@ type VolumeServerServer interface { CopyFile(*CopyFileRequest, VolumeServer_CopyFileServer) error ReadNeedleBlob(context.Context, *ReadNeedleBlobRequest) (*ReadNeedleBlobResponse, error) WriteNeedleBlob(context.Context, *WriteNeedleBlobRequest) (*WriteNeedleBlobResponse, error) + FetchAndWriteNeedle(context.Context, *FetchAndWriteNeedleRequest) (*FetchAndWriteNeedleResponse, error) VolumeTailSender(*VolumeTailSenderRequest, VolumeServer_VolumeTailSenderServer) error VolumeTailReceiver(context.Context, *VolumeTailReceiverRequest) (*VolumeTailReceiverResponse, error) // erasure coding @@ -7926,6 +8173,9 @@ func (*UnimplementedVolumeServerServer) ReadNeedleBlob(context.Context, *ReadNee func (*UnimplementedVolumeServerServer) WriteNeedleBlob(context.Context, *WriteNeedleBlobRequest) (*WriteNeedleBlobResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method WriteNeedleBlob not implemented") } +func (*UnimplementedVolumeServerServer) FetchAndWriteNeedle(context.Context, *FetchAndWriteNeedleRequest) (*FetchAndWriteNeedleResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method FetchAndWriteNeedle not implemented") +} func (*UnimplementedVolumeServerServer) VolumeTailSender(*VolumeTailSenderRequest, VolumeServer_VolumeTailSenderServer) error { return status.Errorf(codes.Unimplemented, "method VolumeTailSender not implemented") } @@ -8366,6 +8616,24 @@ func _VolumeServer_WriteNeedleBlob_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _VolumeServer_FetchAndWriteNeedle_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(FetchAndWriteNeedleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VolumeServerServer).FetchAndWriteNeedle(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/volume_server_pb.VolumeServer/FetchAndWriteNeedle", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VolumeServerServer).FetchAndWriteNeedle(ctx, req.(*FetchAndWriteNeedleRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _VolumeServer_VolumeTailSender_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(VolumeTailSenderRequest) if err := stream.RecvMsg(m); err != nil { @@ -8767,6 +9035,10 @@ var _VolumeServer_serviceDesc = grpc.ServiceDesc{ MethodName: "WriteNeedleBlob", Handler: _VolumeServer_WriteNeedleBlob_Handler, }, + { + MethodName: "FetchAndWriteNeedle", + Handler: _VolumeServer_FetchAndWriteNeedle_Handler, + }, { MethodName: "VolumeTailReceiver", Handler: _VolumeServer_VolumeTailReceiver_Handler, diff --git a/weed/remote_storage/remote_storage.go b/weed/remote_storage/remote_storage.go index 1b4847e63..06c089d7a 100644 --- a/weed/remote_storage/remote_storage.go +++ b/weed/remote_storage/remote_storage.go @@ -3,7 +3,6 @@ package remote_storage import ( "fmt" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" - "io" "strings" "sync" ) @@ -31,7 +30,7 @@ type VisitFunc func(dir string, name string, isDirectory bool, remoteEntry *file type RemoteStorageClient interface { Traverse(loc *filer_pb.RemoteStorageLocation, visitFn VisitFunc) error - ReadFile(loc *filer_pb.RemoteStorageLocation, offset int64, size int64, writeFn func(w io.Writer) error) error + ReadFile(loc *filer_pb.RemoteStorageLocation, offset int64, size int64) (data[]byte, err error) } type RemoteStorageClientMaker interface { diff --git a/weed/remote_storage/s3/s3_storage_client.go b/weed/remote_storage/s3/s3_storage_client.go index d7d050842..2263054f3 100644 --- a/weed/remote_storage/s3/s3_storage_client.go +++ b/weed/remote_storage/s3/s3_storage_client.go @@ -7,10 +7,10 @@ import ( "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/service/s3/s3iface" + "github.com/aws/aws-sdk-go/service/s3/s3manager" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/remote_storage" "github.com/chrislusf/seaweedfs/weed/util" - "io" ) func init() { @@ -65,7 +65,7 @@ func (s s3RemoteStorageClient) Traverse(remote *filer_pb.RemoteStorageLocation, for !isLastPage && err == nil { listErr := s.conn.ListObjectsV2Pages(listInput, func(page *s3.ListObjectsV2Output, lastPage bool) bool { for _, content := range page.Contents { - key := (*content.Key) + key := *content.Key if len(pathKey) == 0 { key = "/" + key } else { @@ -91,6 +91,23 @@ func (s s3RemoteStorageClient) Traverse(remote *filer_pb.RemoteStorageLocation, } return } -func (s s3RemoteStorageClient) ReadFile(loc *filer_pb.RemoteStorageLocation, offset int64, size int64, writeFn func(w io.Writer) error) error { - return nil +func (s s3RemoteStorageClient) ReadFile(loc *filer_pb.RemoteStorageLocation, offset int64, size int64) (data[]byte, err error) { + downloader := s3manager.NewDownloaderWithClient(s.conn, func(u *s3manager.Downloader) { + u.PartSize = int64(4 * 1024 * 1024) + u.Concurrency = 1 + }) + + dataSlice := make([]byte, int(size)) + writerAt := aws.NewWriteAtBuffer(dataSlice) + + _, err = downloader.Download(writerAt, &s3.GetObjectInput{ + Bucket: aws.String(loc.Bucket), + Key: aws.String(loc.Path[1:]), + Range: aws.String(fmt.Sprintf("bytes=%d-%d", offset, offset+size-1)), + }) + if err != nil { + return nil, fmt.Errorf("failed to download file %s%s: %v", loc.Bucket, loc.Path, err) + } + + return writerAt.Bytes(), nil } diff --git a/weed/server/filer_server_handlers_read.go b/weed/server/filer_server_handlers_read.go index add0be1f4..a3980cd0a 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -164,10 +164,12 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) return err } if entry.IsRemoteOnly() { - err = fs.filer.ReadRemote(writer, entry, offset, size) + var data []byte + data, err = fs.filer.ReadRemote(entry, offset, size) if err != nil { glog.Errorf("failed to read remote %s: %v", r.URL, err) } + _, err = w.Write(data) } else { err = filer.StreamContent(fs.filer.MasterClient, writer, entry.Chunks, offset, size) if err != nil { diff --git a/weed/server/volume_grpc_read_write.go b/weed/server/volume_grpc_read_write.go index 988e9e145..42941250d 100644 --- a/weed/server/volume_grpc_read_write.go +++ b/weed/server/volume_grpc_read_write.go @@ -3,7 +3,9 @@ package weed_server import ( "context" "fmt" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/pb/volume_server_pb" + "github.com/chrislusf/seaweedfs/weed/remote_storage" "github.com/chrislusf/seaweedfs/weed/storage/needle" "github.com/chrislusf/seaweedfs/weed/storage/types" ) @@ -36,3 +38,41 @@ func (vs *VolumeServer) WriteNeedleBlob(ctx context.Context, req *volume_server_ return resp, nil } + +func (vs *VolumeServer) FetchAndWriteNeedle(ctx context.Context, req *volume_server_pb.FetchAndWriteNeedleRequest) (resp *volume_server_pb.FetchAndWriteNeedleResponse, err error) { + resp = &volume_server_pb.FetchAndWriteNeedleResponse{} + v := vs.store.GetVolume(needle.VolumeId(req.VolumeId)) + if v == nil { + return nil, fmt.Errorf("not found volume id %d", req.VolumeId) + } + + remoteConf := &filer_pb.RemoteConf{ + Type: req.RemoteType, + Name: req.RemoteName, + S3AccessKey: req.S3AccessKey, + S3SecretKey: req.S3SecretKey, + S3Region: req.S3Region, + S3Endpoint: req.S3Endpoint, + } + + client, getClientErr := remote_storage.GetRemoteStorage(remoteConf) + if getClientErr != nil { + return nil, fmt.Errorf("get remote client: %v", getClientErr) + } + + remoteStorageLocation := &filer_pb.RemoteStorageLocation{ + Name: req.RemoteName, + Bucket: req.RemoteBucket, + Path: req.RemoteKey, + } + data, ReadRemoteErr := client.ReadFile(remoteStorageLocation, req.Offset, req.Size) + if ReadRemoteErr != nil { + return nil, fmt.Errorf("read from remote %+v: %v", remoteStorageLocation, ReadRemoteErr) + } + + if err = v.WriteNeedleBlob(types.NeedleId(req.NeedleId), data, types.Size(req.Size)); err != nil { + return nil, fmt.Errorf("write blob needle %d size %d: %v", req.NeedleId, req.Size, err) + } + + return resp, nil +} diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go index 8f16d27c8..bd6b49050 100644 --- a/weed/shell/command_remote_mount.go +++ b/weed/shell/command_remote_mount.go @@ -8,6 +8,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/remote_storage" "github.com/chrislusf/seaweedfs/weed/util" + "github.com/golang/protobuf/jsonpb" "github.com/golang/protobuf/proto" "io" ) @@ -49,6 +50,10 @@ func (c *commandRemoteMount) Do(args []string, commandEnv *CommandEnv, writer io return nil } + if *dir == "" { + return c.listExistingRemoteStorageMounts(commandEnv, writer) + } + remoteStorageLocation := remote_storage.ParseLocation(*remote) // find configuration for remote storage @@ -71,6 +76,34 @@ func (c *commandRemoteMount) Do(args []string, commandEnv *CommandEnv, writer io return nil } +func (c *commandRemoteMount) listExistingRemoteStorageMounts(commandEnv *CommandEnv, writer io.Writer) (err error) { + + // read current mapping + var oldContent []byte + err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + oldContent, err = filer.ReadInsideFiler(client, filer.DirectoryEtcRemote, filer.REMOTE_STORAGE_MOUNT_FILE) + return err + }) + if err != nil { + if err != filer_pb.ErrNotFound { + return fmt.Errorf("read existing mapping: %v", err) + } + } + + mappings, unmarshalErr := filer.UnmarshalRemoteStorageMappings(oldContent) + if unmarshalErr != nil { + return unmarshalErr + } + + m := jsonpb.Marshaler{ + EmitDefaults: false, + Indent: " ", + } + + return m.Marshal(writer, mappings) + +} + func (c *commandRemoteMount) findRemoteStorageConfiguration(commandEnv *CommandEnv, writer io.Writer, remote *filer_pb.RemoteStorageLocation) (conf *filer_pb.RemoteConf, err error) { // read storage configuration data @@ -178,7 +211,7 @@ func (c *commandRemoteMount) pullMetadata(commandEnv *CommandEnv, writer io.Writ existingEntry.Attributes.Mtime = remoteEntry.LastModifiedAt _, updateErr := client.UpdateEntry(ctx, &filer_pb.UpdateEntryRequest{ Directory: localDir, - Entry: existingEntry, + Entry: existingEntry, }) return updateErr } @@ -210,7 +243,7 @@ func (c *commandRemoteMount) saveMountMapping(commandEnv *CommandEnv, writer io. } // add new mapping - newContent, err = filer.AddMapping(oldContent, dir, remoteStorageLocation) + newContent, err = filer.AddRemoteStorageMapping(oldContent, dir, remoteStorageLocation) if err != nil { return fmt.Errorf("add mapping %s~%s: %v", dir, remoteStorageLocation, err) } From 767edd3c0802f3e22d6aef4e75f0e8805b748617 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 31 Jul 2021 23:52:09 -0700 Subject: [PATCH 147/265] rename --- weed/filer/read_remote.go | 2 +- weed/server/filer_server_handlers_read.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/weed/filer/read_remote.go b/weed/filer/read_remote.go index 26e220445..d9423ceda 100644 --- a/weed/filer/read_remote.go +++ b/weed/filer/read_remote.go @@ -5,7 +5,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" ) -func (entry *Entry) IsRemoteOnly() bool { +func (entry *Entry) IsInRemoteOnly() bool { return len(entry.Chunks) == 0 && entry.Remote != nil && entry.Remote.Size > 0 } diff --git a/weed/server/filer_server_handlers_read.go b/weed/server/filer_server_handlers_read.go index a3980cd0a..86454f8c5 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -163,7 +163,7 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) } return err } - if entry.IsRemoteOnly() { + if entry.IsInRemoteOnly() { var data []byte data, err = fs.filer.ReadRemote(entry, offset, size) if err != nil { From 9cc84a910f6a2a00da17b6ae3aa54f4e74dfab15 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 1 Aug 2021 00:32:51 -0700 Subject: [PATCH 148/265] volume: deletion can skip volume size checking fix https://github.com/chrislusf/seaweedfs/issues/2225 --- weed/storage/needle/needle_read_write.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/storage/needle/needle_read_write.go b/weed/storage/needle/needle_read_write.go index 84e00374a..3b9eb7237 100644 --- a/weed/storage/needle/needle_read_write.go +++ b/weed/storage/needle/needle_read_write.go @@ -147,7 +147,7 @@ func (n *Needle) Append(w backend.BackendStorageFile, version Version) (offset u err = fmt.Errorf("Cannot Read Current Volume Position: %v", e) return } - if offset >= MaxPossibleVolumeSize { + if offset >= MaxPossibleVolumeSize && n.Size.IsValid() { err = fmt.Errorf("Volume Size %d Exeededs %d", offset, MaxPossibleVolumeSize) return } From cb1dbd31351ad7900b8c4acc4fd6c7f862088325 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 1 Aug 2021 11:53:46 -0700 Subject: [PATCH 149/265] refactor --- weed/topology/store_replicate.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/weed/topology/store_replicate.go b/weed/topology/store_replicate.go index ea0a8c968..6d68bb26f 100644 --- a/weed/topology/store_replicate.go +++ b/weed/topology/store_replicate.go @@ -50,7 +50,7 @@ func ReplicatedWrite(masterFn operation.GetMasterFn, s *storage.Store, volumeId } if len(remoteLocations) > 0 { //send to other replica locations - if err = distributedOperation(remoteLocations, s, func(location operation.Location) error { + if err = DistributedOperation(remoteLocations, func(location operation.Location) error { u := url.URL{ Scheme: "http", Host: location.Url, @@ -115,7 +115,7 @@ func ReplicatedDelete(masterFn operation.GetMasterFn, store *storage.Store, } if len(remoteLocations) > 0 { //send to other replica locations - if err = distributedOperation(remoteLocations, store, func(location operation.Location) error { + if err = DistributedOperation(remoteLocations, func(location operation.Location) error { return util.Delete("http://"+location.Url+r.URL.Path+"?type=replicate", string(jwt)) }); err != nil { size = 0 @@ -144,7 +144,7 @@ type RemoteResult struct { Error error } -func distributedOperation(locations []operation.Location, store *storage.Store, op func(location operation.Location) error) error { +func DistributedOperation(locations []operation.Location, op func(location operation.Location) error) error { length := len(locations) results := make(chan RemoteResult) for _, location := range locations { From 1c7e404abec01da8bb322ef4000d6acecf1a6be5 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 1 Aug 2021 12:23:16 -0700 Subject: [PATCH 150/265] remove buckets folder option the related code still works for old deployments --- weed/command/scaffold/filer.toml | 2 -- 1 file changed, 2 deletions(-) diff --git a/weed/command/scaffold/filer.toml b/weed/command/scaffold/filer.toml index 1de7d02aa..9e9258865 100644 --- a/weed/command/scaffold/filer.toml +++ b/weed/command/scaffold/filer.toml @@ -12,8 +12,6 @@ # with http DELETE, by default the filer would check whether a folder is empty. # recursive_delete will delete all sub folders and files, similar to "rm -Rf" recursive_delete = false -# directories under this folder will be automatically creating a separate bucket -buckets_folder = "/buckets" #################################################### # The following are filer store options From 89933c46d224008cf53cd16e1bf2d04188d7bb1a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 1 Aug 2021 12:28:08 -0700 Subject: [PATCH 151/265] s3: skip hidden directories in /buckets folder --- weed/filer/filer_buckets.go | 4 ++++ weed/filer/filer_on_meta_event.go | 8 ++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/weed/filer/filer_buckets.go b/weed/filer/filer_buckets.go index 43fb000c9..38a1abadb 100644 --- a/weed/filer/filer_buckets.go +++ b/weed/filer/filer_buckets.go @@ -3,6 +3,7 @@ package filer import ( "context" "math" + "strings" "sync" "github.com/chrislusf/seaweedfs/weed/glog" @@ -78,6 +79,9 @@ func (f *Filer) isBucket(entry *Entry) bool { if parent != f.DirBucketsPath { return false } + if strings.HasPrefix(dirName, ".") { + return false + } f.buckets.RLock() defer f.buckets.RUnlock() diff --git a/weed/filer/filer_on_meta_event.go b/weed/filer/filer_on_meta_event.go index c9f75a5ca..5717b2b09 100644 --- a/weed/filer/filer_on_meta_event.go +++ b/weed/filer/filer_on_meta_event.go @@ -24,10 +24,14 @@ func (f *Filer) onBucketEvents(event *filer_pb.SubscribeMetadataResponse) { } if f.DirBucketsPath == event.Directory { if message.OldEntry == nil && message.NewEntry != nil { - f.Store.OnBucketCreation(message.NewEntry.Name) + if message.NewEntry.IsDirectory { + f.Store.OnBucketCreation(message.NewEntry.Name) + } } if message.OldEntry != nil && message.NewEntry == nil { - f.Store.OnBucketDeletion(message.OldEntry.Name) + if message.OldEntry.IsDirectory { + f.Store.OnBucketDeletion(message.OldEntry.Name) + } } } } From 2ca1839d77956371d2af384a13f2cb8bd9981fcd Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 1 Aug 2021 15:33:45 -0700 Subject: [PATCH 152/265] shell: add `volume.deleteEmpty` command --- weed/command/scaffold/master.toml | 1 + weed/shell/command_volume_delete_empty.go | 69 +++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 weed/shell/command_volume_delete_empty.go diff --git a/weed/command/scaffold/master.toml b/weed/command/scaffold/master.toml index 60a7dbcfc..9acefe69e 100644 --- a/weed/command/scaffold/master.toml +++ b/weed/command/scaffold/master.toml @@ -11,6 +11,7 @@ scripts = """ ec.encode -fullPercent=95 -quietFor=1h ec.rebuild -force ec.balance -force + volume.deleteEmpty volume.balance -force volume.fix.replication unlock diff --git a/weed/shell/command_volume_delete_empty.go b/weed/shell/command_volume_delete_empty.go new file mode 100644 index 000000000..07c6d5b2c --- /dev/null +++ b/weed/shell/command_volume_delete_empty.go @@ -0,0 +1,69 @@ +package shell + +import ( + "flag" + "github.com/chrislusf/seaweedfs/weed/pb/master_pb" + "io" + "log" + "time" + + "github.com/chrislusf/seaweedfs/weed/storage/needle" +) + +func init() { + Commands = append(Commands, &commandVolumeDeleteEmpty{}) +} + +type commandVolumeDeleteEmpty struct { +} + +func (c *commandVolumeDeleteEmpty) Name() string { + return "volume.deleteEmpty" +} + +func (c *commandVolumeDeleteEmpty) Help() string { + return `delete empty volumes from all volume servers + + volume.deleteEmpty -quietFor=24h + + This command deletes all empty volumes from one volume server. + +` +} + +func (c *commandVolumeDeleteEmpty) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { + + if err = commandEnv.confirmIsLocked(); err != nil { + return + } + + volDeleteCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) + quietPeriod := volDeleteCommand.Duration("quietFor", 24*time.Hour, "select empty volumes with no recent writes, avoid newly created ones") + if err = volDeleteCommand.Parse(args); err != nil { + return nil + } + + // collect topology information + topologyInfo, _, err := collectTopologyInfo(commandEnv) + if err != nil { + return err + } + + quietSeconds := int64(*quietPeriod / time.Second) + nowUnixSeconds := time.Now().Unix() + + eachDataNode(topologyInfo, func(dc string, rack RackId, dn *master_pb.DataNodeInfo) { + for _, diskInfo := range dn.DiskInfos { + for _, v := range diskInfo.VolumeInfos { + if v.Size <= 8 && v.ModifiedAtSecond + quietSeconds < nowUnixSeconds { + log.Printf("deleting empty volume %d from %s", v.Id, dn.Id) + if deleteErr := deleteVolume(commandEnv.option.GrpcDialOption, needle.VolumeId(v.Id), dn.Id); deleteErr != nil { + err = deleteErr + } + } + } + } + }) + + return +} From 58bc3ecf4712dd8c94c3470324aa68492072c78b Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 1 Aug 2021 15:36:06 -0700 Subject: [PATCH 153/265] add default quietFor value --- weed/command/scaffold/master.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/command/scaffold/master.toml b/weed/command/scaffold/master.toml index 9acefe69e..cdd92016c 100644 --- a/weed/command/scaffold/master.toml +++ b/weed/command/scaffold/master.toml @@ -11,7 +11,7 @@ scripts = """ ec.encode -fullPercent=95 -quietFor=1h ec.rebuild -force ec.balance -force - volume.deleteEmpty + volume.deleteEmpty -quietFor=24h volume.balance -force volume.fix.replication unlock From 56ee1d5ef1627a88eb5711c79e693cf3fbc00313 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 1 Aug 2021 15:50:19 -0700 Subject: [PATCH 154/265] 2.61 --- k8s/seaweedfs/Chart.yaml | 4 ++-- k8s/seaweedfs/values.yaml | 1 - weed/util/constants.go | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/k8s/seaweedfs/Chart.yaml b/k8s/seaweedfs/Chart.yaml index cc8e4bdca..83b0148e7 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.60" -version: "2.60" +appVersion: "2.61" +version: "2.61" diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index 3f1c6da1c..adc0f1d2c 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,6 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.60" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index 2636adf45..108dfb2e4 100644 --- a/weed/util/constants.go +++ b/weed/util/constants.go @@ -5,7 +5,7 @@ import ( ) var ( - VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 60) + VERSION = fmt.Sprintf("%s %.02f", sizeLimit, 2.61) COMMIT = "" ) From 9e839cb5cc25a256e3b79b516d9d7637d3ed01b5 Mon Sep 17 00:00:00 2001 From: "byunghwa.yun" Date: Mon, 2 Aug 2021 11:37:20 +0900 Subject: [PATCH 155/265] Add force option in volume.deleteEmpty command --- weed/shell/command_volume_delete_empty.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/weed/shell/command_volume_delete_empty.go b/weed/shell/command_volume_delete_empty.go index 07c6d5b2c..079915f66 100644 --- a/weed/shell/command_volume_delete_empty.go +++ b/weed/shell/command_volume_delete_empty.go @@ -3,11 +3,10 @@ package shell import ( "flag" "github.com/chrislusf/seaweedfs/weed/pb/master_pb" + "github.com/chrislusf/seaweedfs/weed/storage/needle" "io" "log" "time" - - "github.com/chrislusf/seaweedfs/weed/storage/needle" ) func init() { @@ -24,7 +23,7 @@ func (c *commandVolumeDeleteEmpty) Name() string { func (c *commandVolumeDeleteEmpty) Help() string { return `delete empty volumes from all volume servers - volume.deleteEmpty -quietFor=24h + volume.deleteEmpty -quietFor=24h -force This command deletes all empty volumes from one volume server. @@ -39,6 +38,7 @@ func (c *commandVolumeDeleteEmpty) Do(args []string, commandEnv *CommandEnv, wri volDeleteCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) quietPeriod := volDeleteCommand.Duration("quietFor", 24*time.Hour, "select empty volumes with no recent writes, avoid newly created ones") + applyBalancing := volDeleteCommand.Bool("force", false, "apply to delete empty volumes") if err = volDeleteCommand.Parse(args); err != nil { return nil } @@ -55,10 +55,15 @@ func (c *commandVolumeDeleteEmpty) Do(args []string, commandEnv *CommandEnv, wri eachDataNode(topologyInfo, func(dc string, rack RackId, dn *master_pb.DataNodeInfo) { for _, diskInfo := range dn.DiskInfos { for _, v := range diskInfo.VolumeInfos { - if v.Size <= 8 && v.ModifiedAtSecond + quietSeconds < nowUnixSeconds { - log.Printf("deleting empty volume %d from %s", v.Id, dn.Id) - if deleteErr := deleteVolume(commandEnv.option.GrpcDialOption, needle.VolumeId(v.Id), dn.Id); deleteErr != nil { - err = deleteErr + if v.Size <= 8 && v.ModifiedAtSecond+quietSeconds < nowUnixSeconds { + if *applyBalancing { + log.Printf("deleting empty volume %d from %s", v.Id, dn.Id) + if deleteErr := deleteVolume(commandEnv.option.GrpcDialOption, needle.VolumeId(v.Id), dn.Id); deleteErr != nil { + err = deleteErr + } + continue + } else { + log.Printf("empty volume %d from %s", v.Id, dn.Id) } } } From 3bb640b786f199572a956d02df17fd55f31b8fa6 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 1 Aug 2021 20:03:05 -0700 Subject: [PATCH 156/265] add -force option following #2228 --- weed/command/scaffold/master.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/command/scaffold/master.toml b/weed/command/scaffold/master.toml index cdd92016c..020f48e36 100644 --- a/weed/command/scaffold/master.toml +++ b/weed/command/scaffold/master.toml @@ -11,7 +11,7 @@ scripts = """ ec.encode -fullPercent=95 -quietFor=1h ec.rebuild -force ec.balance -force - volume.deleteEmpty -quietFor=24h + volume.deleteEmpty -quietFor=24h -force volume.balance -force volume.fix.replication unlock From 6de786185d6c02046d28daf6bbeb2cef7798241e Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 1 Aug 2021 22:32:50 -0700 Subject: [PATCH 157/265] volume.balance: balance read only volumes first --- weed/shell/command_volume_balance.go | 30 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/weed/shell/command_volume_balance.go b/weed/shell/command_volume_balance.go index ad7da0e44..06a5ebc92 100644 --- a/weed/shell/command_volume_balance.go +++ b/weed/shell/command_volume_balance.go @@ -120,21 +120,6 @@ func balanceVolumeServers(commandEnv *CommandEnv, diskTypes []types.DiskType, vo func balanceVolumeServersByDiskType(commandEnv *CommandEnv, diskType types.DiskType, volumeReplicas map[uint32][]*VolumeReplica, nodes []*Node, volumeSizeLimit uint64, collection string, applyBalancing bool) error { - // balance writable volumes - for _, n := range nodes { - n.selectVolumes(func(v *master_pb.VolumeInformationMessage) bool { - if collection != "ALL_COLLECTIONS" { - if v.Collection != collection { - return false - } - } - return v.DiskType == string(diskType) && (!v.ReadOnly && v.Size < volumeSizeLimit) - }) - } - if err := balanceSelectedVolume(commandEnv, volumeReplicas, nodes, capacityByMaxVolumeCount(diskType), sortWritableVolumes, applyBalancing); err != nil { - return err - } - // balance readable volumes for _, n := range nodes { n.selectVolumes(func(v *master_pb.VolumeInformationMessage) bool { @@ -150,6 +135,21 @@ func balanceVolumeServersByDiskType(commandEnv *CommandEnv, diskType types.DiskT return err } + // balance writable volumes + for _, n := range nodes { + n.selectVolumes(func(v *master_pb.VolumeInformationMessage) bool { + if collection != "ALL_COLLECTIONS" { + if v.Collection != collection { + return false + } + } + return v.DiskType == string(diskType) && (!v.ReadOnly && v.Size < volumeSizeLimit) + }) + } + if err := balanceSelectedVolume(commandEnv, volumeReplicas, nodes, capacityByMaxVolumeCount(diskType), sortWritableVolumes, applyBalancing); err != nil { + return err + } + return nil } From f690643b47654b3220b71bd3bfa839a2d1b365d3 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 1 Aug 2021 22:53:50 -0700 Subject: [PATCH 158/265] adds a test --- weed/shell/command_volume_balance.go | 2 +- weed/shell/command_volume_list_test.go | 3065 +++++++++++++++++------- 2 files changed, 2262 insertions(+), 805 deletions(-) diff --git a/weed/shell/command_volume_balance.go b/weed/shell/command_volume_balance.go index 06a5ebc92..6da128c68 100644 --- a/weed/shell/command_volume_balance.go +++ b/weed/shell/command_volume_balance.go @@ -120,7 +120,7 @@ func balanceVolumeServers(commandEnv *CommandEnv, diskTypes []types.DiskType, vo func balanceVolumeServersByDiskType(commandEnv *CommandEnv, diskType types.DiskType, volumeReplicas map[uint32][]*VolumeReplica, nodes []*Node, volumeSizeLimit uint64, collection string, applyBalancing bool) error { - // balance readable volumes + // balance read only volumes for _, n := range nodes { n.selectVolumes(func(v *master_pb.VolumeInformationMessage) bool { if collection != "ALL_COLLECTIONS" { diff --git a/weed/shell/command_volume_list_test.go b/weed/shell/command_volume_list_test.go index 72c76f242..11977e2cb 100644 --- a/weed/shell/command_volume_list_test.go +++ b/weed/shell/command_volume_list_test.go @@ -86,808 +86,2265 @@ func parseOutput(output string) *master_pb.TopologyInfo { } const topoData = ` -Topology volumeSizeLimit:1024 MB hdd(volume:760/7280 active:760 free:6520 remote:0) - DataCenter dc1 hdd(volume:0/0 active:0 free:0 remote:0) - Rack DefaultRack hdd(volume:0/0 active:0 free:0 remote:0) - Rack DefaultRack total size:0 file_count:0 - DataCenter dc1 total size:0 file_count:0 - DataCenter dc2 hdd(volume:86/430 active:86 free:344 remote:0) - Rack rack1 hdd(volume:50/240 active:50 free:190 remote:0) - DataNode 192.168.1.4:8080 hdd(volume:50/240 active:50 free:190 remote:0) - Disk hdd(volume:50/240 active:50 free:190 remote:0) - volume id:15 size:1115965064 collection:"collection0" file_count:83 replica_placement:100 version:3 modified_at_second:1609923671 - volume id:21 size:1097631536 collection:"collection0" file_count:82 delete_count:7 deleted_byte_count:68975485 replica_placement:100 version:3 modified_at_second:1609929578 - volume id:22 size:1086828272 collection:"collection0" file_count:75 replica_placement:100 version:3 modified_at_second:1609930001 - volume id:23 size:1076380216 collection:"collection0" file_count:68 replica_placement:100 version:3 modified_at_second:1609930434 - volume id:24 size:1074139776 collection:"collection0" file_count:90 replica_placement:100 version:3 modified_at_second:1609930909 - volume id:25 size:690757512 collection:"collection0" file_count:38 replica_placement:100 version:3 modified_at_second:1611144216 - volume id:27 size:298886792 file_count:1608 replica_placement:100 version:3 modified_at_second:1615632482 - volume id:28 size:308919192 file_count:1591 delete_count:1 deleted_byte_count:125280 replica_placement:100 version:3 modified_at_second:1615631762 - volume id:29 size:281582680 file_count:1537 replica_placement:100 version:3 modified_at_second:1615629422 - volume id:30 size:289466144 file_count:1566 delete_count:1 deleted_byte_count:124972 replica_placement:100 version:3 modified_at_second:1615632422 - volume id:31 size:273363256 file_count:1498 replica_placement:100 version:3 modified_at_second:1615631642 - volume id:33 size:1130226400 collection:"collection1" file_count:7322 delete_count:172 deleted_byte_count:45199399 replica_placement:100 version:3 modified_at_second:1615618789 - volume id:38 size:1075545744 collection:"collection1" file_count:13324 delete_count:100 deleted_byte_count:25223906 replica_placement:100 version:3 modified_at_second:1615569830 - volume id:51 size:1076796120 collection:"collection1" file_count:10550 delete_count:39 deleted_byte_count:12723654 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615547786 - volume id:52 size:1083529728 collection:"collection1" file_count:10128 delete_count:32 deleted_byte_count:10608391 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615599195 - volume id:54 size:1045022344 collection:"collection1" file_count:9408 delete_count:30 deleted_byte_count:15132106 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630812 - volume id:63 size:956941112 collection:"collection1" file_count:8271 delete_count:32 deleted_byte_count:15876189 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632036 - volume id:69 size:869213648 collection:"collection1" file_count:7293 delete_count:102 deleted_byte_count:30643207 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630534 - volume id:74 size:957046128 collection:"collection1" file_count:6982 delete_count:258 deleted_byte_count:73054259 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615631460 - volume id:80 size:827912928 collection:"collection1" file_count:6914 delete_count:17 deleted_byte_count:5689635 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615631157 - volume id:84 size:873121856 collection:"collection1" file_count:8200 delete_count:13 deleted_byte_count:3131676 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631161 - volume id:85 size:1023869320 collection:"collection1" file_count:7788 delete_count:234 deleted_byte_count:78037967 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631723 - volume id:97 size:1053112992 collection:"collection1" file_count:6789 delete_count:50 deleted_byte_count:38894001 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631193 - volume id:98 size:1077836440 collection:"collection1" file_count:7605 delete_count:202 deleted_byte_count:73180379 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615523691 - volume id:105 size:1073996824 collection:"collection1" file_count:6872 delete_count:20 deleted_byte_count:14482293 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615499757 - volume id:106 size:1075458664 collection:"collection1" file_count:7182 delete_count:307 deleted_byte_count:69349053 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615598137 - volume id:112 size:1076392512 collection:"collection1" file_count:8291 delete_count:156 deleted_byte_count:74120183 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615569823 - volume id:116 size:1074489504 collection:"collection1" file_count:9981 delete_count:174 deleted_byte_count:53998777 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615611565 - volume id:119 size:1075940104 collection:"collection1" file_count:9003 delete_count:12 deleted_byte_count:9128155 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615573878 - volume id:128 size:1074874632 collection:"collection1" file_count:9821 delete_count:148 deleted_byte_count:43633334 replica_placement:100 version:3 modified_at_second:1615602670 - volume id:133 size:1075952760 collection:"collection1" file_count:9538 delete_count:74 deleted_byte_count:19558008 replica_placement:100 version:3 modified_at_second:1615584779 - volume id:136 size:1074433552 collection:"collection1" file_count:9593 delete_count:72 deleted_byte_count:26912512 replica_placement:100 version:3 modified_at_second:1615376036 - volume id:138 size:1074465744 collection:"collection1" file_count:10120 delete_count:55 deleted_byte_count:15875438 replica_placement:100 version:3 modified_at_second:1615572231 - volume id:140 size:1076203744 collection:"collection1" file_count:11219 delete_count:57 deleted_byte_count:19864498 replica_placement:100 version:3 modified_at_second:1615571947 - volume id:144 size:1074549720 collection:"collection1" file_count:8780 delete_count:50 deleted_byte_count:52475146 replica_placement:100 version:3 modified_at_second:1615573451 - volume id:161 size:1077397192 collection:"collection1" file_count:9988 delete_count:28 deleted_byte_count:12509164 replica_placement:100 version:3 modified_at_second:1615631452 - volume id:173 size:1074154704 collection:"collection1" file_count:30884 delete_count:34 deleted_byte_count:2578509 replica_placement:100 version:3 modified_at_second:1615591904 - volume id:174 size:1073824232 collection:"collection1" file_count:30689 delete_count:36 deleted_byte_count:2160116 replica_placement:100 version:3 modified_at_second:1615598914 - volume id:197 size:1075423240 collection:"collection1" file_count:16473 delete_count:15 deleted_byte_count:12552442 replica_placement:100 version:3 modified_at_second:1615485254 - volume id:219 size:1092298904 collection:"collection1" file_count:3193 delete_count:17 deleted_byte_count:2047576 replica_placement:100 version:3 modified_at_second:1615579316 - volume id:263 size:1077167352 collection:"collection2" file_count:20227 delete_count:4 deleted_byte_count:97887 replica_placement:100 version:3 modified_at_second:1614871567 - volume id:272 size:1076146040 collection:"collection2" file_count:21034 delete_count:2 deleted_byte_count:216564 replica_placement:100 version:3 modified_at_second:1614884139 - volume id:291 size:1076256760 collection:"collection2" file_count:28301 delete_count:5 deleted_byte_count:116027 replica_placement:100 version:3 modified_at_second:1614904924 - volume id:299 size:1075147824 collection:"collection2" file_count:22927 delete_count:4 deleted_byte_count:345569 replica_placement:100 version:3 modified_at_second:1614918454 - volume id:301 size:1074655600 collection:"collection2" file_count:22543 delete_count:6 deleted_byte_count:136968 replica_placement:100 version:3 modified_at_second:1614918378 - volume id:302 size:1077559792 collection:"collection2" file_count:23124 delete_count:7 deleted_byte_count:293111 replica_placement:100 version:3 modified_at_second:1614925500 - volume id:339 size:1078402392 collection:"collection2" file_count:22309 replica_placement:100 version:3 modified_at_second:1614969996 - volume id:345 size:1074560760 collection:"collection2" file_count:22117 delete_count:2 deleted_byte_count:373286 replica_placement:100 version:3 modified_at_second:1614977458 - volume id:355 size:1075239792 collection:"collection2" file_count:22244 delete_count:1 deleted_byte_count:23282 replica_placement:100 version:3 modified_at_second:1614992157 - volume id:373 size:1080928000 collection:"collection2" file_count:22617 delete_count:4 deleted_byte_count:91849 replica_placement:100 version:3 modified_at_second:1615016877 - Disk hdd total size:48630015544 file_count:537880 deleted_file:2580 deleted_bytes:929560253 - DataNode 192.168.1.4:8080 total size:48630015544 file_count:537880 deleted_file:2580 deleted_bytes:929560253 - Rack rack1 total size:48630015544 file_count:537880 deleted_file:2580 deleted_bytes:929560253 - Rack rack2 hdd(volume:36/190 active:36 free:154 remote:0) - DataNode 192.168.1.2:8080 hdd(volume:36/190 active:36 free:154 remote:0) - Disk hdd(volume:36/190 active:36 free:154 remote:0) - volume id:2 size:289228560 file_count:1640 delete_count:4 deleted_byte_count:480564 replica_placement:100 version:3 compact_revision:6 modified_at_second:1615630622 - volume id:3 size:308743136 file_count:1638 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632242 - volume id:4 size:285986968 file_count:1641 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632302 - volume id:6 size:302411024 file_count:1604 delete_count:2 deleted_byte_count:274587 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631402 - volume id:7 size:1924728 collection:"collection4" file_count:15 replica_placement:100 version:3 modified_at_second:1609331040 - volume id:9 size:77337416 collection:"collection3" file_count:58 replica_placement:100 version:3 ttl:772 modified_at_second:1615513762 - volume id:10 size:1212784656 collection:"collection0" file_count:58 replica_placement:100 version:3 modified_at_second:1609814550 - volume id:12 size:1110923848 collection:"collection0" file_count:45 replica_placement:100 version:3 modified_at_second:1609819732 - volume id:13 size:1184910656 collection:"collection0" file_count:47 replica_placement:100 version:3 modified_at_second:1609827837 - volume id:14 size:1107475720 collection:"collection0" file_count:80 delete_count:3 deleted_byte_count:6870 replica_placement:100 version:3 modified_at_second:1612956980 - volume id:16 size:1113666104 collection:"collection0" file_count:73 delete_count:5 deleted_byte_count:6318 replica_placement:100 version:3 modified_at_second:1612957007 - volume id:17 size:1095115800 collection:"collection0" file_count:83 delete_count:3 deleted_byte_count:7099 replica_placement:100 version:3 modified_at_second:1612957000 - volume id:21 size:1097631664 collection:"collection0" file_count:82 delete_count:11 deleted_byte_count:68985100 replica_placement:100 version:3 modified_at_second:1612957007 - volume id:56 size:1001897616 collection:"collection1" file_count:8762 delete_count:37 deleted_byte_count:65375405 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615632014 - volume id:81 size:880693104 collection:"collection1" file_count:7481 delete_count:236 deleted_byte_count:80386421 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615631396 - volume id:104 size:1076383624 collection:"collection1" file_count:7663 delete_count:184 deleted_byte_count:100728071 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615602658 - volume id:107 size:1073811840 collection:"collection1" file_count:7436 delete_count:168 deleted_byte_count:57747484 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615293569 - volume id:113 size:1076709184 collection:"collection1" file_count:9355 delete_count:177 deleted_byte_count:59796765 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615569822 - volume id:139 size:1074163936 collection:"collection1" file_count:9315 delete_count:42 deleted_byte_count:10630966 replica_placement:100 version:3 modified_at_second:1615571946 - volume id:151 size:1098659752 collection:"collection1" file_count:10808 delete_count:24 deleted_byte_count:7088102 replica_placement:100 version:3 modified_at_second:1615586389 - volume id:155 size:1075140688 collection:"collection1" file_count:10882 delete_count:32 deleted_byte_count:9076141 replica_placement:100 version:3 modified_at_second:1615606614 - volume id:167 size:1073958176 collection:"collection1" file_count:25229 delete_count:48 deleted_byte_count:25871565 replica_placement:100 version:3 modified_at_second:1615602669 - volume id:177 size:1074120216 collection:"collection1" file_count:22293 delete_count:16 deleted_byte_count:3803952 replica_placement:100 version:3 modified_at_second:1615516892 - volume id:179 size:1074313920 collection:"collection1" file_count:21829 delete_count:24 deleted_byte_count:45552859 replica_placement:100 version:3 modified_at_second:1615580308 - volume id:182 size:1076131280 collection:"collection1" file_count:31987 delete_count:21 deleted_byte_count:1452346 replica_placement:100 version:3 modified_at_second:1615568922 - volume id:215 size:1068268216 collection:"collection1" file_count:2813 delete_count:10 deleted_byte_count:5676795 replica_placement:100 version:3 modified_at_second:1615586386 - volume id:217 size:1075381872 collection:"collection1" file_count:3331 delete_count:14 deleted_byte_count:2009141 replica_placement:100 version:3 modified_at_second:1615401638 - volume id:283 size:1080178944 collection:"collection2" file_count:19462 delete_count:7 deleted_byte_count:660407 replica_placement:100 version:3 modified_at_second:1614896626 - volume id:303 size:1075944504 collection:"collection2" file_count:22541 delete_count:2 deleted_byte_count:13617 replica_placement:100 version:3 modified_at_second:1614925431 - volume id:309 size:1075178624 collection:"collection2" file_count:22692 delete_count:3 deleted_byte_count:171124 replica_placement:100 version:3 modified_at_second:1614931409 - volume id:323 size:1074608200 collection:"collection2" file_count:21605 delete_count:4 deleted_byte_count:172090 replica_placement:100 version:3 modified_at_second:1614950526 - volume id:344 size:1075035448 collection:"collection2" file_count:21765 delete_count:1 deleted_byte_count:24623 replica_placement:100 version:3 modified_at_second:1614977465 - volume id:347 size:1075145496 collection:"collection2" file_count:22178 delete_count:1 deleted_byte_count:79392 replica_placement:100 version:3 modified_at_second:1614984727 - volume id:357 size:1074276208 collection:"collection2" file_count:23137 delete_count:4 deleted_byte_count:188487 replica_placement:100 version:3 modified_at_second:1614998792 - volume id:380 size:1010760456 collection:"collection2" file_count:14921 delete_count:6 deleted_byte_count:65678 replica_placement:100 version:3 modified_at_second:1615632322 - volume id:381 size:939292792 collection:"collection2" file_count:14619 delete_count:2 deleted_byte_count:5119 replica_placement:100 version:3 modified_at_second:1615632324 - Disk hdd total size:33468194376 file_count:369168 deleted_file:1091 deleted_bytes:546337088 - DataNode 192.168.1.2:8080 total size:33468194376 file_count:369168 deleted_file:1091 deleted_bytes:546337088 - Rack rack2 total size:33468194376 file_count:369168 deleted_file:1091 deleted_bytes:546337088 - DataCenter dc2 total size:82098209920 file_count:907048 deleted_file:3671 deleted_bytes:1475897341 - DataCenter dc3 hdd(volume:108/1850 active:108 free:1742 remote:0) - Rack rack3 hdd(volume:108/1850 active:108 free:1742 remote:0) - DataNode 192.168.1.6:8080 hdd(volume:108/1850 active:108 free:1742 remote:0) - Disk hdd(volume:108/1850 active:108 free:1742 remote:0) - volume id:1 size:284685936 file_count:1557 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632062 - volume id:32 size:281390512 file_count:1496 delete_count:6 deleted_byte_count:546403 replica_placement:100 version:3 modified_at_second:1615632362 - volume id:47 size:444599784 collection:"collection1" file_count:709 delete_count:19 deleted_byte_count:11913451 replica_placement:100 version:3 modified_at_second:1615632397 - volume id:49 size:1078775288 collection:"collection1" file_count:9636 delete_count:22 deleted_byte_count:5625976 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630446 - volume id:68 size:898630584 collection:"collection1" file_count:6934 delete_count:95 deleted_byte_count:27460707 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632284 - volume id:88 size:1073767976 collection:"collection1" file_count:14995 delete_count:206 deleted_byte_count:81222360 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615629897 - volume id:202 size:1077533160 collection:"collection1" file_count:2847 delete_count:67 deleted_byte_count:65172985 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615588497 - volume id:203 size:1027316272 collection:"collection1" file_count:3040 delete_count:11 deleted_byte_count:3993230 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615631728 - volume id:205 size:1078485304 collection:"collection1" file_count:2869 delete_count:43 deleted_byte_count:18290259 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615579314 - volume id:206 size:1082045848 collection:"collection1" file_count:2979 delete_count:225 deleted_byte_count:88220074 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615564274 - volume id:209 size:1074083592 collection:"collection1" file_count:3238 delete_count:4 deleted_byte_count:1494244 replica_placement:100 version:3 modified_at_second:1615419954 - volume id:211 size:1080610712 collection:"collection1" file_count:3247 delete_count:7 deleted_byte_count:1891456 replica_placement:100 version:3 modified_at_second:1615269124 - volume id:212 size:1078293360 collection:"collection1" file_count:3106 delete_count:6 deleted_byte_count:2085755 replica_placement:100 version:3 modified_at_second:1615586387 - volume id:213 size:1093587976 collection:"collection1" file_count:3681 delete_count:12 deleted_byte_count:3138791 replica_placement:100 version:3 modified_at_second:1615586387 - volume id:214 size:1074486992 collection:"collection1" file_count:3217 delete_count:10 deleted_byte_count:6392871 replica_placement:100 version:3 modified_at_second:1615586383 - volume id:216 size:1080073496 collection:"collection1" file_count:3316 delete_count:4 deleted_byte_count:179819 replica_placement:100 version:3 modified_at_second:1615586387 - volume id:222 size:1106623104 collection:"collection1" file_count:3273 delete_count:11 deleted_byte_count:2114627 replica_placement:100 version:3 modified_at_second:1615586243 - volume id:223 size:1075233064 collection:"collection1" file_count:2966 delete_count:9 deleted_byte_count:744001 replica_placement:100 version:3 modified_at_second:1615586244 - volume id:227 size:1106699896 collection:"collection1" file_count:2827 delete_count:20 deleted_byte_count:5496790 replica_placement:100 version:3 modified_at_second:1615609989 - volume id:229 size:1109855312 collection:"collection1" file_count:2857 delete_count:22 deleted_byte_count:2839883 replica_placement:100 version:3 modified_at_second:1615609988 - volume id:230 size:1080722984 collection:"collection1" file_count:2898 delete_count:15 deleted_byte_count:3929261 replica_placement:100 version:3 modified_at_second:1615610537 - volume id:231 size:1112917696 collection:"collection1" file_count:3151 delete_count:20 deleted_byte_count:2989828 replica_placement:100 version:3 modified_at_second:1615611350 - volume id:233 size:1080526464 collection:"collection1" file_count:3136 delete_count:61 deleted_byte_count:17991717 replica_placement:100 version:3 modified_at_second:1615611352 - volume id:234 size:1073835280 collection:"collection1" file_count:2965 delete_count:41 deleted_byte_count:4960354 replica_placement:100 version:3 modified_at_second:1615611351 - volume id:235 size:1075586104 collection:"collection1" file_count:2767 delete_count:33 deleted_byte_count:3216540 replica_placement:100 version:3 modified_at_second:1615611354 - volume id:237 size:375722792 collection:"collection1" file_count:736 delete_count:16 deleted_byte_count:4464870 replica_placement:100 version:3 modified_at_second:1615631727 - volume id:239 size:426569024 collection:"collection1" file_count:693 delete_count:19 deleted_byte_count:13020783 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630838 - volume id:241 size:380217424 collection:"collection1" file_count:633 delete_count:6 deleted_byte_count:1715768 replica_placement:100 version:3 modified_at_second:1615632006 - volume id:244 size:1080295352 collection:"collection2" file_count:10812 delete_count:1 deleted_byte_count:795 replica_placement:100 version:3 modified_at_second:1614852171 - volume id:245 size:1074597056 collection:"collection2" file_count:10371 delete_count:3 deleted_byte_count:209701 replica_placement:100 version:3 modified_at_second:1614852093 - volume id:246 size:1075998648 collection:"collection2" file_count:10365 delete_count:1 deleted_byte_count:13112 replica_placement:100 version:3 modified_at_second:1614852105 - volume id:248 size:1084301184 collection:"collection2" file_count:11217 delete_count:4 deleted_byte_count:746488 replica_placement:100 version:3 modified_at_second:1614856285 - volume id:249 size:1074819136 collection:"collection2" file_count:10763 delete_count:2 deleted_byte_count:271699 replica_placement:100 version:3 modified_at_second:1614856230 - volume id:251 size:1075684488 collection:"collection2" file_count:10847 replica_placement:100 version:3 modified_at_second:1614856270 - volume id:252 size:1075065208 collection:"collection2" file_count:14622 delete_count:2 deleted_byte_count:5228 replica_placement:100 version:3 modified_at_second:1614861196 - volume id:253 size:1087328816 collection:"collection2" file_count:14920 delete_count:3 deleted_byte_count:522994 replica_placement:100 version:3 modified_at_second:1614861255 - volume id:255 size:1079581640 collection:"collection2" file_count:14877 delete_count:3 deleted_byte_count:101223 replica_placement:100 version:3 modified_at_second:1614861233 - volume id:256 size:1074283592 collection:"collection2" file_count:14157 delete_count:1 deleted_byte_count:18156 replica_placement:100 version:3 modified_at_second:1614861100 - volume id:258 size:1075527216 collection:"collection2" file_count:18421 delete_count:4 deleted_byte_count:267833 replica_placement:100 version:3 modified_at_second:1614866420 - volume id:259 size:1075507776 collection:"collection2" file_count:18079 delete_count:2 deleted_byte_count:71992 replica_placement:100 version:3 modified_at_second:1614866381 - volume id:264 size:1081624192 collection:"collection2" file_count:21151 replica_placement:100 version:3 modified_at_second:1614871629 - volume id:265 size:1076401104 collection:"collection2" file_count:19932 delete_count:2 deleted_byte_count:160823 replica_placement:100 version:3 modified_at_second:1615629130 - volume id:266 size:1075617464 collection:"collection2" file_count:20075 delete_count:1 deleted_byte_count:1039 replica_placement:100 version:3 modified_at_second:1614871526 - volume id:267 size:1075699544 collection:"collection2" file_count:21039 delete_count:3 deleted_byte_count:59956 replica_placement:100 version:3 modified_at_second:1614877294 - volume id:268 size:1074490592 collection:"collection2" file_count:21698 delete_count:1 deleted_byte_count:33968 replica_placement:100 version:3 modified_at_second:1614877434 - volume id:269 size:1077552872 collection:"collection2" file_count:21875 delete_count:4 deleted_byte_count:347272 replica_placement:100 version:3 modified_at_second:1614877481 - volume id:270 size:1076876568 collection:"collection2" file_count:22057 delete_count:1 deleted_byte_count:43916 replica_placement:100 version:3 modified_at_second:1614877469 - volume id:275 size:1078349024 collection:"collection2" file_count:20808 delete_count:1 deleted_byte_count:1118 replica_placement:100 version:3 modified_at_second:1614884147 - volume id:277 size:1074956288 collection:"collection2" file_count:19260 delete_count:2 deleted_byte_count:172356 replica_placement:100 version:3 modified_at_second:1614889988 - volume id:278 size:1078798640 collection:"collection2" file_count:20597 delete_count:5 deleted_byte_count:400060 replica_placement:100 version:3 modified_at_second:1614890292 - volume id:279 size:1077325040 collection:"collection2" file_count:19671 delete_count:6 deleted_byte_count:379116 replica_placement:100 version:3 modified_at_second:1614890229 - volume id:280 size:1077432216 collection:"collection2" file_count:20286 delete_count:1 deleted_byte_count:879 replica_placement:100 version:3 modified_at_second:1614890262 - volume id:281 size:1077581096 collection:"collection2" file_count:20206 delete_count:3 deleted_byte_count:143964 replica_placement:100 version:3 modified_at_second:1614890237 - volume id:284 size:1074533384 collection:"collection2" file_count:22196 delete_count:4 deleted_byte_count:154683 replica_placement:100 version:3 modified_at_second:1614897231 - volume id:285 size:1082128688 collection:"collection2" file_count:21804 delete_count:1 deleted_byte_count:1064 replica_placement:100 version:3 modified_at_second:1614897165 - volume id:289 size:1075284256 collection:"collection2" file_count:29342 delete_count:5 deleted_byte_count:100454 replica_placement:100 version:3 modified_at_second:1614904977 - volume id:290 size:1074723792 collection:"collection2" file_count:28340 delete_count:4 deleted_byte_count:199064 replica_placement:100 version:3 modified_at_second:1614904924 - volume id:291 size:1076256768 collection:"collection2" file_count:28301 delete_count:5 deleted_byte_count:116027 replica_placement:100 version:3 modified_at_second:1614904924 - volume id:293 size:1075409792 collection:"collection2" file_count:26063 delete_count:4 deleted_byte_count:183834 replica_placement:100 version:3 modified_at_second:1614912235 - volume id:294 size:1075444048 collection:"collection2" file_count:26076 delete_count:4 deleted_byte_count:194914 replica_placement:100 version:3 modified_at_second:1614912220 - volume id:296 size:1077824032 collection:"collection2" file_count:26741 delete_count:4 deleted_byte_count:199906 replica_placement:100 version:3 modified_at_second:1614912301 - volume id:297 size:1080229136 collection:"collection2" file_count:23409 delete_count:5 deleted_byte_count:46268 replica_placement:100 version:3 modified_at_second:1614918481 - volume id:298 size:1075410136 collection:"collection2" file_count:23222 delete_count:2 deleted_byte_count:46110 replica_placement:100 version:3 modified_at_second:1614918474 - volume id:299 size:1075147936 collection:"collection2" file_count:22927 delete_count:4 deleted_byte_count:345569 replica_placement:100 version:3 modified_at_second:1614918455 - volume id:300 size:1076212392 collection:"collection2" file_count:22892 delete_count:2 deleted_byte_count:61320 replica_placement:100 version:3 modified_at_second:1614918464 - volume id:301 size:1074655600 collection:"collection2" file_count:22543 delete_count:6 deleted_byte_count:136968 replica_placement:100 version:3 modified_at_second:1614918378 - volume id:303 size:1075944480 collection:"collection2" file_count:22541 delete_count:2 deleted_byte_count:13617 replica_placement:100 version:3 modified_at_second:1614925431 - volume id:306 size:1074764016 collection:"collection2" file_count:22939 replica_placement:100 version:3 modified_at_second:1614925462 - volume id:307 size:1076568000 collection:"collection2" file_count:23377 delete_count:2 deleted_byte_count:25453 replica_placement:100 version:3 modified_at_second:1614931448 - volume id:308 size:1074022392 collection:"collection2" file_count:23086 delete_count:2 deleted_byte_count:2127 replica_placement:100 version:3 modified_at_second:1614931401 - volume id:309 size:1075178664 collection:"collection2" file_count:22692 delete_count:3 deleted_byte_count:171124 replica_placement:100 version:3 modified_at_second:1614931409 - volume id:310 size:1074761528 collection:"collection2" file_count:21441 delete_count:3 deleted_byte_count:13934 replica_placement:100 version:3 modified_at_second:1614931077 - volume id:314 size:1074670840 collection:"collection2" file_count:20964 delete_count:4 deleted_byte_count:304291 replica_placement:100 version:3 modified_at_second:1614937441 - volume id:315 size:1084153544 collection:"collection2" file_count:23638 delete_count:2 deleted_byte_count:53956 replica_placement:100 version:3 modified_at_second:1614937885 - volume id:317 size:1076215096 collection:"collection2" file_count:23572 delete_count:2 deleted_byte_count:1441356 replica_placement:100 version:3 modified_at_second:1614943965 - volume id:318 size:1075965168 collection:"collection2" file_count:22459 delete_count:2 deleted_byte_count:37778 replica_placement:100 version:3 modified_at_second:1614943862 - volume id:319 size:1073952880 collection:"collection2" file_count:22286 delete_count:2 deleted_byte_count:43421 replica_placement:100 version:3 modified_at_second:1614943810 - volume id:320 size:1082437792 collection:"collection2" file_count:21544 delete_count:3 deleted_byte_count:16712 replica_placement:100 version:3 modified_at_second:1614943599 - volume id:321 size:1081477904 collection:"collection2" file_count:23531 delete_count:5 deleted_byte_count:262564 replica_placement:100 version:3 modified_at_second:1614943982 - volume id:324 size:1075606680 collection:"collection2" file_count:20799 delete_count:1 deleted_byte_count:251210 replica_placement:100 version:3 modified_at_second:1614950310 - volume id:325 size:1080701144 collection:"collection2" file_count:21735 replica_placement:100 version:3 modified_at_second:1614950525 - volume id:330 size:1080825832 collection:"collection2" file_count:22464 delete_count:2 deleted_byte_count:15771 replica_placement:100 version:3 modified_at_second:1614956477 - volume id:332 size:1075569928 collection:"collection2" file_count:22097 delete_count:3 deleted_byte_count:98273 replica_placement:100 version:3 modified_at_second:1614962869 - volume id:334 size:1075607880 collection:"collection2" file_count:22546 delete_count:6 deleted_byte_count:101538 replica_placement:100 version:3 modified_at_second:1614962978 - volume id:336 size:1087853056 collection:"collection2" file_count:22801 delete_count:2 deleted_byte_count:26394 replica_placement:100 version:3 modified_at_second:1614963005 - volume id:337 size:1075646784 collection:"collection2" file_count:21934 delete_count:1 deleted_byte_count:3397 replica_placement:100 version:3 modified_at_second:1614969937 - volume id:338 size:1076118304 collection:"collection2" file_count:21680 replica_placement:100 version:3 modified_at_second:1614969850 - volume id:340 size:1079462184 collection:"collection2" file_count:22319 delete_count:4 deleted_byte_count:93620 replica_placement:100 version:3 modified_at_second:1614969978 - volume id:341 size:1074448400 collection:"collection2" file_count:21590 delete_count:5 deleted_byte_count:160085 replica_placement:100 version:3 modified_at_second:1614969858 - volume id:342 size:1080186424 collection:"collection2" file_count:22405 delete_count:4 deleted_byte_count:64819 replica_placement:100 version:3 modified_at_second:1614977521 - volume id:344 size:1075035416 collection:"collection2" file_count:21765 delete_count:1 deleted_byte_count:24623 replica_placement:100 version:3 modified_at_second:1614977465 - volume id:345 size:1074560760 collection:"collection2" file_count:22117 delete_count:2 deleted_byte_count:373286 replica_placement:100 version:3 modified_at_second:1614977457 - volume id:346 size:1076464112 collection:"collection2" file_count:22320 delete_count:4 deleted_byte_count:798258 replica_placement:100 version:3 modified_at_second:1615631322 - volume id:348 size:1080623640 collection:"collection2" file_count:21667 delete_count:1 deleted_byte_count:2443 replica_placement:100 version:3 modified_at_second:1614984606 - volume id:350 size:1074756688 collection:"collection2" file_count:21990 delete_count:3 deleted_byte_count:233881 replica_placement:100 version:3 modified_at_second:1614984682 - volume id:351 size:1078795112 collection:"collection2" file_count:23660 delete_count:3 deleted_byte_count:102141 replica_placement:100 version:3 modified_at_second:1614984816 - volume id:352 size:1077145936 collection:"collection2" file_count:22066 delete_count:1 deleted_byte_count:1018 replica_placement:100 version:3 modified_at_second:1614992130 - volume id:353 size:1074897496 collection:"collection2" file_count:21266 delete_count:2 deleted_byte_count:3105374 replica_placement:100 version:3 modified_at_second:1614991951 - volume id:355 size:1075239728 collection:"collection2" file_count:22244 delete_count:1 deleted_byte_count:23282 replica_placement:100 version:3 modified_at_second:1614992157 - volume id:356 size:1083305048 collection:"collection2" file_count:21552 delete_count:4 deleted_byte_count:14472 replica_placement:100 version:3 modified_at_second:1614992028 - volume id:358 size:1085152368 collection:"collection2" file_count:23756 delete_count:3 deleted_byte_count:44531 replica_placement:100 version:3 modified_at_second:1614998824 - volume id:360 size:1075532456 collection:"collection2" file_count:22574 delete_count:3 deleted_byte_count:1774776 replica_placement:100 version:3 modified_at_second:1614998770 - volume id:361 size:1075362744 collection:"collection2" file_count:22272 delete_count:1 deleted_byte_count:3497 replica_placement:100 version:3 modified_at_second:1614998668 - volume id:375 size:1076140568 collection:"collection2" file_count:21880 delete_count:2 deleted_byte_count:51103 replica_placement:100 version:3 modified_at_second:1615016787 - volume id:376 size:1074845944 collection:"collection2" file_count:22908 delete_count:4 deleted_byte_count:432305 replica_placement:100 version:3 modified_at_second:1615016916 - volume id:377 size:957284144 collection:"collection2" file_count:14923 delete_count:1 deleted_byte_count:1797 replica_placement:100 version:3 modified_at_second:1615632323 - volume id:378 size:959273936 collection:"collection2" file_count:15027 delete_count:4 deleted_byte_count:231414 replica_placement:100 version:3 modified_at_second:1615632323 - volume id:381 size:939261032 collection:"collection2" file_count:14615 delete_count:5 deleted_byte_count:1192272 replica_placement:100 version:3 modified_at_second:1615632324 - Disk hdd total size:111617646696 file_count:1762773 deleted_file:1221 deleted_bytes:398484585 - DataNode 192.168.1.6:8080 total size:111617646696 file_count:1762773 deleted_file:1221 deleted_bytes:398484585 - Rack rack3 total size:111617646696 file_count:1762773 deleted_file:1221 deleted_bytes:398484585 - DataCenter dc3 total size:111617646696 file_count:1762773 deleted_file:1221 deleted_bytes:398484585 - DataCenter dc4 hdd(volume:267/2000 active:267 free:1733 remote:0) - Rack DefaultRack hdd(volume:267/2000 active:267 free:1733 remote:0) - DataNode 192.168.1.1:8080 hdd(volume:267/2000 active:267 free:1733 remote:0) - Disk hdd(volume:267/2000 active:267 free:1733 remote:0) - volume id:1 size:284693256 file_count:1558 delete_count:2 deleted_byte_count:4818 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632062 - volume id:2 size:289228560 file_count:1640 delete_count:4 deleted_byte_count:464508 replica_placement:100 version:3 compact_revision:6 modified_at_second:1615630622 - volume id:3 size:308741952 file_count:1637 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632242 - volume id:4 size:285986968 file_count:1640 delete_count:1 deleted_byte_count:145095 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632302 - volume id:5 size:293806008 file_count:1669 delete_count:2 deleted_byte_count:274334 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631342 - volume id:6 size:302411024 file_count:1604 delete_count:2 deleted_byte_count:274587 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631402 - volume id:7 size:1924728 collection:"collection4" file_count:15 replica_placement:100 version:3 modified_at_second:1609331040 - volume id:9 size:77337416 collection:"collection3" file_count:58 replica_placement:100 version:3 ttl:772 modified_at_second:1615513762 - volume id:10 size:1212784656 collection:"collection0" file_count:58 replica_placement:100 version:3 modified_at_second:1609814543 - volume id:11 size:1109224552 collection:"collection0" file_count:44 replica_placement:100 version:3 modified_at_second:1609815123 - volume id:12 size:1110923848 collection:"collection0" file_count:45 replica_placement:100 version:3 modified_at_second:1609819726 - volume id:13 size:1184910656 collection:"collection0" file_count:47 replica_placement:100 version:3 modified_at_second:1609827832 - volume id:14 size:1107475720 collection:"collection0" file_count:80 delete_count:3 deleted_byte_count:6870 replica_placement:100 version:3 modified_at_second:1612956983 - volume id:15 size:1115965160 collection:"collection0" file_count:83 delete_count:3 deleted_byte_count:4956 replica_placement:100 version:3 modified_at_second:1612957001 - volume id:16 size:1113666048 collection:"collection0" file_count:73 delete_count:5 deleted_byte_count:6318 replica_placement:100 version:3 modified_at_second:1612957007 - volume id:17 size:1095115800 collection:"collection0" file_count:83 delete_count:3 deleted_byte_count:7099 replica_placement:100 version:3 modified_at_second:1612957000 - volume id:18 size:1096678688 collection:"collection0" file_count:88 delete_count:4 deleted_byte_count:8633 replica_placement:100 version:3 modified_at_second:1612957000 - volume id:19 size:1096923792 collection:"collection0" file_count:100 delete_count:10 deleted_byte_count:75779917 replica_placement:100 version:3 compact_revision:4 modified_at_second:1612957011 - volume id:20 size:1074760432 collection:"collection0" file_count:82 delete_count:5 deleted_byte_count:12156 replica_placement:100 version:3 compact_revision:2 modified_at_second:1612957011 - volume id:22 size:1086828368 collection:"collection0" file_count:75 delete_count:3 deleted_byte_count:5551 replica_placement:100 version:3 modified_at_second:1612957007 - volume id:23 size:1076380280 collection:"collection0" file_count:68 delete_count:2 deleted_byte_count:2910 replica_placement:100 version:3 modified_at_second:1612957011 - volume id:24 size:1074139808 collection:"collection0" file_count:90 delete_count:1 deleted_byte_count:1977 replica_placement:100 version:3 modified_at_second:1612957011 - volume id:25 size:690757544 collection:"collection0" file_count:38 delete_count:1 deleted_byte_count:1944 replica_placement:100 version:3 modified_at_second:1612956995 - volume id:26 size:532657632 collection:"collection0" file_count:100 delete_count:4 deleted_byte_count:9081 replica_placement:100 version:3 modified_at_second:1614170023 - volume id:34 size:1077111136 collection:"collection1" file_count:9781 delete_count:110 deleted_byte_count:20894827 replica_placement:100 version:3 modified_at_second:1615619366 - volume id:35 size:1075241656 collection:"collection1" file_count:10523 delete_count:96 deleted_byte_count:46618989 replica_placement:100 version:3 modified_at_second:1615618790 - volume id:36 size:1075118360 collection:"collection1" file_count:10342 delete_count:116 deleted_byte_count:25493106 replica_placement:100 version:3 modified_at_second:1615606148 - volume id:37 size:1075895584 collection:"collection1" file_count:12013 delete_count:98 deleted_byte_count:50747932 replica_placement:100 version:3 modified_at_second:1615594777 - volume id:39 size:1076606536 collection:"collection1" file_count:12612 delete_count:78 deleted_byte_count:17462730 replica_placement:100 version:3 modified_at_second:1615611959 - volume id:40 size:1075358552 collection:"collection1" file_count:12597 delete_count:62 deleted_byte_count:11657901 replica_placement:100 version:3 modified_at_second:1615612994 - volume id:41 size:1076283528 collection:"collection1" file_count:12088 delete_count:84 deleted_byte_count:19319268 replica_placement:100 version:3 modified_at_second:1615596736 - volume id:42 size:1093948352 collection:"collection1" file_count:7889 delete_count:47 deleted_byte_count:5697275 replica_placement:100 version:3 modified_at_second:1615548908 - volume id:43 size:1116445864 collection:"collection1" file_count:7358 delete_count:54 deleted_byte_count:9534379 replica_placement:100 version:3 modified_at_second:1615566170 - volume id:44 size:1077582560 collection:"collection1" file_count:7295 delete_count:50 deleted_byte_count:12618414 replica_placement:100 version:3 modified_at_second:1615566170 - volume id:45 size:1075254640 collection:"collection1" file_count:10772 delete_count:76 deleted_byte_count:22426345 replica_placement:100 version:3 modified_at_second:1615573499 - volume id:46 size:1075286056 collection:"collection1" file_count:9947 delete_count:309 deleted_byte_count:105601163 replica_placement:100 version:3 modified_at_second:1615569826 - volume id:48 size:1076778720 collection:"collection1" file_count:9850 delete_count:77 deleted_byte_count:16641907 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630690 - volume id:50 size:1076688224 collection:"collection1" file_count:7921 delete_count:26 deleted_byte_count:5162032 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615610879 - volume id:52 size:1083529704 collection:"collection1" file_count:10128 delete_count:32 deleted_byte_count:10608391 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615599195 - volume id:53 size:1063089216 collection:"collection1" file_count:9832 delete_count:31 deleted_byte_count:9273066 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632156 - volume id:55 size:1012890016 collection:"collection1" file_count:8651 delete_count:27 deleted_byte_count:9418841 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631452 - volume id:57 size:839849792 collection:"collection1" file_count:7514 delete_count:24 deleted_byte_count:6228543 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631774 - volume id:58 size:908064200 collection:"collection1" file_count:8128 delete_count:21 deleted_byte_count:6113731 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632342 - volume id:59 size:988302272 collection:"collection1" file_count:8098 delete_count:20 deleted_byte_count:3947615 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632238 - volume id:60 size:1010702480 collection:"collection1" file_count:8969 delete_count:79 deleted_byte_count:24782814 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615632439 - volume id:61 size:975604488 collection:"collection1" file_count:8683 delete_count:20 deleted_byte_count:10276072 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615631176 - volume id:62 size:873845936 collection:"collection1" file_count:7897 delete_count:23 deleted_byte_count:10920170 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631133 - volume id:64 size:965638488 collection:"collection1" file_count:8218 delete_count:27 deleted_byte_count:6922489 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631031 - volume id:65 size:823283552 collection:"collection1" file_count:7834 delete_count:29 deleted_byte_count:5950610 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632306 - volume id:66 size:821343440 collection:"collection1" file_count:7383 delete_count:29 deleted_byte_count:12010343 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631968 - volume id:67 size:878713872 collection:"collection1" file_count:7299 delete_count:117 deleted_byte_count:24857326 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632156 - volume id:68 size:898630584 collection:"collection1" file_count:6934 delete_count:95 deleted_byte_count:27460707 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632284 - volume id:70 size:886695472 collection:"collection1" file_count:7769 delete_count:164 deleted_byte_count:45162513 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632398 - volume id:71 size:907608392 collection:"collection1" file_count:7658 delete_count:122 deleted_byte_count:27622941 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632307 - volume id:72 size:903990720 collection:"collection1" file_count:6996 delete_count:240 deleted_byte_count:74147727 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630982 - volume id:73 size:929047664 collection:"collection1" file_count:7038 delete_count:227 deleted_byte_count:65336664 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630707 - volume id:74 size:957046128 collection:"collection1" file_count:6981 delete_count:259 deleted_byte_count:73080838 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615631460 - volume id:75 size:908044992 collection:"collection1" file_count:6911 delete_count:268 deleted_byte_count:73934373 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632430 - volume id:76 size:985296744 collection:"collection1" file_count:6566 delete_count:61 deleted_byte_count:44464430 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632284 - volume id:77 size:929398296 collection:"collection1" file_count:7427 delete_count:238 deleted_byte_count:59581579 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632013 - volume id:78 size:1075671512 collection:"collection1" file_count:7540 delete_count:258 deleted_byte_count:71726846 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615582829 - volume id:79 size:948225472 collection:"collection1" file_count:6997 delete_count:227 deleted_byte_count:60625763 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631326 - volume id:82 size:1041661800 collection:"collection1" file_count:7043 delete_count:207 deleted_byte_count:52275724 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632430 - volume id:83 size:936195856 collection:"collection1" file_count:7593 delete_count:13 deleted_byte_count:4633917 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632029 - volume id:85 size:1023867520 collection:"collection1" file_count:7787 delete_count:240 deleted_byte_count:82091742 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631723 - volume id:86 size:1009437488 collection:"collection1" file_count:8474 delete_count:236 deleted_byte_count:64543674 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630812 - volume id:87 size:922276640 collection:"collection1" file_count:12902 delete_count:13 deleted_byte_count:3412959 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632438 - volume id:89 size:1044401976 collection:"collection1" file_count:14943 delete_count:243 deleted_byte_count:58543159 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632208 - volume id:90 size:891145784 collection:"collection1" file_count:14608 delete_count:10 deleted_byte_count:2564369 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615629390 - volume id:91 size:936572832 collection:"collection1" file_count:14686 delete_count:11 deleted_byte_count:4717727 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631851 - volume id:92 size:992440712 collection:"collection1" file_count:7061 delete_count:195 deleted_byte_count:60649573 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630566 - volume id:93 size:1079603768 collection:"collection1" file_count:7878 delete_count:270 deleted_byte_count:74150048 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615556015 - volume id:94 size:1030685824 collection:"collection1" file_count:7660 delete_count:207 deleted_byte_count:70150733 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631616 - volume id:95 size:990879168 collection:"collection1" file_count:6620 delete_count:206 deleted_byte_count:60363604 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615631866 - volume id:96 size:989296136 collection:"collection1" file_count:7544 delete_count:229 deleted_byte_count:59931853 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630778 - volume id:97 size:1053112992 collection:"collection1" file_count:6789 delete_count:50 deleted_byte_count:38894001 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631194 - volume id:99 size:1071718504 collection:"collection1" file_count:7470 delete_count:8 deleted_byte_count:9624950 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631175 - volume id:100 size:1083617440 collection:"collection1" file_count:7018 delete_count:187 deleted_byte_count:61304236 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615505917 - volume id:101 size:1077109520 collection:"collection1" file_count:7706 delete_count:226 deleted_byte_count:77864841 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630994 - volume id:102 size:1074359920 collection:"collection1" file_count:7338 delete_count:7 deleted_byte_count:6499151 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615626683 - volume id:103 size:1075863904 collection:"collection1" file_count:7184 delete_count:186 deleted_byte_count:58872238 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615628417 - volume id:104 size:1076383768 collection:"collection1" file_count:7663 delete_count:184 deleted_byte_count:100578087 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615602661 - volume id:105 size:1073996824 collection:"collection1" file_count:6873 delete_count:19 deleted_byte_count:14271533 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615499756 - volume id:108 size:1074648024 collection:"collection1" file_count:7472 delete_count:194 deleted_byte_count:70864699 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615593232 - volume id:109 size:1075254560 collection:"collection1" file_count:7556 delete_count:263 deleted_byte_count:55155265 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615502487 - volume id:110 size:1076575744 collection:"collection1" file_count:6996 delete_count:163 deleted_byte_count:52954032 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615590786 - volume id:111 size:1073826232 collection:"collection1" file_count:7355 delete_count:155 deleted_byte_count:50083578 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615593233 - volume id:114 size:1074762784 collection:"collection1" file_count:8802 delete_count:156 deleted_byte_count:38470055 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615591826 - volume id:115 size:1076192240 collection:"collection1" file_count:7690 delete_count:154 deleted_byte_count:32267193 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615285295 - volume id:116 size:1074489504 collection:"collection1" file_count:9981 delete_count:174 deleted_byte_count:53998777 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615611567 - volume id:117 size:1073917192 collection:"collection1" file_count:9520 delete_count:114 deleted_byte_count:21835126 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615573714 - volume id:118 size:1074064400 collection:"collection1" file_count:8738 delete_count:15 deleted_byte_count:3460697 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615516265 - volume id:119 size:1075940104 collection:"collection1" file_count:9003 delete_count:12 deleted_byte_count:9128155 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615573880 - volume id:120 size:1076115928 collection:"collection1" file_count:9639 delete_count:118 deleted_byte_count:33357871 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615482567 - volume id:121 size:1078803248 collection:"collection1" file_count:10113 delete_count:441 deleted_byte_count:94128627 replica_placement:100 version:3 modified_at_second:1615506629 - volume id:122 size:1076235312 collection:"collection1" file_count:9106 delete_count:252 deleted_byte_count:93041272 replica_placement:100 version:3 modified_at_second:1615585913 - volume id:123 size:1080491112 collection:"collection1" file_count:10623 delete_count:302 deleted_byte_count:83956998 replica_placement:100 version:3 modified_at_second:1615585916 - volume id:124 size:1074519360 collection:"collection1" file_count:9457 delete_count:286 deleted_byte_count:74752459 replica_placement:100 version:3 modified_at_second:1615585916 - volume id:125 size:1088687040 collection:"collection1" file_count:9518 delete_count:281 deleted_byte_count:76037905 replica_placement:100 version:3 modified_at_second:1615585913 - volume id:126 size:1073867464 collection:"collection1" file_count:9320 delete_count:278 deleted_byte_count:94547424 replica_placement:100 version:3 modified_at_second:1615585912 - volume id:127 size:1074907336 collection:"collection1" file_count:9900 delete_count:133 deleted_byte_count:48570820 replica_placement:100 version:3 modified_at_second:1615612991 - volume id:129 size:1074704272 collection:"collection1" file_count:10012 delete_count:150 deleted_byte_count:64491721 replica_placement:100 version:3 modified_at_second:1615627566 - volume id:130 size:1075000632 collection:"collection1" file_count:10633 delete_count:161 deleted_byte_count:34768201 replica_placement:100 version:3 modified_at_second:1615582330 - volume id:131 size:1075279584 collection:"collection1" file_count:10075 delete_count:135 deleted_byte_count:29795712 replica_placement:100 version:3 modified_at_second:1615523898 - volume id:132 size:1088539496 collection:"collection1" file_count:11051 delete_count:71 deleted_byte_count:17178322 replica_placement:100 version:3 modified_at_second:1615619584 - volume id:133 size:1075952760 collection:"collection1" file_count:9538 delete_count:74 deleted_byte_count:19558008 replica_placement:100 version:3 modified_at_second:1615584780 - volume id:134 size:1074367304 collection:"collection1" file_count:10662 delete_count:69 deleted_byte_count:25530139 replica_placement:100 version:3 modified_at_second:1615555876 - volume id:135 size:1073906720 collection:"collection1" file_count:10446 delete_count:71 deleted_byte_count:28599975 replica_placement:100 version:3 modified_at_second:1615569816 - volume id:137 size:1074309264 collection:"collection1" file_count:9633 delete_count:50 deleted_byte_count:27487972 replica_placement:100 version:3 modified_at_second:1615572231 - volume id:139 size:1074163936 collection:"collection1" file_count:9314 delete_count:43 deleted_byte_count:10631353 replica_placement:100 version:3 modified_at_second:1615571946 - volume id:141 size:1074619488 collection:"collection1" file_count:9840 delete_count:45 deleted_byte_count:40890181 replica_placement:100 version:3 modified_at_second:1615630994 - volume id:142 size:1075732992 collection:"collection1" file_count:9009 delete_count:48 deleted_byte_count:9912854 replica_placement:100 version:3 modified_at_second:1615598914 - volume id:143 size:1075011280 collection:"collection1" file_count:9608 delete_count:51 deleted_byte_count:37282460 replica_placement:100 version:3 modified_at_second:1615488586 - volume id:145 size:1074394928 collection:"collection1" file_count:9255 delete_count:34 deleted_byte_count:38011392 replica_placement:100 version:3 modified_at_second:1615591825 - volume id:146 size:1076337520 collection:"collection1" file_count:10492 delete_count:50 deleted_byte_count:17071505 replica_placement:100 version:3 modified_at_second:1615632005 - volume id:147 size:1077130544 collection:"collection1" file_count:10451 delete_count:27 deleted_byte_count:8290907 replica_placement:100 version:3 modified_at_second:1615604117 - volume id:148 size:1076066568 collection:"collection1" file_count:9547 delete_count:33 deleted_byte_count:7034089 replica_placement:100 version:3 modified_at_second:1615586393 - volume id:149 size:1074989016 collection:"collection1" file_count:8352 delete_count:35 deleted_byte_count:7179742 replica_placement:100 version:3 modified_at_second:1615494496 - volume id:150 size:1076290408 collection:"collection1" file_count:9328 delete_count:33 deleted_byte_count:43417791 replica_placement:100 version:3 modified_at_second:1615611569 - volume id:151 size:1098659752 collection:"collection1" file_count:10805 delete_count:27 deleted_byte_count:7209106 replica_placement:100 version:3 modified_at_second:1615586390 - volume id:152 size:1075941376 collection:"collection1" file_count:9951 delete_count:36 deleted_byte_count:25348335 replica_placement:100 version:3 modified_at_second:1615606614 - volume id:153 size:1078539784 collection:"collection1" file_count:10924 delete_count:34 deleted_byte_count:12603081 replica_placement:100 version:3 modified_at_second:1615606614 - volume id:154 size:1081244752 collection:"collection1" file_count:11002 delete_count:31 deleted_byte_count:8467560 replica_placement:100 version:3 modified_at_second:1615478471 - volume id:156 size:1074975832 collection:"collection1" file_count:9535 delete_count:40 deleted_byte_count:11426621 replica_placement:100 version:3 modified_at_second:1615628342 - volume id:157 size:1076758536 collection:"collection1" file_count:10012 delete_count:19 deleted_byte_count:11688737 replica_placement:100 version:3 modified_at_second:1615597782 - volume id:158 size:1087251976 collection:"collection1" file_count:9972 delete_count:20 deleted_byte_count:10328429 replica_placement:100 version:3 modified_at_second:1615588879 - volume id:159 size:1074132336 collection:"collection1" file_count:9382 delete_count:27 deleted_byte_count:11474574 replica_placement:100 version:3 modified_at_second:1615593593 - volume id:160 size:1075680976 collection:"collection1" file_count:9772 delete_count:22 deleted_byte_count:4981968 replica_placement:100 version:3 modified_at_second:1615597782 - volume id:161 size:1077397136 collection:"collection1" file_count:9988 delete_count:28 deleted_byte_count:12509164 replica_placement:100 version:3 modified_at_second:1615631452 - volume id:162 size:1074286880 collection:"collection1" file_count:11220 delete_count:17 deleted_byte_count:1815547 replica_placement:100 version:3 modified_at_second:1615478127 - volume id:163 size:1074457224 collection:"collection1" file_count:12524 delete_count:27 deleted_byte_count:6359619 replica_placement:100 version:3 modified_at_second:1615579313 - volume id:164 size:1074261256 collection:"collection1" file_count:11922 delete_count:25 deleted_byte_count:2923288 replica_placement:100 version:3 modified_at_second:1615620085 - volume id:165 size:1073891080 collection:"collection1" file_count:9152 delete_count:12 deleted_byte_count:19164659 replica_placement:100 version:3 modified_at_second:1615471910 - volume id:166 size:1075637536 collection:"collection1" file_count:14211 delete_count:24 deleted_byte_count:20415490 replica_placement:100 version:3 modified_at_second:1615491021 - volume id:167 size:1073958280 collection:"collection1" file_count:25231 delete_count:48 deleted_byte_count:26022344 replica_placement:100 version:3 modified_at_second:1615620014 - volume id:168 size:1074718864 collection:"collection1" file_count:25702 delete_count:40 deleted_byte_count:4024775 replica_placement:100 version:3 modified_at_second:1615585664 - volume id:169 size:1073863032 collection:"collection1" file_count:25248 delete_count:43 deleted_byte_count:3013817 replica_placement:100 version:3 modified_at_second:1615569832 - volume id:170 size:1075747088 collection:"collection1" file_count:24596 delete_count:41 deleted_byte_count:3494711 replica_placement:100 version:3 modified_at_second:1615579207 - volume id:171 size:1081881400 collection:"collection1" file_count:24215 delete_count:36 deleted_byte_count:3191335 replica_placement:100 version:3 modified_at_second:1615596486 - volume id:172 size:1074787304 collection:"collection1" file_count:31236 delete_count:50 deleted_byte_count:3316482 replica_placement:100 version:3 modified_at_second:1615612385 - volume id:174 size:1073824160 collection:"collection1" file_count:30689 delete_count:36 deleted_byte_count:2160116 replica_placement:100 version:3 modified_at_second:1615598914 - volume id:175 size:1077742472 collection:"collection1" file_count:32353 delete_count:33 deleted_byte_count:1861403 replica_placement:100 version:3 modified_at_second:1615559516 - volume id:176 size:1073854800 collection:"collection1" file_count:30582 delete_count:34 deleted_byte_count:7701976 replica_placement:100 version:3 modified_at_second:1615626169 - volume id:178 size:1087560112 collection:"collection1" file_count:23482 delete_count:22 deleted_byte_count:18810492 replica_placement:100 version:3 modified_at_second:1615541369 - volume id:179 size:1074313920 collection:"collection1" file_count:21829 delete_count:24 deleted_byte_count:45574435 replica_placement:100 version:3 modified_at_second:1615580308 - volume id:180 size:1078438448 collection:"collection1" file_count:23614 delete_count:12 deleted_byte_count:4496474 replica_placement:100 version:3 modified_at_second:1614773243 - volume id:181 size:1074571672 collection:"collection1" file_count:22898 delete_count:19 deleted_byte_count:6628413 replica_placement:100 version:3 modified_at_second:1614745117 - volume id:183 size:1076361616 collection:"collection1" file_count:31293 delete_count:16 deleted_byte_count:468841 replica_placement:100 version:3 modified_at_second:1615572985 - volume id:184 size:1074594216 collection:"collection1" file_count:31368 delete_count:22 deleted_byte_count:857453 replica_placement:100 version:3 modified_at_second:1615586578 - volume id:185 size:1074099592 collection:"collection1" file_count:30612 delete_count:17 deleted_byte_count:2610847 replica_placement:100 version:3 modified_at_second:1615506835 - volume id:186 size:1074220664 collection:"collection1" file_count:31450 delete_count:15 deleted_byte_count:391855 replica_placement:100 version:3 modified_at_second:1615614934 - volume id:187 size:1074396112 collection:"collection1" file_count:31853 delete_count:17 deleted_byte_count:454283 replica_placement:100 version:3 modified_at_second:1615590491 - volume id:188 size:1074732632 collection:"collection1" file_count:31867 delete_count:19 deleted_byte_count:393743 replica_placement:100 version:3 modified_at_second:1615487645 - volume id:189 size:1074847824 collection:"collection1" file_count:31450 delete_count:16 deleted_byte_count:1040552 replica_placement:100 version:3 modified_at_second:1615335661 - volume id:190 size:1074008968 collection:"collection1" file_count:31987 delete_count:11 deleted_byte_count:685125 replica_placement:100 version:3 modified_at_second:1615447162 - volume id:191 size:1075492960 collection:"collection1" file_count:31301 delete_count:19 deleted_byte_count:708401 replica_placement:100 version:3 modified_at_second:1615357457 - volume id:192 size:1075857384 collection:"collection1" file_count:31490 delete_count:25 deleted_byte_count:720617 replica_placement:100 version:3 modified_at_second:1615621632 - volume id:193 size:1076616760 collection:"collection1" file_count:31907 delete_count:16 deleted_byte_count:464900 replica_placement:100 version:3 modified_at_second:1615507877 - volume id:194 size:1073985792 collection:"collection1" file_count:31434 delete_count:18 deleted_byte_count:391432 replica_placement:100 version:3 modified_at_second:1615559502 - volume id:195 size:1074158304 collection:"collection1" file_count:31453 delete_count:15 deleted_byte_count:718266 replica_placement:100 version:3 modified_at_second:1615559331 - volume id:196 size:1074594640 collection:"collection1" file_count:31665 delete_count:18 deleted_byte_count:3468922 replica_placement:100 version:3 modified_at_second:1615501690 - volume id:198 size:1075104624 collection:"collection1" file_count:16577 delete_count:18 deleted_byte_count:6583181 replica_placement:100 version:3 modified_at_second:1615623371 - volume id:199 size:1078117688 collection:"collection1" file_count:16497 delete_count:14 deleted_byte_count:1514286 replica_placement:100 version:3 modified_at_second:1615585987 - volume id:200 size:1075630464 collection:"collection1" file_count:16380 delete_count:18 deleted_byte_count:1103109 replica_placement:100 version:3 modified_at_second:1615485252 - volume id:201 size:1091460440 collection:"collection1" file_count:16684 delete_count:26 deleted_byte_count:5590335 replica_placement:100 version:3 modified_at_second:1615585987 - volume id:204 size:1079766904 collection:"collection1" file_count:3233 delete_count:255 deleted_byte_count:104707641 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615565702 - volume id:207 size:1081939960 collection:"collection1" file_count:3010 delete_count:4 deleted_byte_count:692350 replica_placement:100 version:3 modified_at_second:1615269061 - volume id:208 size:1077863624 collection:"collection1" file_count:3147 delete_count:6 deleted_byte_count:858726 replica_placement:100 version:3 modified_at_second:1615495515 - volume id:209 size:1074083592 collection:"collection1" file_count:3238 delete_count:4 deleted_byte_count:1494244 replica_placement:100 version:3 modified_at_second:1615419954 - volume id:210 size:1094311304 collection:"collection1" file_count:3468 delete_count:4 deleted_byte_count:466433 replica_placement:100 version:3 modified_at_second:1615495515 - volume id:211 size:1080610712 collection:"collection1" file_count:3247 delete_count:7 deleted_byte_count:1891456 replica_placement:100 version:3 modified_at_second:1615269124 - volume id:216 size:1080073496 collection:"collection1" file_count:3316 delete_count:4 deleted_byte_count:179819 replica_placement:100 version:3 modified_at_second:1615586387 - volume id:218 size:1081263944 collection:"collection1" file_count:3433 delete_count:14 deleted_byte_count:3454237 replica_placement:100 version:3 modified_at_second:1615603637 - volume id:220 size:1081928312 collection:"collection1" file_count:3166 delete_count:13 deleted_byte_count:4127709 replica_placement:100 version:3 modified_at_second:1615579317 - volume id:221 size:1106545536 collection:"collection1" file_count:3153 delete_count:11 deleted_byte_count:1496835 replica_placement:100 version:3 modified_at_second:1615269138 - volume id:224 size:1093691520 collection:"collection1" file_count:3463 delete_count:10 deleted_byte_count:1128328 replica_placement:100 version:3 modified_at_second:1615601870 - volume id:225 size:1080698928 collection:"collection1" file_count:3115 delete_count:7 deleted_byte_count:18170416 replica_placement:100 version:3 modified_at_second:1615434685 - volume id:226 size:1103504792 collection:"collection1" file_count:2965 delete_count:10 deleted_byte_count:2639254 replica_placement:100 version:3 modified_at_second:1615601870 - volume id:227 size:1106699864 collection:"collection1" file_count:2827 delete_count:19 deleted_byte_count:5393310 replica_placement:100 version:3 modified_at_second:1615609989 - volume id:228 size:1109784072 collection:"collection1" file_count:2504 delete_count:24 deleted_byte_count:5458950 replica_placement:100 version:3 modified_at_second:1615610489 - volume id:229 size:1109855256 collection:"collection1" file_count:2857 delete_count:22 deleted_byte_count:2839883 replica_placement:100 version:3 modified_at_second:1615609989 - volume id:231 size:1112917664 collection:"collection1" file_count:3151 delete_count:19 deleted_byte_count:2852517 replica_placement:100 version:3 modified_at_second:1615611350 - volume id:232 size:1073901520 collection:"collection1" file_count:3004 delete_count:54 deleted_byte_count:10273081 replica_placement:100 version:3 modified_at_second:1615611352 - volume id:233 size:1080526464 collection:"collection1" file_count:3136 delete_count:61 deleted_byte_count:17991717 replica_placement:100 version:3 modified_at_second:1615611354 - volume id:236 size:1089476200 collection:"collection1" file_count:3231 delete_count:53 deleted_byte_count:11625921 replica_placement:100 version:3 modified_at_second:1615611351 - volume id:238 size:354320000 collection:"collection1" file_count:701 delete_count:17 deleted_byte_count:5940420 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615632030 - volume id:240 size:424791528 collection:"collection1" file_count:734 delete_count:12 deleted_byte_count:7353071 replica_placement:100 version:3 modified_at_second:1615631669 - volume id:242 size:1075383304 collection:"collection2" file_count:10470 replica_placement:100 version:3 modified_at_second:1614852115 - volume id:243 size:1088174560 collection:"collection2" file_count:11109 delete_count:1 deleted_byte_count:938 replica_placement:100 version:3 modified_at_second:1614852202 - volume id:245 size:1074597056 collection:"collection2" file_count:10371 delete_count:3 deleted_byte_count:209701 replica_placement:100 version:3 modified_at_second:1614852093 - volume id:247 size:1075859784 collection:"collection2" file_count:10443 delete_count:2 deleted_byte_count:564486 replica_placement:100 version:3 modified_at_second:1614856152 - volume id:249 size:1074819168 collection:"collection2" file_count:10763 delete_count:2 deleted_byte_count:271699 replica_placement:100 version:3 modified_at_second:1614856231 - volume id:250 size:1080572256 collection:"collection2" file_count:10220 replica_placement:100 version:3 modified_at_second:1614856129 - volume id:251 size:1075684408 collection:"collection2" file_count:10847 replica_placement:100 version:3 modified_at_second:1614856270 - volume id:254 size:1074830800 collection:"collection2" file_count:14140 delete_count:2 deleted_byte_count:105892 replica_placement:100 version:3 modified_at_second:1614861115 - volume id:257 size:1082621664 collection:"collection2" file_count:18172 delete_count:2 deleted_byte_count:25125 replica_placement:100 version:3 modified_at_second:1614866395 - volume id:260 size:1075105664 collection:"collection2" file_count:17316 delete_count:4 deleted_byte_count:2015310 replica_placement:100 version:3 modified_at_second:1614866226 - volume id:261 size:1076628592 collection:"collection2" file_count:18355 delete_count:1 deleted_byte_count:1155 replica_placement:100 version:3 modified_at_second:1614866420 - volume id:262 size:1078492464 collection:"collection2" file_count:20390 delete_count:3 deleted_byte_count:287601 replica_placement:100 version:3 modified_at_second:1614871601 - volume id:263 size:1077167440 collection:"collection2" file_count:20227 delete_count:4 deleted_byte_count:97887 replica_placement:100 version:3 modified_at_second:1614871567 - volume id:268 size:1074490592 collection:"collection2" file_count:21698 delete_count:1 deleted_byte_count:33968 replica_placement:100 version:3 modified_at_second:1614877435 - volume id:269 size:1077552720 collection:"collection2" file_count:21875 delete_count:4 deleted_byte_count:347272 replica_placement:100 version:3 modified_at_second:1614877481 - volume id:271 size:1076992648 collection:"collection2" file_count:22640 delete_count:1 deleted_byte_count:30645 replica_placement:100 version:3 modified_at_second:1614877504 - volume id:273 size:1074873432 collection:"collection2" file_count:20511 delete_count:3 deleted_byte_count:46076 replica_placement:100 version:3 modified_at_second:1614884046 - volume id:274 size:1075994128 collection:"collection2" file_count:20997 replica_placement:100 version:3 modified_at_second:1614884113 - volume id:276 size:1076899888 collection:"collection2" file_count:20190 delete_count:1 deleted_byte_count:8798 replica_placement:100 version:3 modified_at_second:1614884003 - volume id:277 size:1074956160 collection:"collection2" file_count:19260 delete_count:2 deleted_byte_count:172356 replica_placement:100 version:3 modified_at_second:1614889988 - volume id:279 size:1077325096 collection:"collection2" file_count:19671 delete_count:6 deleted_byte_count:379116 replica_placement:100 version:3 modified_at_second:1614890230 - volume id:282 size:1075232240 collection:"collection2" file_count:22659 delete_count:4 deleted_byte_count:67915 replica_placement:100 version:3 modified_at_second:1614897304 - volume id:284 size:1074533384 collection:"collection2" file_count:22196 delete_count:4 deleted_byte_count:154683 replica_placement:100 version:3 modified_at_second:1614897231 - volume id:285 size:1082128576 collection:"collection2" file_count:21804 delete_count:1 deleted_byte_count:1064 replica_placement:100 version:3 modified_at_second:1614897165 - volume id:286 size:1077464824 collection:"collection2" file_count:23905 delete_count:6 deleted_byte_count:630577 replica_placement:100 version:3 modified_at_second:1614897401 - volume id:287 size:1074590528 collection:"collection2" file_count:28163 delete_count:5 deleted_byte_count:35727 replica_placement:100 version:3 modified_at_second:1614904874 - volume id:288 size:1075406800 collection:"collection2" file_count:27243 delete_count:2 deleted_byte_count:51519 replica_placement:100 version:3 modified_at_second:1614904738 - volume id:292 size:1092010744 collection:"collection2" file_count:26781 delete_count:5 deleted_byte_count:508910 replica_placement:100 version:3 modified_at_second:1614912327 - volume id:293 size:1075409776 collection:"collection2" file_count:26063 delete_count:4 deleted_byte_count:183834 replica_placement:100 version:3 modified_at_second:1614912235 - volume id:294 size:1075443992 collection:"collection2" file_count:26076 delete_count:4 deleted_byte_count:194914 replica_placement:100 version:3 modified_at_second:1614912220 - volume id:295 size:1074702376 collection:"collection2" file_count:24488 delete_count:3 deleted_byte_count:48555 replica_placement:100 version:3 modified_at_second:1614911929 - volume id:300 size:1076212424 collection:"collection2" file_count:22892 delete_count:2 deleted_byte_count:61320 replica_placement:100 version:3 modified_at_second:1614918464 - volume id:304 size:1081038888 collection:"collection2" file_count:24505 delete_count:2 deleted_byte_count:124447 replica_placement:100 version:3 modified_at_second:1614925567 - volume id:305 size:1074185552 collection:"collection2" file_count:22074 delete_count:5 deleted_byte_count:20221 replica_placement:100 version:3 modified_at_second:1614925312 - volume id:310 size:1074761520 collection:"collection2" file_count:21441 delete_count:3 deleted_byte_count:13934 replica_placement:100 version:3 modified_at_second:1614931077 - volume id:311 size:1088248208 collection:"collection2" file_count:23553 delete_count:6 deleted_byte_count:191716 replica_placement:100 version:3 modified_at_second:1614931460 - volume id:312 size:1075037808 collection:"collection2" file_count:22524 replica_placement:100 version:3 modified_at_second:1614937832 - volume id:313 size:1074876016 collection:"collection2" file_count:22404 delete_count:4 deleted_byte_count:51728 replica_placement:100 version:3 modified_at_second:1614937755 - volume id:314 size:1074670840 collection:"collection2" file_count:20964 delete_count:4 deleted_byte_count:304291 replica_placement:100 version:3 modified_at_second:1614937441 - volume id:315 size:1084153456 collection:"collection2" file_count:23638 delete_count:2 deleted_byte_count:53956 replica_placement:100 version:3 modified_at_second:1614937884 - volume id:316 size:1077720784 collection:"collection2" file_count:22605 delete_count:1 deleted_byte_count:8503 replica_placement:100 version:3 modified_at_second:1614937838 - volume id:317 size:1076215040 collection:"collection2" file_count:23572 delete_count:2 deleted_byte_count:1441356 replica_placement:100 version:3 modified_at_second:1614943965 - volume id:319 size:1073952744 collection:"collection2" file_count:22286 delete_count:2 deleted_byte_count:43421 replica_placement:100 version:3 modified_at_second:1614943810 - volume id:320 size:1082437736 collection:"collection2" file_count:21544 delete_count:3 deleted_byte_count:16712 replica_placement:100 version:3 modified_at_second:1614943591 - volume id:321 size:1081477960 collection:"collection2" file_count:23531 delete_count:5 deleted_byte_count:262564 replica_placement:100 version:3 modified_at_second:1614943982 - volume id:322 size:1078471600 collection:"collection2" file_count:21905 delete_count:3 deleted_byte_count:145002 replica_placement:100 version:3 modified_at_second:1614950574 - volume id:324 size:1075606712 collection:"collection2" file_count:20799 delete_count:1 deleted_byte_count:251210 replica_placement:100 version:3 modified_at_second:1614950310 - volume id:326 size:1076059936 collection:"collection2" file_count:22564 delete_count:2 deleted_byte_count:192886 replica_placement:100 version:3 modified_at_second:1614950619 - volume id:327 size:1076121224 collection:"collection2" file_count:22007 delete_count:3 deleted_byte_count:60358 replica_placement:100 version:3 modified_at_second:1614956487 - volume id:328 size:1074767928 collection:"collection2" file_count:21720 delete_count:3 deleted_byte_count:56429 replica_placement:100 version:3 modified_at_second:1614956362 - volume id:329 size:1076691776 collection:"collection2" file_count:22411 delete_count:5 deleted_byte_count:214092 replica_placement:100 version:3 modified_at_second:1614956485 - volume id:331 size:1074957192 collection:"collection2" file_count:21230 delete_count:4 deleted_byte_count:62145 replica_placement:100 version:3 modified_at_second:1614956259 - volume id:333 size:1074270192 collection:"collection2" file_count:21271 delete_count:2 deleted_byte_count:168122 replica_placement:100 version:3 modified_at_second:1614962697 - volume id:335 size:1076235176 collection:"collection2" file_count:22391 delete_count:3 deleted_byte_count:8838 replica_placement:100 version:3 modified_at_second:1614962970 - volume id:336 size:1087853032 collection:"collection2" file_count:22801 delete_count:2 deleted_byte_count:26394 replica_placement:100 version:3 modified_at_second:1614963003 - volume id:338 size:1076118360 collection:"collection2" file_count:21680 replica_placement:100 version:3 modified_at_second:1614969850 - volume id:342 size:1080186296 collection:"collection2" file_count:22405 delete_count:4 deleted_byte_count:64819 replica_placement:100 version:3 modified_at_second:1614977518 - volume id:343 size:1075345184 collection:"collection2" file_count:21095 delete_count:2 deleted_byte_count:20581 replica_placement:100 version:3 modified_at_second:1614977148 - volume id:349 size:1075957824 collection:"collection2" file_count:22395 delete_count:2 deleted_byte_count:61565 replica_placement:100 version:3 modified_at_second:1614984748 - volume id:350 size:1074756688 collection:"collection2" file_count:21990 delete_count:3 deleted_byte_count:233881 replica_placement:100 version:3 modified_at_second:1614984682 - volume id:354 size:1085213992 collection:"collection2" file_count:23150 delete_count:4 deleted_byte_count:82391 replica_placement:100 version:3 modified_at_second:1614992207 - volume id:356 size:1083304992 collection:"collection2" file_count:21552 delete_count:4 deleted_byte_count:14472 replica_placement:100 version:3 modified_at_second:1614992027 - volume id:358 size:1085152312 collection:"collection2" file_count:23756 delete_count:3 deleted_byte_count:44531 replica_placement:100 version:3 modified_at_second:1614998824 - volume id:359 size:1074211240 collection:"collection2" file_count:22437 delete_count:2 deleted_byte_count:187953 replica_placement:100 version:3 modified_at_second:1614998711 - volume id:362 size:1074074120 collection:"collection2" file_count:20595 delete_count:1 deleted_byte_count:112145 replica_placement:100 version:3 modified_at_second:1615004407 - volume id:363 size:1078859496 collection:"collection2" file_count:23177 delete_count:4 deleted_byte_count:9601 replica_placement:100 version:3 modified_at_second:1615004822 - volume id:364 size:1081280816 collection:"collection2" file_count:22686 delete_count:1 deleted_byte_count:84375 replica_placement:100 version:3 modified_at_second:1615004813 - volume id:365 size:1075736632 collection:"collection2" file_count:22193 delete_count:5 deleted_byte_count:259033 replica_placement:100 version:3 modified_at_second:1615004776 - volume id:366 size:1075267272 collection:"collection2" file_count:21856 delete_count:5 deleted_byte_count:138363 replica_placement:100 version:3 modified_at_second:1615004703 - volume id:367 size:1076403648 collection:"collection2" file_count:22995 delete_count:2 deleted_byte_count:36955 replica_placement:100 version:3 modified_at_second:1615010985 - volume id:368 size:1074822016 collection:"collection2" file_count:22252 delete_count:4 deleted_byte_count:3291946 replica_placement:100 version:3 modified_at_second:1615010878 - volume id:369 size:1091472040 collection:"collection2" file_count:23709 delete_count:4 deleted_byte_count:400876 replica_placement:100 version:3 modified_at_second:1615011019 - volume id:370 size:1076040480 collection:"collection2" file_count:22092 delete_count:2 deleted_byte_count:115388 replica_placement:100 version:3 modified_at_second:1615010877 - volume id:371 size:1078806160 collection:"collection2" file_count:22685 delete_count:2 deleted_byte_count:68905 replica_placement:100 version:3 modified_at_second:1615010994 - volume id:372 size:1076193312 collection:"collection2" file_count:22774 delete_count:1 deleted_byte_count:3495 replica_placement:100 version:3 modified_at_second:1615016911 - volume id:374 size:1085011080 collection:"collection2" file_count:23054 delete_count:2 deleted_byte_count:89034 replica_placement:100 version:3 modified_at_second:1615016917 - volume id:375 size:1076140688 collection:"collection2" file_count:21880 delete_count:2 deleted_byte_count:51103 replica_placement:100 version:3 modified_at_second:1615016787 - volume id:378 size:959273824 collection:"collection2" file_count:15031 replica_placement:100 version:3 modified_at_second:1615632323 - volume id:379 size:1014108592 collection:"collection2" file_count:15360 delete_count:8 deleted_byte_count:2524591 replica_placement:100 version:3 modified_at_second:1615632323 - volume id:380 size:1010760464 collection:"collection2" file_count:14920 delete_count:7 deleted_byte_count:134859 replica_placement:100 version:3 modified_at_second:1615632322 - Disk hdd total size:274627838960 file_count:3607097 deleted_file:13594 deleted_bytes:4185524457 - DataNode 192.168.1.1:8080 total size:274627838960 file_count:3607097 deleted_file:13594 deleted_bytes:4185524457 - Rack DefaultRack total size:274627838960 file_count:3607097 deleted_file:13594 deleted_bytes:4185524457 - DataCenter dc4 total size:274627838960 file_count:3607097 deleted_file:13594 deleted_bytes:4185524457 - DataCenter dc5 hdd(volume:299/3000 active:299 free:2701 remote:0) - Rack DefaultRack hdd(volume:299/3000 active:299 free:2701 remote:0) - DataNode 192.168.1.5:8080 hdd(volume:299/3000 active:299 free:2701 remote:0) - Disk hdd(volume:299/3000 active:299 free:2701 remote:0) - volume id:5 size:293806008 file_count:1669 delete_count:2 deleted_byte_count:274334 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631342 - volume id:11 size:1109224552 collection:"collection0" file_count:44 replica_placement:100 version:3 modified_at_second:1615629606 - volume id:18 size:1096678688 collection:"collection0" file_count:88 delete_count:4 deleted_byte_count:8633 replica_placement:100 version:3 modified_at_second:1615631673 - volume id:19 size:1096923792 collection:"collection0" file_count:100 delete_count:10 deleted_byte_count:75779917 replica_placement:100 version:3 compact_revision:4 modified_at_second:1615630117 - volume id:20 size:1074760432 collection:"collection0" file_count:82 delete_count:5 deleted_byte_count:12156 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615629340 - volume id:26 size:532657632 collection:"collection0" file_count:100 delete_count:4 deleted_byte_count:9081 replica_placement:100 version:3 modified_at_second:1614170024 - volume id:27 size:298886792 file_count:1608 replica_placement:100 version:3 modified_at_second:1615632482 - volume id:28 size:308919192 file_count:1591 delete_count:1 deleted_byte_count:125280 replica_placement:100 version:3 modified_at_second:1615631762 - volume id:29 size:281582688 file_count:1537 replica_placement:100 version:3 modified_at_second:1615629422 - volume id:30 size:289466144 file_count:1566 delete_count:1 deleted_byte_count:124972 replica_placement:100 version:3 modified_at_second:1615632422 - volume id:31 size:273363256 file_count:1498 replica_placement:100 version:3 modified_at_second:1615631642 - volume id:32 size:281343360 file_count:1497 replica_placement:100 version:3 modified_at_second:1615632362 - volume id:33 size:1130226344 collection:"collection1" file_count:7322 delete_count:172 deleted_byte_count:45199399 replica_placement:100 version:3 modified_at_second:1615618789 - volume id:34 size:1077111136 collection:"collection1" file_count:9781 delete_count:110 deleted_byte_count:20894827 replica_placement:100 version:3 modified_at_second:1615619366 - volume id:35 size:1075241744 collection:"collection1" file_count:10523 delete_count:97 deleted_byte_count:46586217 replica_placement:100 version:3 modified_at_second:1615618790 - volume id:36 size:1075118336 collection:"collection1" file_count:10341 delete_count:118 deleted_byte_count:24753278 replica_placement:100 version:3 modified_at_second:1615606148 - volume id:37 size:1075895576 collection:"collection1" file_count:12013 delete_count:98 deleted_byte_count:50747932 replica_placement:100 version:3 modified_at_second:1615594776 - volume id:38 size:1075545744 collection:"collection1" file_count:13324 delete_count:100 deleted_byte_count:25223906 replica_placement:100 version:3 modified_at_second:1615569830 - volume id:39 size:1076606536 collection:"collection1" file_count:12612 delete_count:78 deleted_byte_count:17462730 replica_placement:100 version:3 modified_at_second:1615611959 - volume id:40 size:1075358552 collection:"collection1" file_count:12597 delete_count:62 deleted_byte_count:11657901 replica_placement:100 version:3 modified_at_second:1615612994 - volume id:41 size:1076283592 collection:"collection1" file_count:12088 delete_count:84 deleted_byte_count:19311237 replica_placement:100 version:3 modified_at_second:1615596736 - volume id:42 size:1093948352 collection:"collection1" file_count:7889 delete_count:47 deleted_byte_count:5697275 replica_placement:100 version:3 modified_at_second:1615548906 - volume id:43 size:1116445864 collection:"collection1" file_count:7355 delete_count:57 deleted_byte_count:9727158 replica_placement:100 version:3 modified_at_second:1615566167 - volume id:44 size:1077582560 collection:"collection1" file_count:7295 delete_count:50 deleted_byte_count:12618414 replica_placement:100 version:3 modified_at_second:1615566170 - volume id:45 size:1075254640 collection:"collection1" file_count:10772 delete_count:76 deleted_byte_count:22426345 replica_placement:100 version:3 modified_at_second:1615573498 - volume id:46 size:1075286056 collection:"collection1" file_count:9947 delete_count:309 deleted_byte_count:105601163 replica_placement:100 version:3 modified_at_second:1615569825 - volume id:47 size:444599784 collection:"collection1" file_count:709 delete_count:19 deleted_byte_count:11913451 replica_placement:100 version:3 modified_at_second:1615632397 - volume id:48 size:1076778664 collection:"collection1" file_count:9850 delete_count:77 deleted_byte_count:16641907 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630690 - volume id:49 size:1078775288 collection:"collection1" file_count:9631 delete_count:27 deleted_byte_count:5985628 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615575823 - volume id:50 size:1076688288 collection:"collection1" file_count:7921 delete_count:26 deleted_byte_count:5162032 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615610876 - volume id:51 size:1076796120 collection:"collection1" file_count:10550 delete_count:39 deleted_byte_count:12723654 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615547786 - volume id:53 size:1063089216 collection:"collection1" file_count:9832 delete_count:31 deleted_byte_count:9273066 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632156 - volume id:54 size:1045022288 collection:"collection1" file_count:9409 delete_count:29 deleted_byte_count:15102818 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630813 - volume id:55 size:1012890016 collection:"collection1" file_count:8651 delete_count:27 deleted_byte_count:9418841 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631453 - volume id:56 size:1002412240 collection:"collection1" file_count:8762 delete_count:40 deleted_byte_count:65885831 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615632014 - volume id:57 size:839849792 collection:"collection1" file_count:7514 delete_count:24 deleted_byte_count:6228543 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631775 - volume id:58 size:908064192 collection:"collection1" file_count:8128 delete_count:21 deleted_byte_count:6113731 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632343 - volume id:59 size:988302272 collection:"collection1" file_count:8098 delete_count:20 deleted_byte_count:3947615 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632238 - volume id:60 size:1010702480 collection:"collection1" file_count:8969 delete_count:79 deleted_byte_count:24782814 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615632439 - volume id:61 size:975604544 collection:"collection1" file_count:8683 delete_count:20 deleted_byte_count:10276072 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615631176 - volume id:62 size:873845904 collection:"collection1" file_count:7897 delete_count:23 deleted_byte_count:10920170 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631133 - volume id:63 size:956941176 collection:"collection1" file_count:8271 delete_count:32 deleted_byte_count:15876189 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632036 - volume id:64 size:965638424 collection:"collection1" file_count:8218 delete_count:27 deleted_byte_count:6922489 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631032 - volume id:65 size:823283608 collection:"collection1" file_count:7834 delete_count:29 deleted_byte_count:5950610 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632307 - volume id:66 size:821343440 collection:"collection1" file_count:7383 delete_count:29 deleted_byte_count:12010343 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631968 - volume id:67 size:878713880 collection:"collection1" file_count:7299 delete_count:117 deleted_byte_count:24857326 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632156 - volume id:69 size:863913896 collection:"collection1" file_count:7291 delete_count:100 deleted_byte_count:25335024 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630534 - volume id:70 size:886695472 collection:"collection1" file_count:7769 delete_count:164 deleted_byte_count:45162513 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632398 - volume id:71 size:907608392 collection:"collection1" file_count:7658 delete_count:122 deleted_byte_count:27622941 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632307 - volume id:72 size:903990720 collection:"collection1" file_count:6996 delete_count:240 deleted_byte_count:74147727 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630985 - volume id:73 size:929047544 collection:"collection1" file_count:7038 delete_count:227 deleted_byte_count:65336664 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630707 - volume id:75 size:908045000 collection:"collection1" file_count:6911 delete_count:268 deleted_byte_count:73934373 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632430 - volume id:76 size:985296744 collection:"collection1" file_count:6566 delete_count:61 deleted_byte_count:44464430 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632284 - volume id:77 size:929398296 collection:"collection1" file_count:7427 delete_count:238 deleted_byte_count:59581579 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632014 - volume id:78 size:1075671512 collection:"collection1" file_count:7540 delete_count:258 deleted_byte_count:71726846 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615582829 - volume id:79 size:948225472 collection:"collection1" file_count:6997 delete_count:227 deleted_byte_count:60625763 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631326 - volume id:80 size:827912928 collection:"collection1" file_count:6916 delete_count:15 deleted_byte_count:5611604 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615631159 - volume id:81 size:880693168 collection:"collection1" file_count:7481 delete_count:238 deleted_byte_count:80880878 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615631395 - volume id:82 size:1041660512 collection:"collection1" file_count:7043 delete_count:207 deleted_byte_count:52275724 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632430 - volume id:83 size:936194288 collection:"collection1" file_count:7593 delete_count:13 deleted_byte_count:4633917 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632029 - volume id:84 size:871262320 collection:"collection1" file_count:8190 delete_count:14 deleted_byte_count:3150948 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631161 - volume id:86 size:1009434632 collection:"collection1" file_count:8474 delete_count:236 deleted_byte_count:64543674 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630812 - volume id:87 size:922274624 collection:"collection1" file_count:12902 delete_count:13 deleted_byte_count:3412959 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632438 - volume id:88 size:1073767976 collection:"collection1" file_count:14994 delete_count:207 deleted_byte_count:82380696 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615541383 - volume id:89 size:1044421824 collection:"collection1" file_count:14943 delete_count:243 deleted_byte_count:58543159 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632208 - volume id:90 size:891163760 collection:"collection1" file_count:14608 delete_count:10 deleted_byte_count:2564369 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615629392 - volume id:91 size:936573952 collection:"collection1" file_count:14686 delete_count:11 deleted_byte_count:4717727 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631851 - volume id:92 size:992439144 collection:"collection1" file_count:7061 delete_count:195 deleted_byte_count:60649573 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630566 - volume id:93 size:1079602592 collection:"collection1" file_count:7878 delete_count:270 deleted_byte_count:74150048 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615556013 - volume id:94 size:1030684704 collection:"collection1" file_count:7660 delete_count:207 deleted_byte_count:70150733 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631616 - volume id:95 size:990877824 collection:"collection1" file_count:6620 delete_count:206 deleted_byte_count:60363604 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615631867 - volume id:96 size:989294848 collection:"collection1" file_count:7544 delete_count:229 deleted_byte_count:59931853 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630778 - volume id:98 size:1077836472 collection:"collection1" file_count:7605 delete_count:202 deleted_byte_count:73180379 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615523691 - volume id:99 size:1071718496 collection:"collection1" file_count:7470 delete_count:8 deleted_byte_count:9624950 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631175 - volume id:100 size:1083617472 collection:"collection1" file_count:7018 delete_count:187 deleted_byte_count:61304236 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615505914 - volume id:101 size:1077109408 collection:"collection1" file_count:7706 delete_count:226 deleted_byte_count:77864780 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630994 - volume id:102 size:1074359920 collection:"collection1" file_count:7338 delete_count:7 deleted_byte_count:6499151 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615626682 - volume id:103 size:1075863904 collection:"collection1" file_count:7184 delete_count:186 deleted_byte_count:58872238 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615628417 - volume id:106 size:1075458680 collection:"collection1" file_count:7182 delete_count:307 deleted_byte_count:69349053 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615598137 - volume id:107 size:1073811776 collection:"collection1" file_count:7436 delete_count:168 deleted_byte_count:57747428 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615293569 - volume id:108 size:1074648024 collection:"collection1" file_count:7472 delete_count:194 deleted_byte_count:70864699 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615593231 - volume id:109 size:1075254560 collection:"collection1" file_count:7556 delete_count:263 deleted_byte_count:55155265 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615502487 - volume id:110 size:1076575744 collection:"collection1" file_count:6996 delete_count:163 deleted_byte_count:52954032 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615590786 - volume id:111 size:1073826176 collection:"collection1" file_count:7355 delete_count:155 deleted_byte_count:50083578 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615593232 - volume id:112 size:1076392512 collection:"collection1" file_count:8291 delete_count:156 deleted_byte_count:74120183 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615569823 - volume id:113 size:1076709184 collection:"collection1" file_count:9355 delete_count:177 deleted_byte_count:59796765 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615569822 - volume id:114 size:1074762792 collection:"collection1" file_count:8802 delete_count:156 deleted_byte_count:38470055 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615591826 - volume id:115 size:1076192296 collection:"collection1" file_count:7690 delete_count:154 deleted_byte_count:32267193 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615285296 - volume id:117 size:1073917192 collection:"collection1" file_count:9520 delete_count:114 deleted_byte_count:21835126 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615573712 - volume id:118 size:1074064344 collection:"collection1" file_count:8738 delete_count:15 deleted_byte_count:3460697 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615516264 - volume id:120 size:1076115928 collection:"collection1" file_count:9639 delete_count:118 deleted_byte_count:33357871 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615482567 - volume id:121 size:1078803320 collection:"collection1" file_count:10113 delete_count:441 deleted_byte_count:94128627 replica_placement:100 version:3 modified_at_second:1615506626 - volume id:122 size:1076235312 collection:"collection1" file_count:9106 delete_count:252 deleted_byte_count:93041272 replica_placement:100 version:3 modified_at_second:1615585912 - volume id:123 size:1080491112 collection:"collection1" file_count:10623 delete_count:302 deleted_byte_count:83956998 replica_placement:100 version:3 modified_at_second:1615585916 - volume id:124 size:1074519360 collection:"collection1" file_count:9457 delete_count:286 deleted_byte_count:74752459 replica_placement:100 version:3 modified_at_second:1615585913 - volume id:125 size:1088687040 collection:"collection1" file_count:9518 delete_count:281 deleted_byte_count:76037905 replica_placement:100 version:3 modified_at_second:1615585913 - volume id:126 size:1073867408 collection:"collection1" file_count:9320 delete_count:278 deleted_byte_count:94547424 replica_placement:100 version:3 modified_at_second:1615585911 - volume id:127 size:1074907336 collection:"collection1" file_count:9900 delete_count:133 deleted_byte_count:48570820 replica_placement:100 version:3 modified_at_second:1615612990 - volume id:128 size:1074874632 collection:"collection1" file_count:9821 delete_count:148 deleted_byte_count:43633334 replica_placement:100 version:3 modified_at_second:1615602670 - volume id:129 size:1074704328 collection:"collection1" file_count:10012 delete_count:150 deleted_byte_count:64491721 replica_placement:100 version:3 modified_at_second:1615627566 - volume id:130 size:1075000632 collection:"collection1" file_count:10633 delete_count:161 deleted_byte_count:34768201 replica_placement:100 version:3 modified_at_second:1615582327 - volume id:131 size:1075279584 collection:"collection1" file_count:10075 delete_count:135 deleted_byte_count:29795712 replica_placement:100 version:3 modified_at_second:1615523898 - volume id:132 size:1088539552 collection:"collection1" file_count:11051 delete_count:71 deleted_byte_count:17178322 replica_placement:100 version:3 modified_at_second:1615619581 - volume id:134 size:1074367304 collection:"collection1" file_count:10662 delete_count:69 deleted_byte_count:25530139 replica_placement:100 version:3 modified_at_second:1615555873 - volume id:135 size:1073906776 collection:"collection1" file_count:10446 delete_count:71 deleted_byte_count:28599975 replica_placement:100 version:3 modified_at_second:1615569816 - volume id:136 size:1074433552 collection:"collection1" file_count:9593 delete_count:72 deleted_byte_count:26912512 replica_placement:100 version:3 modified_at_second:1615376036 - volume id:137 size:1074309264 collection:"collection1" file_count:9633 delete_count:50 deleted_byte_count:27487972 replica_placement:100 version:3 modified_at_second:1615572231 - volume id:138 size:1074465744 collection:"collection1" file_count:10120 delete_count:55 deleted_byte_count:15875438 replica_placement:100 version:3 modified_at_second:1615572231 - volume id:140 size:1076203744 collection:"collection1" file_count:11219 delete_count:57 deleted_byte_count:19864498 replica_placement:100 version:3 modified_at_second:1615571947 - volume id:141 size:1074619488 collection:"collection1" file_count:9840 delete_count:45 deleted_byte_count:40890181 replica_placement:100 version:3 modified_at_second:1615630994 - volume id:142 size:1075733064 collection:"collection1" file_count:9009 delete_count:48 deleted_byte_count:9912854 replica_placement:100 version:3 modified_at_second:1615598913 - volume id:143 size:1075011280 collection:"collection1" file_count:9608 delete_count:51 deleted_byte_count:37282460 replica_placement:100 version:3 modified_at_second:1615488584 - volume id:144 size:1074549720 collection:"collection1" file_count:8780 delete_count:50 deleted_byte_count:52475146 replica_placement:100 version:3 modified_at_second:1615573451 - volume id:145 size:1074394928 collection:"collection1" file_count:9255 delete_count:34 deleted_byte_count:38011392 replica_placement:100 version:3 modified_at_second:1615591825 - volume id:146 size:1076337576 collection:"collection1" file_count:10492 delete_count:50 deleted_byte_count:17071505 replica_placement:100 version:3 modified_at_second:1615632005 - volume id:147 size:1077130576 collection:"collection1" file_count:10451 delete_count:27 deleted_byte_count:8290907 replica_placement:100 version:3 modified_at_second:1615604115 - volume id:148 size:1076066568 collection:"collection1" file_count:9547 delete_count:33 deleted_byte_count:7034089 replica_placement:100 version:3 modified_at_second:1615586390 - volume id:149 size:1074989016 collection:"collection1" file_count:8352 delete_count:35 deleted_byte_count:7179742 replica_placement:100 version:3 modified_at_second:1615494494 - volume id:150 size:1076290328 collection:"collection1" file_count:9328 delete_count:33 deleted_byte_count:43417791 replica_placement:100 version:3 modified_at_second:1615611567 - volume id:152 size:1075941400 collection:"collection1" file_count:9951 delete_count:36 deleted_byte_count:25348335 replica_placement:100 version:3 modified_at_second:1615606614 - volume id:153 size:1078539784 collection:"collection1" file_count:10924 delete_count:34 deleted_byte_count:12603081 replica_placement:100 version:3 modified_at_second:1615606614 - volume id:154 size:1081244696 collection:"collection1" file_count:11002 delete_count:31 deleted_byte_count:8467560 replica_placement:100 version:3 modified_at_second:1615478469 - volume id:155 size:1075140688 collection:"collection1" file_count:10882 delete_count:32 deleted_byte_count:10076804 replica_placement:100 version:3 modified_at_second:1615606614 - volume id:156 size:1074975832 collection:"collection1" file_count:9535 delete_count:40 deleted_byte_count:11426621 replica_placement:100 version:3 modified_at_second:1615628341 - volume id:157 size:1076758536 collection:"collection1" file_count:10012 delete_count:19 deleted_byte_count:11688737 replica_placement:100 version:3 modified_at_second:1615597782 - volume id:158 size:1087251976 collection:"collection1" file_count:9972 delete_count:20 deleted_byte_count:10328429 replica_placement:100 version:3 modified_at_second:1615588879 - volume id:159 size:1074132368 collection:"collection1" file_count:9382 delete_count:27 deleted_byte_count:11474574 replica_placement:100 version:3 modified_at_second:1615593593 - volume id:160 size:1075680952 collection:"collection1" file_count:9772 delete_count:22 deleted_byte_count:4981968 replica_placement:100 version:3 modified_at_second:1615597780 - volume id:162 size:1074286880 collection:"collection1" file_count:11220 delete_count:17 deleted_byte_count:1815547 replica_placement:100 version:3 modified_at_second:1615478126 - volume id:163 size:1074457192 collection:"collection1" file_count:12524 delete_count:27 deleted_byte_count:6359619 replica_placement:100 version:3 modified_at_second:1615579313 - volume id:164 size:1074261248 collection:"collection1" file_count:11922 delete_count:25 deleted_byte_count:2923288 replica_placement:100 version:3 modified_at_second:1615620084 - volume id:165 size:1073891016 collection:"collection1" file_count:9152 delete_count:12 deleted_byte_count:19164659 replica_placement:100 version:3 modified_at_second:1615471907 - volume id:166 size:1075637536 collection:"collection1" file_count:14211 delete_count:24 deleted_byte_count:20415490 replica_placement:100 version:3 modified_at_second:1615491019 - volume id:168 size:1074718808 collection:"collection1" file_count:25702 delete_count:40 deleted_byte_count:4024775 replica_placement:100 version:3 modified_at_second:1615585664 - volume id:169 size:1073863128 collection:"collection1" file_count:25248 delete_count:43 deleted_byte_count:3013817 replica_placement:100 version:3 modified_at_second:1615569832 - volume id:170 size:1075747096 collection:"collection1" file_count:24596 delete_count:41 deleted_byte_count:3494711 replica_placement:100 version:3 modified_at_second:1615579204 - volume id:171 size:1081881312 collection:"collection1" file_count:24215 delete_count:36 deleted_byte_count:3191335 replica_placement:100 version:3 modified_at_second:1615596485 - volume id:172 size:1074787312 collection:"collection1" file_count:31236 delete_count:50 deleted_byte_count:3316482 replica_placement:100 version:3 modified_at_second:1615612385 - volume id:173 size:1074154648 collection:"collection1" file_count:30884 delete_count:34 deleted_byte_count:2430948 replica_placement:100 version:3 modified_at_second:1615591904 - volume id:175 size:1077742504 collection:"collection1" file_count:32353 delete_count:33 deleted_byte_count:1861403 replica_placement:100 version:3 modified_at_second:1615559515 - volume id:176 size:1073854800 collection:"collection1" file_count:30582 delete_count:34 deleted_byte_count:7701976 replica_placement:100 version:3 modified_at_second:1615626169 - volume id:177 size:1074120120 collection:"collection1" file_count:22293 delete_count:16 deleted_byte_count:3719562 replica_placement:100 version:3 modified_at_second:1615516891 - volume id:178 size:1087560112 collection:"collection1" file_count:23482 delete_count:22 deleted_byte_count:18810492 replica_placement:100 version:3 modified_at_second:1615541369 - volume id:180 size:1078438536 collection:"collection1" file_count:23614 delete_count:12 deleted_byte_count:4496474 replica_placement:100 version:3 modified_at_second:1614773242 - volume id:181 size:1074571768 collection:"collection1" file_count:22898 delete_count:19 deleted_byte_count:6628413 replica_placement:100 version:3 modified_at_second:1614745116 - volume id:182 size:1076131280 collection:"collection1" file_count:31987 delete_count:21 deleted_byte_count:1416142 replica_placement:100 version:3 modified_at_second:1615568922 - volume id:183 size:1076361448 collection:"collection1" file_count:31293 delete_count:16 deleted_byte_count:468841 replica_placement:100 version:3 modified_at_second:1615572982 - volume id:184 size:1074594160 collection:"collection1" file_count:31368 delete_count:22 deleted_byte_count:857453 replica_placement:100 version:3 modified_at_second:1615586578 - volume id:185 size:1074099624 collection:"collection1" file_count:30612 delete_count:17 deleted_byte_count:2610847 replica_placement:100 version:3 modified_at_second:1615506832 - volume id:186 size:1074220864 collection:"collection1" file_count:31450 delete_count:15 deleted_byte_count:391855 replica_placement:100 version:3 modified_at_second:1615614933 - volume id:187 size:1074395944 collection:"collection1" file_count:31853 delete_count:17 deleted_byte_count:454283 replica_placement:100 version:3 modified_at_second:1615590490 - volume id:188 size:1074732792 collection:"collection1" file_count:31867 delete_count:19 deleted_byte_count:393743 replica_placement:100 version:3 modified_at_second:1615487645 - volume id:189 size:1074847896 collection:"collection1" file_count:31450 delete_count:16 deleted_byte_count:1040552 replica_placement:100 version:3 modified_at_second:1615335661 - volume id:190 size:1074008912 collection:"collection1" file_count:31987 delete_count:11 deleted_byte_count:685125 replica_placement:100 version:3 modified_at_second:1615447161 - volume id:191 size:1075493024 collection:"collection1" file_count:31301 delete_count:19 deleted_byte_count:708401 replica_placement:100 version:3 modified_at_second:1615357456 - volume id:192 size:1075857400 collection:"collection1" file_count:31490 delete_count:25 deleted_byte_count:720617 replica_placement:100 version:3 modified_at_second:1615621632 - volume id:193 size:1076616768 collection:"collection1" file_count:31907 delete_count:16 deleted_byte_count:464900 replica_placement:100 version:3 modified_at_second:1615507875 - volume id:194 size:1073985624 collection:"collection1" file_count:31434 delete_count:18 deleted_byte_count:391432 replica_placement:100 version:3 modified_at_second:1615559499 - volume id:195 size:1074158312 collection:"collection1" file_count:31453 delete_count:15 deleted_byte_count:718266 replica_placement:100 version:3 modified_at_second:1615559331 - volume id:196 size:1074594784 collection:"collection1" file_count:31665 delete_count:18 deleted_byte_count:3468922 replica_placement:100 version:3 modified_at_second:1615501688 - volume id:197 size:1075423296 collection:"collection1" file_count:16473 delete_count:15 deleted_byte_count:12552442 replica_placement:100 version:3 modified_at_second:1615485253 - volume id:198 size:1075104712 collection:"collection1" file_count:16577 delete_count:18 deleted_byte_count:6583181 replica_placement:100 version:3 modified_at_second:1615623369 - volume id:199 size:1078117688 collection:"collection1" file_count:16497 delete_count:14 deleted_byte_count:1514286 replica_placement:100 version:3 modified_at_second:1615585984 - volume id:200 size:1075630536 collection:"collection1" file_count:16380 delete_count:18 deleted_byte_count:1103109 replica_placement:100 version:3 modified_at_second:1615485252 - volume id:201 size:1091460440 collection:"collection1" file_count:16684 delete_count:26 deleted_byte_count:5590335 replica_placement:100 version:3 modified_at_second:1615585987 - volume id:202 size:1077533160 collection:"collection1" file_count:2847 delete_count:67 deleted_byte_count:65172985 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615588497 - volume id:203 size:1027316272 collection:"collection1" file_count:3040 delete_count:11 deleted_byte_count:3993230 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615631728 - volume id:204 size:1079766872 collection:"collection1" file_count:3233 delete_count:255 deleted_byte_count:104707641 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615565701 - volume id:205 size:1078485304 collection:"collection1" file_count:2869 delete_count:43 deleted_byte_count:18290259 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615579314 - volume id:206 size:1082045848 collection:"collection1" file_count:2979 delete_count:225 deleted_byte_count:88220074 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630989 - volume id:207 size:1081939960 collection:"collection1" file_count:3010 delete_count:4 deleted_byte_count:692350 replica_placement:100 version:3 modified_at_second:1615269061 - volume id:208 size:1077863624 collection:"collection1" file_count:3147 delete_count:6 deleted_byte_count:858726 replica_placement:100 version:3 modified_at_second:1615495515 - volume id:210 size:1094311304 collection:"collection1" file_count:3468 delete_count:4 deleted_byte_count:466433 replica_placement:100 version:3 modified_at_second:1615495515 - volume id:212 size:1078293448 collection:"collection1" file_count:3106 delete_count:6 deleted_byte_count:2085755 replica_placement:100 version:3 modified_at_second:1615586387 - volume id:213 size:1093588072 collection:"collection1" file_count:3681 delete_count:12 deleted_byte_count:3138791 replica_placement:100 version:3 modified_at_second:1615586387 - volume id:214 size:1074486992 collection:"collection1" file_count:3217 delete_count:10 deleted_byte_count:6392871 replica_placement:100 version:3 modified_at_second:1615586383 - volume id:215 size:1074798704 collection:"collection1" file_count:2819 delete_count:31 deleted_byte_count:10873569 replica_placement:100 version:3 modified_at_second:1615586386 - volume id:217 size:1075381872 collection:"collection1" file_count:3331 delete_count:14 deleted_byte_count:2009141 replica_placement:100 version:3 modified_at_second:1615401638 - volume id:218 size:1081263944 collection:"collection1" file_count:3433 delete_count:14 deleted_byte_count:3454237 replica_placement:100 version:3 modified_at_second:1615603637 - volume id:219 size:1092298816 collection:"collection1" file_count:3193 delete_count:17 deleted_byte_count:2047576 replica_placement:100 version:3 modified_at_second:1615579316 - volume id:220 size:1081928312 collection:"collection1" file_count:3166 delete_count:13 deleted_byte_count:4127709 replica_placement:100 version:3 modified_at_second:1615579317 - volume id:221 size:1106545456 collection:"collection1" file_count:3153 delete_count:11 deleted_byte_count:1496835 replica_placement:100 version:3 modified_at_second:1615269138 - volume id:222 size:1106623104 collection:"collection1" file_count:3273 delete_count:11 deleted_byte_count:2114627 replica_placement:100 version:3 modified_at_second:1615586243 - volume id:223 size:1075233064 collection:"collection1" file_count:2966 delete_count:9 deleted_byte_count:744001 replica_placement:100 version:3 modified_at_second:1615586244 - volume id:224 size:1093691520 collection:"collection1" file_count:3463 delete_count:10 deleted_byte_count:1128328 replica_placement:100 version:3 modified_at_second:1615601870 - volume id:225 size:1080698928 collection:"collection1" file_count:3115 delete_count:7 deleted_byte_count:18170416 replica_placement:100 version:3 modified_at_second:1615434684 - volume id:226 size:1103504768 collection:"collection1" file_count:2965 delete_count:10 deleted_byte_count:2639254 replica_placement:100 version:3 modified_at_second:1615601867 - volume id:228 size:1109784072 collection:"collection1" file_count:2504 delete_count:24 deleted_byte_count:5458950 replica_placement:100 version:3 modified_at_second:1615610489 - volume id:230 size:1080722984 collection:"collection1" file_count:2898 delete_count:15 deleted_byte_count:3929261 replica_placement:100 version:3 modified_at_second:1615610537 - volume id:232 size:1073901520 collection:"collection1" file_count:3004 delete_count:54 deleted_byte_count:10273081 replica_placement:100 version:3 modified_at_second:1615611351 - volume id:234 size:1073835280 collection:"collection1" file_count:2965 delete_count:41 deleted_byte_count:4960354 replica_placement:100 version:3 modified_at_second:1615611351 - volume id:235 size:1075586104 collection:"collection1" file_count:2767 delete_count:33 deleted_byte_count:3216540 replica_placement:100 version:3 modified_at_second:1615611354 - volume id:236 size:1089476136 collection:"collection1" file_count:3231 delete_count:53 deleted_byte_count:11625921 replica_placement:100 version:3 modified_at_second:1615611351 - volume id:237 size:375722792 collection:"collection1" file_count:736 delete_count:16 deleted_byte_count:4464870 replica_placement:100 version:3 modified_at_second:1615631727 - volume id:238 size:354320000 collection:"collection1" file_count:701 delete_count:17 deleted_byte_count:5940420 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615632030 - volume id:239 size:426569024 collection:"collection1" file_count:693 delete_count:19 deleted_byte_count:13020783 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630841 - volume id:240 size:424791528 collection:"collection1" file_count:733 delete_count:13 deleted_byte_count:7515220 replica_placement:100 version:3 modified_at_second:1615631670 - volume id:241 size:380217424 collection:"collection1" file_count:633 delete_count:6 deleted_byte_count:1715768 replica_placement:100 version:3 modified_at_second:1615632006 - volume id:242 size:1075383392 collection:"collection2" file_count:10470 replica_placement:100 version:3 modified_at_second:1614852116 - volume id:243 size:1088174704 collection:"collection2" file_count:11109 delete_count:1 deleted_byte_count:938 replica_placement:100 version:3 modified_at_second:1614852203 - volume id:244 size:1080295352 collection:"collection2" file_count:10812 delete_count:1 deleted_byte_count:795 replica_placement:100 version:3 modified_at_second:1615628825 - volume id:246 size:1075998672 collection:"collection2" file_count:10365 delete_count:1 deleted_byte_count:13112 replica_placement:100 version:3 modified_at_second:1614852106 - volume id:247 size:1075859808 collection:"collection2" file_count:10443 delete_count:2 deleted_byte_count:564486 replica_placement:100 version:3 modified_at_second:1614856152 - volume id:248 size:1084301208 collection:"collection2" file_count:11217 delete_count:4 deleted_byte_count:746488 replica_placement:100 version:3 modified_at_second:1614856285 - volume id:250 size:1080572168 collection:"collection2" file_count:10220 replica_placement:100 version:3 modified_at_second:1614856129 - volume id:252 size:1075065264 collection:"collection2" file_count:14622 delete_count:2 deleted_byte_count:5228 replica_placement:100 version:3 modified_at_second:1614861200 - volume id:253 size:1087328880 collection:"collection2" file_count:14920 delete_count:3 deleted_byte_count:522994 replica_placement:100 version:3 modified_at_second:1614861258 - volume id:254 size:1074830736 collection:"collection2" file_count:14140 delete_count:2 deleted_byte_count:105892 replica_placement:100 version:3 modified_at_second:1614861115 - volume id:255 size:1079581640 collection:"collection2" file_count:14877 delete_count:3 deleted_byte_count:101223 replica_placement:100 version:3 modified_at_second:1614861233 - volume id:256 size:1074283592 collection:"collection2" file_count:14157 delete_count:1 deleted_byte_count:18156 replica_placement:100 version:3 modified_at_second:1614861100 - volume id:257 size:1082621720 collection:"collection2" file_count:18172 delete_count:2 deleted_byte_count:25125 replica_placement:100 version:3 modified_at_second:1614866402 - volume id:258 size:1075527216 collection:"collection2" file_count:18421 delete_count:4 deleted_byte_count:267833 replica_placement:100 version:3 modified_at_second:1614866420 - volume id:259 size:1075507848 collection:"collection2" file_count:18079 delete_count:2 deleted_byte_count:71992 replica_placement:100 version:3 modified_at_second:1614866381 - volume id:260 size:1075105664 collection:"collection2" file_count:17316 delete_count:4 deleted_byte_count:2015310 replica_placement:100 version:3 modified_at_second:1614866226 - volume id:261 size:1076628592 collection:"collection2" file_count:18355 delete_count:1 deleted_byte_count:1155 replica_placement:100 version:3 modified_at_second:1614866420 - volume id:262 size:1078492584 collection:"collection2" file_count:20390 delete_count:3 deleted_byte_count:287601 replica_placement:100 version:3 modified_at_second:1614871601 - volume id:264 size:1081624192 collection:"collection2" file_count:21151 replica_placement:100 version:3 modified_at_second:1614871629 - volume id:265 size:1076401104 collection:"collection2" file_count:19932 delete_count:2 deleted_byte_count:160823 replica_placement:100 version:3 modified_at_second:1614871543 - volume id:266 size:1075617552 collection:"collection2" file_count:20075 delete_count:1 deleted_byte_count:1039 replica_placement:100 version:3 modified_at_second:1614871526 - volume id:267 size:1075699376 collection:"collection2" file_count:21039 delete_count:3 deleted_byte_count:59956 replica_placement:100 version:3 modified_at_second:1614877294 - volume id:270 size:1076876424 collection:"collection2" file_count:22057 delete_count:1 deleted_byte_count:43916 replica_placement:100 version:3 modified_at_second:1614877469 - volume id:271 size:1076992704 collection:"collection2" file_count:22640 delete_count:1 deleted_byte_count:30645 replica_placement:100 version:3 modified_at_second:1614877504 - volume id:272 size:1076145912 collection:"collection2" file_count:21034 delete_count:2 deleted_byte_count:216564 replica_placement:100 version:3 modified_at_second:1614884139 - volume id:273 size:1074873432 collection:"collection2" file_count:20511 delete_count:3 deleted_byte_count:46076 replica_placement:100 version:3 modified_at_second:1614884046 - volume id:274 size:1075994184 collection:"collection2" file_count:20997 replica_placement:100 version:3 modified_at_second:1614884113 - volume id:275 size:1078349024 collection:"collection2" file_count:20808 delete_count:1 deleted_byte_count:1118 replica_placement:100 version:3 modified_at_second:1614884147 - volume id:276 size:1076899880 collection:"collection2" file_count:20190 delete_count:1 deleted_byte_count:8798 replica_placement:100 version:3 modified_at_second:1614884003 - volume id:278 size:1078798632 collection:"collection2" file_count:20597 delete_count:5 deleted_byte_count:400060 replica_placement:100 version:3 modified_at_second:1614890292 - volume id:280 size:1077432160 collection:"collection2" file_count:20286 delete_count:1 deleted_byte_count:879 replica_placement:100 version:3 modified_at_second:1614890262 - volume id:281 size:1077581064 collection:"collection2" file_count:20206 delete_count:3 deleted_byte_count:143964 replica_placement:100 version:3 modified_at_second:1614890237 - volume id:282 size:1075232184 collection:"collection2" file_count:22659 delete_count:4 deleted_byte_count:67915 replica_placement:100 version:3 modified_at_second:1614897304 - volume id:283 size:1080178880 collection:"collection2" file_count:19462 delete_count:7 deleted_byte_count:660407 replica_placement:100 version:3 modified_at_second:1614896623 - volume id:286 size:1077464816 collection:"collection2" file_count:23905 delete_count:6 deleted_byte_count:630577 replica_placement:100 version:3 modified_at_second:1614897401 - volume id:287 size:1074590536 collection:"collection2" file_count:28163 delete_count:5 deleted_byte_count:35727 replica_placement:100 version:3 modified_at_second:1614904875 - volume id:288 size:1075406920 collection:"collection2" file_count:27243 delete_count:2 deleted_byte_count:51519 replica_placement:100 version:3 modified_at_second:1614904738 - volume id:289 size:1075284312 collection:"collection2" file_count:29342 delete_count:5 deleted_byte_count:100454 replica_placement:100 version:3 modified_at_second:1614904977 - volume id:290 size:1074723800 collection:"collection2" file_count:28340 delete_count:4 deleted_byte_count:199064 replica_placement:100 version:3 modified_at_second:1614904924 - volume id:292 size:1092010672 collection:"collection2" file_count:26781 delete_count:5 deleted_byte_count:508910 replica_placement:100 version:3 modified_at_second:1614912325 - volume id:295 size:1074702320 collection:"collection2" file_count:24488 delete_count:3 deleted_byte_count:48555 replica_placement:100 version:3 modified_at_second:1614911929 - volume id:296 size:1077824056 collection:"collection2" file_count:26741 delete_count:4 deleted_byte_count:199906 replica_placement:100 version:3 modified_at_second:1614912301 - volume id:297 size:1080229176 collection:"collection2" file_count:23409 delete_count:5 deleted_byte_count:46268 replica_placement:100 version:3 modified_at_second:1614918481 - volume id:298 size:1075410024 collection:"collection2" file_count:23222 delete_count:2 deleted_byte_count:46110 replica_placement:100 version:3 modified_at_second:1614918474 - volume id:302 size:1077559640 collection:"collection2" file_count:23124 delete_count:7 deleted_byte_count:293111 replica_placement:100 version:3 modified_at_second:1614925500 - volume id:304 size:1081038944 collection:"collection2" file_count:24505 delete_count:2 deleted_byte_count:124447 replica_placement:100 version:3 modified_at_second:1614925569 - volume id:305 size:1074185376 collection:"collection2" file_count:22074 delete_count:5 deleted_byte_count:20221 replica_placement:100 version:3 modified_at_second:1614925312 - volume id:306 size:1074763952 collection:"collection2" file_count:22939 replica_placement:100 version:3 modified_at_second:1614925462 - volume id:307 size:1076567912 collection:"collection2" file_count:23377 delete_count:2 deleted_byte_count:25453 replica_placement:100 version:3 modified_at_second:1614931448 - volume id:308 size:1074022336 collection:"collection2" file_count:23086 delete_count:2 deleted_byte_count:2127 replica_placement:100 version:3 modified_at_second:1614931401 - volume id:311 size:1088248344 collection:"collection2" file_count:23553 delete_count:6 deleted_byte_count:191716 replica_placement:100 version:3 modified_at_second:1614931463 - volume id:312 size:1075037528 collection:"collection2" file_count:22524 replica_placement:100 version:3 modified_at_second:1614937831 - volume id:313 size:1074875960 collection:"collection2" file_count:22404 delete_count:4 deleted_byte_count:51728 replica_placement:100 version:3 modified_at_second:1614937755 - volume id:316 size:1077720776 collection:"collection2" file_count:22605 delete_count:1 deleted_byte_count:8503 replica_placement:100 version:3 modified_at_second:1614937838 - volume id:318 size:1075965168 collection:"collection2" file_count:22459 delete_count:2 deleted_byte_count:37778 replica_placement:100 version:3 modified_at_second:1614943862 - volume id:322 size:1078471536 collection:"collection2" file_count:21905 delete_count:3 deleted_byte_count:145002 replica_placement:100 version:3 modified_at_second:1614950572 - volume id:323 size:1074608056 collection:"collection2" file_count:21605 delete_count:4 deleted_byte_count:172090 replica_placement:100 version:3 modified_at_second:1614950526 - volume id:325 size:1080701232 collection:"collection2" file_count:21735 replica_placement:100 version:3 modified_at_second:1614950525 - volume id:326 size:1076059920 collection:"collection2" file_count:22564 delete_count:2 deleted_byte_count:192886 replica_placement:100 version:3 modified_at_second:1614950619 - volume id:327 size:1076121304 collection:"collection2" file_count:22007 delete_count:3 deleted_byte_count:60358 replica_placement:100 version:3 modified_at_second:1614956487 - volume id:328 size:1074767816 collection:"collection2" file_count:21720 delete_count:3 deleted_byte_count:56429 replica_placement:100 version:3 modified_at_second:1614956362 - volume id:329 size:1076691960 collection:"collection2" file_count:22411 delete_count:5 deleted_byte_count:214092 replica_placement:100 version:3 modified_at_second:1614956485 - volume id:330 size:1080825760 collection:"collection2" file_count:22464 delete_count:2 deleted_byte_count:15771 replica_placement:100 version:3 modified_at_second:1614956476 - volume id:331 size:1074957256 collection:"collection2" file_count:21230 delete_count:4 deleted_byte_count:62145 replica_placement:100 version:3 modified_at_second:1614956259 - volume id:332 size:1075569928 collection:"collection2" file_count:22097 delete_count:3 deleted_byte_count:98273 replica_placement:100 version:3 modified_at_second:1614962869 - volume id:333 size:1074270160 collection:"collection2" file_count:21271 delete_count:2 deleted_byte_count:168122 replica_placement:100 version:3 modified_at_second:1614962697 - volume id:334 size:1075607880 collection:"collection2" file_count:22546 delete_count:6 deleted_byte_count:101538 replica_placement:100 version:3 modified_at_second:1614962978 - volume id:335 size:1076235136 collection:"collection2" file_count:22391 delete_count:3 deleted_byte_count:8838 replica_placement:100 version:3 modified_at_second:1614962970 - volume id:337 size:1075646896 collection:"collection2" file_count:21934 delete_count:1 deleted_byte_count:3397 replica_placement:100 version:3 modified_at_second:1614969937 - volume id:339 size:1078402392 collection:"collection2" file_count:22309 replica_placement:100 version:3 modified_at_second:1614969995 - volume id:340 size:1079462152 collection:"collection2" file_count:22319 delete_count:4 deleted_byte_count:93620 replica_placement:100 version:3 modified_at_second:1614969977 - volume id:341 size:1074448360 collection:"collection2" file_count:21590 delete_count:5 deleted_byte_count:160085 replica_placement:100 version:3 modified_at_second:1614969858 - volume id:343 size:1075345072 collection:"collection2" file_count:21095 delete_count:2 deleted_byte_count:20581 replica_placement:100 version:3 modified_at_second:1614977148 - volume id:346 size:1076464112 collection:"collection2" file_count:22320 delete_count:4 deleted_byte_count:798258 replica_placement:100 version:3 modified_at_second:1614977511 - volume id:347 size:1075145248 collection:"collection2" file_count:22178 delete_count:1 deleted_byte_count:79392 replica_placement:100 version:3 modified_at_second:1614984727 - volume id:348 size:1080623544 collection:"collection2" file_count:21667 delete_count:1 deleted_byte_count:2443 replica_placement:100 version:3 modified_at_second:1614984604 - volume id:349 size:1075957672 collection:"collection2" file_count:22395 delete_count:2 deleted_byte_count:61565 replica_placement:100 version:3 modified_at_second:1614984748 - volume id:351 size:1078795120 collection:"collection2" file_count:23660 delete_count:3 deleted_byte_count:102141 replica_placement:100 version:3 modified_at_second:1614984816 - volume id:352 size:1077145936 collection:"collection2" file_count:22066 delete_count:1 deleted_byte_count:1018 replica_placement:100 version:3 modified_at_second:1614992130 - volume id:353 size:1074897496 collection:"collection2" file_count:21266 delete_count:2 deleted_byte_count:3105374 replica_placement:100 version:3 modified_at_second:1614991951 - volume id:354 size:1085214104 collection:"collection2" file_count:23150 delete_count:4 deleted_byte_count:82391 replica_placement:100 version:3 modified_at_second:1614992208 - volume id:357 size:1074276152 collection:"collection2" file_count:23137 delete_count:4 deleted_byte_count:188487 replica_placement:100 version:3 modified_at_second:1614998792 - volume id:359 size:1074211296 collection:"collection2" file_count:22437 delete_count:2 deleted_byte_count:187953 replica_placement:100 version:3 modified_at_second:1614998711 - volume id:360 size:1075532512 collection:"collection2" file_count:22574 delete_count:3 deleted_byte_count:1774776 replica_placement:100 version:3 modified_at_second:1614998770 - volume id:361 size:1075362744 collection:"collection2" file_count:22272 delete_count:1 deleted_byte_count:3497 replica_placement:100 version:3 modified_at_second:1614998668 - volume id:362 size:1074074176 collection:"collection2" file_count:20595 delete_count:1 deleted_byte_count:112145 replica_placement:100 version:3 modified_at_second:1615004407 - volume id:363 size:1078859640 collection:"collection2" file_count:23177 delete_count:4 deleted_byte_count:9601 replica_placement:100 version:3 modified_at_second:1615004823 - volume id:364 size:1081280880 collection:"collection2" file_count:22686 delete_count:1 deleted_byte_count:84375 replica_placement:100 version:3 modified_at_second:1615004813 - volume id:365 size:1075736632 collection:"collection2" file_count:22193 delete_count:5 deleted_byte_count:259033 replica_placement:100 version:3 modified_at_second:1615004776 - volume id:366 size:1075267272 collection:"collection2" file_count:21856 delete_count:5 deleted_byte_count:138363 replica_placement:100 version:3 modified_at_second:1615004703 - volume id:367 size:1076403648 collection:"collection2" file_count:22995 delete_count:2 deleted_byte_count:36955 replica_placement:100 version:3 modified_at_second:1615010985 - volume id:368 size:1074821960 collection:"collection2" file_count:22252 delete_count:4 deleted_byte_count:3291946 replica_placement:100 version:3 modified_at_second:1615010877 - volume id:369 size:1091472040 collection:"collection2" file_count:23709 delete_count:4 deleted_byte_count:400876 replica_placement:100 version:3 modified_at_second:1615011021 - volume id:370 size:1076040544 collection:"collection2" file_count:22092 delete_count:2 deleted_byte_count:115388 replica_placement:100 version:3 modified_at_second:1615010877 - volume id:371 size:1078806216 collection:"collection2" file_count:22685 delete_count:2 deleted_byte_count:68905 replica_placement:100 version:3 modified_at_second:1615010995 - volume id:372 size:1076193344 collection:"collection2" file_count:22774 delete_count:1 deleted_byte_count:3495 replica_placement:100 version:3 modified_at_second:1615016911 - volume id:373 size:1080928088 collection:"collection2" file_count:22617 delete_count:4 deleted_byte_count:91849 replica_placement:100 version:3 modified_at_second:1615016878 - volume id:374 size:1085011176 collection:"collection2" file_count:23054 delete_count:2 deleted_byte_count:89034 replica_placement:100 version:3 modified_at_second:1615016917 - volume id:376 size:1074845832 collection:"collection2" file_count:22908 delete_count:4 deleted_byte_count:432305 replica_placement:100 version:3 modified_at_second:1615016916 - volume id:377 size:957434264 collection:"collection2" file_count:14929 delete_count:1 deleted_byte_count:43099 replica_placement:100 version:3 modified_at_second:1615632323 - volume id:379 size:1014108528 collection:"collection2" file_count:15362 delete_count:6 deleted_byte_count:2481613 replica_placement:100 version:3 modified_at_second:1615632323 - Disk hdd total size:306912958016 file_count:4201794 deleted_file:15268 deleted_bytes:4779359660 - DataNode 192.168.1.5:8080 total size:306912958016 file_count:4201794 deleted_file:15268 deleted_bytes:4779359660 - Rack DefaultRack total size:306912958016 file_count:4201794 deleted_file:15268 deleted_bytes:4779359660 - DataCenter dc5 total size:306912958016 file_count:4201794 deleted_file:15268 deleted_bytes:4779359660 -total size:775256653592 file_count:10478712 deleted_file:33754 deleted_bytes:10839266043 +Topology volumeSizeLimit:20000 MB nvme(volume:1600/1601 active:1419 free:1 remote:0) hdd(volume:426/2759 active:18446744073709551344 free:2333 remote:0) + DataCenter DefaultDataCenter hdd(volume:426/2759 active:18446744073709551344 free:2333 remote:0) nvme(volume:1600/1601 active:1419 free:1 remote:0) + Rack DefaultRack nvme(volume:1600/1601 active:1419 free:1 remote:0) hdd(volume:426/2759 active:18446744073709551344 free:2333 remote:0) + DataNode 10.244.107.16:8080 nvme(volume:32/33 active:33 free:1 remote:0) + Disk nvme(volume:32/33 active:33 free:1 remote:0) + volume id:36 size:3804920 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:10810 delete_count:9907 deleted_byte_count:2557278 version:3 compact_revision:6 modified_at_second:1627500575 disk_type:"nvme" + volume id:52 size:3834960 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:11124 delete_count:10252 deleted_byte_count:2599071 version:3 compact_revision:8 modified_at_second:1627504771 disk_type:"nvme" + volume id:515 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:3 modified_at_second:1627676213 disk_type:"nvme" + volume id:582 size:1087813800 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3719 delete_count:3716 deleted_byte_count:1074978006 version:3 compact_revision:1 modified_at_second:1627504948 disk_type:"nvme" + volume id:608 size:1083681304 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7883 delete_count:7882 deleted_byte_count:1078951183 version:3 modified_at_second:1627500577 disk_type:"nvme" + volume id:622 size:12583208 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1627672952 disk_type:"nvme" + volume id:633 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627672953 disk_type:"nvme" + volume id:664 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627517790 disk_type:"nvme" + volume id:727 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1627414988 disk_type:"nvme" + volume id:737 size:104857952 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1627415149 disk_type:"nvme" + volume id:739 size:117441120 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:1 modified_at_second:1627415464 disk_type:"nvme" + volume id:753 size:142606888 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1627415280 disk_type:"nvme" + volume id:754 size:109052352 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1627415433 disk_type:"nvme" + volume id:1079 size:20981451056 collection:"braingeneers-backups-swfs" file_count:12262 delete_count:225 deleted_byte_count:349314158 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1106 size:20974117232 collection:"braingeneers-backups-swfs" file_count:12258 delete_count:229 deleted_byte_count:383576860 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:246103 size:21017335272 collection:"hengenlab" file_count:8062 version:3 compact_revision:1 modified_at_second:1627416401 disk_type:"nvme" + volume id:246106 size:21091278592 collection:"hengenlab" file_count:8043 version:3 compact_revision:1 modified_at_second:1627416401 disk_type:"nvme" + volume id:246112 size:21141587752 collection:"hengenlab" file_count:8109 version:3 compact_revision:1 modified_at_second:1627416409 disk_type:"nvme" + volume id:246118 size:21027658872 collection:"hengenlab" file_count:8003 version:3 compact_revision:1 modified_at_second:1627416369 disk_type:"nvme" + volume id:246119 size:21090047592 collection:"hengenlab" file_count:8027 version:3 compact_revision:1 modified_at_second:1627416401 disk_type:"nvme" + volume id:246147 size:20993918552 collection:"hengenlab" file_count:8643 delete_count:496 deleted_byte_count:1229459895 version:3 modified_at_second:1627414743 disk_type:"nvme" + volume id:246148 size:20988892312 collection:"hengenlab" file_count:8641 delete_count:578 deleted_byte_count:1420198603 version:3 modified_at_second:1627414690 disk_type:"nvme" + volume id:246151 size:21067515568 collection:"hengenlab" file_count:8011 version:3 modified_at_second:1627416930 disk_type:"nvme" + volume id:246156 size:21374966256 collection:"hengenlab" file_count:8202 version:3 modified_at_second:1627416944 disk_type:"nvme" + volume id:246163 size:21293954224 collection:"hengenlab" file_count:8134 version:3 modified_at_second:1627417333 disk_type:"nvme" + volume id:246169 size:21649654648 collection:"hengenlab" file_count:8228 version:3 modified_at_second:1627417511 disk_type:"nvme" + volume id:246174 size:21118992920 collection:"hengenlab" file_count:8106 version:3 modified_at_second:1627418092 disk_type:"nvme" + volume id:246202 size:21384772480 collection:"hengenlab" file_count:8145 version:3 modified_at_second:1627420091 disk_type:"nvme" + volume id:246224 size:21800603816 collection:"hengenlab" file_count:8349 version:3 modified_at_second:1627421747 disk_type:"nvme" + volume id:246231 size:21151072736 collection:"hengenlab" file_count:8207 version:3 modified_at_second:1627422299 disk_type:"nvme" + volume id:246266 size:21310016776 collection:"hengenlab" file_count:8019 version:3 modified_at_second:1627423869 disk_type:"nvme" + volume id:246291 size:21563812856 collection:"hengenlab" file_count:8243 version:3 modified_at_second:1627425133 disk_type:"nvme" + volume id:246311 size:6461898408 collection:"hengenlab" file_count:2437 version:3 modified_at_second:1627425695 disk_type:"nvme" + Disk nvme total size:412228916664 file_count:199695 deleted_file:33285 deleted_bytes:5541635054 + DataNode 10.244.107.16:8080 total size:412228916664 file_count:199695 deleted_file:33285 deleted_bytes:5541635054 + DataNode 10.244.107.37:8080 nvme(volume:32/32 active:32 free:0 remote:0) + Disk nvme(volume:32/32 active:32 free:0 remote:0) + volume id:57 size:3954520 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:11025 delete_count:10133 deleted_byte_count:2654098 version:3 compact_revision:7 modified_at_second:1627504757 disk_type:"nvme" + volume id:60 size:4002800 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:11132 delete_count:10231 deleted_byte_count:2675670 version:3 compact_revision:7 modified_at_second:1627504774 disk_type:"nvme" + volume id:578 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1627516919 disk_type:"nvme" + volume id:599 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627517793 disk_type:"nvme" + volume id:610 size:8388808 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627516918 disk_type:"nvme" + volume id:760 size:41943328 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:3 modified_at_second:1627415104 disk_type:"nvme" + volume id:771 size:71303424 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1627415229 disk_type:"nvme" + volume id:779 size:46137712 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:2 modified_at_second:1627504940 disk_type:"nvme" + volume id:782 size:100663560 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1627415422 disk_type:"nvme" + volume id:804 size:41943312 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:1 modified_at_second:1627500575 disk_type:"nvme" + volume id:1124 size:20981558144 collection:"braingeneers-backups-swfs" file_count:12294 delete_count:238 deleted_byte_count:353310263 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1132 size:20972966960 collection:"braingeneers-backups-swfs" file_count:12252 delete_count:230 deleted_byte_count:365652225 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:133787 size:21301768216 collection:"hengenlab" file_count:8526 delete_count:8264 deleted_byte_count:20658424014 read_only:true version:3 modified_at_second:1627419537 disk_type:"nvme" + volume id:133819 size:21226668664 collection:"hengenlab" file_count:8129 delete_count:8129 deleted_byte_count:21226124008 read_only:true version:3 modified_at_second:1627420866 disk_type:"nvme" + volume id:133869 size:21571728944 collection:"hengenlab" file_count:8249 read_only:true version:3 compact_revision:1 modified_at_second:1627423103 disk_type:"nvme" + volume id:246099 size:93611912 file_count:110 version:3 modified_at_second:1627423623 disk_type:"nvme" + volume id:246100 size:102506304 file_count:118 version:3 modified_at_second:1627423803 disk_type:"nvme" + volume id:246101 size:105559656 file_count:128 version:3 modified_at_second:1627424043 disk_type:"nvme" + volume id:246110 size:21077107912 collection:"hengenlab" file_count:8028 read_only:true version:3 compact_revision:1 modified_at_second:1627416386 disk_type:"nvme" + volume id:246111 size:21238297720 collection:"hengenlab" file_count:8218 read_only:true version:3 compact_revision:1 modified_at_second:1627416416 disk_type:"nvme" + volume id:246116 size:21116990672 collection:"hengenlab" file_count:8000 read_only:true version:3 compact_revision:1 modified_at_second:1627416386 disk_type:"nvme" + volume id:246121 size:21025910752 collection:"hengenlab" file_count:7929 read_only:true version:3 compact_revision:1 modified_at_second:1627416401 disk_type:"nvme" + volume id:246126 size:21135866264 collection:"hengenlab" file_count:8120 read_only:true version:3 compact_revision:1 modified_at_second:1627416416 disk_type:"nvme" + volume id:246145 size:20996024600 collection:"hengenlab" file_count:8650 delete_count:569 deleted_byte_count:1406783580 read_only:true version:3 modified_at_second:1627414655 disk_type:"nvme" + volume id:246159 size:21483403792 collection:"hengenlab" file_count:8224 delete_count:3 deleted_byte_count:12582975 read_only:true version:3 modified_at_second:1627417144 disk_type:"nvme" + volume id:246170 size:21584773216 collection:"hengenlab" file_count:8255 read_only:true version:3 modified_at_second:1627417520 disk_type:"nvme" + volume id:246177 size:21240770832 collection:"hengenlab" file_count:8210 read_only:true version:3 modified_at_second:1627418752 disk_type:"nvme" + volume id:246239 size:21089256352 collection:"hengenlab" file_count:8018 read_only:true version:3 modified_at_second:1627423046 disk_type:"nvme" + volume id:246262 size:21394156680 collection:"hengenlab" file_count:8164 read_only:true version:3 modified_at_second:1627423585 disk_type:"nvme" + volume id:246265 size:21327729128 collection:"hengenlab" file_count:8186 read_only:true version:3 modified_at_second:1627423877 disk_type:"nvme" + volume id:246275 size:1338420296 collection:"hengenlab" file_count:515 version:3 modified_at_second:1627424194 disk_type:"nvme" + volume id:246277 size:1399878536 collection:"hengenlab" file_count:528 version:3 modified_at_second:1627424194 disk_type:"nvme" + Disk nvme total size:364135876200 file_count:171029 deleted_file:37799 deleted_bytes:44036595503 + DataNode 10.244.107.37:8080 total size:364135876200 file_count:171029 deleted_file:37799 deleted_bytes:44036595503 + DataNode 10.244.11.0:8080 nvme(volume:69/69 active:68 free:0 remote:0) + Disk nvme(volume:69/69 active:68 free:0 remote:0) + volume id:74 size:624088 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:910 read_only:true version:3 compact_revision:8 modified_at_second:1627507800 disk_type:"nvme" + volume id:76 size:575032 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:856 read_only:true version:3 compact_revision:6 modified_at_second:1627507800 disk_type:"nvme" + volume id:204 size:1214000688 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:580 read_only:true version:3 modified_at_second:1623182699 disk_type:"nvme" + volume id:227 size:1101811464 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:528 read_only:true version:3 modified_at_second:1623182338 disk_type:"nvme" + volume id:232 size:1164914112 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:562 read_only:true version:3 modified_at_second:1623181649 disk_type:"nvme" + volume id:286 size:1163548288 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:566 read_only:true version:3 modified_at_second:1623181548 disk_type:"nvme" + volume id:319 size:1189298656 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:593 read_only:true version:3 modified_at_second:1623182442 disk_type:"nvme" + volume id:369 size:1093083336 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:523 read_only:true version:3 modified_at_second:1623181034 disk_type:"nvme" + volume id:377 size:1103962224 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:554 read_only:true version:3 modified_at_second:1623180941 disk_type:"nvme" + volume id:378 size:1085340552 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:552 read_only:true version:3 modified_at_second:1623180833 disk_type:"nvme" + volume id:383 size:1169239608 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:591 read_only:true version:3 modified_at_second:1623181752 disk_type:"nvme" + volume id:404 size:1141464880 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:546 read_only:true version:3 modified_at_second:1623181966 disk_type:"nvme" + volume id:415 size:1134207256 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:552 read_only:true version:3 modified_at_second:1623181145 disk_type:"nvme" + volume id:440 size:1139081320 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:550 read_only:true version:3 modified_at_second:1623181245 disk_type:"nvme" + volume id:468 size:1178437616 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:637 read_only:true version:3 modified_at_second:1623182594 disk_type:"nvme" + volume id:475 size:1156692960 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:578 read_only:true version:3 modified_at_second:1623181446 disk_type:"nvme" + volume id:480 size:1091564648 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:538 read_only:true version:3 modified_at_second:1623180844 disk_type:"nvme" + volume id:521 size:1158613792 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:565 read_only:true version:3 modified_at_second:1623182103 disk_type:"nvme" + volume id:553 size:1089047024 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:608 read_only:true version:3 modified_at_second:1623181345 disk_type:"nvme" + volume id:561 size:1092313176 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:689 read_only:true version:3 modified_at_second:1623182209 disk_type:"nvme" + volume id:796 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 read_only:true version:3 compact_revision:2 modified_at_second:1623182856 disk_type:"nvme" + volume id:811 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 read_only:true version:3 compact_revision:1 modified_at_second:1623184702 disk_type:"nvme" + volume id:818 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 read_only:true version:3 compact_revision:2 modified_at_second:1623183494 disk_type:"nvme" + volume id:835 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 read_only:true version:3 compact_revision:2 modified_at_second:1623183822 disk_type:"nvme" + volume id:887 size:83886632 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194335 read_only:true version:3 compact_revision:1 modified_at_second:1627504764 disk_type:"nvme" + volume id:924 size:134218088 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 read_only:true version:3 compact_revision:1 modified_at_second:1623183679 disk_type:"nvme" + volume id:950 size:104857976 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 delete_count:1 deleted_byte_count:4194342 read_only:true version:3 compact_revision:1 modified_at_second:1627504751 disk_type:"nvme" + volume id:955 size:201327056 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 read_only:true version:3 compact_revision:2 modified_at_second:1623184026 disk_type:"nvme" + volume id:958 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 read_only:true version:3 compact_revision:1 modified_at_second:1623184142 disk_type:"nvme" + volume id:970 size:171966984 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 read_only:true version:3 compact_revision:2 modified_at_second:1623184419 disk_type:"nvme" + volume id:988 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 read_only:true version:3 compact_revision:1 modified_at_second:1623182867 disk_type:"nvme" + volume id:989 size:8388776 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 read_only:true version:3 compact_revision:1 modified_at_second:1623183080 disk_type:"nvme" + volume id:996 size:37748888 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 read_only:true version:3 compact_revision:2 modified_at_second:1623182972 disk_type:"nvme" + volume id:1023 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 read_only:true version:3 compact_revision:1 modified_at_second:1623183253 disk_type:"nvme" + volume id:1049 size:20975717256 collection:"braingeneers-backups-swfs" file_count:12279 delete_count:221 deleted_byte_count:347033818 read_only:true version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1080 size:20972503688 collection:"braingeneers-backups-swfs" file_count:12296 delete_count:244 deleted_byte_count:399119927 read_only:true version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1095 size:20974245384 collection:"braingeneers-backups-swfs" file_count:12208 delete_count:244 deleted_byte_count:389921617 read_only:true version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1112 size:20990798696 collection:"braingeneers-backups-swfs" file_count:12260 delete_count:238 deleted_byte_count:380046331 read_only:true version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:133789 size:735486336 collection:"hengenlab" file_count:282 read_only:true version:3 compact_revision:1 modified_at_second:1627507744 disk_type:"nvme" + volume id:133792 size:881869784 collection:"hengenlab" file_count:310 read_only:true version:3 compact_revision:1 modified_at_second:1627507554 disk_type:"nvme" + volume id:133802 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507782 disk_type:"nvme" + volume id:133811 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507782 disk_type:"nvme" + volume id:133812 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507744 disk_type:"nvme" + volume id:133815 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507555 disk_type:"nvme" + volume id:133816 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" + volume id:133832 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507788 disk_type:"nvme" + volume id:133834 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507788 disk_type:"nvme" + volume id:133837 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507634 disk_type:"nvme" + volume id:133845 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507574 disk_type:"nvme" + volume id:133855 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507364 disk_type:"nvme" + volume id:133867 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507096 disk_type:"nvme" + volume id:133876 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507649 disk_type:"nvme" + volume id:133880 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507428 disk_type:"nvme" + volume id:133881 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" + volume id:133882 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507171 disk_type:"nvme" + volume id:133905 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507634 disk_type:"nvme" + volume id:133907 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" + volume id:133908 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507555 disk_type:"nvme" + volume id:133913 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" + volume id:133928 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" + volume id:133932 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507555 disk_type:"nvme" + volume id:133952 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507152 disk_type:"nvme" + volume id:133956 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" + volume id:133959 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507170 disk_type:"nvme" + volume id:133960 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507153 disk_type:"nvme" + volume id:133971 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507574 disk_type:"nvme" + volume id:133972 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507046 disk_type:"nvme" + volume id:133986 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" + volume id:133992 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507786 disk_type:"nvme" + Disk nvme total size:107126713872 file_count:61758 deleted_file:949 deleted_bytes:1524510370 + DataNode 10.244.11.0:8080 total size:107126713872 file_count:61758 deleted_file:949 deleted_bytes:1524510370 + DataNode 10.244.11.19:8080 nvme(volume:66/66 active:62 free:0 remote:0) + Disk nvme(volume:66/66 active:62 free:0 remote:0) + volume id:70 size:529288 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:884 version:3 compact_revision:8 modified_at_second:1627507799 disk_type:"nvme" + volume id:157 size:1122476512 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:548 version:3 modified_at_second:1623181523 disk_type:"nvme" + volume id:158 size:1196081064 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:582 version:3 modified_at_second:1623182569 disk_type:"nvme" + volume id:177 size:1133337560 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:702 version:3 modified_at_second:1623181220 disk_type:"nvme" + volume id:277 size:1161156640 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:560 version:3 modified_at_second:1623181939 disk_type:"nvme" + volume id:315 size:1092148208 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:547 version:3 modified_at_second:1623181359 disk_type:"nvme" + volume id:323 size:1163779192 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:559 version:3 modified_at_second:1623182312 disk_type:"nvme" + volume id:342 size:1149035344 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:577 version:3 modified_at_second:1623181954 disk_type:"nvme" + volume id:353 size:1252673472 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:608 version:3 modified_at_second:1610497794 disk_type:"nvme" + volume id:418 size:1132380048 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:549 version:3 modified_at_second:1623181663 disk_type:"nvme" + volume id:456 size:1107957400 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:555 version:3 modified_at_second:1623180914 disk_type:"nvme" + volume id:457 size:1192491288 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:595 version:3 modified_at_second:1623182726 disk_type:"nvme" + volume id:476 size:1147841016 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:573 version:3 modified_at_second:1623182117 disk_type:"nvme" + volume id:488 size:1133874736 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:554 version:3 modified_at_second:1623181234 disk_type:"nvme" + volume id:489 size:1111273568 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:537 version:3 modified_at_second:1623181048 disk_type:"nvme" + volume id:490 size:1129110824 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:544 version:3 modified_at_second:1623181535 disk_type:"nvme" + volume id:507 size:1108618968 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:632 version:3 modified_at_second:1623180928 disk_type:"nvme" + volume id:540 size:1189084392 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:584 version:3 modified_at_second:1623182300 disk_type:"nvme" + volume id:558 size:1161785320 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:747 version:3 modified_at_second:1623182467 disk_type:"nvme" + volume id:894 size:67109000 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1623183878 disk_type:"nvme" + volume id:902 size:268436096 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1623184409 disk_type:"nvme" + volume id:909 size:138412488 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1623184037 disk_type:"nvme" + volume id:915 size:100663512 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623183176 disk_type:"nvme" + volume id:918 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623183739 disk_type:"nvme" + volume id:922 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1617901708 disk_type:"nvme" + volume id:923 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1617901544 disk_type:"nvme" + volume id:966 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623183298 disk_type:"nvme" + volume id:968 size:79692256 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 delete_count:2 deleted_byte_count:8388677 version:3 compact_revision:1 modified_at_second:1627504913 disk_type:"nvme" + volume id:997 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183186 disk_type:"nvme" + volume id:998 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623183727 disk_type:"nvme" + volume id:1001 size:8 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" replica_placement:1 version:3 compact_revision:2 modified_at_second:1623183459 disk_type:"nvme" + volume id:1002 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183449 disk_type:"nvme" + volume id:1014 size:205521504 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:1 modified_at_second:1623184132 disk_type:"nvme" + volume id:1042 size:376 collection:"pvc-0544e3a6-da8f-42fe-a149-3a103bcc8552" file_count:1 version:3 modified_at_second:1615234634 disk_type:"nvme" + volume id:1064 size:20974995560 collection:"braingeneers-backups-swfs" file_count:12287 delete_count:236 deleted_byte_count:359450306 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1086 size:20974060120 collection:"braingeneers-backups-swfs" file_count:12171 delete_count:223 deleted_byte_count:381767404 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1102 size:20974457480 collection:"braingeneers-backups-swfs" file_count:12357 delete_count:233 deleted_byte_count:380291056 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1105 size:20975999912 collection:"braingeneers-backups-swfs" file_count:12219 delete_count:205 deleted_byte_count:360816088 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1712 size:161457328 file_count:334 version:3 modified_at_second:1627079927 disk_type:"nvme" + volume id:133798 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507649 disk_type:"nvme" + volume id:133818 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627506992 disk_type:"nvme" + volume id:133824 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" + volume id:133835 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507329 disk_type:"nvme" + volume id:133844 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507153 disk_type:"nvme" + volume id:133846 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" + volume id:133847 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507574 disk_type:"nvme" + volume id:133849 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507782 disk_type:"nvme" + volume id:133854 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627506993 disk_type:"nvme" + volume id:133858 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507009 disk_type:"nvme" + volume id:133859 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507365 disk_type:"nvme" + volume id:133860 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507574 disk_type:"nvme" + volume id:133865 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" + volume id:133870 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627506993 disk_type:"nvme" + volume id:133872 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507788 disk_type:"nvme" + volume id:133877 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507114 disk_type:"nvme" + volume id:133897 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507046 disk_type:"nvme" + volume id:133904 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" + volume id:133942 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507114 disk_type:"nvme" + volume id:133967 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627507329 disk_type:"nvme" + volume id:133984 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507553 disk_type:"nvme" + volume id:134003 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507096 disk_type:"nvme" + volume id:134013 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507788 disk_type:"nvme" + volume id:134022 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" + volume id:134023 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507170 disk_type:"nvme" + volume id:134031 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507170 disk_type:"nvme" + volume id:134038 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507574 disk_type:"nvme" + Disk nvme total size:106118147352 file_count:60853 deleted_file:899 deleted_bytes:1490713531 + DataNode 10.244.11.19:8080 total size:106118147352 file_count:60853 deleted_file:899 deleted_bytes:1490713531 + DataNode 10.244.11.26:8080 nvme(volume:66/66 active:18446744073709551615 free:0 remote:0) + Disk nvme(volume:66/66 active:18446744073709551615 free:0 remote:0) + volume id:7 size:288797416 file_count:5629 delete_count:1 deleted_byte_count:266 version:3 modified_at_second:1627417083 disk_type:"nvme" + volume id:127 size:8 collection:"._.DS_Store" version:3 modified_at_second:1610069605 disk_type:"nvme" + volume id:144 size:1656454968 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:856 version:3 modified_at_second:1610491353 disk_type:"nvme" + volume id:145 size:1662083456 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:863 version:3 modified_at_second:1610491353 disk_type:"nvme" + volume id:183 size:1264059216 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:766 version:3 modified_at_second:1610494389 disk_type:"nvme" + volume id:201 size:1220315640 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:621 version:3 modified_at_second:1610494836 disk_type:"nvme" + volume id:222 size:1464201984 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:703 version:3 modified_at_second:1610496178 disk_type:"nvme" + volume id:230 size:1212205592 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:585 version:3 modified_at_second:1610496236 disk_type:"nvme" + volume id:234 size:1336320944 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:643 version:3 modified_at_second:1610496298 disk_type:"nvme" + volume id:235 size:1356021448 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:648 version:3 modified_at_second:1610496298 disk_type:"nvme" + volume id:247 size:1186730544 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:603 version:3 modified_at_second:1610496421 disk_type:"nvme" + volume id:298 size:1271544400 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:615 version:3 modified_at_second:1610497013 disk_type:"nvme" + volume id:303 size:1261139456 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:607 version:3 modified_at_second:1610497082 disk_type:"nvme" + volume id:310 size:1183449136 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:589 version:3 modified_at_second:1610497162 disk_type:"nvme" + volume id:328 size:1269368376 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:611 version:3 modified_at_second:1610497407 disk_type:"nvme" + volume id:330 size:1211938144 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:596 version:3 modified_at_second:1610497483 disk_type:"nvme" + volume id:355 size:1288125688 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:623 version:3 modified_at_second:1610497794 disk_type:"nvme" + volume id:409 size:1226643888 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:600 version:3 modified_at_second:1610498523 disk_type:"nvme" + volume id:420 size:1259995816 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:603 version:3 modified_at_second:1610498676 disk_type:"nvme" + volume id:432 size:1270209832 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:625 version:3 modified_at_second:1610498827 disk_type:"nvme" + volume id:470 size:1251179768 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:674 version:3 modified_at_second:1610499335 disk_type:"nvme" + volume id:550 size:1268929112 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:705 version:3 modified_at_second:1610644201 disk_type:"nvme" + volume id:725 size:157216216 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1618444181 disk_type:"nvme" + volume id:729 size:142606824 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:3 modified_at_second:1627500611 disk_type:"nvme" + volume id:775 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1619387453 disk_type:"nvme" + volume id:781 size:134218040 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1617901623 disk_type:"nvme" + volume id:824 size:142606856 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1619387455 disk_type:"nvme" + volume id:827 size:75497816 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1619387460 disk_type:"nvme" + volume id:889 size:71303408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1619387460 disk_type:"nvme" + volume id:938 size:171966944 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1619387452 disk_type:"nvme" + volume id:948 size:171967008 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:1 modified_at_second:1627500593 disk_type:"nvme" + volume id:977 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1617901619 disk_type:"nvme" + volume id:1026 size:104857944 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1618444164 disk_type:"nvme" + volume id:1043 size:8 collection:"pvc-73532100-54aa-469c-b8a7-1774be8c3b9e" version:3 compact_revision:3 modified_at_second:1625624761 disk_type:"nvme" + volume id:1045 size:8 collection:"pvc-73532100-54aa-469c-b8a7-1774be8c3b9e" version:3 compact_revision:3 modified_at_second:1625624761 disk_type:"nvme" + volume id:1081 size:20986367400 collection:"braingeneers-backups-swfs" file_count:12221 delete_count:259 deleted_byte_count:448102839 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1093 size:20975891280 collection:"braingeneers-backups-swfs" file_count:12292 delete_count:259 deleted_byte_count:412232025 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1096 size:20979632232 collection:"braingeneers-backups-swfs" file_count:12181 delete_count:212 deleted_byte_count:340140861 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1130 size:20973820192 collection:"braingeneers-backups-swfs" file_count:12337 delete_count:242 deleted_byte_count:369569018 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:133795 size:21385503576 collection:"hengenlab" file_count:8200 delete_count:8187 deleted_byte_count:21358739950 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" + volume id:133808 size:21202577760 collection:"hengenlab" file_count:8071 delete_count:8062 deleted_byte_count:21180017048 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" + volume id:133809 size:21230369728 collection:"hengenlab" file_count:8092 delete_count:8078 deleted_byte_count:21202564777 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" + volume id:133810 size:21235314952 collection:"hengenlab" file_count:8121 delete_count:8103 deleted_byte_count:21190730900 read_only:true version:3 modified_at_second:1627415000 disk_type:"nvme" + volume id:133813 size:21313247416 collection:"hengenlab" file_count:8254 delete_count:8237 deleted_byte_count:21279140176 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" + volume id:133814 size:21289223464 collection:"hengenlab" file_count:8186 delete_count:8173 deleted_byte_count:21249877828 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" + volume id:133820 size:21328570240 collection:"hengenlab" file_count:8104 delete_count:8092 deleted_byte_count:21296570114 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" + volume id:133839 size:21083537992 collection:"hengenlab" file_count:8122 delete_count:8113 deleted_byte_count:21064119544 read_only:true version:3 modified_at_second:1627415000 disk_type:"nvme" + volume id:133853 size:21604021952 collection:"hengenlab" file_count:8277 delete_count:8259 deleted_byte_count:21549990235 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" + volume id:133861 size:21144475920 collection:"hengenlab" file_count:8141 delete_count:8130 deleted_byte_count:21119813441 read_only:true version:3 modified_at_second:1627414998 disk_type:"nvme" + volume id:133868 size:21265175232 collection:"hengenlab" file_count:8180 delete_count:8173 deleted_byte_count:21247850068 read_only:true version:3 modified_at_second:1627415000 disk_type:"nvme" + volume id:133875 size:21037253832 collection:"hengenlab" file_count:7999 delete_count:7987 deleted_byte_count:21008406537 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" + volume id:133885 size:21496349080 collection:"hengenlab" file_count:8263 delete_count:8248 deleted_byte_count:21464338437 read_only:true version:3 modified_at_second:1627415000 disk_type:"nvme" + volume id:133887 size:21082600992 collection:"hengenlab" file_count:8108 delete_count:8101 deleted_byte_count:21062134970 read_only:true version:3 modified_at_second:1627415000 disk_type:"nvme" + volume id:133895 size:21227764056 collection:"hengenlab" file_count:8043 delete_count:8028 deleted_byte_count:21195768100 read_only:true version:3 modified_at_second:1627414998 disk_type:"nvme" + volume id:133912 size:21136149656 collection:"hengenlab" file_count:8097 delete_count:8083 deleted_byte_count:21102052930 read_only:true version:3 modified_at_second:1627415000 disk_type:"nvme" + volume id:133919 size:21105633736 collection:"hengenlab" file_count:8018 delete_count:8004 deleted_byte_count:21062105129 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" + volume id:133921 size:21380640952 collection:"hengenlab" file_count:8224 delete_count:8203 deleted_byte_count:21323467123 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" + volume id:133924 size:21496832784 collection:"hengenlab" file_count:8167 delete_count:8155 deleted_byte_count:21464828475 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" + volume id:133925 size:21108697560 collection:"hengenlab" file_count:8097 delete_count:8080 deleted_byte_count:21058872203 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" + volume id:133929 size:21172350416 collection:"hengenlab" file_count:8030 delete_count:8021 deleted_byte_count:21149792478 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" + volume id:133934 size:21249851816 collection:"hengenlab" file_count:8113 delete_count:8094 deleted_byte_count:21201073969 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" + volume id:133941 size:21048173224 collection:"hengenlab" file_count:8022 delete_count:7869 deleted_byte_count:20648130020 read_only:true version:3 modified_at_second:1627415036 disk_type:"nvme" + volume id:133946 size:21038839736 collection:"hengenlab" file_count:8043 delete_count:7919 deleted_byte_count:20735263790 read_only:true version:3 modified_at_second:1627415027 disk_type:"nvme" + volume id:133947 size:21113908544 collection:"hengenlab" file_count:8042 delete_count:256 deleted_byte_count:664802560 read_only:true version:3 modified_at_second:1627416494 disk_type:"nvme" + volume id:133953 size:21149111216 collection:"hengenlab" file_count:7995 delete_count:277 deleted_byte_count:746591929 read_only:true version:3 modified_at_second:1627416480 disk_type:"nvme" + volume id:246168 size:19535090304 collection:"hengenlab" file_count:7417 delete_count:1 deleted_byte_count:4194325 version:3 modified_at_second:1627504928 disk_type:"nvme" + Disk nvme total size:683067985504 file_count:286274 deleted_file:195908 deleted_bytes:511209670735 + DataNode 10.244.11.26:8080 total size:683067985504 file_count:286274 deleted_file:195908 deleted_bytes:511209670735 + DataNode 10.244.11.35:8080 nvme(volume:67/67 active:64 free:0 remote:0) + Disk nvme(volume:67/67 active:64 free:0 remote:0) + volume id:45 size:545648 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:812 version:3 compact_revision:7 modified_at_second:1627507800 disk_type:"nvme" + volume id:111 size:662374536 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1034 version:3 compact_revision:2 modified_at_second:1627618182 disk_type:"nvme" + volume id:196 size:1159925296 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3382 version:3 modified_at_second:1623181741 disk_type:"nvme" + volume id:282 size:1173833248 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:568 version:3 modified_at_second:1623182545 disk_type:"nvme" + volume id:284 size:1106394184 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:535 version:3 modified_at_second:1623182351 disk_type:"nvme" + volume id:287 size:1166213152 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:589 version:3 modified_at_second:1623182558 disk_type:"nvme" + volume id:320 size:1105052992 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:554 version:3 modified_at_second:1623181433 disk_type:"nvme" + volume id:336 size:1148056416 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:569 version:3 modified_at_second:1623181562 disk_type:"nvme" + volume id:347 size:1587167392 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:842 version:3 modified_at_second:1610497707 disk_type:"nvme" + volume id:350 size:1117751376 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:535 version:3 modified_at_second:1623181421 disk_type:"nvme" + volume id:356 size:1196620360 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:583 version:3 modified_at_second:1623182739 disk_type:"nvme" + volume id:382 size:1118311696 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:558 version:3 modified_at_second:1623181132 disk_type:"nvme" + volume id:449 size:1154088216 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:554 version:3 modified_at_second:1623182198 disk_type:"nvme" + volume id:453 size:1164991128 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:562 version:3 modified_at_second:1623182184 disk_type:"nvme" + volume id:469 size:1140820728 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:612 version:3 modified_at_second:1610499328 disk_type:"nvme" + volume id:487 size:1111840200 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:563 version:3 modified_at_second:1623180952 disk_type:"nvme" + volume id:524 size:1121395600 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:543 version:3 modified_at_second:1623181119 disk_type:"nvme" + volume id:551 size:1085123224 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:614 version:3 modified_at_second:1623181256 disk_type:"nvme" + volume id:562 size:1156026888 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:717 version:3 modified_at_second:1623181993 disk_type:"nvme" + volume id:795 size:71303424 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623184096 disk_type:"nvme" + volume id:815 size:176161368 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 delete_count:2 deleted_byte_count:8388677 version:3 compact_revision:1 modified_at_second:1627500580 disk_type:"nvme" + volume id:850 size:79692200 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1623183658 disk_type:"nvme" + volume id:863 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623183379 disk_type:"nvme" + volume id:879 size:109052352 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1623184652 disk_type:"nvme" + volume id:896 size:138412464 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1623184233 disk_type:"nvme" + volume id:897 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623183286 disk_type:"nvme" + volume id:925 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1623183197 disk_type:"nvme" + volume id:932 size:79692248 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1623183959 disk_type:"nvme" + volume id:952 size:100663544 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623184374 disk_type:"nvme" + volume id:960 size:209715864 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1619387459 disk_type:"nvme" + volume id:973 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1623183469 disk_type:"nvme" + volume id:1015 size:8 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" replica_placement:1 version:3 compact_revision:1 modified_at_second:1623183110 disk_type:"nvme" + volume id:1017 size:155190024 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:9 delete_count:2 deleted_byte_count:8388670 version:3 compact_revision:1 modified_at_second:1627504926 disk_type:"nvme" + volume id:1052 size:20979135608 collection:"braingeneers-backups-swfs" file_count:12284 delete_count:262 deleted_byte_count:434825085 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1054 size:20975860960 collection:"braingeneers-backups-swfs" file_count:12206 delete_count:252 deleted_byte_count:416631769 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1069 size:20973437296 collection:"braingeneers-backups-swfs" file_count:12173 delete_count:192 deleted_byte_count:307674992 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1090 size:20976149576 collection:"braingeneers-backups-swfs" file_count:12258 delete_count:271 deleted_byte_count:438418834 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1690 size:52115880 file_count:18 version:3 modified_at_second:1627078487 disk_type:"nvme" + volume id:1691 size:127169592 file_count:41 version:3 modified_at_second:1627078607 disk_type:"nvme" + volume id:133793 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507170 disk_type:"nvme" + volume id:133800 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" + volume id:133801 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507555 disk_type:"nvme" + volume id:133806 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507096 disk_type:"nvme" + volume id:133807 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627506993 disk_type:"nvme" + volume id:133829 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507744 disk_type:"nvme" + volume id:133830 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627507364 disk_type:"nvme" + volume id:133850 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627507787 disk_type:"nvme" + volume id:133856 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507364 disk_type:"nvme" + volume id:133866 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507009 disk_type:"nvme" + volume id:133888 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507170 disk_type:"nvme" + volume id:133893 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507114 disk_type:"nvme" + volume id:133899 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" + volume id:133900 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507046 disk_type:"nvme" + volume id:133903 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507788 disk_type:"nvme" + volume id:133922 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507552 disk_type:"nvme" + volume id:133923 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507787 disk_type:"nvme" + volume id:133933 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507364 disk_type:"nvme" + volume id:133936 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507153 disk_type:"nvme" + volume id:133937 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507782 disk_type:"nvme" + volume id:133957 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507634 disk_type:"nvme" + volume id:133962 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507648 disk_type:"nvme" + volume id:133970 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507787 disk_type:"nvme" + volume id:133977 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507114 disk_type:"nvme" + volume id:133996 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507574 disk_type:"nvme" + volume id:133997 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507649 disk_type:"nvme" + volume id:134005 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627507648 disk_type:"nvme" + volume id:134006 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627507648 disk_type:"nvme" + Disk nvme total size:105852251944 file_count:63762 deleted_file:981 deleted_bytes:1614328027 + DataNode 10.244.11.35:8080 total size:105852251944 file_count:63762 deleted_file:981 deleted_bytes:1614328027 + DataNode 10.244.11.50:8080 nvme(volume:69/69 active:67 free:0 remote:0) + Disk nvme(volume:69/69 active:67 free:0 remote:0) + volume id:56 size:571720 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:835 version:3 compact_revision:8 modified_at_second:1627507798 disk_type:"nvme" + volume id:179 size:1109217312 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:640 version:3 modified_at_second:1623181587 disk_type:"nvme" + volume id:214 size:1167120904 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:565 version:3 modified_at_second:1623182362 disk_type:"nvme" + volume id:251 size:1123351664 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:552 version:3 modified_at_second:1623182621 disk_type:"nvme" + volume id:265 size:1110039368 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:539 version:3 modified_at_second:1623180975 disk_type:"nvme" + volume id:285 size:1128073600 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:546 version:3 modified_at_second:1623182798 disk_type:"nvme" + volume id:312 size:1150263504 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:582 version:3 modified_at_second:1623182048 disk_type:"nvme" + volume id:352 size:1102353264 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:529 version:3 modified_at_second:1623180892 disk_type:"nvme" + volume id:359 size:1139335592 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:549 version:3 modified_at_second:1623181386 disk_type:"nvme" + volume id:361 size:1165494896 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:563 version:3 modified_at_second:1623182289 disk_type:"nvme" + volume id:391 size:1137412944 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:543 version:3 modified_at_second:1623181294 disk_type:"nvme" + volume id:400 size:1135825296 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:548 version:3 modified_at_second:1623181701 disk_type:"nvme" + volume id:437 size:1134849896 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:548 version:3 modified_at_second:1623181886 disk_type:"nvme" + volume id:438 size:1103700792 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:532 version:3 modified_at_second:1623181497 disk_type:"nvme" + volume id:473 size:1113543640 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:553 version:3 modified_at_second:1623181081 disk_type:"nvme" + volume id:478 size:1126705440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:565 version:3 modified_at_second:1623181181 disk_type:"nvme" + volume id:559 size:1078866520 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:678 version:3 modified_at_second:1623180797 disk_type:"nvme" + volume id:560 size:1154208824 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:726 version:3 modified_at_second:1623182532 disk_type:"nvme" + volume id:565 size:907021680 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1411 version:3 modified_at_second:1623182131 disk_type:"nvme" + volume id:800 size:8 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" replica_placement:1 version:3 compact_revision:1 modified_at_second:1623182899 disk_type:"nvme" + volume id:810 size:71303432 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183787 disk_type:"nvme" + volume id:831 size:71303424 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:2 modified_at_second:1627500577 disk_type:"nvme" + volume id:832 size:109137960 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:3 modified_at_second:1627504759 disk_type:"nvme" + volume id:843 size:71303432 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183346 disk_type:"nvme" + volume id:855 size:134218040 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1623184455 disk_type:"nvme" + volume id:858 size:113246688 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1623183587 disk_type:"nvme" + volume id:861 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623184270 disk_type:"nvme" + volume id:885 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:3 modified_at_second:1623183222 disk_type:"nvme" + volume id:936 size:75497848 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:2 modified_at_second:1627500605 disk_type:"nvme" + volume id:964 size:75497848 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 delete_count:2 deleted_byte_count:8388670 version:3 compact_revision:1 modified_at_second:1627500575 disk_type:"nvme" + volume id:978 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:1 modified_at_second:1627504768 disk_type:"nvme" + volume id:990 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623183527 disk_type:"nvme" + volume id:999 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1623182824 disk_type:"nvme" + volume id:1058 size:20974301928 collection:"braingeneers-backups-swfs" file_count:12271 delete_count:226 deleted_byte_count:357273426 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1066 size:20983198856 collection:"braingeneers-backups-swfs" file_count:12295 delete_count:250 deleted_byte_count:377071913 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1070 size:20990443648 collection:"braingeneers-backups-swfs" file_count:12314 delete_count:243 deleted_byte_count:359409281 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1074 size:20973205968 collection:"braingeneers-backups-swfs" file_count:12296 delete_count:259 deleted_byte_count:436010847 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1689 size:86017768 file_count:28 version:3 modified_at_second:1627417983 disk_type:"nvme" + volume id:133794 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507153 disk_type:"nvme" + volume id:133796 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507046 disk_type:"nvme" + volume id:133803 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507649 disk_type:"nvme" + volume id:133804 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" + volume id:133821 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507170 disk_type:"nvme" + volume id:133822 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627507787 disk_type:"nvme" + volume id:133823 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" + volume id:133827 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" + volume id:133833 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507114 disk_type:"nvme" + volume id:133842 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507788 disk_type:"nvme" + volume id:133848 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507742 disk_type:"nvme" + volume id:133851 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" + volume id:133863 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" + volume id:133871 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" + volume id:133889 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507648 disk_type:"nvme" + volume id:133909 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507788 disk_type:"nvme" + volume id:133918 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507364 disk_type:"nvme" + volume id:133939 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507574 disk_type:"nvme" + volume id:133955 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" + volume id:133973 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" + volume id:133978 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627506993 disk_type:"nvme" + volume id:133981 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" + volume id:133983 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" + volume id:133987 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507744 disk_type:"nvme" + volume id:133988 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627506992 disk_type:"nvme" + volume id:133990 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" + volume id:134000 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507574 disk_type:"nvme" + volume id:134004 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507428 disk_type:"nvme" + volume id:134008 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507555 disk_type:"nvme" + volume id:134009 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507170 disk_type:"nvme" + volume id:134019 size:11910676920 collection:"hengenlab" file_count:4551 delete_count:759 deleted_byte_count:1984107610 version:3 modified_at_second:1627418220 disk_type:"nvme" + Disk nvme total size:117041884784 file_count:65804 deleted_file:1743 deleted_bytes:3539039087 + DataNode 10.244.11.50:8080 total size:117041884784 file_count:65804 deleted_file:1743 deleted_bytes:3539039087 + DataNode 10.244.11.52:8080 nvme(volume:69/69 active:18446744073709551613 free:0 remote:0) + Disk nvme(volume:69/69 active:18446744073709551613 free:0 remote:0) + volume id:5 size:867222824 file_count:5786 delete_count:1 deleted_byte_count:466 version:3 modified_at_second:1627416063 disk_type:"nvme" + volume id:51 size:3819480 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:10823 delete_count:9979 deleted_byte_count:2611708 version:3 compact_revision:6 modified_at_second:1627504769 disk_type:"nvme" + volume id:53 size:3907512 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:11182 delete_count:10273 deleted_byte_count:2626115 version:3 compact_revision:7 modified_at_second:1627504756 disk_type:"nvme" + volume id:156 size:1173203784 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:571 version:3 modified_at_second:1610491395 disk_type:"nvme" + volume id:165 size:1596585608 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:879 version:3 modified_at_second:1610491424 disk_type:"nvme" + volume id:169 size:1860837016 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:898 version:3 modified_at_second:1610491453 disk_type:"nvme" + volume id:211 size:1168359520 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:569 version:3 modified_at_second:1623182750 disk_type:"nvme" + volume id:243 size:1938336304 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:937 version:3 modified_at_second:1610496363 disk_type:"nvme" + volume id:290 size:1185325216 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:600 version:3 modified_at_second:1610496936 disk_type:"nvme" + volume id:294 size:1264804928 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:611 version:3 modified_at_second:1610497013 disk_type:"nvme" + volume id:313 size:1134907416 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:572 version:3 modified_at_second:1610497245 disk_type:"nvme" + volume id:314 size:1117357896 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:557 version:3 modified_at_second:1610497245 disk_type:"nvme" + volume id:331 size:1790162800 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:876 version:3 modified_at_second:1610497489 disk_type:"nvme" + volume id:387 size:1243238032 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:623 version:3 modified_at_second:1610498218 disk_type:"nvme" + volume id:402 size:1265153576 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:604 version:3 modified_at_second:1610498457 disk_type:"nvme" + volume id:405 size:1286493360 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:615 version:3 modified_at_second:1610498457 disk_type:"nvme" + volume id:411 size:1217380888 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:592 version:3 modified_at_second:1610498523 disk_type:"nvme" + volume id:443 size:1197826328 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:599 version:3 modified_at_second:1610498998 disk_type:"nvme" + volume id:495 size:1117441440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1161 version:3 modified_at_second:1610643719 disk_type:"nvme" + volume id:505 size:1214893912 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:682 version:3 modified_at_second:1610643815 disk_type:"nvme" + volume id:537 size:1286418000 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:653 version:3 modified_at_second:1610644085 disk_type:"nvme" + volume id:772 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1618444174 disk_type:"nvme" + volume id:774 size:138412488 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1618444167 disk_type:"nvme" + volume id:799 size:71303456 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:1 modified_at_second:1627504952 disk_type:"nvme" + volume id:807 size:109052376 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 delete_count:2 deleted_byte_count:8388677 version:3 compact_revision:1 modified_at_second:1627500582 disk_type:"nvme" + volume id:816 size:142606848 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:3 modified_at_second:1619387452 disk_type:"nvme" + volume id:845 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1618444179 disk_type:"nvme" + volume id:869 size:205521512 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:1 modified_at_second:1619387455 disk_type:"nvme" + volume id:886 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1617901709 disk_type:"nvme" + volume id:900 size:146801288 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:1 modified_at_second:1618444176 disk_type:"nvme" + volume id:901 size:71303408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1619387458 disk_type:"nvme" + volume id:953 size:138412488 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1618444190 disk_type:"nvme" + volume id:983 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1617901557 disk_type:"nvme" + volume id:993 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1617901738 disk_type:"nvme" + volume id:995 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:1 modified_at_second:1627500583 disk_type:"nvme" + volume id:1032 size:8 collection:"swfstest" version:3 modified_at_second:1613592642 disk_type:"nvme" + volume id:1034 size:314720 collection:"swfstest" file_count:1 version:3 modified_at_second:1615234671 disk_type:"nvme" + volume id:1036 size:8 collection:"swfstest" version:3 modified_at_second:1613592642 disk_type:"nvme" + volume id:1040 size:8 collection:"pvc-0544e3a6-da8f-42fe-a149-3a103bcc8552" version:3 modified_at_second:1615234634 disk_type:"nvme" + volume id:1108 size:20973179648 collection:"braingeneers-backups-swfs" file_count:12158 delete_count:244 deleted_byte_count:385586736 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1113 size:20973829552 collection:"braingeneers-backups-swfs" file_count:12295 delete_count:244 deleted_byte_count:373814340 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1118 size:20975423768 collection:"braingeneers-backups-swfs" file_count:12224 delete_count:241 deleted_byte_count:390765751 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1128 size:20973005760 collection:"braingeneers-backups-swfs" file_count:12190 delete_count:202 deleted_byte_count:344596437 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:133799 size:21750903688 collection:"hengenlab" file_count:8212 delete_count:8193 deleted_byte_count:21712289804 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" + volume id:133805 size:21273889584 collection:"hengenlab" file_count:8145 delete_count:8112 deleted_byte_count:21207557857 read_only:true version:3 modified_at_second:1627415108 disk_type:"nvme" + volume id:133838 size:21263362952 collection:"hengenlab" file_count:8081 delete_count:8049 deleted_byte_count:21206621302 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" + volume id:133840 size:21105726928 collection:"hengenlab" file_count:7979 delete_count:7955 deleted_byte_count:21053067891 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" + volume id:133843 size:21232229808 collection:"hengenlab" file_count:8165 delete_count:8136 deleted_byte_count:21165213558 read_only:true version:3 modified_at_second:1627415108 disk_type:"nvme" + volume id:133874 size:21388518216 collection:"hengenlab" file_count:8258 delete_count:8228 deleted_byte_count:21317668425 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" + volume id:133879 size:21308860696 collection:"hengenlab" file_count:8134 delete_count:8105 deleted_byte_count:21239616052 read_only:true version:3 modified_at_second:1627415108 disk_type:"nvme" + volume id:133891 size:21362969712 collection:"hengenlab" file_count:8224 delete_count:8191 deleted_byte_count:21288679522 read_only:true version:3 modified_at_second:1627415108 disk_type:"nvme" + volume id:133896 size:21320296680 collection:"hengenlab" file_count:8088 delete_count:8056 deleted_byte_count:21268045834 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" + volume id:133901 size:21452285712 collection:"hengenlab" file_count:8275 delete_count:8236 deleted_byte_count:21367797021 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" + volume id:133926 size:21496921192 collection:"hengenlab" file_count:8262 delete_count:8222 deleted_byte_count:21409836098 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" + volume id:133935 size:21569024976 collection:"hengenlab" file_count:8244 delete_count:8217 deleted_byte_count:21511029987 read_only:true version:3 modified_at_second:1627415106 disk_type:"nvme" + volume id:133943 size:21075121824 collection:"hengenlab" file_count:8036 delete_count:8003 deleted_byte_count:21024539839 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" + volume id:133950 size:21358468792 collection:"hengenlab" file_count:8146 delete_count:8124 deleted_byte_count:21307547425 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" + volume id:133954 size:21214186200 collection:"hengenlab" file_count:8146 delete_count:8117 deleted_byte_count:21148574345 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" + volume id:133963 size:21211632160 collection:"hengenlab" file_count:8117 delete_count:8080 deleted_byte_count:21136356572 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" + volume id:133974 size:21672456128 collection:"hengenlab" file_count:8256 delete_count:8229 deleted_byte_count:21621369690 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" + volume id:133976 size:21244430736 collection:"hengenlab" file_count:8169 delete_count:8151 deleted_byte_count:21202380779 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" + volume id:133982 size:21537083600 collection:"hengenlab" file_count:8294 delete_count:8263 deleted_byte_count:21478826246 read_only:true version:3 modified_at_second:1627415106 disk_type:"nvme" + volume id:133993 size:21564559944 collection:"hengenlab" file_count:8317 delete_count:8285 deleted_byte_count:21496628385 version:3 modified_at_second:1627504914 disk_type:"nvme" + volume id:133995 size:21423980504 collection:"hengenlab" file_count:8144 delete_count:8114 deleted_byte_count:21370150782 version:3 modified_at_second:1627504954 disk_type:"nvme" + volume id:134001 size:21561824664 collection:"hengenlab" file_count:8226 delete_count:8202 deleted_byte_count:21506874515 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" + volume id:134012 size:21315415112 collection:"hengenlab" file_count:8205 delete_count:8178 deleted_byte_count:21273728833 read_only:true version:3 modified_at_second:1627415108 disk_type:"nvme" + volume id:134017 size:21038970704 collection:"hengenlab" file_count:8041 delete_count:8019 deleted_byte_count:21006048043 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" + volume id:134021 size:21812890272 collection:"hengenlab" file_count:8169 delete_count:8146 deleted_byte_count:21758730994 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" + volume id:246138 size:17534561016 collection:"hengenlab" file_count:6813 delete_count:4263 deleted_byte_count:11139431579 version:3 compact_revision:1 modified_at_second:1627607477 disk_type:"nvme" + Disk nvme total size:662392206984 file_count:300461 deleted_file:229062 deleted_bytes:545735390285 + DataNode 10.244.11.52:8080 total size:662392206984 file_count:300461 deleted_file:229062 deleted_bytes:545735390285 + DataNode 10.244.11.6:8080 nvme(volume:67/67 active:62 free:0 remote:0) + Disk nvme(volume:67/67 active:62 free:0 remote:0) + volume id:54 size:582088 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:866 version:3 compact_revision:7 modified_at_second:1627507800 disk_type:"nvme" + volume id:114 size:1177912456 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:600 version:3 compact_revision:2 modified_at_second:1623182645 disk_type:"nvme" + volume id:188 size:1121756368 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3593 version:3 modified_at_second:1623180997 disk_type:"nvme" + volume id:212 size:1085089760 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:525 version:3 modified_at_second:1623180819 disk_type:"nvme" + volume id:213 size:1093854120 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:533 version:3 modified_at_second:1623180866 disk_type:"nvme" + volume id:246 size:1131416216 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:569 version:3 modified_at_second:1623182775 disk_type:"nvme" + volume id:275 size:1110571296 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:535 version:3 modified_at_second:1623181614 disk_type:"nvme" + volume id:301 size:1146491504 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:550 version:3 modified_at_second:1623181914 disk_type:"nvme" + volume id:318 size:1161820360 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:580 version:3 modified_at_second:1623182159 disk_type:"nvme" + volume id:372 size:1109617464 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:534 version:3 modified_at_second:1623182389 disk_type:"nvme" + volume id:379 size:1130289520 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:563 version:3 modified_at_second:1623181676 disk_type:"nvme" + volume id:393 size:1093146672 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:521 version:3 modified_at_second:1623181269 disk_type:"nvme" + volume id:423 size:1161451208 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:556 version:3 modified_at_second:1623182020 disk_type:"nvme" + volume id:426 size:1105000584 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:534 version:3 modified_at_second:1623181408 disk_type:"nvme" + volume id:464 size:1159754728 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:570 version:3 modified_at_second:1623182262 disk_type:"nvme" + volume id:496 size:1156809856 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1127 version:3 modified_at_second:1623181470 disk_type:"nvme" + volume id:541 size:1125292336 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:557 version:3 modified_at_second:1623181059 disk_type:"nvme" + volume id:563 size:888898664 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1454 version:3 modified_at_second:1623182506 disk_type:"nvme" + volume id:566 size:848439816 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1364 version:3 modified_at_second:1623181207 disk_type:"nvme" + volume id:847 size:142606872 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1623184293 disk_type:"nvme" + volume id:870 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183901 disk_type:"nvme" + volume id:878 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1623182929 disk_type:"nvme" + volume id:913 size:176161392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:2 modified_at_second:1623184715 disk_type:"nvme" + volume id:914 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623183321 disk_type:"nvme" + volume id:939 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:1 modified_at_second:1627504756 disk_type:"nvme" + volume id:942 size:83886648 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1623184016 disk_type:"nvme" + volume id:943 size:75497848 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1623183611 disk_type:"nvme" + volume id:951 size:37748912 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623182985 disk_type:"nvme" + volume id:1005 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623182879 disk_type:"nvme" + volume id:1016 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1623183069 disk_type:"nvme" + volume id:1020 size:41943328 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183243 disk_type:"nvme" + volume id:1021 size:150995672 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1623184430 disk_type:"nvme" + volume id:1022 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183690 disk_type:"nvme" + volume id:1051 size:20975020608 collection:"braingeneers-backups-swfs" file_count:12343 delete_count:252 deleted_byte_count:417786404 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1067 size:20975862216 collection:"braingeneers-backups-swfs" file_count:12195 delete_count:239 deleted_byte_count:365540086 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1076 size:20973686664 collection:"braingeneers-backups-swfs" file_count:12181 delete_count:239 deleted_byte_count:386434480 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1101 size:20977481056 collection:"braingeneers-backups-swfs" file_count:12056 delete_count:235 deleted_byte_count:391033535 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1688 size:99418104 file_count:36 version:3 modified_at_second:1627079989 disk_type:"nvme" + volume id:133788 size:721435976 collection:"hengenlab" file_count:280 read_only:true version:3 compact_revision:1 modified_at_second:1627507172 disk_type:"nvme" + volume id:133790 size:760234520 collection:"hengenlab" file_count:302 read_only:true version:3 compact_revision:1 modified_at_second:1627507154 disk_type:"nvme" + volume id:133817 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507171 disk_type:"nvme" + volume id:133852 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507634 disk_type:"nvme" + volume id:133857 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507171 disk_type:"nvme" + volume id:133862 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507649 disk_type:"nvme" + volume id:133884 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507364 disk_type:"nvme" + volume id:133886 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507202 disk_type:"nvme" + volume id:133892 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507364 disk_type:"nvme" + volume id:133894 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507574 disk_type:"nvme" + volume id:133898 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" + volume id:133910 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" + volume id:133914 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507649 disk_type:"nvme" + volume id:133915 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" + volume id:133917 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507782 disk_type:"nvme" + volume id:133920 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507152 disk_type:"nvme" + volume id:133927 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507786 disk_type:"nvme" + volume id:133938 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507555 disk_type:"nvme" + volume id:133958 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" + volume id:133964 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507170 disk_type:"nvme" + volume id:133965 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507096 disk_type:"nvme" + volume id:133966 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627507788 disk_type:"nvme" + volume id:133968 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" + volume id:134007 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507635 disk_type:"nvme" + volume id:134010 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507555 disk_type:"nvme" + volume id:134014 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507009 disk_type:"nvme" + volume id:134015 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507046 disk_type:"nvme" + volume id:134020 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507555 disk_type:"nvme" + volume id:134032 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507552 disk_type:"nvme" + Disk nvme total size:106360886704 file_count:65576 deleted_file:966 deleted_bytes:1564988840 + DataNode 10.244.11.6:8080 total size:106360886704 file_count:65576 deleted_file:966 deleted_bytes:1564988840 + DataNode 10.244.14.13:8080 nvme(volume:55/55 active:55 free:0 remote:0) + Disk nvme(volume:55/55 active:55 free:0 remote:0) + volume id:50 size:606568 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:875 version:3 compact_revision:8 modified_at_second:1627507801 disk_type:"nvme" + volume id:62 size:539952 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:845 version:3 compact_revision:8 modified_at_second:1627507800 disk_type:"nvme" + volume id:107 size:314720 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1 version:3 compact_revision:2 modified_at_second:1627507804 disk_type:"nvme" + volume id:187 size:1096273400 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3550 version:3 modified_at_second:1623181484 disk_type:"nvme" + volume id:225 size:1132809152 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:541 version:3 modified_at_second:1623181070 disk_type:"nvme" + volume id:240 size:1087756960 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:530 version:3 modified_at_second:1623180808 disk_type:"nvme" + volume id:241 size:1115629952 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:537 version:3 modified_at_second:1623182518 disk_type:"nvme" + volume id:256 size:1180952408 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:577 version:3 modified_at_second:1623182034 disk_type:"nvme" + volume id:260 size:1140938104 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:565 version:3 modified_at_second:1623181689 disk_type:"nvme" + volume id:280 size:1161495456 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:560 version:3 modified_at_second:1623182276 disk_type:"nvme" + volume id:332 size:1143200456 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:561 version:3 modified_at_second:1623181281 disk_type:"nvme" + volume id:375 size:1126027536 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:541 version:3 modified_at_second:1623182634 disk_type:"nvme" + volume id:417 size:1113452152 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:542 version:3 modified_at_second:1623180986 disk_type:"nvme" + volume id:421 size:1155229640 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:553 version:3 modified_at_second:1623181397 disk_type:"nvme" + volume id:442 size:1133829768 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:549 version:3 modified_at_second:1623181600 disk_type:"nvme" + volume id:462 size:1151065072 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:577 version:3 modified_at_second:1623182376 disk_type:"nvme" + volume id:465 size:1188575600 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:569 version:3 modified_at_second:1623182145 disk_type:"nvme" + volume id:482 size:1174497216 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:578 version:3 modified_at_second:1623181900 disk_type:"nvme" + volume id:484 size:1103270248 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:542 version:3 modified_at_second:1623182786 disk_type:"nvme" + volume id:535 size:1094099840 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:535 version:3 modified_at_second:1623180878 disk_type:"nvme" + volume id:738 size:117441120 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:2 modified_at_second:1627504861 disk_type:"nvme" + volume id:750 size:71303424 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1627507793 disk_type:"nvme" + volume id:768 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183232 disk_type:"nvme" + volume id:787 size:104857976 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:1 modified_at_second:1627504767 disk_type:"nvme" + volume id:791 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183799 disk_type:"nvme" + volume id:794 size:37748888 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1623183153 disk_type:"nvme" + volume id:828 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1623182834 disk_type:"nvme" + volume id:848 size:205521512 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:1 modified_at_second:1623184727 disk_type:"nvme" + volume id:865 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623183913 disk_type:"nvme" + volume id:899 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623184558 disk_type:"nvme" + volume id:903 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623182997 disk_type:"nvme" + volume id:906 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1623183416 disk_type:"nvme" + volume id:907 size:75497848 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:1 modified_at_second:1627504765 disk_type:"nvme" + volume id:910 size:71303400 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:2 modified_at_second:1627504866 disk_type:"nvme" + volume id:945 size:41943328 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623182919 disk_type:"nvme" + volume id:979 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623184004 disk_type:"nvme" + volume id:991 size:8 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" replica_placement:1 version:3 compact_revision:1 modified_at_second:1623182889 disk_type:"nvme" + volume id:1007 size:109052368 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1623183517 disk_type:"nvme" + volume id:1010 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:3 modified_at_second:1627507794 disk_type:"nvme" + volume id:1013 size:75497816 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623183059 disk_type:"nvme" + volume id:1057 size:20978064192 collection:"braingeneers-backups-swfs" file_count:12314 delete_count:266 deleted_byte_count:429920466 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1071 size:20983645528 collection:"braingeneers-backups-swfs" file_count:12232 delete_count:226 deleted_byte_count:337465633 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1085 size:20980098720 collection:"braingeneers-backups-swfs" file_count:12199 delete_count:219 deleted_byte_count:351274345 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1107 size:20976787256 collection:"braingeneers-backups-swfs" file_count:12172 delete_count:234 deleted_byte_count:390347084 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:246219 size:21568158600 collection:"hengenlab" file_count:8212 read_only:true version:3 modified_at_second:1627421476 disk_type:"nvme" + volume id:246280 size:21407063640 collection:"hengenlab" file_count:8202 read_only:true version:3 modified_at_second:1627424647 disk_type:"nvme" + volume id:246329 size:21804618416 collection:"hengenlab" file_count:7699 delete_count:45 deleted_byte_count:188745804 version:3 modified_at_second:1627427159 disk_type:"nvme" + volume id:246345 size:21686381280 collection:"hengenlab" file_count:7709 delete_count:114 deleted_byte_count:412094707 version:3 modified_at_second:1627427893 disk_type:"nvme" + volume id:246435 size:21127287088 collection:"hengenlab" file_count:8059 version:3 modified_at_second:1627432819 disk_type:"nvme" + volume id:246439 size:21187939544 collection:"hengenlab" file_count:8060 version:3 modified_at_second:1627433637 disk_type:"nvme" + volume id:246465 size:21302108360 collection:"hengenlab" file_count:8110 version:3 modified_at_second:1627435459 disk_type:"nvme" + volume id:246467 size:21106211024 collection:"hengenlab" file_count:7989 version:3 modified_at_second:1627435443 disk_type:"nvme" + volume id:246500 size:21299912208 collection:"hengenlab" file_count:8139 version:3 modified_at_second:1627437468 disk_type:"nvme" + volume id:246529 size:21387182640 collection:"hengenlab" file_count:7596 delete_count:1362 deleted_byte_count:5033550990 version:3 modified_at_second:1627521905 disk_type:"nvme" + volume id:246537 size:2061659304 collection:"hengenlab" file_count:789 version:3 compact_revision:1 modified_at_second:1627528630 disk_type:"nvme" + Disk nvme total size:320705385640 file_count:143670 deleted_file:2470 deleted_bytes:7160176376 + DataNode 10.244.14.13:8080 total size:320705385640 file_count:143670 deleted_file:2470 deleted_bytes:7160176376 + DataNode 10.244.14.16:8080 nvme(volume:51/51 active:51 free:0 remote:0) + Disk nvme(volume:51/51 active:51 free:0 remote:0) + volume id:30 size:648000 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:902 version:3 compact_revision:7 modified_at_second:1627505190 disk_type:"nvme" + volume id:32 size:564624 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:842 version:3 compact_revision:7 modified_at_second:1627500691 disk_type:"nvme" + volume id:161 size:1513609624 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:842 version:3 modified_at_second:1610491424 disk_type:"nvme" + volume id:185 size:1115169696 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3651 version:3 modified_at_second:1623182480 disk_type:"nvme" + volume id:186 size:1117871912 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3492 version:3 modified_at_second:1623182672 disk_type:"nvme" + volume id:208 size:1122742344 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:537 version:3 modified_at_second:1610494885 disk_type:"nvme" + volume id:210 size:1144331496 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:557 version:3 modified_at_second:1610495937 disk_type:"nvme" + volume id:239 size:1088423064 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:528 version:3 modified_at_second:1623182686 disk_type:"nvme" + volume id:242 size:1157461608 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:563 version:3 modified_at_second:1610496354 disk_type:"nvme" + volume id:261 size:1368092280 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:678 version:3 modified_at_second:1610496544 disk_type:"nvme" + volume id:267 size:1222228680 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:587 version:3 modified_at_second:1610496631 disk_type:"nvme" + volume id:295 size:1310628488 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:634 version:3 modified_at_second:1610497013 disk_type:"nvme" + volume id:335 size:1133122320 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:556 version:3 modified_at_second:1610497554 disk_type:"nvme" + volume id:370 size:1108723656 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:531 version:3 modified_at_second:1610497955 disk_type:"nvme" + volume id:414 size:1503127160 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:728 version:3 modified_at_second:1610498598 disk_type:"nvme" + volume id:451 size:1369016200 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:656 version:3 modified_at_second:1610499083 disk_type:"nvme" + volume id:479 size:1109948384 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:551 version:3 modified_at_second:1610499500 disk_type:"nvme" + volume id:486 size:1155571464 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:558 version:3 modified_at_second:1610499565 disk_type:"nvme" + volume id:508 size:1269203968 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:714 version:3 modified_at_second:1610643815 disk_type:"nvme" + volume id:532 size:1229401224 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:649 version:3 modified_at_second:1610644025 disk_type:"nvme" + volume id:603 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627500690 disk_type:"nvme" + volume id:640 size:8388808 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627500690 disk_type:"nvme" + volume id:723 size:201327112 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1617901713 disk_type:"nvme" + volume id:724 size:138412472 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1618444183 disk_type:"nvme" + volume id:735 size:146801240 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:2 modified_at_second:1619387461 disk_type:"nvme" + volume id:756 size:306185064 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:10 version:3 compact_revision:1 modified_at_second:1618444172 disk_type:"nvme" + volume id:767 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1617901606 disk_type:"nvme" + volume id:778 size:109052368 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1618444189 disk_type:"nvme" + volume id:809 size:37748912 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1619387464 disk_type:"nvme" + volume id:812 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1617901679 disk_type:"nvme" + volume id:817 size:205521504 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:2 modified_at_second:1623184210 disk_type:"nvme" + volume id:873 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1618444187 disk_type:"nvme" + volume id:883 size:109052376 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:1 modified_at_second:1627504925 disk_type:"nvme" + volume id:884 size:171966992 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1619387463 disk_type:"nvme" + volume id:893 size:8 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" version:3 compact_revision:2 modified_at_second:1612586373 disk_type:"nvme" + volume id:898 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623184398 disk_type:"nvme" + volume id:971 size:138412488 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1618444168 disk_type:"nvme" + volume id:972 size:138582776 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1623184122 disk_type:"nvme" + volume id:981 size:142606800 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1619387449 disk_type:"nvme" + volume id:1000 size:104857952 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623184677 disk_type:"nvme" + volume id:1073 size:20974354856 collection:"braingeneers-backups-swfs" file_count:12217 delete_count:265 deleted_byte_count:434691544 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1078 size:20971811752 collection:"braingeneers-backups-swfs" file_count:12332 delete_count:237 deleted_byte_count:394927193 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1109 size:20972641960 collection:"braingeneers-backups-swfs" file_count:12269 delete_count:242 deleted_byte_count:399545377 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1115 size:20982669168 collection:"braingeneers-backups-swfs" file_count:12209 delete_count:233 deleted_byte_count:385827098 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:246181 size:21492162832 collection:"hengenlab" file_count:8199 delete_count:1 deleted_byte_count:4194325 version:3 modified_at_second:1627504749 disk_type:"nvme" + volume id:246196 size:21810328512 collection:"hengenlab" file_count:8345 read_only:true version:3 modified_at_second:1627419331 disk_type:"nvme" + volume id:246308 size:22074879448 collection:"hengenlab" file_count:8483 version:3 modified_at_second:1627426119 disk_type:"nvme" + volume id:246314 size:22754854488 collection:"hengenlab" file_count:8677 version:3 modified_at_second:1627426211 disk_type:"nvme" + volume id:246442 size:21077837888 collection:"hengenlab" file_count:8039 version:3 modified_at_second:1627433651 disk_type:"nvme" + volume id:246473 size:587394360 collection:"hengenlab" file_count:227 version:3 modified_at_second:1627435784 disk_type:"nvme" + volume id:246475 size:713161392 collection:"hengenlab" file_count:268 version:3 modified_at_second:1627435784 disk_type:"nvme" + Disk nvme total size:218759028160 file_count:110110 deleted_file:979 deleted_bytes:1623379879 + DataNode 10.244.14.16:8080 total size:218759028160 file_count:110110 deleted_file:979 deleted_bytes:1623379879 + DataNode 10.244.14.38:8080 nvme(volume:48/48 active:48 free:0 remote:0) + Disk nvme(volume:48/48 active:48 free:0 remote:0) + volume id:46 size:588904 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:914 version:3 compact_revision:7 modified_at_second:1627505190 disk_type:"nvme" + volume id:67 size:607952 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:865 version:3 compact_revision:8 modified_at_second:1627507800 disk_type:"nvme" + volume id:82 size:624632 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:882 version:3 compact_revision:6 modified_at_second:1627507799 disk_type:"nvme" + volume id:151 size:1557314160 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:823 version:3 modified_at_second:1610491378 disk_type:"nvme" + volume id:173 size:1262093040 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:788 version:3 modified_at_second:1610491476 disk_type:"nvme" + volume id:181 size:1208448816 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:717 version:3 modified_at_second:1623182415 disk_type:"nvme" + volume id:262 size:1179347032 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:588 version:3 modified_at_second:1623182067 disk_type:"nvme" + volume id:266 size:1160008976 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:556 version:3 modified_at_second:1623182811 disk_type:"nvme" + volume id:311 size:1115993712 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:562 version:3 modified_at_second:1610497245 disk_type:"nvme" + volume id:363 size:1209730440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:582 version:3 modified_at_second:1610497862 disk_type:"nvme" + volume id:431 size:1126797960 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:555 version:3 modified_at_second:1623181873 disk_type:"nvme" + volume id:433 size:1209883088 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:591 version:3 modified_at_second:1623182608 disk_type:"nvme" + volume id:434 size:1167964704 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:569 version:3 modified_at_second:1610498827 disk_type:"nvme" + volume id:466 size:1170821024 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:575 version:3 modified_at_second:1623182429 disk_type:"nvme" + volume id:477 size:1112893904 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:555 version:3 modified_at_second:1610499421 disk_type:"nvme" + volume id:494 size:1154467824 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1137 version:3 modified_at_second:1610643725 disk_type:"nvme" + volume id:499 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:3 modified_at_second:1627507790 disk_type:"nvme" + volume id:534 size:1326592720 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:671 version:3 modified_at_second:1610644085 disk_type:"nvme" + volume id:547 size:1189140320 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:660 version:3 modified_at_second:1610644201 disk_type:"nvme" + volume id:549 size:1182767848 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:646 version:3 modified_at_second:1610644201 disk_type:"nvme" + volume id:567 size:913832888 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1438 version:3 modified_at_second:1623182236 disk_type:"nvme" + volume id:576 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1627507797 disk_type:"nvme" + volume id:616 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507796 disk_type:"nvme" + volume id:733 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1618444177 disk_type:"nvme" + volume id:792 size:167772560 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1623183949 disk_type:"nvme" + volume id:803 size:79692208 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:3 modified_at_second:1623183775 disk_type:"nvme" + volume id:814 size:150996760 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:9 version:3 compact_revision:2 modified_at_second:1623184502 disk_type:"nvme" + volume id:849 size:201327080 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1617901727 disk_type:"nvme" + volume id:851 size:109052368 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 delete_count:2 deleted_byte_count:8388670 version:3 compact_revision:1 modified_at_second:1627500577 disk_type:"nvme" + volume id:904 size:8 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" version:3 compact_revision:1 modified_at_second:1612382093 disk_type:"nvme" + volume id:926 size:138412400 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1623184109 disk_type:"nvme" + volume id:947 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:2 modified_at_second:1627504950 disk_type:"nvme" + volume id:980 size:138412472 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1623183938 disk_type:"nvme" + volume id:984 size:37748912 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623184386 disk_type:"nvme" + volume id:1004 size:134218040 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1623184665 disk_type:"nvme" + volume id:1028 size:142606840 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1623184223 disk_type:"nvme" + volume id:1046 size:8 collection:"pvc-73532100-54aa-469c-b8a7-1774be8c3b9e" version:3 compact_revision:3 modified_at_second:1625624761 disk_type:"nvme" + volume id:1050 size:20983327888 collection:"braingeneers-backups-swfs" file_count:12264 delete_count:230 deleted_byte_count:370961817 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1059 size:20995125632 collection:"braingeneers-backups-swfs" file_count:12209 delete_count:228 deleted_byte_count:354199353 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1063 size:20975272200 collection:"braingeneers-backups-swfs" file_count:12222 delete_count:239 deleted_byte_count:372617511 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1104 size:20971935200 collection:"braingeneers-backups-swfs" file_count:12292 delete_count:231 deleted_byte_count:350682314 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:246179 size:21257143840 collection:"hengenlab" file_count:8030 delete_count:1 deleted_byte_count:1048597 version:3 modified_at_second:1627500588 disk_type:"nvme" + volume id:246180 size:21162493216 collection:"hengenlab" file_count:8052 read_only:true version:3 modified_at_second:1627418743 disk_type:"nvme" + volume id:246188 size:21060079488 collection:"hengenlab" file_count:8045 read_only:true version:3 modified_at_second:1627418950 disk_type:"nvme" + volume id:246214 size:21471574352 collection:"hengenlab" file_count:8202 read_only:true version:3 modified_at_second:1627421176 disk_type:"nvme" + volume id:246286 size:21733675264 collection:"hengenlab" file_count:8331 read_only:true version:3 modified_at_second:1627424954 disk_type:"nvme" + volume id:246342 size:21201042600 collection:"hengenlab" file_count:7543 delete_count:192 deleted_byte_count:478154688 version:3 modified_at_second:1627427872 disk_type:"nvme" + volume id:246355 size:3325961784 collection:"hengenlab" file_count:1300 delete_count:24 deleted_byte_count:100664436 version:3 modified_at_second:1627500603 disk_type:"nvme" + Disk nvme total size:236842981136 file_count:113225 deleted_file:1148 deleted_bytes:2040911721 + DataNode 10.244.14.38:8080 total size:236842981136 file_count:113225 deleted_file:1148 deleted_bytes:2040911721 + DataNode 10.244.14.40:8080 nvme(volume:48/48 active:48 free:0 remote:0) + Disk nvme(volume:48/48 active:48 free:0 remote:0) + volume id:44 size:532120 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:847 version:3 compact_revision:8 modified_at_second:1627507799 disk_type:"nvme" + volume id:69 size:595808 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:852 version:3 compact_revision:7 modified_at_second:1627507798 disk_type:"nvme" + volume id:118 size:1179638096 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:601 version:3 compact_revision:2 modified_at_second:1610643741 disk_type:"nvme" + volume id:149 size:1504362152 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:800 version:3 modified_at_second:1610491378 disk_type:"nvme" + volume id:180 size:1214354616 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:738 version:3 modified_at_second:1610494389 disk_type:"nvme" + volume id:194 size:1251697440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3397 version:3 modified_at_second:1610494777 disk_type:"nvme" + volume id:198 size:1170992464 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:588 version:3 modified_at_second:1610494836 disk_type:"nvme" + volume id:199 size:1186136184 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:602 version:3 modified_at_second:1610494836 disk_type:"nvme" + volume id:218 size:1257822856 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:604 version:3 modified_at_second:1610496071 disk_type:"nvme" + volume id:221 size:1220325024 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:586 version:3 modified_at_second:1610496168 disk_type:"nvme" + volume id:248 size:1141899112 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:578 version:3 modified_at_second:1610496421 disk_type:"nvme" + volume id:334 size:1167170624 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:578 version:3 modified_at_second:1610497477 disk_type:"nvme" + volume id:338 size:1203090488 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:591 version:3 modified_at_second:1610497560 disk_type:"nvme" + volume id:343 size:1252389264 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:626 version:3 modified_at_second:1610497637 disk_type:"nvme" + volume id:366 size:1131643384 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:541 version:3 modified_at_second:1610497954 disk_type:"nvme" + volume id:491 size:1132250216 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1124 version:3 modified_at_second:1610643725 disk_type:"nvme" + volume id:510 size:1150974464 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:593 version:3 modified_at_second:1610643888 disk_type:"nvme" + volume id:512 size:1198198728 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:619 version:3 modified_at_second:1610643888 disk_type:"nvme" + volume id:513 size:1156946392 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:596 version:3 modified_at_second:1610643888 disk_type:"nvme" + volume id:548 size:1158916552 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:635 version:3 modified_at_second:1610644201 disk_type:"nvme" + volume id:556 size:1159536984 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:669 version:3 modified_at_second:1610644260 disk_type:"nvme" + volume id:602 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507793 disk_type:"nvme" + volume id:629 size:12583192 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1627507798 disk_type:"nvme" + volume id:652 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507790 disk_type:"nvme" + volume id:684 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507798 disk_type:"nvme" + volume id:716 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1627507794 disk_type:"nvme" + volume id:717 size:113246768 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1627507796 disk_type:"nvme" + volume id:726 size:138412448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1619387469 disk_type:"nvme" + volume id:742 size:134218088 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1617901677 disk_type:"nvme" + volume id:743 size:134218064 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1617901660 disk_type:"nvme" + volume id:777 size:138412472 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1619387462 disk_type:"nvme" + volume id:806 size:142606896 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:1 modified_at_second:1627504767 disk_type:"nvme" + volume id:819 size:109052360 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:1 modified_at_second:1627504744 disk_type:"nvme" + volume id:839 size:117276912 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1613770290 disk_type:"nvme" + volume id:841 size:176161392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:1 modified_at_second:1619387466 disk_type:"nvme" + volume id:929 size:239076048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1618444184 disk_type:"nvme" + volume id:1009 size:109052352 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1619387455 disk_type:"nvme" + volume id:1019 size:113246768 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1618444182 disk_type:"nvme" + volume id:1024 size:159384496 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:10 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:1 modified_at_second:1627500595 disk_type:"nvme" + volume id:1053 size:20978356456 collection:"braingeneers-backups-swfs" file_count:12212 delete_count:225 deleted_byte_count:358144375 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1055 size:20979735904 collection:"braingeneers-backups-swfs" file_count:12318 delete_count:218 deleted_byte_count:354130118 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1062 size:20986883784 collection:"braingeneers-backups-swfs" file_count:12136 delete_count:246 deleted_byte_count:397472684 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1123 size:20972215416 collection:"braingeneers-backups-swfs" file_count:12211 delete_count:227 deleted_byte_count:378646248 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:246213 size:21782268984 collection:"hengenlab" file_count:8350 read_only:true version:3 modified_at_second:1627421176 disk_type:"nvme" + volume id:246287 size:21163284272 collection:"hengenlab" file_count:8046 read_only:true version:3 modified_at_second:1627424941 disk_type:"nvme" + volume id:246357 size:21156503440 collection:"hengenlab" file_count:7702 delete_count:43 deleted_byte_count:176380261 version:3 modified_at_second:1627504939 disk_type:"nvme" + volume id:246488 size:21362137136 collection:"hengenlab" file_count:8153 version:3 modified_at_second:1627436797 disk_type:"nvme" + volume id:246578 size:4211530048 collection:"hengenlab" file_count:1619 version:3 modified_at_second:1627439154 disk_type:"nvme" + Disk nvme total size:198319668800 file_count:99595 deleted_file:962 deleted_bytes:1677356712 + DataNode 10.244.14.40:8080 total size:198319668800 file_count:99595 deleted_file:962 deleted_bytes:1677356712 + DataNode 10.244.14.42:8080 nvme(volume:53/53 active:53 free:0 remote:0) + Disk nvme(volume:53/53 active:53 free:0 remote:0) + volume id:34 size:559192 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:868 version:3 compact_revision:7 modified_at_second:1627507798 disk_type:"nvme" + volume id:72 size:535304 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:858 version:3 compact_revision:6 modified_at_second:1627507800 disk_type:"nvme" + volume id:113 size:1232309792 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:629 version:3 compact_revision:2 modified_at_second:1610643741 disk_type:"nvme" + volume id:122 size:12583192 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:3 modified_at_second:1627507797 disk_type:"nvme" + volume id:139 size:1565810440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:2438 delete_count:1883 deleted_byte_count:408258526 version:3 modified_at_second:1610491323 disk_type:"nvme" + volume id:148 size:1689304736 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:874 version:3 modified_at_second:1610491353 disk_type:"nvme" + volume id:152 size:1572132664 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:851 version:3 modified_at_second:1610491378 disk_type:"nvme" + volume id:154 size:1423748440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:750 version:3 modified_at_second:1610491378 disk_type:"nvme" + volume id:162 size:1466592168 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:826 version:3 modified_at_second:1610491424 disk_type:"nvme" + volume id:202 size:1216812728 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:616 version:3 modified_at_second:1610494836 disk_type:"nvme" + volume id:209 size:1392406504 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:673 version:3 modified_at_second:1610495945 disk_type:"nvme" + volume id:216 size:1187489448 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:571 version:3 modified_at_second:1610496064 disk_type:"nvme" + volume id:258 size:1285514928 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:636 version:3 modified_at_second:1610496544 disk_type:"nvme" + volume id:259 size:1418767640 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:708 version:3 modified_at_second:1610496544 disk_type:"nvme" + volume id:291 size:1205796160 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:600 version:3 modified_at_second:1610496936 disk_type:"nvme" + volume id:317 size:1197451080 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:602 version:3 modified_at_second:1610497331 disk_type:"nvme" + volume id:339 size:1198784320 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:588 version:3 modified_at_second:1610497560 disk_type:"nvme" + volume id:386 size:1255099232 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:631 version:3 modified_at_second:1610498218 disk_type:"nvme" + volume id:447 size:1200800168 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:599 version:3 modified_at_second:1610498999 disk_type:"nvme" + volume id:452 size:1312230328 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:629 version:3 modified_at_second:1610499083 disk_type:"nvme" + volume id:460 size:1303078744 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:645 version:3 modified_at_second:1610499157 disk_type:"nvme" + volume id:474 size:1887242272 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:925 version:3 modified_at_second:1610499431 disk_type:"nvme" + volume id:501 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:3 modified_at_second:1627507790 disk_type:"nvme" + volume id:530 size:1253806728 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:669 version:3 modified_at_second:1610644025 disk_type:"nvme" + volume id:581 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1627507794 disk_type:"nvme" + volume id:592 size:12583192 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1627507790 disk_type:"nvme" + volume id:593 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" + volume id:594 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" + volume id:597 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507797 disk_type:"nvme" + volume id:600 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" + volume id:606 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507794 disk_type:"nvme" + volume id:620 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507791 disk_type:"nvme" + volume id:663 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507793 disk_type:"nvme" + volume id:668 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507792 disk_type:"nvme" + volume id:719 size:159484792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:21072287 version:3 compact_revision:1 modified_at_second:1619387463 disk_type:"nvme" + volume id:763 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1618444180 disk_type:"nvme" + volume id:867 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:1 modified_at_second:1627500602 disk_type:"nvme" + volume id:891 size:244264328 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:10 version:3 compact_revision:2 modified_at_second:1619387474 disk_type:"nvme" + volume id:962 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1618444185 disk_type:"nvme" + volume id:975 size:71303432 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1619387462 disk_type:"nvme" + volume id:1035 size:2256 collection:"swfstest" file_count:1 version:3 modified_at_second:1613592642 disk_type:"nvme" + volume id:1039 size:314720 collection:"pvc-0544e3a6-da8f-42fe-a149-3a103bcc8552" file_count:1 version:3 modified_at_second:1615234636 disk_type:"nvme" + volume id:1098 size:20973674480 collection:"braingeneers-backups-swfs" file_count:12287 delete_count:227 deleted_byte_count:363217189 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1117 size:20976367656 collection:"braingeneers-backups-swfs" file_count:12224 delete_count:229 deleted_byte_count:381874187 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1137 size:20972013512 collection:"braingeneers-backups-swfs" file_count:12286 delete_count:223 deleted_byte_count:353515699 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1144 size:20980307664 collection:"braingeneers-backups-swfs" file_count:12301 delete_count:235 deleted_byte_count:370673355 version:3 compact_revision:2 modified_at_second:1627607153 disk_type:"nvme" + volume id:1645 size:8913611152 collection:"hengenlab" file_count:3433 version:3 compact_revision:4 modified_at_second:1627507573 disk_type:"nvme" + volume id:246364 size:21112377664 collection:"hengenlab" file_count:7936 delete_count:40 deleted_byte_count:167773973 version:3 modified_at_second:1627428720 disk_type:"nvme" + volume id:246370 size:21082313784 collection:"hengenlab" file_count:8692 delete_count:3 deleted_byte_count:12583023 version:3 modified_at_second:1627429075 disk_type:"nvme" + volume id:246422 size:21207507408 collection:"hengenlab" file_count:8115 version:3 modified_at_second:1627432018 disk_type:"nvme" + volume id:246457 size:21273517664 collection:"hengenlab" file_count:8120 version:3 modified_at_second:1627434466 disk_type:"nvme" + volume id:246458 size:21393938840 collection:"hengenlab" file_count:8159 version:3 modified_at_second:1627434473 disk_type:"nvme" + volume id:246587 size:6317115064 collection:"hengenlab" file_count:2412 version:3 modified_at_second:1627439213 disk_type:"nvme" + Disk nvme total size:233296711568 file_count:113200 deleted_file:2842 deleted_bytes:2083162574 + DataNode 10.244.14.42:8080 total size:233296711568 file_count:113200 deleted_file:2842 deleted_bytes:2083162574 + DataNode 10.244.14.54:8080 nvme(volume:49/49 active:49 free:0 remote:0) + Disk nvme(volume:49/49 active:49 free:0 remote:0) + volume id:65 size:592296 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:874 version:3 compact_revision:8 modified_at_second:1627507800 disk_type:"nvme" + volume id:68 size:550704 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:855 version:3 compact_revision:8 modified_at_second:1627507798 disk_type:"nvme" + volume id:115 size:1296619736 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:698 version:3 compact_revision:2 modified_at_second:1610643650 disk_type:"nvme" + volume id:120 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:4 modified_at_second:1627507792 disk_type:"nvme" + volume id:123 size:144 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:3 modified_at_second:1627507790 disk_type:"nvme" + volume id:133 size:8 collection:".DS_Store" version:3 compact_revision:1 modified_at_second:1610394116 disk_type:"nvme" + volume id:135 size:8 collection:".DS_Store" version:3 modified_at_second:1610069605 disk_type:"nvme" + volume id:175 size:1122297720 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:700 version:3 compact_revision:1 modified_at_second:1627507803 disk_type:"nvme" + volume id:191 size:1245408440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3312 version:3 modified_at_second:1610494777 disk_type:"nvme" + volume id:206 size:1254471552 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:602 version:3 modified_at_second:1610494893 disk_type:"nvme" + volume id:236 size:1214762280 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:582 version:3 modified_at_second:1610496298 disk_type:"nvme" + volume id:238 size:1283041256 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:615 version:3 modified_at_second:1610496298 disk_type:"nvme" + volume id:245 size:1265549600 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:645 version:3 modified_at_second:1610496421 disk_type:"nvme" + volume id:254 size:1250499056 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:607 version:3 modified_at_second:1610496480 disk_type:"nvme" + volume id:297 size:1283466864 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:622 version:3 modified_at_second:1610497013 disk_type:"nvme" + volume id:337 size:1167874736 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:574 version:3 modified_at_second:1610497560 disk_type:"nvme" + volume id:348 size:1184975696 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:568 version:3 modified_at_second:1610497700 disk_type:"nvme" + volume id:406 size:1185077976 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:566 version:3 modified_at_second:1610498457 disk_type:"nvme" + volume id:413 size:1445852896 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:702 version:3 modified_at_second:1610498598 disk_type:"nvme" + volume id:448 size:1198099808 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:598 version:3 modified_at_second:1610498999 disk_type:"nvme" + volume id:471 size:1251064952 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:674 version:3 modified_at_second:1610499335 disk_type:"nvme" + volume id:472 size:1250977184 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:660 version:3 modified_at_second:1610499335 disk_type:"nvme" + volume id:514 size:1262797752 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:661 version:3 modified_at_second:1610643888 disk_type:"nvme" + volume id:544 size:1193792688 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:585 version:3 modified_at_second:1610644140 disk_type:"nvme" + volume id:545 size:1240097296 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:681 version:3 modified_at_second:1610644201 disk_type:"nvme" + volume id:635 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" + volume id:643 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507791 disk_type:"nvme" + volume id:644 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507791 disk_type:"nvme" + volume id:658 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507794 disk_type:"nvme" + volume id:685 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" + volume id:690 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507792 disk_type:"nvme" + volume id:701 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" + volume id:710 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507798 disk_type:"nvme" + volume id:721 size:176181264 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:1 modified_at_second:1618444188 disk_type:"nvme" + volume id:744 size:180355792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:1 modified_at_second:1619387456 disk_type:"nvme" + volume id:805 size:234881624 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:2 modified_at_second:1617901683 disk_type:"nvme" + volume id:820 size:205521528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:1 modified_at_second:1627500582 disk_type:"nvme" + volume id:821 size:215866544 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1619387465 disk_type:"nvme" + volume id:856 size:188744560 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:10 delete_count:2 deleted_byte_count:8388677 version:3 compact_revision:2 modified_at_second:1627500585 disk_type:"nvme" + volume id:1089 size:20983270464 collection:"braingeneers-backups-swfs" file_count:12230 delete_count:236 deleted_byte_count:367424623 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1114 size:20974105816 collection:"braingeneers-backups-swfs" file_count:12247 delete_count:242 deleted_byte_count:379897789 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1121 size:20974478768 collection:"braingeneers-backups-swfs" file_count:12198 delete_count:223 deleted_byte_count:357455804 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1142 size:20981836200 collection:"braingeneers-backups-swfs" file_count:12177 delete_count:236 deleted_byte_count:361487567 version:3 compact_revision:2 modified_at_second:1627607153 disk_type:"nvme" + volume id:1643 size:8931501032 collection:"hengenlab" file_count:3424 version:3 compact_revision:4 modified_at_second:1627507114 disk_type:"nvme" + volume id:246257 size:21208314368 collection:"hengenlab" file_count:8148 read_only:true version:3 modified_at_second:1627423488 disk_type:"nvme" + volume id:246361 size:21246477600 collection:"hengenlab" file_count:7577 delete_count:74 deleted_byte_count:310381990 version:3 modified_at_second:1627428479 disk_type:"nvme" + volume id:246437 size:19655019848 collection:"hengenlab" file_count:7518 version:3 modified_at_second:1627432971 disk_type:"nvme" + volume id:246443 size:217060280 collection:"hengenlab" file_count:90 version:3 modified_at_second:1627432971 disk_type:"nvme" + volume id:246444 size:210768488 collection:"hengenlab" file_count:84 version:3 modified_at_second:1627432971 disk_type:"nvme" + Disk nvme total size:180228393200 file_count:92134 deleted_file:1014 deleted_bytes:1789230792 + DataNode 10.244.14.54:8080 total size:180228393200 file_count:92134 deleted_file:1014 deleted_bytes:1789230792 + DataNode 10.244.14.7:8080 nvme(volume:52/52 active:52 free:0 remote:0) + Disk nvme(volume:52/52 active:52 free:0 remote:0) + volume id:41 size:583672 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:866 version:3 compact_revision:7 modified_at_second:1627500691 disk_type:"nvme" + volume id:63 size:559088 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:847 version:3 compact_revision:8 modified_at_second:1627500691 disk_type:"nvme" + volume id:109 size:376 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1 version:3 compact_revision:2 modified_at_second:1627500691 disk_type:"nvme" + volume id:190 size:1109040768 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3551 version:3 modified_at_second:1623180963 disk_type:"nvme" + volume id:192 size:1182930304 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3450 version:3 modified_at_second:1623182172 disk_type:"nvme" + volume id:228 size:1155850784 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:558 version:3 modified_at_second:1623182659 disk_type:"nvme" + volume id:252 size:1136211808 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:554 version:3 modified_at_second:1623181714 disk_type:"nvme" + volume id:253 size:1152299312 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:562 version:3 modified_at_second:1623182006 disk_type:"nvme" + volume id:268 size:1110550136 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:534 version:3 modified_at_second:1623181510 disk_type:"nvme" + volume id:305 size:1130166824 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:561 version:3 modified_at_second:1623182762 disk_type:"nvme" + volume id:380 size:1117994288 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:567 version:3 modified_at_second:1623182493 disk_type:"nvme" + volume id:416 size:1143219176 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:556 version:3 modified_at_second:1623181372 disk_type:"nvme" + volume id:425 size:1129231688 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:546 version:3 modified_at_second:1623181170 disk_type:"nvme" + volume id:427 size:1102357232 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:529 version:3 modified_at_second:1623180903 disk_type:"nvme" + volume id:429 size:1161577792 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:558 version:3 modified_at_second:1623181575 disk_type:"nvme" + volume id:435 size:1110503240 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:544 version:3 modified_at_second:1623181106 disk_type:"nvme" + volume id:439 size:1150908624 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:554 version:3 modified_at_second:1623182249 disk_type:"nvme" + volume id:467 size:1172172720 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:625 version:3 modified_at_second:1623181927 disk_type:"nvme" + volume id:481 size:1139901224 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:565 version:3 modified_at_second:1623181308 disk_type:"nvme" + volume id:720 size:176161336 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:2 modified_at_second:1623184640 disk_type:"nvme" + volume id:732 size:138412448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1623183855 disk_type:"nvme" + volume id:746 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:1 modified_at_second:1627504769 disk_type:"nvme" + volume id:758 size:88081016 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:2 modified_at_second:1623184084 disk_type:"nvme" + volume id:785 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623184363 disk_type:"nvme" + volume id:801 size:75497816 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1623183090 disk_type:"nvme" + volume id:802 size:37748912 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623183634 disk_type:"nvme" + volume id:822 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1623183646 disk_type:"nvme" + volume id:823 size:134218088 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623183762 disk_type:"nvme" + volume id:829 size:71303432 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623184246 disk_type:"nvme" + volume id:833 size:335545152 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:10 delete_count:2 deleted_byte_count:67108968 version:3 compact_revision:1 modified_at_second:1623184525 disk_type:"nvme" + volume id:857 size:79692200 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1623183100 disk_type:"nvme" + volume id:905 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623183209 disk_type:"nvme" + volume id:933 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1627500690 disk_type:"nvme" + volume id:934 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1617901485 disk_type:"nvme" + volume id:949 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623182950 disk_type:"nvme" + volume id:985 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1623182962 disk_type:"nvme" + volume id:1011 size:104857984 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:3 modified_at_second:1623183368 disk_type:"nvme" + volume id:1018 size:109052336 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1623183356 disk_type:"nvme" + volume id:1030 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1623183482 disk_type:"nvme" + volume id:1056 size:20979047696 collection:"braingeneers-backups-swfs" file_count:12172 delete_count:222 deleted_byte_count:354862328 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1065 size:20982781936 collection:"braingeneers-backups-swfs" file_count:12329 delete_count:263 deleted_byte_count:405184167 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1082 size:20973680512 collection:"braingeneers-backups-swfs" file_count:12203 delete_count:240 deleted_byte_count:375809328 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1083 size:20973117760 collection:"braingeneers-backups-swfs" file_count:12201 delete_count:253 deleted_byte_count:408689779 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:246189 size:21300912680 collection:"hengenlab" file_count:8155 read_only:true version:3 modified_at_second:1627418950 disk_type:"nvme" + volume id:246216 size:21826498352 collection:"hengenlab" file_count:8319 read_only:true version:3 modified_at_second:1627421278 disk_type:"nvme" + volume id:246300 size:21224168192 collection:"hengenlab" file_count:8084 read_only:true version:3 modified_at_second:1627425325 disk_type:"nvme" + volume id:246330 size:21362892376 collection:"hengenlab" file_count:7442 delete_count:52 deleted_byte_count:218106224 version:3 modified_at_second:1627427138 disk_type:"nvme" + volume id:246358 size:21661297032 collection:"hengenlab" file_count:7879 delete_count:48 deleted_byte_count:192554346 version:3 modified_at_second:1627500593 disk_type:"nvme" + volume id:246380 size:21133425560 collection:"hengenlab" file_count:8075 delete_count:6 deleted_byte_count:25166106 version:3 modified_at_second:1627429671 disk_type:"nvme" + volume id:246384 size:21720995776 collection:"hengenlab" file_count:8262 version:3 modified_at_second:1627429845 disk_type:"nvme" + volume id:246434 size:20981185168 collection:"hengenlab" file_count:7956 version:3 modified_at_second:1627432809 disk_type:"nvme" + volume id:246451 size:257955584 collection:"hengenlab" file_count:105 version:3 modified_at_second:1627433574 disk_type:"nvme" + Disk nvme total size:275421129336 file_count:129784 deleted_file:1087 deleted_bytes:2051675588 + DataNode 10.244.14.7:8080 total size:275421129336 file_count:129784 deleted_file:1087 deleted_bytes:2051675588 + DataNode 10.244.16.105:8080 hdd(volume:11/91 active:18446744073709551607 free:80 remote:0) + Disk hdd(volume:11/91 active:18446744073709551607 free:80 remote:0) + volume id:411672 size:20977426496 collection:"hengenlab" file_count:8034 delete_count:3 deleted_byte_count:9437247 version:3 compact_revision:2 modified_at_second:1627703997 + volume id:411766 size:20991227544 collection:"hengenlab" file_count:8102 delete_count:2113 deleted_byte_count:5206960233 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411768 size:16217247664 collection:"hengenlab" file_count:6290 delete_count:663 deleted_byte_count:1560694285 version:3 compact_revision:2 modified_at_second:1627843742 + volume id:411771 size:17830653080 collection:"hengenlab" file_count:6980 delete_count:557 deleted_byte_count:1299266257 version:3 compact_revision:2 modified_at_second:1627843714 + volume id:411786 size:58721720 collection:"hengenlab" file_count:26 version:3 compact_revision:1 modified_at_second:1627526065 + volume id:411879 size:21019024920 collection:"hengenlab" file_count:8021 delete_count:1428 deleted_byte_count:3713951935 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411880 size:11365571592 collection:"hengenlab" file_count:4493 delete_count:38 deleted_byte_count:87032606 version:3 compact_revision:4 modified_at_second:1627843726 + volume id:411898 size:21028460248 collection:"hengenlab" file_count:8071 delete_count:1536 deleted_byte_count:3924994777 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411944 size:19968845784 collection:"hengenlab" file_count:7711 delete_count:4 deleted_byte_count:10485844 version:3 compact_revision:1 modified_at_second:1627843719 + volume id:411978 size:9744231728 collection:"hengenlab" file_count:3819 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:2 modified_at_second:1627843736 + volume id:412029 size:9916864984 collection:"hengenlab" file_count:3805 delete_count:4 deleted_byte_count:13631572 version:3 compact_revision:1 modified_at_second:1627843726 + Disk hdd total size:169118275760 file_count:65352 deleted_file:6347 deleted_bytes:15827503353 + DataNode 10.244.16.105:8080 total size:169118275760 file_count:65352 deleted_file:6347 deleted_bytes:15827503353 + DataNode 10.244.16.109:8080 hdd(volume:28/91 active:18446744073709551606 free:63 remote:0) + Disk hdd(volume:28/91 active:18446744073709551606 free:63 remote:0) + volume id:246132 size:21058344480 collection:"hengenlab" file_count:8073 version:3 compact_revision:1 modified_at_second:1627670913 + volume id:246143 size:21022971736 collection:"hengenlab" file_count:8725 delete_count:531 deleted_byte_count:1341449919 version:3 modified_at_second:1627670233 + volume id:246155 size:21165681304 collection:"hengenlab" file_count:8155 version:3 modified_at_second:1627670725 + volume id:246162 size:21326008384 collection:"hengenlab" file_count:8116 version:3 modified_at_second:1627672622 + volume id:246207 size:21287198904 collection:"hengenlab" file_count:8110 version:3 modified_at_second:1627671903 + volume id:246232 size:21071010368 collection:"hengenlab" file_count:8060 version:3 modified_at_second:1627675625 + volume id:246316 size:22111171216 collection:"hengenlab" file_count:8799 version:3 modified_at_second:1627672922 + volume id:246325 size:21683026640 collection:"hengenlab" file_count:7991 version:3 modified_at_second:1627669902 + volume id:246349 size:21491426128 collection:"hengenlab" file_count:7636 delete_count:32 deleted_byte_count:134219209 version:3 modified_at_second:1627671706 + volume id:246379 size:21234733048 collection:"hengenlab" file_count:8120 delete_count:5 deleted_byte_count:20971735 version:3 modified_at_second:1627674784 + volume id:246386 size:21134592392 collection:"hengenlab" file_count:8086 version:3 modified_at_second:1627672234 + volume id:246396 size:21297928576 collection:"hengenlab" file_count:8118 version:3 modified_at_second:1627674285 + volume id:246409 size:21669134560 collection:"hengenlab" file_count:8298 version:3 modified_at_second:1627670400 + volume id:246441 size:21123695696 collection:"hengenlab" file_count:8042 version:3 modified_at_second:1627671141 + volume id:246480 size:21194588824 collection:"hengenlab" file_count:8054 version:3 modified_at_second:1627671344 + volume id:246511 size:21111213688 collection:"hengenlab" file_count:8047 version:3 modified_at_second:1627670557 + volume id:246572 size:21475386200 collection:"hengenlab" file_count:8204 version:3 modified_at_second:1627673715 + volume id:246655 size:21200635416 collection:"hengenlab" file_count:8029 version:3 modified_at_second:1627671522 + volume id:246788 size:20972680848 collection:"hengenlab" file_count:7999 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:1 modified_at_second:1627700090 + volume id:247162 size:11805700264 collection:"hengenlab" file_count:4496 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:1 modified_at_second:1627843719 + volume id:411734 size:13092644032 collection:"hengenlab" file_count:5032 delete_count:139 deleted_byte_count:279103045 version:3 compact_revision:2 modified_at_second:1627571096 + volume id:411746 size:20974925368 collection:"hengenlab" file_count:8084 delete_count:57 deleted_byte_count:100810404 version:3 compact_revision:2 modified_at_second:1627701127 + volume id:411886 size:19405906328 collection:"hengenlab" file_count:7519 delete_count:1146 deleted_byte_count:2736462084 version:3 compact_revision:3 modified_at_second:1627843702 + volume id:411906 size:21000741928 collection:"hengenlab" file_count:7933 delete_count:1408 deleted_byte_count:3731223029 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411910 size:9184924704 collection:"hengenlab" file_count:3548 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:2 modified_at_second:1627843718 + volume id:411915 size:9321638088 collection:"hengenlab" file_count:3655 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:2 modified_at_second:1627843702 + volume id:411921 size:14239631728 collection:"hengenlab" file_count:5509 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:3 modified_at_second:1627843735 + volume id:411997 size:10613401472 collection:"hengenlab" file_count:4082 delete_count:8 deleted_byte_count:17825960 version:3 compact_revision:2 modified_at_second:1627843724 + Disk hdd total size:534270942320 file_count:204520 deleted_file:3335 deleted_bytes:8387231398 + DataNode 10.244.16.109:8080 total size:534270942320 file_count:204520 deleted_file:3335 deleted_bytes:8387231398 + DataNode 10.244.16.111:8080 hdd(volume:10/91 active:18446744073709551608 free:81 remote:0) + Disk hdd(volume:10/91 active:18446744073709551608 free:81 remote:0) + volume id:411731 size:11041845712 collection:"hengenlab" file_count:4328 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:4 modified_at_second:1627843736 + volume id:411749 size:15839442992 collection:"hengenlab" file_count:6152 delete_count:691 deleted_byte_count:1661617930 version:3 compact_revision:2 modified_at_second:1627843732 + volume id:411800 size:21002193408 collection:"hengenlab" file_count:8047 delete_count:1553 deleted_byte_count:3945690961 version:3 compact_revision:1 modified_at_second:1627571055 + volume id:411801 size:5243000 collection:"hengenlab" file_count:2 version:3 compact_revision:1 modified_at_second:1627524409 + volume id:411825 size:20983314512 collection:"hengenlab" file_count:8152 delete_count:1565 deleted_byte_count:3892032612 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411830 size:20979666360 collection:"hengenlab" file_count:8090 delete_count:1619 deleted_byte_count:4121810760 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411903 size:21028663960 collection:"hengenlab" file_count:8085 delete_count:2311 deleted_byte_count:5888622291 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411935 size:7822161536 collection:"hengenlab" file_count:3129 version:3 compact_revision:1 modified_at_second:1627618125 + volume id:411989 size:10108862568 collection:"hengenlab" file_count:3947 delete_count:88 deleted_byte_count:210180878 version:3 compact_revision:2 modified_at_second:1627843720 + volume id:411996 size:11119897928 collection:"hengenlab" file_count:4242 delete_count:10 deleted_byte_count:29360338 version:3 compact_revision:2 modified_at_second:1627843744 + Disk hdd total size:139931291976 file_count:54174 deleted_file:7839 deleted_bytes:19757704420 + DataNode 10.244.16.111:8080 total size:139931291976 file_count:54174 deleted_file:7839 deleted_bytes:19757704420 + DataNode 10.244.16.113:8080 hdd(volume:16/87 active:18446744073709551599 free:71 remote:0) + Disk hdd(volume:16/87 active:18446744073709551599 free:71 remote:0) + volume id:411666 size:9016547472 collection:"hengenlab" file_count:3452 delete_count:2 deleted_byte_count:2097194 version:3 compact_revision:1 modified_at_second:1627843715 + volume id:411668 size:9202893840 collection:"hengenlab" file_count:3543 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:1 modified_at_second:1627843684 + volume id:411683 size:11181630688 collection:"hengenlab" file_count:4245 version:3 compact_revision:2 modified_at_second:1627608542 + volume id:411718 size:11338532520 collection:"hengenlab" file_count:4397 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:4 modified_at_second:1627843730 + volume id:411719 size:20980243888 collection:"hengenlab" file_count:8154 delete_count:150 deleted_byte_count:339264245 version:3 compact_revision:2 modified_at_second:1627704643 + volume id:411742 size:11220642024 collection:"hengenlab" file_count:4406 delete_count:5 deleted_byte_count:17825897 version:3 compact_revision:4 modified_at_second:1627843723 + volume id:411774 size:413147104 collection:"hengenlab" file_count:145 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411776 size:20986017496 collection:"hengenlab" file_count:8124 delete_count:51 deleted_byte_count:85309527 version:3 compact_revision:2 modified_at_second:1627701780 + volume id:411835 size:21006400216 collection:"hengenlab" file_count:8087 delete_count:1548 deleted_byte_count:3986368184 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411846 size:11200737944 collection:"hengenlab" file_count:4348 version:3 compact_revision:4 modified_at_second:1627843734 + volume id:411893 size:12886872008 collection:"hengenlab" file_count:4990 delete_count:273 deleted_byte_count:608551124 version:3 compact_revision:2 modified_at_second:1627609261 + volume id:411908 size:10337525600 collection:"hengenlab" file_count:4062 delete_count:1165 deleted_byte_count:2920129545 version:3 compact_revision:2 modified_at_second:1627607477 + volume id:411969 size:10956589432 collection:"hengenlab" file_count:4158 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:2 modified_at_second:1627843737 + volume id:411973 size:12219002136 collection:"hengenlab" file_count:4488 delete_count:5 deleted_byte_count:8388713 version:3 compact_revision:2 modified_at_second:1627843722 + volume id:411998 size:10714716832 collection:"hengenlab" file_count:4196 delete_count:7 deleted_byte_count:16777363 version:3 compact_revision:2 modified_at_second:1627843742 + volume id:412024 size:9351795144 collection:"hengenlab" file_count:3622 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:2 modified_at_second:1627843689 + Disk hdd total size:193013294344 file_count:74417 deleted_file:3215 deleted_bytes:8003586349 + DataNode 10.244.16.113:8080 total size:193013294344 file_count:74417 deleted_file:3215 deleted_bytes:8003586349 + DataNode 10.244.16.115:8080 hdd(volume:14/88 active:18446744073709551606 free:74 remote:0) + Disk hdd(volume:14/88 active:18446744073709551606 free:74 remote:0) + volume id:411680 size:15080342928 collection:"hengenlab" file_count:5850 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:3 modified_at_second:1627843721 + volume id:411699 size:20999744272 collection:"hengenlab" file_count:8116 delete_count:1445 deleted_byte_count:3651895668 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411702 size:13631720 collection:"hengenlab" file_count:4 version:3 compact_revision:1 modified_at_second:1627527081 + volume id:411721 size:12804978144 collection:"hengenlab" file_count:4933 delete_count:225 deleted_byte_count:495367244 version:3 compact_revision:4 modified_at_second:1627843718 + volume id:411754 size:20997906008 collection:"hengenlab" file_count:8186 delete_count:2465 deleted_byte_count:5961803335 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411807 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627524245 + volume id:411828 size:21010056688 collection:"hengenlab" file_count:8163 delete_count:1717 deleted_byte_count:4249377968 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411857 size:13134025448 collection:"hengenlab" file_count:5091 delete_count:117 deleted_byte_count:189209269 version:3 compact_revision:2 modified_at_second:1627571096 + volume id:411864 size:423554448 collection:"pvc-98352fb2-44e8-4c55-984c-b81bc55fc4bf" file_count:9339 delete_count:250 deleted_byte_count:39111669 version:3 compact_revision:1 modified_at_second:1627763831 + volume id:411890 size:10544130960 collection:"hengenlab" file_count:4119 delete_count:12 deleted_byte_count:31457532 version:3 compact_revision:4 modified_at_second:1627843710 + volume id:411896 size:9116052272 collection:"hengenlab" file_count:3576 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:2 modified_at_second:1627843728 + volume id:411930 size:17108060688 collection:"hengenlab" file_count:6799 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:1 modified_at_second:1627843724 + volume id:412019 size:11051418808 collection:"hengenlab" file_count:4147 delete_count:142 deleted_byte_count:391121830 version:3 compact_revision:2 modified_at_second:1627843719 + volume id:412033 size:9757944808 collection:"hengenlab" file_count:3709 delete_count:4 deleted_byte_count:16777300 version:3 compact_revision:1 modified_at_second:1627843742 + Disk hdd total size:162041847200 file_count:72032 deleted_file:6382 deleted_bytes:15040801984 + DataNode 10.244.16.115:8080 total size:162041847200 file_count:72032 deleted_file:6382 deleted_bytes:15040801984 + DataNode 10.244.16.119:8080 hdd(volume:11/91 active:18446744073709551606 free:80 remote:0) + Disk hdd(volume:11/91 active:18446744073709551606 free:80 remote:0) + volume id:411700 size:1048640 collection:"hengenlab" file_count:1 version:3 compact_revision:1 modified_at_second:1627526056 + volume id:411709 size:20972820528 collection:"hengenlab" file_count:8109 delete_count:115 deleted_byte_count:250133345 version:3 compact_revision:2 modified_at_second:1627703138 + volume id:411795 size:20979805704 collection:"hengenlab" file_count:8145 delete_count:145 deleted_byte_count:307755521 version:3 compact_revision:2 modified_at_second:1627703294 + volume id:411827 size:21034784864 collection:"hengenlab" file_count:8260 delete_count:2542 deleted_byte_count:6147081247 version:3 compact_revision:1 modified_at_second:1627571069 + volume id:411841 size:16717792160 collection:"hengenlab" file_count:6492 delete_count:721 deleted_byte_count:1744708457 version:3 compact_revision:2 modified_at_second:1627843729 + volume id:411918 size:10276162736 collection:"hengenlab" file_count:3946 delete_count:4 deleted_byte_count:13631572 version:3 compact_revision:3 modified_at_second:1627843737 + volume id:411929 size:7918028088 collection:"hengenlab" file_count:3176 version:3 compact_revision:1 modified_at_second:1627611409 + volume id:411943 size:19730459888 collection:"hengenlab" file_count:7574 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:1 modified_at_second:1627843740 + volume id:411949 size:20296779920 collection:"hengenlab" file_count:7730 delete_count:5 deleted_byte_count:5242985 version:3 compact_revision:1 modified_at_second:1627843733 + volume id:411959 size:20972517216 collection:"hengenlab" file_count:8066 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:1 modified_at_second:1627703107 + volume id:412017 size:10396379712 collection:"hengenlab" file_count:4002 delete_count:163 deleted_byte_count:425725279 version:3 compact_revision:2 modified_at_second:1627843742 + Disk hdd total size:169296579456 file_count:65501 deleted_file:3699 deleted_bytes:8904764250 + DataNode 10.244.16.119:8080 total size:169296579456 file_count:65501 deleted_file:3699 deleted_bytes:8904764250 + DataNode 10.244.16.120:8080 hdd(volume:12/88 active:18446744073709551606 free:76 remote:0) + Disk hdd(volume:12/88 active:18446744073709551606 free:76 remote:0) + volume id:411691 size:17329839840 collection:"hengenlab" file_count:6725 delete_count:568 deleted_byte_count:1368138726 version:3 compact_revision:2 modified_at_second:1627843733 + volume id:411725 size:12490053632 collection:"hengenlab" file_count:4880 version:3 compact_revision:4 modified_at_second:1627843686 + volume id:411735 size:13217507528 collection:"hengenlab" file_count:5150 delete_count:186 deleted_byte_count:337558326 version:3 compact_revision:3 modified_at_second:1627607477 + volume id:411772 size:15612258448 collection:"hengenlab" file_count:5910 delete_count:3 deleted_byte_count:9437247 version:3 compact_revision:3 modified_at_second:1627607477 + volume id:411842 size:16614826248 collection:"hengenlab" file_count:6483 delete_count:597 deleted_byte_count:1458708031 version:3 compact_revision:2 modified_at_second:1627843701 + volume id:411870 size:13632056 collection:"hengenlab" file_count:10 version:3 compact_revision:1 modified_at_second:1627523623 + volume id:411974 size:13700151256 collection:"hengenlab" file_count:5015 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:2 modified_at_second:1627843680 + volume id:411975 size:9862483768 collection:"hengenlab" file_count:3854 delete_count:3 deleted_byte_count:9437247 version:3 compact_revision:3 modified_at_second:1627843733 + volume id:411983 size:10304232208 collection:"hengenlab" file_count:3967 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:2 modified_at_second:1627843743 + volume id:411987 size:10362849136 collection:"hengenlab" file_count:4021 delete_count:14 deleted_byte_count:33554726 version:3 compact_revision:2 modified_at_second:1627843696 + volume id:412025 size:9611253592 collection:"hengenlab" file_count:3683 delete_count:3 deleted_byte_count:12582975 version:3 compact_revision:2 modified_at_second:1627843741 + volume id:412028 size:9540573984 collection:"hengenlab" file_count:3715 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:1 modified_at_second:1627843737 + Disk hdd total size:138659661696 file_count:53413 deleted_file:1380 deleted_bytes:3242000316 + DataNode 10.244.16.120:8080 total size:138659661696 file_count:53413 deleted_file:1380 deleted_bytes:3242000316 + DataNode 10.244.16.65:8080 hdd(volume:9/90 active:18446744073709551610 free:81 remote:0) + Disk hdd(volume:9/90 active:18446744073709551610 free:81 remote:0) + volume id:411667 size:9502047744 collection:"hengenlab" file_count:3591 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:1 modified_at_second:1627843728 + volume id:411697 size:5243168 collection:"hengenlab" file_count:5 version:3 compact_revision:1 modified_at_second:1627527081 + volume id:411714 size:17491395904 collection:"hengenlab" file_count:6885 delete_count:651 deleted_byte_count:1495790614 version:3 compact_revision:2 modified_at_second:1627843723 + volume id:411733 size:10485992 collection:"hengenlab" file_count:4 version:3 compact_revision:1 modified_at_second:1627526516 + volume id:411813 size:20755617216 collection:"hengenlab" file_count:8108 delete_count:240 deleted_byte_count:541743222 version:3 compact_revision:2 modified_at_second:1627843732 + volume id:411818 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627522290 + volume id:411866 size:20988360592 collection:"hengenlab" file_count:8016 delete_count:1508 deleted_byte_count:3928332868 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411946 size:19825586120 collection:"hengenlab" file_count:7513 version:3 compact_revision:1 modified_at_second:1627843732 + volume id:412000 size:10448263664 collection:"hengenlab" file_count:4006 delete_count:36 deleted_byte_count:88081140 version:3 compact_revision:2 modified_at_second:1627843733 + Disk hdd total size:99027000408 file_count:38128 deleted_file:2438 deleted_bytes:6060239363 + DataNode 10.244.16.65:8080 total size:99027000408 file_count:38128 deleted_file:2438 deleted_bytes:6060239363 + DataNode 10.244.16.69:8080 hdd(volume:15/88 active:18446744073709551606 free:73 remote:0) + Disk hdd(volume:15/88 active:18446744073709551606 free:73 remote:0) + volume id:411713 size:13818469408 collection:"hengenlab" file_count:5424 delete_count:112 deleted_byte_count:208359274 version:3 compact_revision:2 modified_at_second:1627571096 + volume id:411793 size:21005328904 collection:"hengenlab" file_count:8295 delete_count:1819 deleted_byte_count:4450705254 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411837 size:20988574632 collection:"hengenlab" file_count:8160 delete_count:1567 deleted_byte_count:3925691116 version:3 compact_revision:1 modified_at_second:1627571055 + volume id:411838 size:15008508456 collection:"hengenlab" file_count:5849 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:4 modified_at_second:1627843719 + volume id:411850 size:1048640 collection:"hengenlab" file_count:1 version:3 compact_revision:1 modified_at_second:1627523809 + volume id:411860 size:420112720 collection:"pvc-98352fb2-44e8-4c55-984c-b81bc55fc4bf" file_count:9442 delete_count:271 deleted_byte_count:29546350 version:3 compact_revision:1 modified_at_second:1627762123 + volume id:411865 size:442392768 collection:"pvc-98352fb2-44e8-4c55-984c-b81bc55fc4bf" file_count:9478 delete_count:244 deleted_byte_count:32475539 version:3 compact_revision:1 modified_at_second:1627764191 + volume id:411868 size:20972398400 collection:"hengenlab" file_count:8101 delete_count:985 deleted_byte_count:2180106940 version:3 compact_revision:3 modified_at_second:1627696649 + volume id:411871 size:12329805552 collection:"hengenlab" file_count:4808 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:4 modified_at_second:1627843725 + volume id:411874 size:16113797624 collection:"hengenlab" file_count:6334 delete_count:729 deleted_byte_count:1622141539 version:3 compact_revision:3 modified_at_second:1627843734 + volume id:411914 size:20984608288 collection:"hengenlab" file_count:8157 delete_count:2343 deleted_byte_count:6026008543 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411942 size:19899798504 collection:"hengenlab" file_count:7735 delete_count:2 deleted_byte_count:2097194 version:3 compact_revision:1 modified_at_second:1627843722 + volume id:411971 size:11924701448 collection:"hengenlab" file_count:4300 delete_count:4 deleted_byte_count:13631572 version:3 compact_revision:2 modified_at_second:1627843729 + volume id:412005 size:10520767216 collection:"hengenlab" file_count:4093 delete_count:49 deleted_byte_count:133170181 version:3 compact_revision:2 modified_at_second:1627843727 + volume id:412027 size:9725406568 collection:"hengenlab" file_count:3734 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:1 modified_at_second:1627843739 + Disk hdd total size:194155719128 file_count:93911 deleted_file:8130 deleted_bytes:18635467943 + DataNode 10.244.16.69:8080 total size:194155719128 file_count:93911 deleted_file:8130 deleted_bytes:18635467943 + DataNode 10.244.16.89:8080 hdd(volume:11/91 active:18446744073709551608 free:80 remote:0) + Disk hdd(volume:11/91 active:18446744073709551608 free:80 remote:0) + volume id:411689 size:17721480736 collection:"hengenlab" file_count:6838 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:3 modified_at_second:1627843728 + volume id:411736 size:6291632 collection:"hengenlab" file_count:3 version:3 compact_revision:1 modified_at_second:1627526065 + volume id:411744 size:20992042128 collection:"hengenlab" file_count:8139 delete_count:1649 deleted_byte_count:3997475113 version:3 compact_revision:1 modified_at_second:1627571069 + volume id:411826 size:21055317568 collection:"hengenlab" file_count:8254 delete_count:2279 deleted_byte_count:5438881964 version:3 compact_revision:1 modified_at_second:1627571069 + volume id:411892 size:21019062712 collection:"hengenlab" file_count:8082 delete_count:1574 deleted_byte_count:3995713981 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411917 size:16156430128 collection:"hengenlab" file_count:6270 delete_count:68 deleted_byte_count:159054334 version:3 compact_revision:3 modified_at_second:1627843741 + volume id:411932 size:17476189904 collection:"hengenlab" file_count:6824 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:1 modified_at_second:1627843737 + volume id:411934 size:17662154256 collection:"hengenlab" file_count:6889 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:1 modified_at_second:1627843706 + volume id:411951 size:18886558064 collection:"hengenlab" file_count:7225 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:1 modified_at_second:1627843724 + volume id:411988 size:10240976400 collection:"hengenlab" file_count:3905 delete_count:91 deleted_byte_count:205024517 version:3 compact_revision:2 modified_at_second:1627843695 + volume id:412009 size:11811033752 collection:"hengenlab" file_count:4406 delete_count:61 deleted_byte_count:155190529 version:3 compact_revision:2 modified_at_second:1627843739 + Disk hdd total size:173027537280 file_count:66835 deleted_file:5728 deleted_bytes:13973360660 + DataNode 10.244.16.89:8080 total size:173027537280 file_count:66835 deleted_file:5728 deleted_bytes:13973360660 + DataNode 10.244.16.97:8080 hdd(volume:10/88 active:18446744073709551610 free:78 remote:0) + Disk hdd(volume:10/88 active:18446744073709551610 free:78 remote:0) + volume id:411694 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627522738 + volume id:411745 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627523320 + volume id:411812 size:21025219208 collection:"hengenlab" file_count:8162 delete_count:1641 deleted_byte_count:4120037316 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411831 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627523132 + volume id:411851 size:20707778976 collection:"hengenlab" file_count:8133 delete_count:246 deleted_byte_count:560626694 version:3 compact_revision:2 modified_at_second:1627843736 + volume id:411862 size:431544360 collection:"pvc-98352fb2-44e8-4c55-984c-b81bc55fc4bf" file_count:9319 delete_count:259 deleted_byte_count:31888543 version:3 compact_revision:1 modified_at_second:1627576156 + volume id:411957 size:13489303224 collection:"hengenlab" file_count:5173 version:3 compact_revision:1 modified_at_second:1627614963 + volume id:411966 size:10782973592 collection:"hengenlab" file_count:4115 delete_count:3 deleted_byte_count:3145791 version:3 compact_revision:2 modified_at_second:1627843707 + volume id:411972 size:12313393160 collection:"hengenlab" file_count:4472 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:2 modified_at_second:1627843745 + volume id:412004 size:10772632176 collection:"hengenlab" file_count:4140 delete_count:28 deleted_byte_count:79692364 version:3 compact_revision:2 modified_at_second:1627843733 + Disk hdd total size:89522844720 file_count:43514 deleted_file:2180 deleted_bytes:4801682227 + DataNode 10.244.16.97:8080 total size:89522844720 file_count:43514 deleted_file:2180 deleted_bytes:4801682227 + DataNode 10.244.16.98:8080 hdd(volume:16/90 active:18446744073709551592 free:74 remote:0) + Disk hdd(volume:16/90 active:18446744073709551592 free:74 remote:0) + volume id:411673 size:20976550232 collection:"hengenlab" file_count:8071 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:2 modified_at_second:1627703449 + volume id:411707 size:17874044264 collection:"hengenlab" file_count:6894 delete_count:36 deleted_byte_count:100664052 version:3 compact_revision:4 modified_at_second:1627843733 + volume id:411720 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627524407 + volume id:411748 size:21000373448 collection:"hengenlab" file_count:7970 delete_count:1380 deleted_byte_count:3565195673 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411760 size:14333970528 collection:"hengenlab" file_count:5564 version:3 compact_revision:3 modified_at_second:1627611016 + volume id:411809 size:11310452088 collection:"hengenlab" file_count:4415 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:4 modified_at_second:1627843729 + volume id:411810 size:20976280960 collection:"hengenlab" file_count:8157 delete_count:141 deleted_byte_count:296091258 version:3 compact_revision:2 modified_at_second:1627703861 + volume id:411811 size:20993007800 collection:"hengenlab" file_count:8261 delete_count:1346 deleted_byte_count:3385831758 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411815 size:20984547408 collection:"hengenlab" file_count:8148 delete_count:133 deleted_byte_count:239143575 version:3 compact_revision:2 modified_at_second:1627702576 + volume id:411821 size:21006604824 collection:"hengenlab" file_count:8070 delete_count:1458 deleted_byte_count:3653227255 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411853 size:20985752376 collection:"hengenlab" file_count:8066 delete_count:1465 deleted_byte_count:3668882240 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411881 size:18276124664 collection:"hengenlab" file_count:7091 delete_count:468 deleted_byte_count:1040392637 version:3 compact_revision:2 modified_at_second:1627843735 + volume id:411895 size:21080309584 collection:"hengenlab" file_count:8146 delete_count:2420 deleted_byte_count:5989979359 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411913 size:20984013304 collection:"hengenlab" file_count:8035 version:3 compact_revision:2 modified_at_second:1627703453 + volume id:411920 size:9411225816 collection:"hengenlab" file_count:3640 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:2 modified_at_second:1627843721 + volume id:411925 size:8018464800 collection:"hengenlab" file_count:3147 version:3 compact_revision:2 modified_at_second:1627616331 + Disk hdd total size:268211722104 file_count:103675 deleted_file:8854 deleted_bytes:21953039442 + DataNode 10.244.16.98:8080 total size:268211722104 file_count:103675 deleted_file:8854 deleted_bytes:21953039442 + DataNode 10.244.216.104:8080 nvme(volume:92/92 active:92 free:0 remote:0) + Disk nvme(volume:92/92 active:92 free:0 remote:0) + volume id:6 size:154572064 file_count:5480 version:3 modified_at_second:1626566497 disk_type:"nvme" + volume id:31 size:632704 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:843 version:3 compact_revision:7 modified_at_second:1627507800 disk_type:"nvme" + volume id:58 size:601456 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:900 version:3 compact_revision:8 modified_at_second:1627507798 disk_type:"nvme" + volume id:79 size:606224 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:854 version:3 compact_revision:6 modified_at_second:1627507799 disk_type:"nvme" + volume id:81 size:622232 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:901 version:3 compact_revision:7 modified_at_second:1627507799 disk_type:"nvme" + volume id:116 size:2202353384 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1126 version:3 compact_revision:2 modified_at_second:1623132644 disk_type:"nvme" + volume id:126 size:8 collection:"._.DS_Store" replica_placement:1 version:3 modified_at_second:1623132657 disk_type:"nvme" + volume id:129 size:8 collection:"._.DS_Store" replica_placement:1 version:3 modified_at_second:1623132667 disk_type:"nvme" + volume id:130 size:8 collection:"._.DS_Store" version:3 modified_at_second:1610069605 disk_type:"nvme" + volume id:137 size:1630156472 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:2460 delete_count:1887 deleted_byte_count:432763215 version:3 modified_at_second:1610491324 disk_type:"nvme" + volume id:138 size:1603047968 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:2449 delete_count:1881 deleted_byte_count:418068489 version:3 modified_at_second:1610491324 disk_type:"nvme" + volume id:150 size:1575240048 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:839 version:3 modified_at_second:1610491378 disk_type:"nvme" + volume id:153 size:1494952944 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:787 version:3 modified_at_second:1623132680 disk_type:"nvme" + volume id:159 size:3110118664 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1495 version:3 modified_at_second:1610491401 disk_type:"nvme" + volume id:164 size:1458776248 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:813 version:3 modified_at_second:1623132694 disk_type:"nvme" + volume id:167 size:1764458648 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:850 version:3 modified_at_second:1610491453 disk_type:"nvme" + volume id:168 size:1695114936 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:816 version:3 modified_at_second:1610491453 disk_type:"nvme" + volume id:200 size:1152898088 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:588 version:3 modified_at_second:1610494836 disk_type:"nvme" + volume id:205 size:1154243552 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:553 version:3 modified_at_second:1610494893 disk_type:"nvme" + volume id:231 size:1152295576 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:558 version:3 modified_at_second:1610496236 disk_type:"nvme" + volume id:244 size:1174086520 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:568 version:3 modified_at_second:1610496354 disk_type:"nvme" + volume id:264 size:1234236192 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:593 version:3 modified_at_second:1610496631 disk_type:"nvme" + volume id:269 size:1187392304 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:600 version:3 modified_at_second:1623132737 disk_type:"nvme" + volume id:276 size:1246990632 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:601 version:3 modified_at_second:1623132751 disk_type:"nvme" + volume id:281 size:1753868488 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:919 version:3 modified_at_second:1610496873 disk_type:"nvme" + volume id:288 size:1181077768 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:592 version:3 modified_at_second:1623132779 disk_type:"nvme" + volume id:293 size:1302889432 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:629 version:3 modified_at_second:1610497013 disk_type:"nvme" + volume id:300 size:1246727888 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:598 version:3 modified_at_second:1623132794 disk_type:"nvme" + volume id:302 size:1342897048 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:644 version:3 modified_at_second:1610497082 disk_type:"nvme" + volume id:321 size:1138789880 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:562 version:3 modified_at_second:1623132808 disk_type:"nvme" + volume id:340 size:1161117576 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:568 version:3 modified_at_second:1623132822 disk_type:"nvme" + volume id:346 size:1288754128 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:645 version:3 modified_at_second:1610497637 disk_type:"nvme" + volume id:358 size:1151521568 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:559 version:3 modified_at_second:1610497787 disk_type:"nvme" + volume id:371 size:1312268072 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:628 version:3 modified_at_second:1610498031 disk_type:"nvme" + volume id:374 size:1323581208 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:634 version:3 modified_at_second:1623132836 disk_type:"nvme" + volume id:376 size:1302828304 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:626 version:3 modified_at_second:1623132865 disk_type:"nvme" + volume id:388 size:1324169520 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:664 version:3 modified_at_second:1610498218 disk_type:"nvme" + volume id:392 size:1134250720 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:545 version:3 modified_at_second:1610498311 disk_type:"nvme" + volume id:394 size:1341215576 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:641 version:3 modified_at_second:1623132879 disk_type:"nvme" + volume id:401 size:1150668440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:552 version:3 modified_at_second:1610498457 disk_type:"nvme" + volume id:408 size:1367251616 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:668 version:3 modified_at_second:1610498529 disk_type:"nvme" + volume id:412 size:1156052976 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:564 version:3 modified_at_second:1623132893 disk_type:"nvme" + volume id:419 size:1133426832 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:545 version:3 modified_at_second:1610498668 disk_type:"nvme" + volume id:430 size:1145801792 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:552 version:3 modified_at_second:1610498760 disk_type:"nvme" + volume id:450 size:1278326168 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:616 version:3 modified_at_second:1610499083 disk_type:"nvme" + volume id:459 size:1212072184 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:601 version:3 modified_at_second:1623132908 disk_type:"nvme" + volume id:503 size:1795992728 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:969 version:3 modified_at_second:1610643823 disk_type:"nvme" + volume id:590 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507789 disk_type:"nvme" + volume id:618 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507790 disk_type:"nvme" + volume id:649 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507792 disk_type:"nvme" + volume id:707 size:8388808 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507793 disk_type:"nvme" + volume id:734 size:100663544 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1617901669 disk_type:"nvme" + volume id:745 size:75497848 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1618444184 disk_type:"nvme" + volume id:755 size:109052328 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1619387454 disk_type:"nvme" + volume id:759 size:82165760 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1619387464 disk_type:"nvme" + volume id:773 size:142606856 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1619387462 disk_type:"nvme" + volume id:780 size:142606832 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1619387455 disk_type:"nvme" + volume id:784 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623184338 disk_type:"nvme" + volume id:786 size:239076032 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1619387472 disk_type:"nvme" + volume id:825 size:100663544 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1617901627 disk_type:"nvme" + volume id:840 size:109052368 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1623184606 disk_type:"nvme" + volume id:852 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1618444171 disk_type:"nvme" + volume id:864 size:113246768 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:2 modified_at_second:1627504954 disk_type:"nvme" + volume id:866 size:109052312 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1619387472 disk_type:"nvme" + volume id:871 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623184200 disk_type:"nvme" + volume id:875 size:104857952 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623184328 disk_type:"nvme" + volume id:880 size:104857920 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1618444170 disk_type:"nvme" + volume id:881 size:104857952 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623184479 disk_type:"nvme" + volume id:895 size:142606888 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1618444171 disk_type:"nvme" + volume id:911 size:146801232 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:2 modified_at_second:1619387449 disk_type:"nvme" + volume id:916 size:111997040 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:33557045 version:3 compact_revision:2 modified_at_second:1627500611 disk_type:"nvme" + volume id:921 size:50332080 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:2 modified_at_second:1627504749 disk_type:"nvme" + volume id:927 size:113438912 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:2 modified_at_second:1627504916 disk_type:"nvme" + volume id:930 size:71303432 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:2 modified_at_second:1627504956 disk_type:"nvme" + volume id:940 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1617901476 disk_type:"nvme" + volume id:944 size:104857928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1623184059 disk_type:"nvme" + volume id:946 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623184187 disk_type:"nvme" + volume id:969 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623184467 disk_type:"nvme" + volume id:986 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:1 modified_at_second:1627504742 disk_type:"nvme" + volume id:992 size:46137696 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1619387463 disk_type:"nvme" + volume id:994 size:37748912 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1619387462 disk_type:"nvme" + volume id:1003 size:142606848 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1619387458 disk_type:"nvme" + volume id:1006 size:168896560 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1617901572 disk_type:"nvme" + volume id:1025 size:138412488 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1618444180 disk_type:"nvme" + volume id:1072 size:20977959168 collection:"braingeneers-backups-swfs" file_count:12243 delete_count:214 deleted_byte_count:368569899 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1084 size:20974675784 collection:"braingeneers-backups-swfs" file_count:12149 delete_count:216 deleted_byte_count:352173501 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1087 size:20975802264 collection:"braingeneers-backups-swfs" file_count:12268 delete_count:249 deleted_byte_count:384729337 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1092 size:20973656776 collection:"braingeneers-backups-swfs" file_count:12162 delete_count:244 deleted_byte_count:385207912 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1094 size:20972954464 collection:"braingeneers-backups-swfs" file_count:12254 delete_count:230 deleted_byte_count:352275616 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1097 size:20972823488 collection:"braingeneers-backups-swfs" file_count:12260 delete_count:225 deleted_byte_count:369502703 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1119 size:20973407464 collection:"braingeneers-backups-swfs" file_count:12191 delete_count:251 deleted_byte_count:429317624 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1133 size:20979013528 collection:"braingeneers-backups-swfs" file_count:12195 delete_count:228 deleted_byte_count:369277930 version:3 modified_at_second:1627607153 disk_type:"nvme" + Disk nvme total size:225927923296 file_count:137074 deleted_file:5631 deleted_bytes:3916414967 + DataNode 10.244.216.104:8080 total size:225927923296 file_count:137074 deleted_file:5631 deleted_bytes:3916414967 + DataNode 10.244.216.115:8080 nvme(volume:74/74 active:69 free:0 remote:0) + Disk nvme(volume:74/74 active:69 free:0 remote:0) + volume id:3 size:297552792 file_count:290 version:3 modified_at_second:1626640527 disk_type:"nvme" + volume id:55 size:661136 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:892 version:3 compact_revision:7 modified_at_second:1627507799 disk_type:"nvme" + volume id:73 size:628400 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:948 version:3 compact_revision:7 modified_at_second:1627507800 disk_type:"nvme" + volume id:117 size:8 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" replica_placement:1 version:3 compact_revision:2 modified_at_second:1623174832 disk_type:"nvme" + volume id:131 size:8 collection:".DS_Store" replica_placement:1 version:3 modified_at_second:1623174313 disk_type:"nvme" + volume id:134 size:8 collection:".DS_Store" replica_placement:1 version:3 modified_at_second:1623174842 disk_type:"nvme" + volume id:142 size:1559633608 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:2416 delete_count:1853 deleted_byte_count:384450144 version:3 modified_at_second:1623174854 disk_type:"nvme" + volume id:155 size:1270832232 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:620 version:3 modified_at_second:1623174868 disk_type:"nvme" + volume id:163 size:1474682472 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:831 version:3 modified_at_second:1623174882 disk_type:"nvme" + volume id:170 size:1847542352 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:887 version:3 modified_at_second:1623174896 disk_type:"nvme" + volume id:174 size:1212956456 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:755 version:3 modified_at_second:1623174910 disk_type:"nvme" + volume id:178 size:1225699864 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:774 version:3 modified_at_second:1623174339 disk_type:"nvme" + volume id:184 size:1303411928 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:785 version:3 modified_at_second:1623174924 disk_type:"nvme" + volume id:263 size:1204740008 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:578 version:3 modified_at_second:1610496631 disk_type:"nvme" + volume id:304 size:1347904096 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:646 version:3 modified_at_second:1610497082 disk_type:"nvme" + volume id:309 size:1703950792 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:837 version:3 modified_at_second:1610497170 disk_type:"nvme" + volume id:360 size:1169493040 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:562 version:3 modified_at_second:1623174407 disk_type:"nvme" + volume id:396 size:1191652408 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:575 version:3 modified_at_second:1610498385 disk_type:"nvme" + volume id:398 size:1245932376 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:600 version:3 modified_at_second:1610498385 disk_type:"nvme" + volume id:407 size:1387053048 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:673 version:3 modified_at_second:1610498529 disk_type:"nvme" + volume id:410 size:1175456952 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:572 version:3 modified_at_second:1610498523 disk_type:"nvme" + volume id:424 size:1195974440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:575 version:3 modified_at_second:1623174435 disk_type:"nvme" + volume id:522 size:1342299832 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:668 version:3 modified_at_second:1610643966 disk_type:"nvme" + volume id:538 size:1210268872 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:613 version:3 modified_at_second:1623174463 disk_type:"nvme" + volume id:554 size:1174587720 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:688 version:3 modified_at_second:1623174476 disk_type:"nvme" + volume id:580 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1627507790 disk_type:"nvme" + volume id:639 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507791 disk_type:"nvme" + volume id:642 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" + volume id:679 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507798 disk_type:"nvme" + volume id:765 size:239076024 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1618444183 disk_type:"nvme" + volume id:834 size:213910272 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:9 version:3 compact_revision:1 modified_at_second:1619387469 disk_type:"nvme" + volume id:836 size:171967008 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1618444183 disk_type:"nvme" + volume id:872 size:134218088 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1617901725 disk_type:"nvme" + volume id:874 size:134218064 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1623172843 disk_type:"nvme" + volume id:876 size:209715896 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:1 modified_at_second:1623172869 disk_type:"nvme" + volume id:882 size:113246752 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:1 modified_at_second:1627504745 disk_type:"nvme" + volume id:908 size:138412464 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1618444165 disk_type:"nvme" + volume id:919 size:134218088 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623172907 disk_type:"nvme" + volume id:920 size:113246768 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1623174569 disk_type:"nvme" + volume id:928 size:138412440 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1623172920 disk_type:"nvme" + volume id:937 size:113246760 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:1 modified_at_second:1627504745 disk_type:"nvme" + volume id:963 size:201327128 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1623172983 disk_type:"nvme" + volume id:965 size:134218088 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623172996 disk_type:"nvme" + volume id:1008 size:138412448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:3 modified_at_second:1623174608 disk_type:"nvme" + volume id:1012 size:272679104 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:10 version:3 compact_revision:3 modified_at_second:1623173022 disk_type:"nvme" + volume id:1110 size:20986677760 collection:"braingeneers-backups-swfs" file_count:12129 delete_count:225 deleted_byte_count:373699582 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1125 size:20979792272 collection:"braingeneers-backups-swfs" file_count:12312 delete_count:253 deleted_byte_count:400756796 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1126 size:20976056280 collection:"braingeneers-backups-swfs" file_count:12266 delete_count:248 deleted_byte_count:398799062 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1138 size:20989427240 collection:"braingeneers-backups-swfs" file_count:12263 delete_count:204 deleted_byte_count:311650638 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:246201 size:21384261328 collection:"hengenlab" file_count:8215 read_only:true version:3 modified_at_second:1627420098 disk_type:"nvme" + volume id:246240 size:21135039848 collection:"hengenlab" file_count:8095 read_only:true version:3 modified_at_second:1627423054 disk_type:"nvme" + volume id:246276 size:21144142368 collection:"hengenlab" file_count:8052 read_only:true version:3 modified_at_second:1627424647 disk_type:"nvme" + volume id:246372 size:21212400664 collection:"hengenlab" file_count:8684 delete_count:13 deleted_byte_count:54526463 version:3 modified_at_second:1627429092 disk_type:"nvme" + volume id:246378 size:20998753624 collection:"hengenlab" file_count:8038 delete_count:3 deleted_byte_count:12583053 version:3 modified_at_second:1627429662 disk_type:"nvme" + volume id:246433 size:21298865592 collection:"hengenlab" file_count:8174 version:3 modified_at_second:1627432819 disk_type:"nvme" + volume id:246450 size:21345526048 collection:"hengenlab" file_count:8173 version:3 modified_at_second:1627433965 disk_type:"nvme" + volume id:246462 size:21191151728 collection:"hengenlab" file_count:8097 version:3 modified_at_second:1627434848 disk_type:"nvme" + volume id:246471 size:21128006912 collection:"hengenlab" file_count:8081 delete_count:1 deleted_byte_count:4194325 version:3 modified_at_second:1627500576 disk_type:"nvme" + volume id:246483 size:21077677080 collection:"hengenlab" file_count:8114 version:3 modified_at_second:1627436472 disk_type:"nvme" + volume id:246491 size:21520002056 collection:"hengenlab" file_count:8203 version:3 modified_at_second:1627436960 disk_type:"nvme" + volume id:246602 size:21426843352 collection:"hengenlab" file_count:8195 version:3 modified_at_second:1627439899 disk_type:"nvme" + volume id:246642 size:21299151352 collection:"hengenlab" file_count:8150 version:3 modified_at_second:1627441211 disk_type:"nvme" + volume id:246671 size:13369876656 collection:"hengenlab" file_count:5164 version:3 compact_revision:1 modified_at_second:1627528747 disk_type:"nvme" + volume id:246744 size:14194623656 collection:"hengenlab" file_count:5431 version:3 compact_revision:1 modified_at_second:1627528659 disk_type:"nvme" + volume id:246760 size:13673325384 collection:"hengenlab" file_count:5196 version:3 compact_revision:1 modified_at_second:1627528688 disk_type:"nvme" + volume id:246786 size:14171590384 collection:"hengenlab" file_count:5416 version:3 compact_revision:1 modified_at_second:1627528615 disk_type:"nvme" + volume id:246809 size:13970260096 collection:"hengenlab" file_count:5350 version:3 compact_revision:1 modified_at_second:1627618163 disk_type:"nvme" + volume id:246828 size:8240065248 collection:"hengenlab" file_count:3142 version:3 compact_revision:1 modified_at_second:1627618178 disk_type:"nvme" + volume id:246896 size:2700383904 collection:"hengenlab" file_count:1022 version:3 compact_revision:1 modified_at_second:1627528627 disk_type:"nvme" + volume id:246901 size:1741901064 collection:"hengenlab" file_count:665 version:3 compact_revision:1 modified_at_second:1627528633 disk_type:"nvme" + volume id:246920 size:2612123096 collection:"hengenlab" file_count:998 version:3 compact_revision:1 modified_at_second:1627528664 disk_type:"nvme" + volume id:246950 size:2879566056 collection:"hengenlab" file_count:1101 version:3 compact_revision:1 modified_at_second:1627528777 disk_type:"nvme" + volume id:247055 size:4170454488 collection:"hengenlab" file_count:1583 version:3 compact_revision:1 modified_at_second:1627528697 disk_type:"nvme" + volume id:247057 size:3690312136 collection:"hengenlab" file_count:1418 version:3 compact_revision:1 modified_at_second:1627528724 disk_type:"nvme" + Disk nvme total size:483676864296 file_count:208614 deleted_file:2802 deleted_bytes:1949048740 + DataNode 10.244.216.115:8080 total size:483676864296 file_count:208614 deleted_file:2802 deleted_bytes:1949048740 + DataNode 10.244.216.119:8080 nvme(volume:47/47 active:47 free:0 remote:0) + Disk nvme(volume:47/47 active:47 free:0 remote:0) + volume id:59 size:562688 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:907 version:3 compact_revision:8 modified_at_second:1627507800 disk_type:"nvme" + volume id:80 size:587552 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:839 version:3 compact_revision:8 modified_at_second:1627507798 disk_type:"nvme" + volume id:124 size:8388776 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1627507793 disk_type:"nvme" + volume id:132 size:8 collection:".DS_Store" version:3 modified_at_second:1610069605 disk_type:"nvme" + volume id:143 size:1402413064 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:692 version:3 modified_at_second:1610491343 disk_type:"nvme" + volume id:146 size:1604797608 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:834 version:3 modified_at_second:1610491353 disk_type:"nvme" + volume id:171 size:1814029024 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:874 version:3 modified_at_second:1610491453 disk_type:"nvme" + volume id:176 size:1218650056 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:761 version:3 modified_at_second:1610491476 disk_type:"nvme" + volume id:182 size:1299684992 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:786 version:3 modified_at_second:1610494389 disk_type:"nvme" + volume id:203 size:1269298488 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:606 version:3 modified_at_second:1610494892 disk_type:"nvme" + volume id:207 size:1259353968 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:603 version:3 modified_at_second:1610494893 disk_type:"nvme" + volume id:223 size:1430634688 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:689 version:3 modified_at_second:1610496178 disk_type:"nvme" + volume id:308 size:1218204048 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:600 version:3 modified_at_second:1610497162 disk_type:"nvme" + volume id:316 size:1481558640 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:730 version:3 modified_at_second:1610497252 disk_type:"nvme" + volume id:354 size:1228968456 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:595 version:3 modified_at_second:1610497794 disk_type:"nvme" + volume id:368 size:1356782040 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:649 version:3 modified_at_second:1610497960 disk_type:"nvme" + volume id:389 size:1298978368 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:623 version:3 modified_at_second:1610498317 disk_type:"nvme" + volume id:395 size:1221106984 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:590 version:3 modified_at_second:1610498385 disk_type:"nvme" + volume id:397 size:1321427632 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:635 version:3 modified_at_second:1610498385 disk_type:"nvme" + volume id:399 size:1217579976 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:588 version:3 modified_at_second:1610498385 disk_type:"nvme" + volume id:455 size:1272114416 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:626 version:3 modified_at_second:1610499157 disk_type:"nvme" + volume id:539 size:1217814168 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:598 version:3 modified_at_second:1610644140 disk_type:"nvme" + volume id:552 size:2693106344 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1558 version:3 modified_at_second:1610644276 disk_type:"nvme" + volume id:570 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1627507798 disk_type:"nvme" + volume id:571 size:8388808 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1627507797 disk_type:"nvme" + volume id:591 size:8388808 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507793 disk_type:"nvme" + volume id:612 size:471736 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" + volume id:636 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507792 disk_type:"nvme" + volume id:655 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507794 disk_type:"nvme" + volume id:656 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507796 disk_type:"nvme" + volume id:722 size:256445448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:9 version:3 compact_revision:1 modified_at_second:1619387453 disk_type:"nvme" + volume id:751 size:247464832 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:10 version:3 compact_revision:1 modified_at_second:1619387464 disk_type:"nvme" + volume id:808 size:171966944 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1619387469 disk_type:"nvme" + volume id:813 size:276824936 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:10 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:2 modified_at_second:1627504924 disk_type:"nvme" + volume id:844 size:171966992 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:2 modified_at_second:1627500598 disk_type:"nvme" + volume id:854 size:142606888 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1618444185 disk_type:"nvme" + volume id:935 size:268436096 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1617901650 disk_type:"nvme" + volume id:982 size:218104648 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:10 version:3 compact_revision:3 modified_at_second:1619387472 disk_type:"nvme" + volume id:1038 size:8 collection:"pvc-0544e3a6-da8f-42fe-a149-3a103bcc8552" version:3 modified_at_second:1615234634 disk_type:"nvme" + volume id:1111 size:20992311808 collection:"braingeneers-backups-swfs" file_count:12332 delete_count:227 deleted_byte_count:340575187 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1131 size:20975001016 collection:"braingeneers-backups-swfs" file_count:12212 delete_count:254 deleted_byte_count:409474937 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1136 size:20971824008 collection:"braingeneers-backups-swfs" file_count:12174 delete_count:218 deleted_byte_count:362416322 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1141 size:21083986224 collection:"braingeneers-backups-swfs" file_count:12362 delete_count:224 deleted_byte_count:343942797 version:3 compact_revision:4 modified_at_second:1627607153 disk_type:"nvme" + volume id:1644 size:9426453224 collection:"hengenlab" file_count:3614 delete_count:27 deleted_byte_count:62915127 version:3 compact_revision:4 modified_at_second:1627521882 disk_type:"nvme" + volume id:246178 size:21711767592 collection:"hengenlab" file_count:8273 delete_count:31 deleted_byte_count:70255243 version:3 modified_at_second:1627521882 disk_type:"nvme" + volume id:246193 size:21502111304 collection:"hengenlab" file_count:8179 delete_count:24 deleted_byte_count:56623608 read_only:true version:3 modified_at_second:1627521882 disk_type:"nvme" + volume id:246227 size:9440774688 collection:"hengenlab" file_count:3598 version:3 compact_revision:1 modified_at_second:1627528715 disk_type:"nvme" + Disk nvme total size:174728115592 file_count:88203 deleted_file:1007 deleted_bytes:1654591905 + DataNode 10.244.216.119:8080 total size:174728115592 file_count:88203 deleted_file:1007 deleted_bytes:1654591905 + DataNode 10.244.216.121:8080 nvme(volume:68/68 active:67 free:0 remote:0) + Disk nvme(volume:68/68 active:67 free:0 remote:0) + volume id:1 size:467947296 file_count:5823 delete_count:1 deleted_byte_count:294 version:3 modified_at_second:1627443123 disk_type:"nvme" + volume id:4 size:441258608 file_count:5832 version:3 modified_at_second:1627443063 disk_type:"nvme" + volume id:71 size:610784 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:859 version:3 compact_revision:7 modified_at_second:1627507799 disk_type:"nvme" + volume id:75 size:580576 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:881 version:3 compact_revision:8 modified_at_second:1627507801 disk_type:"nvme" + volume id:140 size:1506928952 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:2396 delete_count:1864 deleted_byte_count:399350512 version:3 modified_at_second:1623171889 disk_type:"nvme" + volume id:147 size:1667938056 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:854 version:3 modified_at_second:1623171904 disk_type:"nvme" + volume id:160 size:1194083240 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:581 version:3 modified_at_second:1610491395 disk_type:"nvme" + volume id:166 size:1467965456 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:817 version:3 modified_at_second:1623171919 disk_type:"nvme" + volume id:172 size:1691025904 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:812 version:3 modified_at_second:1623171934 disk_type:"nvme" + volume id:189 size:1220039200 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:4642 version:3 modified_at_second:1610494518 disk_type:"nvme" + volume id:195 size:1242480352 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3468 version:3 modified_at_second:1623171976 disk_type:"nvme" + volume id:233 size:1338611528 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:641 version:3 modified_at_second:1623172005 disk_type:"nvme" + volume id:273 size:1200692744 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:615 version:3 modified_at_second:1623172033 disk_type:"nvme" + volume id:274 size:1590254712 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:791 version:3 modified_at_second:1610496726 disk_type:"nvme" + volume id:278 size:1229501720 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:595 version:3 modified_at_second:1623172048 disk_type:"nvme" + volume id:279 size:1259710904 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:610 version:3 modified_at_second:1623172062 disk_type:"nvme" + volume id:324 size:1228986784 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:592 version:3 modified_at_second:1623172076 disk_type:"nvme" + volume id:326 size:1222977192 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:587 version:3 modified_at_second:1610497407 disk_type:"nvme" + volume id:403 size:1223593064 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:586 version:3 modified_at_second:1623172133 disk_type:"nvme" + volume id:422 size:1235862880 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:593 version:3 modified_at_second:1623172190 disk_type:"nvme" + volume id:461 size:1196079944 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:589 version:3 modified_at_second:1623172247 disk_type:"nvme" + volume id:493 size:1214228208 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1166 version:3 modified_at_second:1623172318 disk_type:"nvme" + volume id:506 size:1262940608 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:710 version:3 modified_at_second:1623172332 disk_type:"nvme" + volume id:529 size:1293102176 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:681 version:3 modified_at_second:1623172359 disk_type:"nvme" + volume id:572 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1627507791 disk_type:"nvme" + volume id:584 size:8388776 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1627507794 disk_type:"nvme" + volume id:625 size:8388808 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507796 disk_type:"nvme" + volume id:660 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507793 disk_type:"nvme" + volume id:677 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507796 disk_type:"nvme" + volume id:681 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507798 disk_type:"nvme" + volume id:689 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507796 disk_type:"nvme" + volume id:699 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507790 disk_type:"nvme" + volume id:706 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507791 disk_type:"nvme" + volume id:711 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507797 disk_type:"nvme" + volume id:730 size:109052320 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1623172569 disk_type:"nvme" + volume id:736 size:184550104 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:9 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:2 modified_at_second:1627500600 disk_type:"nvme" + volume id:740 size:138412464 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1618444166 disk_type:"nvme" + volume id:752 size:209715912 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:1 modified_at_second:1619387458 disk_type:"nvme" + volume id:797 size:167772584 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1623171556 disk_type:"nvme" + volume id:941 size:268436144 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1617901734 disk_type:"nvme" + volume id:1044 size:86712 collection:"pvc-73532100-54aa-469c-b8a7-1774be8c3b9e" file_count:1 version:3 compact_revision:3 modified_at_second:1625624761 disk_type:"nvme" + volume id:1047 size:8 collection:"pvc-73532100-54aa-469c-b8a7-1774be8c3b9e" version:3 compact_revision:3 modified_at_second:1625624761 disk_type:"nvme" + volume id:1088 size:20974667904 collection:"braingeneers-backups-swfs" file_count:12173 delete_count:242 deleted_byte_count:374645876 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1120 size:20996395720 collection:"braingeneers-backups-swfs" file_count:12233 delete_count:212 deleted_byte_count:348970606 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1122 size:20992144360 collection:"braingeneers-backups-swfs" file_count:12207 delete_count:230 deleted_byte_count:363012031 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1127 size:20976711152 collection:"braingeneers-backups-swfs" file_count:12297 delete_count:229 deleted_byte_count:364484950 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:133787 size:21301768216 collection:"hengenlab" file_count:8526 delete_count:8264 deleted_byte_count:20658424014 read_only:true version:3 modified_at_second:1627419563 disk_type:"nvme" + volume id:133789 size:735486336 collection:"hengenlab" file_count:282 read_only:true version:3 compact_revision:1 modified_at_second:1627507743 disk_type:"nvme" + volume id:133792 size:881869784 collection:"hengenlab" file_count:310 read_only:true version:3 compact_revision:1 modified_at_second:1627507554 disk_type:"nvme" + volume id:133819 size:21226668664 collection:"hengenlab" file_count:8129 delete_count:8129 deleted_byte_count:21226124008 read_only:true version:3 modified_at_second:1627419753 disk_type:"nvme" + volume id:133873 size:21645954720 collection:"hengenlab" file_count:8361 read_only:true version:3 compact_revision:1 modified_at_second:1627423103 disk_type:"nvme" + volume id:246278 size:21216024872 collection:"hengenlab" file_count:8116 delete_count:1 deleted_byte_count:4194325 version:3 modified_at_second:1627504758 disk_type:"nvme" + volume id:246304 size:21180999232 collection:"hengenlab" file_count:8115 read_only:true version:3 modified_at_second:1627425536 disk_type:"nvme" + volume id:246305 size:21253580256 collection:"hengenlab" file_count:8113 read_only:true version:3 modified_at_second:1627425536 disk_type:"nvme" + volume id:246331 size:21139438032 collection:"hengenlab" file_count:7420 delete_count:50 deleted_byte_count:209717518 version:3 modified_at_second:1627427144 disk_type:"nvme" + volume id:246392 size:21483531064 collection:"hengenlab" file_count:8199 version:3 modified_at_second:1627430347 disk_type:"nvme" + volume id:246418 size:21437637296 collection:"hengenlab" file_count:8201 version:3 modified_at_second:1627431671 disk_type:"nvme" + volume id:246509 size:21324437576 collection:"hengenlab" file_count:8131 delete_count:1 deleted_byte_count:85 version:3 modified_at_second:1627521514 disk_type:"nvme" + volume id:246523 size:21022332720 collection:"hengenlab" file_count:7739 delete_count:827 deleted_byte_count:2901782526 version:3 modified_at_second:1627521905 disk_type:"nvme" + volume id:246589 size:21164642208 collection:"hengenlab" file_count:8073 version:3 modified_at_second:1627439400 disk_type:"nvme" + volume id:246595 size:21191150048 collection:"hengenlab" file_count:8067 version:3 modified_at_second:1627439729 disk_type:"nvme" + volume id:246620 size:21362763672 collection:"hengenlab" file_count:8162 version:3 modified_at_second:1627440399 disk_type:"nvme" + volume id:246648 size:21280598032 collection:"hengenlab" file_count:8102 version:3 modified_at_second:1627441550 disk_type:"nvme" + volume id:246670 size:13572658056 collection:"hengenlab" file_count:5124 version:3 compact_revision:1 modified_at_second:1627671372 disk_type:"nvme" + volume id:246700 size:12345506560 collection:"hengenlab" file_count:4699 version:3 compact_revision:1 modified_at_second:1627672427 disk_type:"nvme" + volume id:246721 size:12449856352 collection:"hengenlab" file_count:4762 version:3 compact_revision:1 modified_at_second:1627671671 disk_type:"nvme" + volume id:246742 size:20670639592 collection:"hengenlab" file_count:7916 delete_count:2237 deleted_byte_count:5824138895 version:3 modified_at_second:1627521784 disk_type:"nvme" + volume id:246746 size:1430471024 collection:"hengenlab" file_count:536 delete_count:133 deleted_byte_count:362810089 version:3 modified_at_second:1627521784 disk_type:"nvme" + Disk nvme total size:493787887720 file_count:229768 deleted_file:22421 deleted_bytes:53041850064 + DataNode 10.244.216.121:8080 total size:493787887720 file_count:229768 deleted_file:22421 deleted_bytes:53041850064 + DataNode 10.244.216.124:8080 nvme(volume:69/69 active:67 free:0 remote:0) + Disk nvme(volume:69/69 active:67 free:0 remote:0) + volume id:61 size:615912 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:879 version:3 compact_revision:8 modified_at_second:1627513382 disk_type:"nvme" + volume id:237 size:1364951800 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:655 version:3 modified_at_second:1610496298 disk_type:"nvme" + volume id:249 size:1156345656 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:589 version:3 modified_at_second:1610496421 disk_type:"nvme" + volume id:292 size:1238778960 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:620 version:3 modified_at_second:1610496936 disk_type:"nvme" + volume id:296 size:1162877928 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:562 version:3 modified_at_second:1610497004 disk_type:"nvme" + volume id:307 size:1167087136 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:582 version:3 modified_at_second:1610497162 disk_type:"nvme" + volume id:327 size:1206497736 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:579 version:3 modified_at_second:1610497407 disk_type:"nvme" + volume id:357 size:1129977984 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:549 version:3 modified_at_second:1610497787 disk_type:"nvme" + volume id:364 size:1183530952 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:569 version:3 modified_at_second:1610497862 disk_type:"nvme" + volume id:373 size:1278907048 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:611 version:3 modified_at_second:1610498031 disk_type:"nvme" + volume id:436 size:1117460680 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:547 version:3 modified_at_second:1610498821 disk_type:"nvme" + volume id:463 size:1106554216 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:553 version:3 modified_at_second:1623133765 disk_type:"nvme" + volume id:485 size:1235448568 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:598 version:3 modified_at_second:1623133793 disk_type:"nvme" + volume id:492 size:1147160824 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1139 version:3 modified_at_second:1623133807 disk_type:"nvme" + volume id:509 size:1207966936 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:619 version:3 modified_at_second:1610643888 disk_type:"nvme" + volume id:523 size:1335123824 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:670 version:3 modified_at_second:1623133850 disk_type:"nvme" + volume id:527 size:1253834800 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:663 version:3 modified_at_second:1623133864 disk_type:"nvme" + volume id:531 size:1287189864 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:678 version:3 modified_at_second:1623133878 disk_type:"nvme" + volume id:536 size:1290519256 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:654 version:3 modified_at_second:1623133893 disk_type:"nvme" + volume id:557 size:1123381424 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:701 version:3 modified_at_second:1623133907 disk_type:"nvme" + volume id:647 size:8388808 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627672953 disk_type:"nvme" + volume id:653 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627513390 disk_type:"nvme" + volume id:662 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627513387 disk_type:"nvme" + volume id:669 size:1082993928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:9738 delete_count:9737 deleted_byte_count:1078157927 version:3 modified_at_second:1627500596 disk_type:"nvme" + volume id:674 size:1083867360 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8810 delete_count:8808 deleted_byte_count:1074892513 version:3 modified_at_second:1627504775 disk_type:"nvme" + volume id:697 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627515992 disk_type:"nvme" + volume id:704 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627513391 disk_type:"nvme" + volume id:1033 size:376 collection:"swfstest" file_count:1 version:3 modified_at_second:1623134314 disk_type:"nvme" + volume id:1037 size:8 collection:"pvc-0544e3a6-da8f-42fe-a149-3a103bcc8552" replica_placement:1 version:3 modified_at_second:1623134327 disk_type:"nvme" + volume id:1124 size:20981558144 collection:"braingeneers-backups-swfs" file_count:12294 delete_count:238 deleted_byte_count:353310263 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1132 size:20972966960 collection:"braingeneers-backups-swfs" file_count:12252 delete_count:230 deleted_byte_count:365652225 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1134 size:20972489728 collection:"braingeneers-backups-swfs" file_count:12218 delete_count:217 deleted_byte_count:359714514 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1135 size:20972086640 collection:"braingeneers-backups-swfs" file_count:12232 delete_count:233 deleted_byte_count:370529147 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1140 size:21014815008 collection:"braingeneers-backups-swfs" file_count:12261 delete_count:220 deleted_byte_count:364939661 version:3 compact_revision:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1767 size:245280920 file_count:112 version:3 modified_at_second:1627431723 disk_type:"nvme" + volume id:133787 size:21301768216 collection:"hengenlab" file_count:8526 delete_count:8264 deleted_byte_count:20658424014 read_only:true version:3 modified_at_second:1627413970 disk_type:"nvme" + volume id:133819 size:21226668664 collection:"hengenlab" file_count:8129 delete_count:8129 deleted_byte_count:21226124008 read_only:true version:3 modified_at_second:1627413963 disk_type:"nvme" + volume id:133878 size:13631888 collection:"hengenlab" file_count:7 read_only:true version:3 compact_revision:1 modified_at_second:1627513374 disk_type:"nvme" + volume id:133883 size:18874712 collection:"hengenlab" file_count:6 read_only:true version:3 compact_revision:1 modified_at_second:1627513357 disk_type:"nvme" + volume id:133902 size:15728984 collection:"hengenlab" file_count:6 read_only:true version:3 compact_revision:1 modified_at_second:1627513353 disk_type:"nvme" + volume id:133906 size:9437360 collection:"hengenlab" file_count:3 read_only:true version:3 compact_revision:1 modified_at_second:1627513371 disk_type:"nvme" + volume id:133916 size:10485992 collection:"hengenlab" file_count:4 read_only:true version:3 compact_revision:1 modified_at_second:1627513365 disk_type:"nvme" + volume id:133930 size:9437360 collection:"hengenlab" file_count:3 read_only:true version:3 compact_revision:1 modified_at_second:1627513375 disk_type:"nvme" + volume id:133931 size:30409160 collection:"hengenlab" file_count:8 read_only:true version:3 compact_revision:1 modified_at_second:1627513362 disk_type:"nvme" + volume id:133940 size:10485992 collection:"hengenlab" file_count:4 read_only:true version:3 compact_revision:1 modified_at_second:1627513381 disk_type:"nvme" + volume id:133944 size:27263432 collection:"hengenlab" file_count:8 read_only:true version:3 compact_revision:1 modified_at_second:1627513361 disk_type:"nvme" + volume id:133998 size:20971976 collection:"hengenlab" file_count:8 read_only:true version:3 compact_revision:1 modified_at_second:1627513353 disk_type:"nvme" + volume id:134016 size:27263432 collection:"hengenlab" file_count:8 read_only:true version:3 compact_revision:1 modified_at_second:1627513354 disk_type:"nvme" + volume id:134026 size:11534624 collection:"hengenlab" file_count:5 read_only:true version:3 compact_revision:1 modified_at_second:1627513367 disk_type:"nvme" + volume id:134027 size:18874712 collection:"hengenlab" file_count:6 read_only:true version:3 compact_revision:1 modified_at_second:1627513378 disk_type:"nvme" + volume id:134035 size:7340432 collection:"hengenlab" file_count:7 read_only:true version:3 compact_revision:1 modified_at_second:1627513356 disk_type:"nvme" + volume id:134044 size:13631720 collection:"hengenlab" file_count:4 read_only:true version:3 compact_revision:1 modified_at_second:1627513373 disk_type:"nvme" + volume id:134080 size:20971976 collection:"hengenlab" file_count:8 read_only:true version:3 compact_revision:1 modified_at_second:1627513354 disk_type:"nvme" + volume id:134097 size:9437528 collection:"hengenlab" file_count:6 read_only:true version:3 compact_revision:1 modified_at_second:1627513365 disk_type:"nvme" + volume id:134098 size:8388728 collection:"hengenlab" file_count:2 read_only:true version:3 compact_revision:1 modified_at_second:1627513356 disk_type:"nvme" + volume id:134124 size:23069240 collection:"hengenlab" file_count:10 read_only:true version:3 compact_revision:1 modified_at_second:1627513352 disk_type:"nvme" + volume id:134126 size:5243000 collection:"hengenlab" file_count:2 read_only:true version:3 compact_revision:1 modified_at_second:1627513372 disk_type:"nvme" + volume id:134130 size:9437360 collection:"hengenlab" file_count:3 read_only:true version:3 compact_revision:1 modified_at_second:1627513373 disk_type:"nvme" + volume id:134152 size:15728984 collection:"hengenlab" file_count:6 read_only:true version:3 compact_revision:1 modified_at_second:1627513371 disk_type:"nvme" + volume id:134170 size:18874712 collection:"hengenlab" file_count:6 version:3 compact_revision:1 modified_at_second:1627513372 disk_type:"nvme" + volume id:134194 size:11534624 collection:"hengenlab" file_count:5 version:3 compact_revision:1 modified_at_second:1627513370 disk_type:"nvme" + volume id:134245 size:21333464920 collection:"hengenlab" file_count:8233 delete_count:1356 deleted_byte_count:3363590657 version:3 modified_at_second:1627504865 disk_type:"nvme" + volume id:246154 size:21297033344 collection:"hengenlab" file_count:8121 read_only:true version:3 modified_at_second:1627419656 disk_type:"nvme" + volume id:246255 size:21292259792 collection:"hengenlab" file_count:8058 read_only:true version:3 modified_at_second:1627423488 disk_type:"nvme" + volume id:246282 size:21406049120 collection:"hengenlab" file_count:8163 read_only:true version:3 modified_at_second:1627424758 disk_type:"nvme" + volume id:246322 size:21614436384 collection:"hengenlab" file_count:9033 version:3 modified_at_second:1627426441 disk_type:"nvme" + volume id:246400 size:21121703536 collection:"hengenlab" file_count:8120 version:3 modified_at_second:1627431006 disk_type:"nvme" + volume id:246414 size:21486611344 collection:"hengenlab" file_count:8180 version:3 modified_at_second:1627431506 disk_type:"nvme" + volume id:246425 size:1747029080 collection:"hengenlab" file_count:662 version:3 modified_at_second:1627432019 disk_type:"nvme" + Disk nvme total size:324540519312 file_count:168301 deleted_file:37432 deleted_bytes:49215334929 + DataNode 10.244.216.124:8080 total size:324540519312 file_count:168301 deleted_file:37432 deleted_bytes:49215334929 + DataNode 10.244.216.77:8080 nvme(volume:58/58 active:57 free:0 remote:0) + Disk nvme(volume:58/58 active:57 free:0 remote:0) + volume id:2 size:237058544 file_count:5594 delete_count:1 deleted_byte_count:197 version:3 modified_at_second:1626640345 disk_type:"nvme" + volume id:38 size:604200 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:869 version:3 compact_revision:7 modified_at_second:1627507800 disk_type:"nvme" + volume id:39 size:578216 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:848 version:3 compact_revision:7 modified_at_second:1627507799 disk_type:"nvme" + volume id:121 size:12583160 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:3 modified_at_second:1627507796 disk_type:"nvme" + volume id:128 size:8 collection:"._.DS_Store" version:3 modified_at_second:1610069605 disk_type:"nvme" + volume id:136 size:8 collection:".DS_Store" version:3 compact_revision:1 modified_at_second:1610070116 disk_type:"nvme" + volume id:217 size:1209636576 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:581 version:3 modified_at_second:1623175319 disk_type:"nvme" + volume id:219 size:1197692984 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:577 version:3 modified_at_second:1623175333 disk_type:"nvme" + volume id:226 size:1461113792 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:702 version:3 modified_at_second:1623175360 disk_type:"nvme" + volume id:271 size:1536308152 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:765 version:3 modified_at_second:1623175388 disk_type:"nvme" + volume id:299 size:1258933600 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:603 version:3 modified_at_second:1623175402 disk_type:"nvme" + volume id:325 size:1246875352 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:598 version:3 modified_at_second:1623175416 disk_type:"nvme" + volume id:329 size:1218014304 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:601 version:3 modified_at_second:1623175430 disk_type:"nvme" + volume id:333 size:1196940808 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:589 version:3 modified_at_second:1623175443 disk_type:"nvme" + volume id:345 size:1205177112 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:609 version:3 modified_at_second:1623175471 disk_type:"nvme" + volume id:367 size:1257405952 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:602 version:3 modified_at_second:1610497960 disk_type:"nvme" + volume id:384 size:1245513472 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:627 version:3 modified_at_second:1623175540 disk_type:"nvme" + volume id:385 size:1265778408 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:635 version:3 modified_at_second:1610498218 disk_type:"nvme" + volume id:441 size:1220881832 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:589 version:3 modified_at_second:1623175568 disk_type:"nvme" + volume id:445 size:1568529440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:779 version:3 modified_at_second:1610499009 disk_type:"nvme" + volume id:483 size:1215104824 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:597 version:3 modified_at_second:1623175595 disk_type:"nvme" + volume id:498 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1627507790 disk_type:"nvme" + volume id:504 size:1226829928 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:697 version:3 modified_at_second:1623175637 disk_type:"nvme" + volume id:525 size:1377305584 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:687 version:3 modified_at_second:1610643966 disk_type:"nvme" + volume id:526 size:1282701392 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:641 version:3 modified_at_second:1610643966 disk_type:"nvme" + volume id:528 size:1327751736 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:695 version:3 modified_at_second:1610644025 disk_type:"nvme" + volume id:596 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" + volume id:648 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507798 disk_type:"nvme" + volume id:666 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507791 disk_type:"nvme" + volume id:671 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507796 disk_type:"nvme" + volume id:687 size:16777576 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1627507796 disk_type:"nvme" + volume id:713 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1627507792 disk_type:"nvme" + volume id:747 size:138412464 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1618444173 disk_type:"nvme" + volume id:749 size:138412488 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1618444179 disk_type:"nvme" + volume id:770 size:171967016 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:2 modified_at_second:1627504767 disk_type:"nvme" + volume id:776 size:205521416 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:2 modified_at_second:1619387461 disk_type:"nvme" + volume id:846 size:180355792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:1 modified_at_second:1619387463 disk_type:"nvme" + volume id:931 size:134218088 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1617901742 disk_type:"nvme" + volume id:961 size:209715936 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:2 modified_at_second:1627500580 disk_type:"nvme" + volume id:974 size:207600392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:1 modified_at_second:1619387472 disk_type:"nvme" + volume id:976 size:142606864 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:2 deleted_byte_count:8388677 version:3 compact_revision:2 modified_at_second:1627504752 disk_type:"nvme" + volume id:1029 size:167772560 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1613770360 disk_type:"nvme" + volume id:1041 size:8 collection:"pvc-0544e3a6-da8f-42fe-a149-3a103bcc8552" version:3 modified_at_second:1615234634 disk_type:"nvme" + volume id:1048 size:8 collection:"pvc-73532100-54aa-469c-b8a7-1774be8c3b9e" version:3 compact_revision:3 modified_at_second:1625624761 disk_type:"nvme" + volume id:1075 size:20980265944 collection:"braingeneers-backups-swfs" file_count:12204 delete_count:220 deleted_byte_count:341737893 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1091 size:20979698232 collection:"braingeneers-backups-swfs" file_count:12215 delete_count:233 deleted_byte_count:385517642 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1099 size:20972466088 collection:"braingeneers-backups-swfs" file_count:12236 delete_count:240 deleted_byte_count:404330634 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1129 size:20973262376 collection:"braingeneers-backups-swfs" file_count:12222 delete_count:221 deleted_byte_count:345307871 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:246272 size:21262264696 collection:"hengenlab" file_count:8123 read_only:true version:3 modified_at_second:1627424197 disk_type:"nvme" + volume id:246389 size:21190435064 collection:"hengenlab" file_count:8096 delete_count:6 deleted_byte_count:12583038 version:3 modified_at_second:1627504944 disk_type:"nvme" + volume id:246464 size:21333635120 collection:"hengenlab" file_count:8201 version:3 modified_at_second:1627435459 disk_type:"nvme" + volume id:246484 size:21157516152 collection:"hengenlab" file_count:8049 version:3 modified_at_second:1627436478 disk_type:"nvme" + volume id:246539 size:12094202280 collection:"hengenlab" file_count:4624 version:3 compact_revision:1 modified_at_second:1627528771 disk_type:"nvme" + volume id:246591 size:21264489512 collection:"hengenlab" file_count:8130 read_only:true version:3 modified_at_second:1627439571 disk_type:"nvme" + volume id:246617 size:21144028736 collection:"hengenlab" file_count:8071 version:3 modified_at_second:1627440224 disk_type:"nvme" + volume id:246635 size:21297929752 collection:"hengenlab" file_count:8139 version:3 modified_at_second:1627440889 disk_type:"nvme" + volume id:246652 size:21099579176 collection:"hengenlab" file_count:8055 version:3 modified_at_second:1627442183 disk_type:"nvme" + volume id:246690 size:2794514912 collection:"hengenlab" file_count:1069 version:3 compact_revision:1 modified_at_second:1627528591 disk_type:"nvme" + Disk nvme total size:295115049088 file_count:138995 deleted_file:925 deleted_bytes:1506254636 + DataNode 10.244.216.77:8080 total size:295115049088 file_count:138995 deleted_file:925 deleted_bytes:1506254636 + DataNode 10.244.216.96:8080 nvme(volume:54/54 active:54 free:0 remote:0) + Disk nvme(volume:54/54 active:54 free:0 remote:0) + volume id:49 size:620856 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:891 version:3 compact_revision:8 modified_at_second:1627507799 disk_type:"nvme" + volume id:77 size:619536 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:892 version:3 compact_revision:7 modified_at_second:1627507800 disk_type:"nvme" + volume id:125 size:8 collection:"._.DS_Store" version:3 compact_revision:1 modified_at_second:1610394116 disk_type:"nvme" + volume id:193 size:1251540904 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3472 version:3 modified_at_second:1610494777 disk_type:"nvme" + volume id:224 size:1473093376 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:708 version:3 modified_at_second:1610496178 disk_type:"nvme" + volume id:257 size:1145971536 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:577 version:3 modified_at_second:1610496537 disk_type:"nvme" + volume id:272 size:1208778992 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:608 version:3 modified_at_second:1610496719 disk_type:"nvme" + volume id:283 size:1241199976 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:600 version:3 modified_at_second:1610496866 disk_type:"nvme" + volume id:289 size:1243481280 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:623 version:3 modified_at_second:1610496936 disk_type:"nvme" + volume id:306 size:1195553616 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:591 version:3 modified_at_second:1610497162 disk_type:"nvme" + volume id:322 size:1195975408 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:596 version:3 modified_at_second:1610497331 disk_type:"nvme" + volume id:341 size:1239397416 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:629 version:3 modified_at_second:1610497637 disk_type:"nvme" + volume id:349 size:1142160784 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:549 version:3 modified_at_second:1610497700 disk_type:"nvme" + volume id:351 size:1137331600 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:547 version:3 modified_at_second:1610497700 disk_type:"nvme" + volume id:362 size:1154734680 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:558 version:3 modified_at_second:1610497862 disk_type:"nvme" + volume id:365 size:1089066584 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:521 version:3 modified_at_second:1610497955 disk_type:"nvme" + volume id:444 size:1487526264 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:738 version:3 modified_at_second:1610499008 disk_type:"nvme" + volume id:454 size:1228957688 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:592 version:3 modified_at_second:1610499083 disk_type:"nvme" + volume id:511 size:2214084672 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1106 version:3 modified_at_second:1623175727 disk_type:"nvme" + volume id:518 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1627507789 disk_type:"nvme" + volume id:533 size:1103653736 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:540 version:3 modified_at_second:1610644079 disk_type:"nvme" + volume id:542 size:1175342904 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:582 version:3 modified_at_second:1623175755 disk_type:"nvme" + volume id:564 size:884884392 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1452 version:3 modified_at_second:1623175768 disk_type:"nvme" + volume id:585 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1627507797 disk_type:"nvme" + volume id:587 size:8388808 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507797 disk_type:"nvme" + volume id:605 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507791 disk_type:"nvme" + volume id:607 size:8388808 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" + volume id:611 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507792 disk_type:"nvme" + volume id:645 size:12583192 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1627507789 disk_type:"nvme" + volume id:650 size:8388776 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507793 disk_type:"nvme" + volume id:659 size:12583176 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1627507790 disk_type:"nvme" + volume id:672 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507794 disk_type:"nvme" + volume id:680 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507792 disk_type:"nvme" + volume id:693 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507796 disk_type:"nvme" + volume id:694 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507797 disk_type:"nvme" + volume id:696 size:12583176 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1627507792 disk_type:"nvme" + volume id:705 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" + volume id:709 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" + volume id:748 size:234881648 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:1 modified_at_second:1617901734 disk_type:"nvme" + volume id:1027 size:222299096 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:11 version:3 compact_revision:2 modified_at_second:1619387473 disk_type:"nvme" + volume id:1031 size:8 collection:"swfstest" replica_placement:1 version:3 modified_at_second:1623176448 disk_type:"nvme" + volume id:1103 size:20977418120 collection:"braingeneers-backups-swfs" file_count:12141 delete_count:222 deleted_byte_count:349264316 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1139 size:20986196552 collection:"braingeneers-backups-swfs" file_count:12267 delete_count:223 deleted_byte_count:356436042 version:3 compact_revision:2 modified_at_second:1627607153 disk_type:"nvme" + volume id:1143 size:20972913568 collection:"braingeneers-backups-swfs" file_count:12178 delete_count:224 deleted_byte_count:363552822 version:3 compact_revision:2 modified_at_second:1627607153 disk_type:"nvme" + volume id:1145 size:21048148008 collection:"braingeneers-backups-swfs" file_count:12399 delete_count:230 deleted_byte_count:379166350 version:3 compact_revision:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1642 size:9100146128 collection:"hengenlab" file_count:3480 delete_count:16 deleted_byte_count:41943376 version:3 compact_revision:4 modified_at_second:1627521882 disk_type:"nvme" + volume id:246199 size:21403378272 collection:"hengenlab" file_count:8154 delete_count:9 deleted_byte_count:34603197 version:3 modified_at_second:1627521882 disk_type:"nvme" + volume id:246205 size:21375756440 collection:"hengenlab" file_count:8181 delete_count:10 deleted_byte_count:35651794 version:3 modified_at_second:1627521882 disk_type:"nvme" + volume id:246252 size:21526280816 collection:"hengenlab" file_count:8194 delete_count:12 deleted_byte_count:34603260 version:3 modified_at_second:1627521882 disk_type:"nvme" + volume id:246269 size:21725222792 collection:"hengenlab" file_count:8334 delete_count:11 deleted_byte_count:27263207 version:3 modified_at_second:1627521881 disk_type:"nvme" + volume id:246290 size:21724377808 collection:"hengenlab" file_count:8308 delete_count:13 deleted_byte_count:38797585 version:3 modified_at_second:1627521882 disk_type:"nvme" + volume id:246307 size:21390829120 collection:"hengenlab" file_count:8104 delete_count:19 deleted_byte_count:41943439 version:3 modified_at_second:1627521881 disk_type:"nvme" + volume id:246340 size:21378038880 collection:"hengenlab" file_count:7477 delete_count:65 deleted_byte_count:253758075 version:3 modified_at_second:1627521882 disk_type:"nvme" + volume id:246360 size:3123609192 collection:"hengenlab" file_count:1192 version:3 compact_revision:1 modified_at_second:1627528621 disk_type:"nvme" + Disk nvme total size:271112526976 file_count:127825 deleted_file:1054 deleted_bytes:1956983463 + DataNode 10.244.216.96:8080 total size:271112526976 file_count:127825 deleted_file:1054 deleted_bytes:1956983463 + DataNode 10.244.216.99:8080 nvme(volume:49/49 active:49 free:0 remote:0) + Disk nvme(volume:49/49 active:49 free:0 remote:0) + volume id:29 size:529376 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:857 version:3 compact_revision:6 modified_at_second:1627500690 disk_type:"nvme" + volume id:47 size:598712 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:920 version:3 compact_revision:8 modified_at_second:1627505190 disk_type:"nvme" + volume id:197 size:1091620784 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:548 version:3 modified_at_second:1623182091 disk_type:"nvme" + volume id:220 size:1152092072 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:555 version:3 modified_at_second:1623181638 disk_type:"nvme" + volume id:229 size:1134909392 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:543 version:3 modified_at_second:1623181157 disk_type:"nvme" + volume id:250 size:1142798728 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:580 version:3 modified_at_second:1623181979 disk_type:"nvme" + volume id:255 size:1095269672 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:535 version:3 modified_at_second:1623182222 disk_type:"nvme" + volume id:270 size:1199706512 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:609 version:3 modified_at_second:1623182325 disk_type:"nvme" + volume id:344 size:1187094264 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:591 version:3 modified_at_second:1623182455 disk_type:"nvme" + volume id:381 size:1077258400 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:542 version:3 modified_at_second:1623181321 disk_type:"nvme" + volume id:390 size:1110493800 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:529 version:3 modified_at_second:1623181008 disk_type:"nvme" + volume id:428 size:1178569608 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:568 version:3 modified_at_second:1623182712 disk_type:"nvme" + volume id:431 size:1126797960 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:555 version:3 modified_at_second:1623181763 disk_type:"nvme" + volume id:446 size:1404180928 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:696 version:3 modified_at_second:1610499009 disk_type:"nvme" + volume id:458 size:1141606496 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:572 version:3 modified_at_second:1623181457 disk_type:"nvme" + volume id:543 size:1190882840 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:586 version:3 modified_at_second:1623182582 disk_type:"nvme" + volume id:546 size:1168631080 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:644 version:3 modified_at_second:1623181627 disk_type:"nvme" + volume id:555 size:1099880440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:613 version:3 modified_at_second:1623180855 disk_type:"nvme" + volume id:568 size:853097112 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1356 version:3 modified_at_second:1623181021 disk_type:"nvme" + volume id:637 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627505191 disk_type:"nvme" + volume id:798 size:104857952 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623183273 disk_type:"nvme" + volume id:826 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1623183121 disk_type:"nvme" + volume id:837 size:104857952 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623184072 disk_type:"nvme" + volume id:838 size:75497856 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 delete_count:2 deleted_byte_count:8388677 version:3 compact_revision:1 modified_at_second:1627500577 disk_type:"nvme" + volume id:853 size:79692216 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1623183834 disk_type:"nvme" + volume id:859 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1618444183 disk_type:"nvme" + volume id:860 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183263 disk_type:"nvme" + volume id:862 size:109052376 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:2 modified_at_second:1627500582 disk_type:"nvme" + volume id:877 size:37748912 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1623183981 disk_type:"nvme" + volume id:888 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623183552 disk_type:"nvme" + volume id:892 size:104857944 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1618444168 disk_type:"nvme" + volume id:912 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623183539 disk_type:"nvme" + volume id:917 size:41943304 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623183391 disk_type:"nvme" + volume id:954 size:201327128 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1623184630 disk_type:"nvme" + volume id:956 size:142606872 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1623183845 disk_type:"nvme" + volume id:957 size:75497848 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:3 modified_at_second:1627505191 disk_type:"nvme" + volume id:959 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623184258 disk_type:"nvme" + volume id:967 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:2 modified_at_second:1627504756 disk_type:"nvme" + volume id:987 size:109052360 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:2 modified_at_second:1627504764 disk_type:"nvme" + volume id:1060 size:20977909896 collection:"braingeneers-backups-swfs" file_count:12264 delete_count:231 deleted_byte_count:360228000 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1061 size:20972527616 collection:"braingeneers-backups-swfs" file_count:12244 delete_count:226 deleted_byte_count:351170696 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1068 size:20983266928 collection:"braingeneers-backups-swfs" file_count:12188 delete_count:222 deleted_byte_count:372826219 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1116 size:20977766728 collection:"braingeneers-backups-swfs" file_count:12176 delete_count:211 deleted_byte_count:317023642 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:246192 size:21569860624 collection:"hengenlab" file_count:8239 read_only:true version:3 modified_at_second:1627419229 disk_type:"nvme" + volume id:246198 size:21638300624 collection:"hengenlab" file_count:8250 read_only:true version:3 modified_at_second:1627419609 disk_type:"nvme" + volume id:246256 size:21605810464 collection:"hengenlab" file_count:8279 read_only:true version:3 modified_at_second:1627423494 disk_type:"nvme" + volume id:246309 size:21136409392 collection:"hengenlab" file_count:8118 version:3 modified_at_second:1627426109 disk_type:"nvme" + volume id:246313 size:21143966648 collection:"hengenlab" file_count:8112 version:3 modified_at_second:1627426110 disk_type:"nvme" + volume id:246390 size:2639501832 collection:"hengenlab" file_count:1017 version:3 modified_at_second:1627430033 disk_type:"nvme" + Disk nvme total size:214645512456 file_count:103356 deleted_file:895 deleted_bytes:1422220253 + DataNode 10.244.216.99:8080 total size:214645512456 file_count:103356 deleted_file:895 deleted_bytes:1422220253 + DataNode 10.244.80.134:8080 hdd(volume:12/90 active:18446744073709551605 free:78 remote:0) + Disk hdd(volume:12/90 active:18446744073709551605 free:78 remote:0) + volume id:411675 size:10925121480 collection:"hengenlab" file_count:4168 delete_count:4 deleted_byte_count:10485844 version:3 compact_revision:4 modified_at_second:1627843728 + volume id:411687 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627523170 + volume id:411737 size:21003049800 collection:"hengenlab" file_count:8134 delete_count:1736 deleted_byte_count:4244054587 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411758 size:21013439504 collection:"hengenlab" file_count:8127 delete_count:1471 deleted_byte_count:3755111049 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411791 size:20974119312 collection:"hengenlab" file_count:8078 delete_count:156 deleted_byte_count:335792052 version:3 compact_revision:2 modified_at_second:1627704288 + volume id:411814 size:99191032 collection:"hengenlab" file_count:50 version:3 compact_revision:1 modified_at_second:1627525396 + volume id:411889 size:10659886216 collection:"hengenlab" file_count:4215 delete_count:29 deleted_byte_count:71303777 version:3 compact_revision:4 modified_at_second:1627843740 + volume id:411960 size:20973696416 collection:"hengenlab" file_count:7972 delete_count:4 deleted_byte_count:10485844 version:3 compact_revision:1 modified_at_second:1627702876 + volume id:411963 size:20980601448 collection:"hengenlab" file_count:7939 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:1 modified_at_second:1627702925 + volume id:411964 size:10968757944 collection:"hengenlab" file_count:4217 delete_count:3 deleted_byte_count:3145791 version:3 compact_revision:2 modified_at_second:1627843733 + volume id:411976 size:12354509912 collection:"hengenlab" file_count:4562 delete_count:9 deleted_byte_count:15728829 version:3 compact_revision:2 modified_at_second:1627843737 + volume id:412010 size:11502343208 collection:"hengenlab" file_count:4471 delete_count:63 deleted_byte_count:176162091 version:3 compact_revision:2 modified_at_second:1627843736 + Disk hdd total size:161454716280 file_count:61933 deleted_file:3476 deleted_bytes:8623318461 + DataNode 10.244.80.134:8080 total size:161454716280 file_count:61933 deleted_file:3476 deleted_bytes:8623318461 + DataNode 10.244.80.140:8080 hdd(volume:13/90 active:9 free:77 remote:0) + Disk hdd(volume:13/90 active:9 free:77 remote:0) + volume id:411682 size:10224440944 collection:"hengenlab" file_count:4003 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:3 modified_at_second:1627843736 + volume id:411695 size:20976107224 collection:"hengenlab" file_count:8196 delete_count:107 deleted_byte_count:213840753 version:3 compact_revision:2 modified_at_second:1627703622 + volume id:411708 size:13297386192 collection:"hengenlab" file_count:5126 delete_count:118 deleted_byte_count:219681828 version:3 compact_revision:2 modified_at_second:1627571096 + volume id:411730 size:9409806072 collection:"hengenlab" file_count:3635 delete_count:4 deleted_byte_count:10485844 version:3 compact_revision:2 modified_at_second:1627843741 + volume id:411803 size:21002314288 collection:"hengenlab" file_count:8072 delete_count:1602 deleted_byte_count:3980876253 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411817 size:20995447416 collection:"hengenlab" file_count:8091 delete_count:1581 deleted_byte_count:4004982858 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411829 size:21001195528 collection:"hengenlab" file_count:8166 delete_count:1438 deleted_byte_count:3647096970 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411852 size:12087574080 collection:"hengenlab" file_count:4685 delete_count:177 deleted_byte_count:464608069 version:3 compact_revision:3 modified_at_second:1627843741 + volume id:411905 size:20996535136 collection:"hengenlab" file_count:8084 delete_count:1680 deleted_byte_count:4385158464 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411962 size:20973083080 collection:"hengenlab" file_count:8056 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:1 modified_at_second:1627702680 + volume id:412013 size:9106611576 collection:"hengenlab" file_count:3574 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:3 modified_at_second:1627843705 + volume id:412016 size:11357864984 collection:"hengenlab" file_count:4329 delete_count:169 deleted_byte_count:438308317 version:3 compact_revision:2 modified_at_second:1627843734 + volume id:412031 size:9574720120 collection:"hengenlab" file_count:3767 delete_count:3 deleted_byte_count:3145791 version:3 compact_revision:1 modified_at_second:1627843736 + Disk hdd total size:201003086640 file_count:77784 deleted_file:6883 deleted_bytes:17381816719 + DataNode 10.244.80.140:8080 total size:201003086640 file_count:77784 deleted_file:6883 deleted_bytes:17381816719 + DataNode 10.244.80.141:8080 hdd(volume:20/90 active:18446744073709551611 free:70 remote:0) + Disk hdd(volume:20/90 active:18446744073709551611 free:70 remote:0) + volume id:133842 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627503390 + volume id:133871 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627502492 + volume id:133872 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627502512 + volume id:133928 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627501592 + volume id:134023 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627501592 + volume id:134031 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627503392 + volume id:411670 size:20991493528 collection:"hengenlab" file_count:8089 delete_count:1595 deleted_byte_count:4184556443 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411705 size:21016882360 collection:"hengenlab" file_count:8153 delete_count:1679 deleted_byte_count:4279403246 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411782 size:72353264 collection:"hengenlab" file_count:27 version:3 compact_revision:1 modified_at_second:1627526155 + volume id:411798 size:20985823160 collection:"hengenlab" file_count:8133 delete_count:1706 deleted_byte_count:4257830234 version:3 compact_revision:1 modified_at_second:1627609261 + volume id:411822 size:20339366800 collection:"hengenlab" file_count:8024 delete_count:1131 deleted_byte_count:2661575468 version:3 compact_revision:3 modified_at_second:1627843706 + volume id:411833 size:21010453856 collection:"hengenlab" file_count:8013 delete_count:1428 deleted_byte_count:3577934150 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411847 size:8961732960 collection:"hengenlab" file_count:3492 delete_count:402 deleted_byte_count:899558882 version:3 compact_revision:2 modified_at_second:1627571096 + volume id:411863 size:450799120 collection:"pvc-98352fb2-44e8-4c55-984c-b81bc55fc4bf" file_count:9286 delete_count:226 deleted_byte_count:52260686 version:3 compact_revision:1 modified_at_second:1627576155 + volume id:411924 size:19830101072 collection:"hengenlab" file_count:7535 delete_count:4 deleted_byte_count:7340116 version:3 compact_revision:2 modified_at_second:1627843739 + volume id:411945 size:19297621912 collection:"hengenlab" file_count:7484 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:1 modified_at_second:1627843728 + volume id:411954 size:18566585328 collection:"hengenlab" file_count:7083 delete_count:3 deleted_byte_count:12582975 version:3 compact_revision:1 modified_at_second:1627843706 + volume id:411977 size:12048972160 collection:"hengenlab" file_count:4472 delete_count:3 deleted_byte_count:12582975 version:3 compact_revision:2 modified_at_second:1627843731 + volume id:412011 size:13056698352 collection:"hengenlab" file_count:4880 delete_count:67 deleted_byte_count:183502207 version:3 compact_revision:2 modified_at_second:1627843731 + volume id:412012 size:12884104024 collection:"hengenlab" file_count:4865 delete_count:65 deleted_byte_count:153093461 version:3 compact_revision:2 modified_at_second:1627843740 + Disk hdd total size:209512987944 file_count:89536 deleted_file:8310 deleted_bytes:20283269440 + DataNode 10.244.80.141:8080 total size:209512987944 file_count:89536 deleted_file:8310 deleted_bytes:20283269440 + DataNode 10.244.80.143:8080 nvme(volume:101/101 active:95 free:0 remote:0) + Disk nvme(volume:101/101 active:95 free:0 remote:0) + volume id:35 size:552064 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:868 version:3 compact_revision:7 modified_at_second:1627672955 disk_type:"nvme" + volume id:37 size:591040 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:887 version:3 compact_revision:6 modified_at_second:1627507799 disk_type:"nvme" + volume id:42 size:955456 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:915 version:3 compact_revision:8 modified_at_second:1627507799 disk_type:"nvme" + volume id:48 size:648448 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:871 version:3 compact_revision:7 modified_at_second:1627672955 disk_type:"nvme" + volume id:64 size:517592 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:842 version:3 compact_revision:4 modified_at_second:1627515234 disk_type:"nvme" + volume id:119 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:4 modified_at_second:1627507794 disk_type:"nvme" + volume id:215 size:1201648024 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:577 version:3 modified_at_second:1627446041 disk_type:"nvme" + volume id:519 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1627415028 disk_type:"nvme" + volume id:586 size:83886632 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1627415114 disk_type:"nvme" + volume id:728 size:109052352 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1627415218 disk_type:"nvme" + volume id:731 size:71303424 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1627415300 disk_type:"nvme" + volume id:757 size:134220680 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 delete_count:1 deleted_byte_count:33557046 version:3 compact_revision:2 modified_at_second:1627504753 disk_type:"nvme" + volume id:761 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627415208 disk_type:"nvme" + volume id:762 size:104857944 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1627415311 disk_type:"nvme" + volume id:766 size:109052352 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1627415411 disk_type:"nvme" + volume id:769 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627415401 disk_type:"nvme" + volume id:788 size:46137712 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1627415497 disk_type:"nvme" + volume id:790 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1627415486 disk_type:"nvme" + volume id:1124 size:20981558144 collection:"braingeneers-backups-swfs" file_count:12294 delete_count:238 deleted_byte_count:353310263 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:133787 size:21301768216 collection:"hengenlab" file_count:8526 delete_count:8264 deleted_byte_count:20658424014 read_only:true version:3 modified_at_second:1627418836 disk_type:"nvme" + volume id:133819 size:21226668664 collection:"hengenlab" file_count:8129 delete_count:8129 deleted_byte_count:21226124008 read_only:true version:3 modified_at_second:1627419166 disk_type:"nvme" + volume id:133826 size:20996386664 collection:"hengenlab" file_count:7925 read_only:true version:3 compact_revision:1 modified_at_second:1627420219 disk_type:"nvme" + volume id:133828 size:3386232504 collection:"hengenlab" file_count:1299 version:3 compact_revision:2 modified_at_second:1627672815 disk_type:"nvme" + volume id:133831 size:21149835000 collection:"hengenlab" file_count:8102 read_only:true version:3 compact_revision:1 modified_at_second:1627420246 disk_type:"nvme" + volume id:133864 size:21147725272 collection:"hengenlab" file_count:8062 read_only:true version:3 compact_revision:1 modified_at_second:1627420790 disk_type:"nvme" + volume id:246129 size:20996663480 collection:"hengenlab" file_count:7985 read_only:true version:3 compact_revision:1 modified_at_second:1627416369 disk_type:"nvme" + volume id:246134 size:21102062712 collection:"hengenlab" file_count:8107 read_only:true version:3 compact_revision:1 modified_at_second:1627416409 disk_type:"nvme" + volume id:246137 size:21070660448 collection:"hengenlab" file_count:8067 read_only:true version:3 compact_revision:1 modified_at_second:1627416015 disk_type:"nvme" + volume id:246139 size:21087378424 collection:"hengenlab" file_count:8143 read_only:true version:3 compact_revision:1 modified_at_second:1627416103 disk_type:"nvme" + volume id:246160 size:21173604912 collection:"hengenlab" file_count:8044 read_only:true version:3 modified_at_second:1627417136 disk_type:"nvme" + volume id:246191 size:21109310752 collection:"hengenlab" file_count:8066 read_only:true version:3 modified_at_second:1627419229 disk_type:"nvme" + volume id:246206 size:21228541464 collection:"hengenlab" file_count:8082 read_only:true version:3 modified_at_second:1627420699 disk_type:"nvme" + volume id:246208 size:21065433552 collection:"hengenlab" file_count:8030 read_only:true version:3 modified_at_second:1627420700 disk_type:"nvme" + volume id:246209 size:21226447896 collection:"hengenlab" file_count:8146 read_only:true version:3 modified_at_second:1627420707 disk_type:"nvme" + volume id:246211 size:21042204688 collection:"hengenlab" file_count:8116 read_only:true version:3 modified_at_second:1627421160 disk_type:"nvme" + volume id:246223 size:21155858416 collection:"hengenlab" file_count:8099 read_only:true version:3 modified_at_second:1627421741 disk_type:"nvme" + volume id:246225 size:21707382056 collection:"hengenlab" file_count:8258 read_only:true version:3 modified_at_second:1627421741 disk_type:"nvme" + volume id:246241 size:21374844896 collection:"hengenlab" file_count:8083 read_only:true version:3 modified_at_second:1627423054 disk_type:"nvme" + volume id:246279 size:21178668712 collection:"hengenlab" file_count:8084 read_only:true version:3 modified_at_second:1627424647 disk_type:"nvme" + volume id:246310 size:21256214592 collection:"hengenlab" file_count:8112 read_only:true version:3 modified_at_second:1627426110 disk_type:"nvme" + volume id:246312 size:21139384064 collection:"hengenlab" file_count:8010 read_only:true version:3 modified_at_second:1627426100 disk_type:"nvme" + volume id:246324 size:21423012704 collection:"hengenlab" file_count:7876 version:3 modified_at_second:1627426646 disk_type:"nvme" + volume id:246327 size:21333965256 collection:"hengenlab" file_count:7432 version:3 modified_at_second:1627426798 disk_type:"nvme" + volume id:246353 size:21539528792 collection:"hengenlab" file_count:7623 version:3 modified_at_second:1627428047 disk_type:"nvme" + volume id:246363 size:21104327016 collection:"hengenlab" file_count:7931 delete_count:36 deleted_byte_count:150996633 version:3 modified_at_second:1627428714 disk_type:"nvme" + volume id:246401 size:21233335320 collection:"hengenlab" file_count:8045 version:3 modified_at_second:1627431006 disk_type:"nvme" + volume id:246412 size:21402967832 collection:"hengenlab" file_count:8164 version:3 modified_at_second:1627431341 disk_type:"nvme" + volume id:246432 size:21349863192 collection:"hengenlab" file_count:8173 version:3 modified_at_second:1627432826 disk_type:"nvme" + volume id:246440 size:21214912272 collection:"hengenlab" file_count:8123 version:3 modified_at_second:1627433651 disk_type:"nvme" + volume id:246454 size:21182583592 collection:"hengenlab" file_count:8089 version:3 modified_at_second:1627434137 disk_type:"nvme" + volume id:246460 size:21313723000 collection:"hengenlab" file_count:8143 version:3 modified_at_second:1627434637 disk_type:"nvme" + volume id:246474 size:21485514192 collection:"hengenlab" file_count:8211 version:3 modified_at_second:1627435962 disk_type:"nvme" + volume id:246508 size:21254246712 collection:"hengenlab" file_count:8121 read_only:true version:3 modified_at_second:1627437774 disk_type:"nvme" + volume id:246515 size:21255182720 collection:"hengenlab" file_count:8159 version:3 modified_at_second:1627438116 disk_type:"nvme" + volume id:246534 size:11952411712 collection:"hengenlab" file_count:4563 version:3 compact_revision:1 modified_at_second:1627672900 disk_type:"nvme" + volume id:246568 size:21482416816 collection:"hengenlab" file_count:8176 version:3 modified_at_second:1627438973 disk_type:"nvme" + volume id:246643 size:21212728664 collection:"hengenlab" file_count:8091 version:3 modified_at_second:1627441212 disk_type:"nvme" + volume id:246646 size:21230091592 collection:"hengenlab" file_count:8110 version:3 modified_at_second:1627441365 disk_type:"nvme" + volume id:246654 size:21256629168 collection:"hengenlab" file_count:8221 version:3 modified_at_second:1627442183 disk_type:"nvme" + volume id:246667 size:21470296632 collection:"hengenlab" file_count:7833 delete_count:696 deleted_byte_count:2816158582 version:3 modified_at_second:1627521906 disk_type:"nvme" + volume id:246762 size:13993967752 collection:"hengenlab" file_count:5330 version:3 compact_revision:1 modified_at_second:1627671971 disk_type:"nvme" + volume id:246804 size:14747219496 collection:"hengenlab" file_count:5616 version:3 compact_revision:1 modified_at_second:1627672312 disk_type:"nvme" + volume id:246821 size:5053374912 collection:"hengenlab" file_count:1930 version:3 compact_revision:1 modified_at_second:1627671741 disk_type:"nvme" + volume id:246846 size:15621328600 collection:"hengenlab" file_count:5960 version:3 compact_revision:1 modified_at_second:1627672550 disk_type:"nvme" + volume id:246857 size:9179967608 collection:"hengenlab" file_count:3501 version:3 compact_revision:1 modified_at_second:1627671462 disk_type:"nvme" + volume id:246860 size:3318059704 collection:"hengenlab" file_count:1276 version:3 compact_revision:1 modified_at_second:1627672026 disk_type:"nvme" + volume id:246908 size:2606815832 collection:"hengenlab" file_count:998 version:3 compact_revision:1 modified_at_second:1627671547 disk_type:"nvme" + volume id:246919 size:2756880144 collection:"hengenlab" file_count:1056 version:3 compact_revision:1 modified_at_second:1627672233 disk_type:"nvme" + volume id:246923 size:3006331520 collection:"hengenlab" file_count:1145 version:3 compact_revision:1 modified_at_second:1627672445 disk_type:"nvme" + volume id:246927 size:2843798936 collection:"hengenlab" file_count:1086 version:3 compact_revision:1 modified_at_second:1627672947 disk_type:"nvme" + volume id:246928 size:2784207504 collection:"hengenlab" file_count:1056 version:3 compact_revision:1 modified_at_second:1627671756 disk_type:"nvme" + volume id:246951 size:3024285968 collection:"hengenlab" file_count:1143 version:3 compact_revision:1 modified_at_second:1627671257 disk_type:"nvme" + volume id:246984 size:2888888600 collection:"hengenlab" file_count:1102 version:3 compact_revision:1 modified_at_second:1627672088 disk_type:"nvme" + volume id:247014 size:2794514912 collection:"hengenlab" file_count:1069 version:3 compact_revision:1 modified_at_second:1627672123 disk_type:"nvme" + volume id:247016 size:3105078816 collection:"hengenlab" file_count:1182 version:3 compact_revision:1 modified_at_second:1627672389 disk_type:"nvme" + volume id:247074 size:2857610056 collection:"hengenlab" file_count:1096 version:3 compact_revision:1 modified_at_second:1627672645 disk_type:"nvme" + volume id:247093 size:2576585584 collection:"hengenlab" file_count:987 version:3 compact_revision:1 modified_at_second:1627671649 disk_type:"nvme" + volume id:247098 size:2826037632 collection:"hengenlab" file_count:1088 version:3 compact_revision:1 modified_at_second:1627671893 disk_type:"nvme" + volume id:247108 size:2750832040 collection:"hengenlab" file_count:1054 version:3 compact_revision:1 modified_at_second:1627672601 disk_type:"nvme" + volume id:247111 size:2410727864 collection:"hengenlab" file_count:922 version:3 compact_revision:1 modified_at_second:1627672153 disk_type:"nvme" + volume id:247142 size:2827020992 collection:"hengenlab" file_count:1073 version:3 compact_revision:1 modified_at_second:1627671400 disk_type:"nvme" + volume id:247147 size:2616432096 collection:"hengenlab" file_count:998 version:3 compact_revision:1 modified_at_second:1627671796 disk_type:"nvme" + volume id:247162 size:2420165216 collection:"hengenlab" file_count:925 read_only:true version:3 compact_revision:1 modified_at_second:1627672615 disk_type:"nvme" + volume id:247167 size:2300624864 collection:"hengenlab" file_count:877 version:3 compact_revision:1 modified_at_second:1627671995 disk_type:"nvme" + volume id:247194 size:2024843552 collection:"hengenlab" file_count:773 version:3 compact_revision:1 modified_at_second:1627672342 disk_type:"nvme" + volume id:247196 size:2161275312 collection:"hengenlab" file_count:812 version:3 compact_revision:1 modified_at_second:1627672048 disk_type:"nvme" + volume id:247197 size:1916903432 collection:"hengenlab" file_count:752 version:3 compact_revision:1 modified_at_second:1627672928 disk_type:"nvme" + volume id:247205 size:1991582056 collection:"hengenlab" file_count:758 version:3 compact_revision:1 modified_at_second:1627671698 disk_type:"nvme" + volume id:247209 size:1645315304 collection:"hengenlab" file_count:628 version:3 compact_revision:2 modified_at_second:1627671498 disk_type:"nvme" + volume id:247216 size:1438677080 collection:"hengenlab" file_count:550 version:3 compact_revision:2 modified_at_second:1627671781 disk_type:"nvme" + volume id:247227 size:1227907928 collection:"hengenlab" file_count:454 version:3 compact_revision:2 modified_at_second:1627671503 disk_type:"nvme" + volume id:247229 size:1125684104 collection:"hengenlab" file_count:443 version:3 compact_revision:2 modified_at_second:1627671636 disk_type:"nvme" + volume id:247238 size:853559408 collection:"hengenlab" file_count:331 version:3 compact_revision:2 modified_at_second:1627671676 disk_type:"nvme" + volume id:247242 size:28755752 file_count:11 version:3 modified_at_second:1627449005 disk_type:"nvme" + volume id:247261 size:831538304 collection:"hengenlab" file_count:313 version:3 compact_revision:2 modified_at_second:1627672052 disk_type:"nvme" + volume id:247267 size:819070200 collection:"hengenlab" file_count:315 version:3 compact_revision:2 modified_at_second:1627672798 disk_type:"nvme" + volume id:247285 size:693188024 collection:"hengenlab" file_count:266 version:3 compact_revision:2 modified_at_second:1627671388 disk_type:"nvme" + volume id:247295 size:683865312 collection:"hengenlab" file_count:262 version:3 compact_revision:2 modified_at_second:1627672648 disk_type:"nvme" + volume id:247313 size:527444936 collection:"hengenlab" file_count:200 version:3 compact_revision:2 modified_at_second:1627672586 disk_type:"nvme" + volume id:247323 size:420846328 collection:"hengenlab" file_count:164 version:3 compact_revision:1 modified_at_second:1627507786 disk_type:"nvme" + volume id:247328 size:54706272 collection:"hengenlab" file_count:22 version:3 compact_revision:1 modified_at_second:1627507787 disk_type:"nvme" + Disk nvme total size:996707130184 file_count:387380 deleted_file:17364 deleted_bytes:45238570546 + DataNode 10.244.80.143:8080 total size:996707130184 file_count:387380 deleted_file:17364 deleted_bytes:45238570546 + DataNode 10.244.80.144:8080 hdd(volume:8/92 active:18446744073709551613 free:84 remote:0) + Disk hdd(volume:8/92 active:18446744073709551613 free:84 remote:0) + volume id:411663 size:9165165000 collection:"hengenlab" file_count:3579 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:1 modified_at_second:1627843722 + volume id:411899 size:20987709344 collection:"hengenlab" file_count:8172 delete_count:1670 deleted_byte_count:4186581607 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411912 size:9780260536 collection:"hengenlab" file_count:3675 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:2 modified_at_second:1627843741 + volume id:411936 size:19749281296 collection:"hengenlab" file_count:7667 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:1 modified_at_second:1627843740 + volume id:411937 size:19947403744 collection:"hengenlab" file_count:7664 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:1 modified_at_second:1627843745 + volume id:411939 size:19769183072 collection:"hengenlab" file_count:7606 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:1 modified_at_second:1627843732 + volume id:411991 size:9944244000 collection:"hengenlab" file_count:3865 delete_count:89 deleted_byte_count:206005689 version:3 compact_revision:2 modified_at_second:1627843715 + volume id:412001 size:10948213800 collection:"hengenlab" file_count:4180 delete_count:52 deleted_byte_count:145753156 version:3 compact_revision:2 modified_at_second:1627843742 + Disk hdd total size:120291460792 file_count:46408 deleted_file:1820 deleted_bytes:4566652193 + DataNode 10.244.80.144:8080 total size:120291460792 file_count:46408 deleted_file:1820 deleted_bytes:4566652193 + DataNode 10.244.80.145:8080 hdd(volume:10/90 active:18446744073709551613 free:80 remote:0) + Disk hdd(volume:10/90 active:18446744073709551613 free:80 remote:0) + volume id:411693 size:21005745488 collection:"hengenlab" file_count:8183 delete_count:2267 deleted_byte_count:5584520032 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411726 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627523126 + volume id:411836 size:17758175912 collection:"hengenlab" file_count:6899 delete_count:454 deleted_byte_count:1105798495 version:3 compact_revision:2 modified_at_second:1627843725 + volume id:411873 size:16990152440 collection:"hengenlab" file_count:6670 delete_count:543 deleted_byte_count:1298690618 version:3 compact_revision:2 modified_at_second:1627843738 + volume id:411875 size:9036328584 collection:"hengenlab" file_count:3519 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:2 modified_at_second:1627843742 + volume id:411878 size:21015592712 collection:"hengenlab" file_count:8082 delete_count:1402 deleted_byte_count:3597776530 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411887 size:18731439016 collection:"hengenlab" file_count:7261 delete_count:471 deleted_byte_count:1103119223 version:3 compact_revision:2 modified_at_second:1627843715 + volume id:411888 size:6917160672 collection:"hengenlab" file_count:2753 delete_count:673 deleted_byte_count:1567438719 version:3 compact_revision:2 modified_at_second:1627607477 + volume id:411970 size:11036248712 collection:"hengenlab" file_count:4155 delete_count:4 deleted_byte_count:13631572 version:3 compact_revision:2 modified_at_second:1627843730 + volume id:411994 size:11059388320 collection:"hengenlab" file_count:4249 delete_count:5 deleted_byte_count:8388713 version:3 compact_revision:2 modified_at_second:1627843719 + Disk hdd total size:133550231864 file_count:51771 deleted_file:5821 deleted_bytes:14284606824 + DataNode 10.244.80.145:8080 total size:133550231864 file_count:51771 deleted_file:5821 deleted_bytes:14284606824 + DataNode 10.244.80.146:8080 hdd(volume:13/88 active:18446744073709551608 free:75 remote:0) + Disk hdd(volume:13/88 active:18446744073709551608 free:75 remote:0) + volume id:133825 size:9225833640 collection:"hengenlab" file_count:3559 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:2 modified_at_second:1627843739 + volume id:411686 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627522290 + volume id:411690 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627522290 + volume id:411738 size:21025894536 collection:"hengenlab" file_count:8089 delete_count:1639 deleted_byte_count:4127582642 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411750 size:13765460952 collection:"hengenlab" file_count:5365 version:3 compact_revision:3 modified_at_second:1627843735 + volume id:411777 size:21046474416 collection:"hengenlab" file_count:8289 delete_count:2487 deleted_byte_count:5924696211 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411796 size:20993425872 collection:"hengenlab" file_count:8135 delete_count:1502 deleted_byte_count:3870962435 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411858 size:21046206000 collection:"hengenlab" file_count:8220 delete_count:2471 deleted_byte_count:6063418663 version:3 compact_revision:1 modified_at_second:1627571069 + volume id:411928 size:9095454264 collection:"hengenlab" file_count:3558 delete_count:3 deleted_byte_count:9437247 version:3 compact_revision:2 modified_at_second:1627843703 + volume id:411982 size:10421317104 collection:"hengenlab" file_count:3989 delete_count:3 deleted_byte_count:9437247 version:3 compact_revision:2 modified_at_second:1627843728 + volume id:411984 size:10009814624 collection:"hengenlab" file_count:3842 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:2 modified_at_second:1627843737 + volume id:412008 size:11965793208 collection:"hengenlab" file_count:4456 delete_count:52 deleted_byte_count:117441604 version:3 compact_revision:2 modified_at_second:1627843740 + volume id:412030 size:9624310920 collection:"hengenlab" file_count:3749 delete_count:6 deleted_byte_count:22020222 version:3 compact_revision:1 modified_at_second:1627843722 + Disk hdd total size:158219985552 file_count:61251 deleted_file:8167 deleted_bytes:20155482115 + DataNode 10.244.80.146:8080 total size:158219985552 file_count:61251 deleted_file:8167 deleted_bytes:20155482115 + DataNode 10.244.80.147:8080 hdd(volume:16/90 active:18446744073709551601 free:74 remote:0) + Disk hdd(volume:16/90 active:18446744073709551601 free:74 remote:0) + volume id:411665 size:9234805288 collection:"hengenlab" file_count:3527 delete_count:3 deleted_byte_count:3145791 version:3 compact_revision:1 modified_at_second:1627843728 + volume id:411703 size:20979965400 collection:"hengenlab" file_count:8104 delete_count:104 deleted_byte_count:195001608 version:3 compact_revision:2 modified_at_second:1627703324 + volume id:411704 size:21002179704 collection:"hengenlab" file_count:8067 delete_count:1578 deleted_byte_count:4010373136 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411710 size:9437360 collection:"hengenlab" file_count:3 version:3 compact_revision:1 modified_at_second:1627523993 + volume id:411759 size:20996758312 collection:"hengenlab" file_count:8123 delete_count:1537 deleted_byte_count:4018732086 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411775 size:21001393496 collection:"hengenlab" file_count:8112 delete_count:1564 deleted_byte_count:3918816453 version:3 compact_revision:1 modified_at_second:1627571069 + volume id:411778 size:12775626152 collection:"hengenlab" file_count:5044 delete_count:152 deleted_byte_count:303006707 version:3 compact_revision:2 modified_at_second:1627571096 + volume id:411843 size:20980953512 collection:"hengenlab" file_count:8010 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:2 modified_at_second:1627700684 + volume id:411869 size:20977725816 collection:"hengenlab" file_count:7982 delete_count:1468 deleted_byte_count:3804294082 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411901 size:21004990728 collection:"hengenlab" file_count:8077 delete_count:1658 deleted_byte_count:4312970222 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411902 size:20971945640 collection:"hengenlab" file_count:8017 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:2 modified_at_second:1627703277 + volume id:411933 size:8098190912 collection:"hengenlab" file_count:3255 version:3 compact_revision:1 modified_at_second:1627617095 + volume id:411941 size:19573411416 collection:"hengenlab" file_count:7597 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:1 modified_at_second:1627843731 + volume id:411947 size:19830507872 collection:"hengenlab" file_count:7612 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:1 modified_at_second:1627843738 + volume id:411965 size:11001156144 collection:"hengenlab" file_count:4207 delete_count:4 deleted_byte_count:10485844 version:3 compact_revision:2 modified_at_second:1627843736 + volume id:411990 size:10037202472 collection:"hengenlab" file_count:3877 delete_count:14 deleted_byte_count:36700454 version:3 compact_revision:2 modified_at_second:1627843737 + Disk hdd total size:258476250224 file_count:99614 deleted_file:8088 deleted_bytes:20632400877 + DataNode 10.244.80.147:8080 total size:258476250224 file_count:99614 deleted_file:8088 deleted_bytes:20632400877 + DataNode 10.244.80.149:8080 hdd(volume:13/89 active:18446744073709551602 free:76 remote:0) + Disk hdd(volume:13/89 active:18446744073709551602 free:76 remote:0) + volume id:411679 size:12243575888 collection:"hengenlab" file_count:4729 version:3 compact_revision:2 modified_at_second:1627609576 + volume id:411698 size:21007978464 collection:"hengenlab" file_count:8153 delete_count:1602 deleted_byte_count:3988154444 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411701 size:11149355920 collection:"hengenlab" file_count:4403 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:4 modified_at_second:1627843731 + volume id:411723 size:20998589440 collection:"hengenlab" file_count:8033 delete_count:1442 deleted_byte_count:3716214068 version:3 compact_revision:1 modified_at_second:1627571055 + volume id:411747 size:17553131856 collection:"hengenlab" file_count:6786 delete_count:568 deleted_byte_count:1366271174 version:3 compact_revision:2 modified_at_second:1627843702 + volume id:411797 size:20983185336 collection:"hengenlab" file_count:8029 delete_count:249 deleted_byte_count:572789818 version:3 compact_revision:2 modified_at_second:1627703704 + volume id:411824 size:5243000 collection:"hengenlab" file_count:2 version:3 compact_revision:1 modified_at_second:1627524780 + volume id:411844 size:20972143216 collection:"hengenlab" file_count:8159 delete_count:103 deleted_byte_count:178069635 version:3 compact_revision:2 modified_at_second:1627702135 + volume id:411856 size:14680352 collection:"hengenlab" file_count:5 version:3 compact_revision:1 modified_at_second:1627524554 + volume id:411876 size:15729016 collection:"hengenlab" file_count:6 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411938 size:19410846296 collection:"hengenlab" file_count:7506 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:1 modified_at_second:1627843746 + volume id:411955 size:18257393928 collection:"hengenlab" file_count:7002 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:1 modified_at_second:1627843738 + volume id:412021 size:9340989152 collection:"hengenlab" file_count:3602 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:2 modified_at_second:1627843737 + Disk hdd total size:171952841864 file_count:66415 deleted_file:3971 deleted_bytes:9838276502 + DataNode 10.244.80.149:8080 total size:171952841864 file_count:66415 deleted_file:3971 deleted_bytes:9838276502 + DataNode 10.244.80.154:8080 hdd(volume:18/86 active:18446744073709551608 free:68 remote:0) + Disk hdd(volume:18/86 active:18446744073709551608 free:68 remote:0) + volume id:411685 size:11497499296 collection:"hengenlab" file_count:4471 delete_count:232 deleted_byte_count:565885294 version:3 compact_revision:5 modified_at_second:1627843741 + volume id:411727 size:21009339472 collection:"hengenlab" file_count:8110 delete_count:1372 deleted_byte_count:3442446742 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411761 size:526395800 collection:"hengenlab" file_count:190 version:3 compact_revision:1 modified_at_second:1627523320 + volume id:411762 size:447751592 collection:"hengenlab" file_count:172 version:3 compact_revision:1 modified_at_second:1627528127 + volume id:411764 size:553660064 collection:"hengenlab" file_count:213 version:3 compact_revision:1 modified_at_second:1627523303 + volume id:411773 size:13331768832 collection:"hengenlab" file_count:5154 delete_count:80 deleted_byte_count:135261209 version:3 compact_revision:2 modified_at_second:1627571096 + volume id:411790 size:20973104848 collection:"hengenlab" file_count:8121 delete_count:61 deleted_byte_count:109090481 version:3 compact_revision:2 modified_at_second:1627701472 + volume id:411845 size:10660662160 collection:"hengenlab" file_count:4137 delete_count:2 deleted_byte_count:2097194 version:3 compact_revision:4 modified_at_second:1627843743 + volume id:411859 size:387887048 collection:"pvc-98352fb2-44e8-4c55-984c-b81bc55fc4bf" file_count:9443 delete_count:260 deleted_byte_count:41241326 version:3 compact_revision:1 modified_at_second:1627576152 + volume id:411923 size:19872622400 collection:"hengenlab" file_count:7565 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:2 modified_at_second:1627843737 + volume id:411927 size:9718495064 collection:"hengenlab" file_count:3691 delete_count:4 deleted_byte_count:13631572 version:3 compact_revision:2 modified_at_second:1627843739 + volume id:411931 size:17603523536 collection:"hengenlab" file_count:6851 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:1 modified_at_second:1627843724 + volume id:411940 size:19854630176 collection:"hengenlab" file_count:7645 delete_count:6 deleted_byte_count:15728766 version:3 compact_revision:1 modified_at_second:1627843724 + volume id:411948 size:19574509752 collection:"hengenlab" file_count:7522 delete_count:2 deleted_byte_count:2097194 version:3 compact_revision:1 modified_at_second:1627843690 + volume id:411952 size:18109160600 collection:"hengenlab" file_count:7019 delete_count:4 deleted_byte_count:4194388 version:3 compact_revision:1 modified_at_second:1627843737 + volume id:411953 size:18466850312 collection:"hengenlab" file_count:7138 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:1 modified_at_second:1627843717 + volume id:412007 size:9615085776 collection:"hengenlab" file_count:3780 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:3 modified_at_second:1627843727 + volume id:412026 size:9292320696 collection:"hengenlab" file_count:3635 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:2 modified_at_second:1627843732 + Disk hdd total size:221495267424 file_count:94857 deleted_file:2030 deleted_bytes:4354742985 + DataNode 10.244.80.154:8080 total size:221495267424 file_count:94857 deleted_file:2030 deleted_bytes:4354742985 + DataNode 10.244.80.156:8080 hdd(volume:10/92 active:18446744073709551604 free:82 remote:0) + Disk hdd(volume:10/92 active:18446744073709551604 free:82 remote:0) + volume id:411717 size:20997625840 collection:"hengenlab" file_count:8202 delete_count:2565 deleted_byte_count:6264865093 version:3 compact_revision:1 modified_at_second:1627609261 + volume id:411732 size:20991507016 collection:"hengenlab" file_count:8199 delete_count:247 deleted_byte_count:545925375 version:3 compact_revision:2 modified_at_second:1627704861 + volume id:411751 size:20212871392 collection:"hengenlab" file_count:7862 delete_count:1412 deleted_byte_count:3283153607 version:3 compact_revision:3 modified_at_second:1627843654 + volume id:411757 size:20990395952 collection:"hengenlab" file_count:8057 delete_count:1422 deleted_byte_count:3698718144 version:3 compact_revision:1 modified_at_second:1627571055 + volume id:411765 size:9785726448 collection:"hengenlab" file_count:3862 delete_count:663 deleted_byte_count:1629992501 version:3 compact_revision:2 modified_at_second:1627609260 + volume id:411794 size:20976658824 collection:"hengenlab" file_count:8166 delete_count:270 deleted_byte_count:585165817 version:3 compact_revision:2 modified_at_second:1627704628 + volume id:411802 size:21042465576 collection:"hengenlab" file_count:8226 delete_count:2425 deleted_byte_count:5780431329 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411883 size:9412521008 collection:"hengenlab" file_count:3590 version:3 compact_revision:2 modified_at_second:1627843731 + volume id:411956 size:18249829552 collection:"hengenlab" file_count:7068 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:1 modified_at_second:1627843717 + volume id:412002 size:10651729792 collection:"hengenlab" file_count:4165 delete_count:47 deleted_byte_count:109052891 version:3 compact_revision:2 modified_at_second:1627843726 + Disk hdd total size:173311331400 file_count:67397 deleted_file:9054 deleted_bytes:21903596276 + DataNode 10.244.80.156:8080 total size:173311331400 file_count:67397 deleted_file:9054 deleted_bytes:21903596276 + DataNode 10.244.80.159:8080 hdd(volume:11/90 active:18446744073709551602 free:79 remote:0) + Disk hdd(volume:11/90 active:18446744073709551602 free:79 remote:0) + volume id:411711 size:20998456432 collection:"hengenlab" file_count:8257 delete_count:1816 deleted_byte_count:4499105022 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411722 size:20971941296 collection:"hengenlab" file_count:8232 delete_count:520 deleted_byte_count:1055575931 version:3 compact_revision:3 modified_at_second:1627701826 + volume id:411752 size:20988602232 collection:"hengenlab" file_count:8206 delete_count:1696 deleted_byte_count:4160916433 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411753 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627523703 + volume id:411788 size:11274978584 collection:"hengenlab" file_count:4428 version:3 compact_revision:4 modified_at_second:1627843737 + volume id:411808 size:13631720 collection:"hengenlab" file_count:4 version:3 compact_revision:1 modified_at_second:1627524409 + volume id:411823 size:21031622392 collection:"hengenlab" file_count:8205 delete_count:1724 deleted_byte_count:4309731628 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411832 size:16472150072 collection:"hengenlab" file_count:6453 delete_count:661 deleted_byte_count:1619461643 version:3 compact_revision:2 modified_at_second:1627843737 + volume id:411834 size:11871131760 collection:"hengenlab" file_count:4592 delete_count:2 deleted_byte_count:2097194 version:3 compact_revision:5 modified_at_second:1627843724 + volume id:411877 size:10679734288 collection:"hengenlab" file_count:4199 delete_count:8 deleted_byte_count:24117416 version:3 compact_revision:4 modified_at_second:1627843739 + volume id:411981 size:10156297120 collection:"hengenlab" file_count:3939 delete_count:4 deleted_byte_count:7340116 version:3 compact_revision:2 modified_at_second:1627843742 + Disk hdd total size:144458545904 file_count:56515 deleted_file:6431 deleted_bytes:15678345383 + DataNode 10.244.80.159:8080 total size:144458545904 file_count:56515 deleted_file:6431 deleted_bytes:15678345383 + DataNode 10.244.80.163:8080 hdd(volume:14/87 active:18446744073709551599 free:73 remote:0) + Disk hdd(volume:14/87 active:18446744073709551599 free:73 remote:0) + volume id:411669 size:9380712976 collection:"hengenlab" file_count:3655 delete_count:4 deleted_byte_count:7340116 version:3 compact_revision:1 modified_at_second:1627843729 + volume id:411671 size:20974522272 collection:"hengenlab" file_count:8085 delete_count:4 deleted_byte_count:7340116 version:3 compact_revision:2 modified_at_second:1627705070 + volume id:411674 size:8911531000 collection:"hengenlab" file_count:3483 delete_count:5 deleted_byte_count:11534441 version:3 compact_revision:2 modified_at_second:1627843740 + volume id:411692 size:20984704840 collection:"hengenlab" file_count:8098 delete_count:129 deleted_byte_count:240002133 version:3 compact_revision:2 modified_at_second:1627703500 + volume id:411728 size:4194368 collection:"hengenlab" file_count:1 version:3 compact_revision:1 modified_at_second:1627527447 + volume id:411779 size:20987091896 collection:"hengenlab" file_count:8114 delete_count:1339 deleted_byte_count:3399261701 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411783 size:20988873016 collection:"hengenlab" file_count:8215 delete_count:2331 deleted_byte_count:5603388342 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411785 size:22020608 collection:"hengenlab" file_count:9 version:3 compact_revision:1 modified_at_second:1627528037 + volume id:411789 size:8554822576 collection:"hengenlab" file_count:3407 delete_count:494 deleted_byte_count:1140851375 version:3 compact_revision:2 modified_at_second:1627571096 + volume id:411799 size:2097272 collection:"hengenlab" file_count:2 version:3 compact_revision:1 modified_at_second:1627526065 + volume id:411854 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627523170 + volume id:411909 size:12933339696 collection:"hengenlab" file_count:5011 version:3 compact_revision:2 modified_at_second:1627610271 + volume id:411926 size:9212697120 collection:"hengenlab" file_count:3565 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:2 modified_at_second:1627843706 + volume id:411985 size:9946696984 collection:"hengenlab" file_count:3893 delete_count:7 deleted_byte_count:19923091 version:3 compact_revision:2 modified_at_second:1627843743 + Disk hdd total size:142903304632 file_count:55538 deleted_file:4315 deleted_bytes:10438029965 + DataNode 10.244.80.163:8080 total size:142903304632 file_count:55538 deleted_file:4315 deleted_bytes:10438029965 + DataNode 10.244.80.167:8080 hdd(volume:9/88 active:18446744073709551609 free:79 remote:0) + Disk hdd(volume:9/88 active:18446744073709551609 free:79 remote:0) + volume id:411684 size:12251200536 collection:"hengenlab" file_count:4821 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:4 modified_at_second:1627843737 + volume id:411784 size:14100248744 collection:"hengenlab" file_count:5363 delete_count:283 deleted_byte_count:612749267 version:3 compact_revision:2 modified_at_second:1627609259 + volume id:411839 size:22020608 collection:"hengenlab" file_count:9 version:3 compact_revision:1 modified_at_second:1627527081 + volume id:411849 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627524849 + volume id:411861 size:454823872 collection:"pvc-98352fb2-44e8-4c55-984c-b81bc55fc4bf" file_count:9416 delete_count:261 deleted_byte_count:31921284 version:3 compact_revision:1 modified_at_second:1627576153 + volume id:411904 size:9251995464 collection:"hengenlab" file_count:3548 delete_count:5 deleted_byte_count:14680169 version:3 compact_revision:2 modified_at_second:1627843724 + volume id:411979 size:10175624520 collection:"hengenlab" file_count:3946 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:2 modified_at_second:1627843729 + volume id:411993 size:10925752072 collection:"hengenlab" file_count:4148 delete_count:10 deleted_byte_count:35651794 version:3 compact_revision:2 modified_at_second:1627843741 + volume id:412014 size:10762886152 collection:"hengenlab" file_count:4192 delete_count:153 deleted_byte_count:396364941 version:3 compact_revision:2 modified_at_second:1627843733 + Disk hdd total size:67944551976 file_count:35443 deleted_file:717 deleted_bytes:1102901896 + DataNode 10.244.80.167:8080 total size:67944551976 file_count:35443 deleted_file:717 deleted_bytes:1102901896 + DataNode 10.244.80.169:8080 nvme(volume:95/95 active:82 free:0 remote:0) + Disk nvme(volume:95/95 active:82 free:0 remote:0) + volume id:33 size:561568 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:851 version:3 compact_revision:7 modified_at_second:1627672955 disk_type:"nvme" + volume id:40 size:592816 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:826 version:3 compact_revision:7 modified_at_second:1627672955 disk_type:"nvme" + volume id:43 size:617000 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:895 version:3 compact_revision:7 modified_at_second:1627672955 disk_type:"nvme" + volume id:66 size:610664 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:901 version:3 compact_revision:7 modified_at_second:1627672956 disk_type:"nvme" + volume id:141 size:1506022288 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:2374 delete_count:1841 deleted_byte_count:388723784 version:3 modified_at_second:1627446024 disk_type:"nvme" + volume id:569 size:12583192 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1627507790 disk_type:"nvme" + volume id:595 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627672953 disk_type:"nvme" + volume id:631 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627515990 disk_type:"nvme" + volume id:692 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627516917 disk_type:"nvme" + volume id:741 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627415160 disk_type:"nvme" + volume id:764 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1627414976 disk_type:"nvme" + volume id:783 size:243270432 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:9 version:3 compact_revision:1 modified_at_second:1627415079 disk_type:"nvme" + volume id:789 size:138412448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1627415170 disk_type:"nvme" + volume id:793 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627415443 disk_type:"nvme" + volume id:842 size:71303432 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1627415269 disk_type:"nvme" + volume id:868 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1627415362 disk_type:"nvme" + volume id:890 size:71303432 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:3 modified_at_second:1627672952 disk_type:"nvme" + volume id:1077 size:20972998352 collection:"braingeneers-backups-swfs" file_count:12147 delete_count:243 deleted_byte_count:396660056 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:1100 size:20974608920 collection:"braingeneers-backups-swfs" file_count:12252 delete_count:198 deleted_byte_count:303236107 version:3 modified_at_second:1627607153 disk_type:"nvme" + volume id:133787 size:21301728024 collection:"hengenlab" file_count:8526 delete_count:7008 deleted_byte_count:17425588517 version:3 modified_at_second:1627414007 disk_type:"nvme" + volume id:133819 size:21226668664 collection:"hengenlab" file_count:8129 delete_count:8129 deleted_byte_count:21226124008 version:3 modified_at_second:1627414332 disk_type:"nvme" + volume id:133836 size:21244742400 collection:"hengenlab" file_count:8072 version:3 compact_revision:1 modified_at_second:1627420253 disk_type:"nvme" + volume id:133841 size:21140030384 collection:"hengenlab" file_count:8121 version:3 compact_revision:1 modified_at_second:1627420233 disk_type:"nvme" + volume id:246127 size:21101266560 collection:"hengenlab" file_count:8038 version:3 compact_revision:1 modified_at_second:1627416392 disk_type:"nvme" + volume id:246135 size:21064817840 collection:"hengenlab" file_count:8081 version:3 compact_revision:1 modified_at_second:1627416409 disk_type:"nvme" + volume id:246144 size:21013850264 collection:"hengenlab" file_count:8635 delete_count:571 deleted_byte_count:1461299369 version:3 modified_at_second:1627414577 disk_type:"nvme" + volume id:246146 size:21054935360 collection:"hengenlab" file_count:8719 delete_count:541 deleted_byte_count:1370414224 version:3 modified_at_second:1627414663 disk_type:"nvme" + volume id:246153 size:21183691960 collection:"hengenlab" file_count:8007 version:3 modified_at_second:1627416939 disk_type:"nvme" + volume id:246172 size:21660385832 collection:"hengenlab" file_count:8263 version:3 modified_at_second:1627417612 disk_type:"nvme" + volume id:246175 size:21159383464 collection:"hengenlab" file_count:8041 version:3 modified_at_second:1627418084 disk_type:"nvme" + volume id:246176 size:21083567776 collection:"hengenlab" file_count:8043 version:3 modified_at_second:1627418076 disk_type:"nvme" + volume id:246212 size:21414255232 collection:"hengenlab" file_count:8102 version:3 modified_at_second:1627421166 disk_type:"nvme" + volume id:246233 size:21086043664 collection:"hengenlab" file_count:7972 version:3 modified_at_second:1627422283 disk_type:"nvme" + volume id:246242 size:21198462832 collection:"hengenlab" file_count:8083 version:3 modified_at_second:1627423046 disk_type:"nvme" + volume id:246243 size:21048018304 collection:"hengenlab" file_count:8027 version:3 modified_at_second:1627423041 disk_type:"nvme" + volume id:246274 size:21422008664 collection:"hengenlab" file_count:8150 version:3 modified_at_second:1627424647 disk_type:"nvme" + volume id:246296 size:21490999024 collection:"hengenlab" file_count:8184 version:3 modified_at_second:1627425220 disk_type:"nvme" + volume id:246336 size:21351235904 collection:"hengenlab" file_count:7410 delete_count:36 deleted_byte_count:150996609 version:3 modified_at_second:1627427287 disk_type:"nvme" + volume id:246343 size:21586547488 collection:"hengenlab" file_count:7771 delete_count:194 deleted_byte_count:540020714 version:3 modified_at_second:1627427872 disk_type:"nvme" + volume id:246371 size:21197726272 collection:"hengenlab" file_count:8666 delete_count:6 deleted_byte_count:25166061 version:3 modified_at_second:1627429075 disk_type:"nvme" + volume id:246381 size:21060855608 collection:"hengenlab" file_count:8048 delete_count:4 deleted_byte_count:16777409 version:3 modified_at_second:1627429671 disk_type:"nvme" + volume id:246394 size:21418696808 collection:"hengenlab" file_count:8170 version:3 modified_at_second:1627430517 disk_type:"nvme" + volume id:246420 size:21577098968 collection:"hengenlab" file_count:8220 version:3 modified_at_second:1627431839 disk_type:"nvme" + volume id:246426 size:21286509368 collection:"hengenlab" file_count:8124 delete_count:3 deleted_byte_count:6291519 version:3 modified_at_second:1627504948 disk_type:"nvme" + volume id:246452 size:21078835312 collection:"hengenlab" file_count:8024 version:3 modified_at_second:1627433959 disk_type:"nvme" + volume id:246466 size:21127956848 collection:"hengenlab" file_count:8086 version:3 modified_at_second:1627435449 disk_type:"nvme" + volume id:246469 size:21609542120 collection:"hengenlab" file_count:8250 version:3 modified_at_second:1627435620 disk_type:"nvme" + volume id:246487 size:21287442424 collection:"hengenlab" file_count:8111 version:3 modified_at_second:1627436797 disk_type:"nvme" + volume id:246496 size:21027864400 collection:"hengenlab" file_count:8039 version:3 modified_at_second:1627437129 disk_type:"nvme" + volume id:246501 size:21129973720 collection:"hengenlab" file_count:8052 delete_count:1 deleted_byte_count:70 version:3 modified_at_second:1627437461 disk_type:"nvme" + volume id:246535 size:11664276264 collection:"hengenlab" file_count:4448 version:3 compact_revision:1 modified_at_second:1627672220 disk_type:"nvme" + volume id:246548 size:21269863608 collection:"hengenlab" file_count:8644 delete_count:2931 deleted_byte_count:6309826926 version:3 modified_at_second:1627607477 disk_type:"nvme" + volume id:246605 size:21525654920 collection:"hengenlab" file_count:8230 version:3 modified_at_second:1627440065 disk_type:"nvme" + volume id:246623 size:21661971032 collection:"hengenlab" file_count:8252 version:3 modified_at_second:1627440566 disk_type:"nvme" + volume id:246626 size:21767879672 collection:"hengenlab" file_count:8296 version:3 modified_at_second:1627440723 disk_type:"nvme" + volume id:246653 size:21162084032 collection:"hengenlab" file_count:8033 version:3 modified_at_second:1627442174 disk_type:"nvme" + volume id:246664 size:21353108088 collection:"hengenlab" file_count:8128 delete_count:41 deleted_byte_count:169115246 version:3 modified_at_second:1627521905 disk_type:"nvme" + volume id:246686 size:13168463584 collection:"hengenlab" file_count:5027 version:3 compact_revision:1 modified_at_second:1627672794 disk_type:"nvme" + volume id:246745 size:14926452688 collection:"hengenlab" file_count:5708 version:3 compact_revision:1 modified_at_second:1627671345 disk_type:"nvme" + volume id:246757 size:233525928 file_count:104 version:3 modified_at_second:1627448403 disk_type:"nvme" + volume id:246769 size:14123240184 collection:"hengenlab" file_count:5398 version:3 compact_revision:1 modified_at_second:1627672734 disk_type:"nvme" + volume id:246796 size:21705124144 collection:"hengenlab" file_count:8278 delete_count:2278 deleted_byte_count:5994511715 version:3 modified_at_second:1627521784 disk_type:"nvme" + volume id:246839 size:12223358896 collection:"hengenlab" file_count:4672 version:3 compact_revision:1 modified_at_second:1627671863 disk_type:"nvme" + volume id:246942 size:2901945320 collection:"hengenlab" file_count:1119 version:3 compact_revision:1 modified_at_second:1627672918 disk_type:"nvme" + volume id:246955 size:3110322144 collection:"hengenlab" file_count:1190 version:3 compact_revision:1 modified_at_second:1627672330 disk_type:"nvme" + volume id:246989 size:2874322224 collection:"hengenlab" file_count:1084 version:3 compact_revision:1 modified_at_second:1627671536 disk_type:"nvme" + volume id:246990 size:2839669520 collection:"hengenlab" file_count:1095 version:3 compact_revision:1 modified_at_second:1627672139 disk_type:"nvme" + volume id:247029 size:2995960680 collection:"hengenlab" file_count:1149 version:3 compact_revision:1 modified_at_second:1627672107 disk_type:"nvme" + volume id:247035 size:3044324616 collection:"hengenlab" file_count:1161 version:3 compact_revision:1 modified_at_second:1627671489 disk_type:"nvme" + volume id:247060 size:4516542160 collection:"hengenlab" file_count:1713 version:3 compact_revision:1 modified_at_second:1627671421 disk_type:"nvme" + volume id:247062 size:3386103288 collection:"hengenlab" file_count:1291 version:3 compact_revision:1 modified_at_second:1627672464 disk_type:"nvme" + volume id:247065 size:2715064920 collection:"hengenlab" file_count:1039 version:3 compact_revision:1 modified_at_second:1627671384 disk_type:"nvme" + volume id:247066 size:3114565864 collection:"hengenlab" file_count:1174 version:3 compact_revision:1 modified_at_second:1627671272 disk_type:"nvme" + volume id:247068 size:2946626792 collection:"hengenlab" file_count:1140 version:3 compact_revision:1 modified_at_second:1627671242 disk_type:"nvme" + volume id:247070 size:3063134704 collection:"hengenlab" file_count:1163 version:3 compact_revision:1 modified_at_second:1627672630 disk_type:"nvme" + volume id:247076 size:2890986032 collection:"hengenlab" file_count:1107 version:3 compact_revision:1 modified_at_second:1627671631 disk_type:"nvme" + volume id:247086 size:2627787296 collection:"hengenlab" file_count:997 version:3 compact_revision:1 modified_at_second:1627672356 disk_type:"nvme" + volume id:247097 size:2613221424 collection:"hengenlab" file_count:988 version:3 compact_revision:1 modified_at_second:1627672370 disk_type:"nvme" + volume id:247101 size:2876305016 collection:"hengenlab" file_count:1090 version:3 compact_revision:1 modified_at_second:1627672039 disk_type:"nvme" + volume id:247114 size:2354168024 collection:"hengenlab" file_count:902 version:3 compact_revision:1 modified_at_second:1627672062 disk_type:"nvme" + volume id:247115 size:2451737640 collection:"hengenlab" file_count:933 version:3 compact_revision:1 modified_at_second:1627671474 disk_type:"nvme" + volume id:247117 size:2789630248 collection:"hengenlab" file_count:1070 version:3 compact_revision:1 modified_at_second:1627672567 disk_type:"nvme" + volume id:247126 size:2820039224 collection:"hengenlab" file_count:1075 version:3 compact_revision:1 modified_at_second:1627671773 disk_type:"nvme" + volume id:247133 size:2842750640 collection:"hengenlab" file_count:1091 version:3 compact_revision:1 modified_at_second:1627671713 disk_type:"nvme" + volume id:247135 size:2751521840 collection:"hengenlab" file_count:1043 version:3 compact_revision:1 modified_at_second:1627671688 disk_type:"nvme" + volume id:247138 size:2870193144 collection:"hengenlab" file_count:1099 version:3 compact_revision:1 modified_at_second:1627672405 disk_type:"nvme" + volume id:247148 size:2617301984 collection:"hengenlab" file_count:1005 version:3 compact_revision:1 modified_at_second:1627672663 disk_type:"nvme" + volume id:247150 size:2775998200 collection:"hengenlab" file_count:1060 version:3 compact_revision:1 modified_at_second:1627672010 disk_type:"nvme" + volume id:247158 size:2585958672 collection:"hengenlab" file_count:992 version:3 compact_revision:1 modified_at_second:1627672582 disk_type:"nvme" + volume id:247159 size:2615447568 collection:"hengenlab" file_count:992 version:3 compact_revision:1 modified_at_second:1627672828 disk_type:"nvme" + volume id:247168 size:2231596584 collection:"hengenlab" file_count:853 version:3 compact_revision:1 modified_at_second:1627672165 disk_type:"nvme" + volume id:247170 size:2424359408 collection:"hengenlab" file_count:923 version:3 compact_revision:1 modified_at_second:1627671876 disk_type:"nvme" + volume id:247183 size:2262005904 collection:"hengenlab" file_count:864 version:3 compact_revision:1 modified_at_second:1627672072 disk_type:"nvme" + volume id:247211 size:1684227816 collection:"hengenlab" file_count:637 version:3 compact_revision:2 modified_at_second:1627671981 disk_type:"nvme" + volume id:247228 size:293786808 collection:"hengenlab" file_count:115 version:3 compact_revision:2 modified_at_second:1627672090 disk_type:"nvme" + Disk nvme total size:1006464213680 file_count:398816 deleted_file:24025 deleted_bytes:55784752334 + DataNode 10.244.80.169:8080 total size:1006464213680 file_count:398816 deleted_file:24025 deleted_bytes:55784752334 + DataNode 10.244.80.171:8080 hdd(volume:16/87 active:18446744073709551600 free:71 remote:0) + Disk hdd(volume:16/87 active:18446744073709551600 free:71 remote:0) + volume id:411664 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627610818 + volume id:411696 size:4194368 collection:"hengenlab" file_count:1 version:3 compact_revision:1 modified_at_second:1627523809 + volume id:411706 size:7340264 collection:"hengenlab" file_count:4 version:3 compact_revision:1 modified_at_second:1627526515 + volume id:411716 size:21000296976 collection:"hengenlab" file_count:7985 delete_count:1370 deleted_byte_count:3528378174 version:3 compact_revision:1 modified_at_second:1627571055 + volume id:411724 size:21010819184 collection:"hengenlab" file_count:8067 delete_count:1483 deleted_byte_count:3767887994 version:3 compact_revision:1 modified_at_second:1627571055 + volume id:411729 size:20979764560 collection:"hengenlab" file_count:8138 delete_count:96 deleted_byte_count:198275837 version:3 compact_revision:2 modified_at_second:1627703346 + volume id:411739 size:12749517664 collection:"hengenlab" file_count:4940 delete_count:115 deleted_byte_count:299895151 version:3 compact_revision:5 modified_at_second:1627843697 + volume id:411755 size:18084502720 collection:"hengenlab" file_count:7125 delete_count:422 deleted_byte_count:938718302 version:3 compact_revision:2 modified_at_second:1627843726 + volume id:411767 size:446702960 collection:"hengenlab" file_count:171 version:3 compact_revision:1 modified_at_second:1627523183 + volume id:411891 size:21026997376 collection:"hengenlab" file_count:8220 delete_count:1701 deleted_byte_count:4238119698 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411894 size:18091922800 collection:"hengenlab" file_count:7112 delete_count:637 deleted_byte_count:1508635198 version:3 compact_revision:2 modified_at_second:1627843713 + volume id:411911 size:20978548352 collection:"hengenlab" file_count:8159 delete_count:954 deleted_byte_count:2385829477 version:3 compact_revision:2 modified_at_second:1627702924 + volume id:411950 size:18275154328 collection:"hengenlab" file_count:7069 version:3 compact_revision:1 modified_at_second:1627843717 + volume id:411967 size:10834082264 collection:"hengenlab" file_count:4109 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:2 modified_at_second:1627843721 + volume id:411980 size:10315093016 collection:"hengenlab" file_count:3929 delete_count:3 deleted_byte_count:9437247 version:3 compact_revision:2 modified_at_second:1627843689 + volume id:412015 size:11693275568 collection:"hengenlab" file_count:4421 delete_count:166 deleted_byte_count:416288158 version:3 compact_revision:2 modified_at_second:1627843708 + Disk hdd total size:205498212408 file_count:79450 deleted_file:6950 deleted_bytes:17297756755 + DataNode 10.244.80.171:8080 total size:205498212408 file_count:79450 deleted_file:6950 deleted_bytes:17297756755 + DataNode 10.244.80.173:8080 hdd(volume:10/90 active:18446744073709551606 free:80 remote:0) + Disk hdd(volume:10/90 active:18446744073709551606 free:80 remote:0) + volume id:411677 size:9413657016 collection:"hengenlab" file_count:3666 delete_count:3 deleted_byte_count:9437247 version:3 compact_revision:2 modified_at_second:1627843735 + volume id:411681 size:16491608416 collection:"hengenlab" file_count:6383 delete_count:4 deleted_byte_count:4194388 version:3 compact_revision:2 modified_at_second:1627843744 + volume id:411770 size:351280976 collection:"hengenlab" file_count:143 version:3 compact_revision:1 modified_at_second:1627524409 + volume id:411804 size:20983729728 collection:"hengenlab" file_count:8192 delete_count:1837 deleted_byte_count:4536925211 version:3 compact_revision:1 modified_at_second:1627571068 + volume id:411872 size:11827184528 collection:"hengenlab" file_count:4564 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:3 modified_at_second:1627843711 + volume id:411900 size:12062763200 collection:"hengenlab" file_count:4738 delete_count:195 deleted_byte_count:493883391 version:3 compact_revision:4 modified_at_second:1627843709 + volume id:411919 size:9444792736 collection:"hengenlab" file_count:3652 delete_count:7 deleted_byte_count:23068819 version:3 compact_revision:2 modified_at_second:1627843730 + volume id:411958 size:20976107664 collection:"hengenlab" file_count:8056 delete_count:4 deleted_byte_count:13631572 version:3 compact_revision:1 modified_at_second:1627703962 + volume id:412003 size:10447815176 collection:"hengenlab" file_count:4044 delete_count:35 deleted_byte_count:87032543 version:3 compact_revision:2 modified_at_second:1627843720 + volume id:412006 size:11528445368 collection:"hengenlab" file_count:4317 delete_count:71 deleted_byte_count:178259411 version:3 compact_revision:2 modified_at_second:1627843723 + Disk hdd total size:123527384808 file_count:47755 deleted_file:2157 deleted_bytes:5350626907 + DataNode 10.244.80.173:8080 total size:123527384808 file_count:47755 deleted_file:2157 deleted_bytes:5350626907 + DataNode 10.244.80.182:8080 hdd(volume:23/81 active:18446744073709551597 free:58 remote:0) + Disk hdd(volume:23/81 active:18446744073709551597 free:58 remote:0) + volume id:133822 size:9348388960 collection:"hengenlab" file_count:3621 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:2 modified_at_second:1627843731 + volume id:133830 size:8 collection:"hengenlab" version:3 compact_revision:2 modified_at_second:1627618126 + volume id:133850 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627506991 + volume id:133966 size:9472294744 collection:"hengenlab" file_count:3634 delete_count:6 deleted_byte_count:22020222 version:3 compact_revision:2 modified_at_second:1627843677 + volume id:134022 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627506992 + volume id:411676 size:20995380656 collection:"hengenlab" file_count:8083 delete_count:1628 deleted_byte_count:4232086349 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411741 size:20978338976 collection:"hengenlab" file_count:8026 delete_count:81 deleted_byte_count:161965983 version:3 compact_revision:2 modified_at_second:1627702345 + volume id:411787 size:21004437928 collection:"hengenlab" file_count:8063 delete_count:1635 deleted_byte_count:4174116078 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411805 size:21010830360 collection:"hengenlab" file_count:8058 delete_count:1452 deleted_byte_count:3663707621 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411806 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627526064 + volume id:411816 size:7972844136 collection:"hengenlab" file_count:3173 delete_count:535 deleted_byte_count:1274718168 version:3 compact_revision:2 modified_at_second:1627571096 + volume id:411820 size:11103604584 collection:"hengenlab" file_count:4416 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:3 modified_at_second:1627843718 + volume id:411840 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627522290 + volume id:411882 size:9476786448 collection:"hengenlab" file_count:3569 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:2 modified_at_second:1627843743 + volume id:411884 size:20975768288 collection:"hengenlab" file_count:8098 delete_count:189 deleted_byte_count:394743945 version:3 compact_revision:2 modified_at_second:1627703989 + volume id:411885 size:10611745152 collection:"hengenlab" file_count:4129 delete_count:34 deleted_byte_count:95421130 version:3 compact_revision:4 modified_at_second:1627843724 + volume id:411907 size:20994844640 collection:"hengenlab" file_count:8070 delete_count:1605 deleted_byte_count:4107716304 version:3 compact_revision:1 modified_at_second:1627609259 + volume id:411916 size:11843699336 collection:"hengenlab" file_count:4592 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:3 modified_at_second:1627843732 + volume id:411922 size:19872656216 collection:"hengenlab" file_count:7602 delete_count:6 deleted_byte_count:18874494 version:3 compact_revision:2 modified_at_second:1627843738 + volume id:411986 size:10450097872 collection:"hengenlab" file_count:3984 delete_count:12 deleted_byte_count:31457532 version:3 compact_revision:2 modified_at_second:1627843739 + volume id:411995 size:10589403672 collection:"hengenlab" file_count:4040 delete_count:7 deleted_byte_count:19923091 version:3 compact_revision:2 modified_at_second:1627843694 + volume id:412020 size:9992180880 collection:"hengenlab" file_count:3848 delete_count:7 deleted_byte_count:19923091 version:3 compact_revision:2 modified_at_second:1627843728 + volume id:412023 size:11391321408 collection:"hengenlab" file_count:4442 delete_count:191 deleted_byte_count:399495827 version:3 compact_revision:1 modified_at_second:1627843730 + Disk hdd total size:258084624296 file_count:99448 deleted_file:7395 deleted_bytes:18639238654 + DataNode 10.244.80.182:8080 total size:258084624296 file_count:99448 deleted_file:7395 deleted_bytes:18639238654 + DataNode 10.244.80.187:8080 hdd(volume:9/91 active:18446744073709551608 free:82 remote:0) + Disk hdd(volume:9/91 active:18446744073709551608 free:82 remote:0) + volume id:133842 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627506990 + volume id:411712 size:20998686088 collection:"hengenlab" file_count:8257 delete_count:1802 deleted_byte_count:4297127481 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411740 size:20987167216 collection:"hengenlab" file_count:8054 delete_count:1417 deleted_byte_count:3594015227 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411743 size:10176141608 collection:"hengenlab" file_count:3972 delete_count:4 deleted_byte_count:10485844 version:3 compact_revision:4 modified_at_second:1627843724 + volume id:411763 size:12703548240 collection:"hengenlab" file_count:4968 delete_count:3 deleted_byte_count:12582975 version:3 compact_revision:3 modified_at_second:1627843743 + volume id:411848 size:11875047160 collection:"hengenlab" file_count:4644 delete_count:4 deleted_byte_count:7340116 version:3 compact_revision:4 modified_at_second:1627843716 + volume id:411897 size:9159541464 collection:"hengenlab" file_count:3605 delete_count:3 deleted_byte_count:9437247 version:3 compact_revision:2 modified_at_second:1627843743 + volume id:411961 size:13624062208 collection:"hengenlab" file_count:5228 version:3 compact_revision:1 modified_at_second:1627613659 + volume id:411992 size:10680394344 collection:"hengenlab" file_count:4112 delete_count:8 deleted_byte_count:14680232 version:3 compact_revision:2 modified_at_second:1627843740 + Disk hdd total size:110204588336 file_count:42840 deleted_file:3241 deleted_bytes:7945669122 + DataNode 10.244.80.187:8080 total size:110204588336 file_count:42840 deleted_file:3241 deleted_bytes:7945669122 + DataNode 10.244.80.188:8080 hdd(volume:22/89 active:20 free:67 remote:0) + Disk hdd(volume:22/89 active:20 free:67 remote:0) + volume id:133787 size:20977333768 collection:"hengenlab" file_count:8145 delete_count:373 deleted_byte_count:852883566 version:3 compact_revision:3 modified_at_second:1627704822 + volume id:133791 size:12894894240 collection:"hengenlab" file_count:4990 version:3 compact_revision:4 modified_at_second:1627843739 + volume id:133797 size:20976269128 collection:"hengenlab" file_count:8074 delete_count:1365 deleted_byte_count:3624138703 version:3 compact_revision:2 modified_at_second:1627571055 + volume id:133890 size:20973749832 collection:"hengenlab" file_count:8105 delete_count:87 deleted_byte_count:158198416 version:3 compact_revision:3 modified_at_second:1627704768 + volume id:133911 size:7193833056 collection:"hengenlab" file_count:2839 version:3 compact_revision:2 modified_at_second:1627843714 + volume id:133949 size:7705370032 collection:"hengenlab" file_count:2945 version:3 compact_revision:2 modified_at_second:1627843735 + volume id:133980 size:12177944664 collection:"hengenlab" file_count:4754 version:3 compact_revision:4 modified_at_second:1627843741 + volume id:134024 size:20987628488 collection:"hengenlab" file_count:8147 delete_count:1533 deleted_byte_count:3904661820 version:3 compact_revision:2 modified_at_second:1627571060 + volume id:246130 size:21628018400 collection:"hengenlab" file_count:8140 delete_count:282 deleted_byte_count:761272098 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:246152 size:21460301248 collection:"hengenlab" file_count:8216 delete_count:91 deleted_byte_count:236980087 version:3 modified_at_second:1627521766 + volume id:246218 size:22123069400 collection:"hengenlab" file_count:8438 delete_count:259 deleted_byte_count:689149263 version:3 modified_at_second:1627521766 + volume id:246234 size:21548861680 collection:"hengenlab" file_count:8177 delete_count:184 deleted_byte_count:504368920 version:3 modified_at_second:1627521636 + volume id:246235 size:21563474080 collection:"hengenlab" file_count:8243 delete_count:166 deleted_byte_count:400559518 version:3 modified_at_second:1627521732 + volume id:246238 size:21939256008 collection:"hengenlab" file_count:8327 delete_count:305 deleted_byte_count:819992837 version:3 modified_at_second:1627521732 + volume id:246244 size:21177236216 collection:"hengenlab" file_count:8091 delete_count:73 deleted_byte_count:164635721 version:3 modified_at_second:1627521821 + volume id:246264 size:21709311176 collection:"hengenlab" file_count:8377 delete_count:137 deleted_byte_count:344984381 version:3 modified_at_second:1627521766 + volume id:246270 size:22130167328 collection:"hengenlab" file_count:8420 delete_count:333 deleted_byte_count:868227921 version:3 modified_at_second:1627521633 + volume id:411756 size:20991502016 collection:"hengenlab" file_count:8230 delete_count:2438 deleted_byte_count:5914063320 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411855 size:7178928632 collection:"hengenlab" file_count:2749 version:3 compact_revision:1 modified_at_second:1627843726 + volume id:411867 size:7349929896 collection:"hengenlab" file_count:2873 version:3 compact_revision:1 modified_at_second:1627843701 + volume id:411968 size:10013989648 collection:"hengenlab" file_count:3769 version:3 compact_revision:2 modified_at_second:1627843711 + volume id:412018 size:9021709232 collection:"hengenlab" file_count:3500 version:3 compact_revision:3 modified_at_second:1627843738 + Disk hdd total size:373722778168 file_count:143549 deleted_file:7626 deleted_bytes:19244116571 + DataNode 10.244.80.188:8080 total size:373722778168 file_count:143549 deleted_file:7626 deleted_bytes:19244116571 + DataNode 10.244.80.190:8080 hdd(volume:16/85 active:18446744073709551613 free:69 remote:0) + Disk hdd(volume:16/85 active:18446744073709551613 free:69 remote:0) + volume id:411656 size:312783808 file_count:853 delete_count:21 deleted_byte_count:1104358 version:3 modified_at_second:1627843685 + volume id:411657 size:406532592 file_count:915 delete_count:33 deleted_byte_count:1879726 version:3 modified_at_second:1627843741 + volume id:411658 size:391617112 file_count:935 delete_count:19 deleted_byte_count:1293103 version:3 modified_at_second:1627843686 + volume id:411659 size:378765040 file_count:891 delete_count:17 deleted_byte_count:1501286 version:3 modified_at_second:1627843688 + volume id:411660 size:381905776 file_count:919 delete_count:32 deleted_byte_count:6239636 version:3 modified_at_second:1627843740 + volume id:411661 size:374743672 file_count:865 delete_count:19 deleted_byte_count:853319 version:3 modified_at_second:1627843741 + volume id:411662 size:453987360 file_count:933 delete_count:14 deleted_byte_count:807287 version:3 modified_at_second:1627843687 + volume id:411678 size:13310756544 collection:"hengenlab" file_count:5141 delete_count:7 deleted_byte_count:16777363 version:3 compact_revision:3 modified_at_second:1627843723 + volume id:411688 size:11320049832 collection:"hengenlab" file_count:4445 delete_count:3 deleted_byte_count:9437247 version:3 compact_revision:4 modified_at_second:1627843734 + volume id:411715 size:20979163616 collection:"hengenlab" file_count:8105 delete_count:128 deleted_byte_count:229514021 version:3 compact_revision:2 modified_at_second:1627703154 + volume id:411769 size:21020447216 collection:"hengenlab" file_count:8257 delete_count:2450 deleted_byte_count:5980737503 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411780 size:21027400496 collection:"hengenlab" file_count:8122 delete_count:2251 deleted_byte_count:5533972074 version:3 compact_revision:1 modified_at_second:1627571060 + volume id:411781 size:21037408832 collection:"hengenlab" file_count:8108 delete_count:1304 deleted_byte_count:3224044243 version:3 compact_revision:1 modified_at_second:1627607477 + volume id:411792 size:21012031144 collection:"hengenlab" file_count:8191 delete_count:1701 deleted_byte_count:4217474712 version:3 compact_revision:1 modified_at_second:1627571055 + volume id:411819 size:13154203544 collection:"hengenlab" file_count:5103 delete_count:211 deleted_byte_count:478778819 version:3 compact_revision:2 modified_at_second:1627609260 + volume id:411999 size:10404127864 collection:"hengenlab" file_count:4016 delete_count:79 deleted_byte_count:217723915 version:3 compact_revision:2 modified_at_second:1627843731 + Disk hdd total size:155965924448 file_count:65799 deleted_file:8289 deleted_bytes:19922138612 + DataNode 10.244.80.190:8080 total size:155965924448 file_count:65799 deleted_file:8289 deleted_bytes:19922138612 + Rack DefaultRack total size:14536458701800 file_count:6344037 deleted_file:789918 deleted_bytes:1752599154873 + DataCenter DefaultDataCenter total size:14536458701800 file_count:6344037 deleted_file:789918 deleted_bytes:1752599154873 +total size:14536458701800 file_count:6344037 deleted_file:789918 deleted_bytes:1752599154873 ` From 3739717092ecec13f05a95c937beaa981681d1a2 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 1 Aug 2021 22:54:45 -0700 Subject: [PATCH 159/265] Revert "adds a test" This reverts commit f690643b47654b3220b71bd3bfa839a2d1b365d3. --- weed/shell/command_volume_balance.go | 2 +- weed/shell/command_volume_list_test.go | 3065 +++++++----------------- 2 files changed, 805 insertions(+), 2262 deletions(-) diff --git a/weed/shell/command_volume_balance.go b/weed/shell/command_volume_balance.go index 6da128c68..06a5ebc92 100644 --- a/weed/shell/command_volume_balance.go +++ b/weed/shell/command_volume_balance.go @@ -120,7 +120,7 @@ func balanceVolumeServers(commandEnv *CommandEnv, diskTypes []types.DiskType, vo func balanceVolumeServersByDiskType(commandEnv *CommandEnv, diskType types.DiskType, volumeReplicas map[uint32][]*VolumeReplica, nodes []*Node, volumeSizeLimit uint64, collection string, applyBalancing bool) error { - // balance read only volumes + // balance readable volumes for _, n := range nodes { n.selectVolumes(func(v *master_pb.VolumeInformationMessage) bool { if collection != "ALL_COLLECTIONS" { diff --git a/weed/shell/command_volume_list_test.go b/weed/shell/command_volume_list_test.go index 11977e2cb..72c76f242 100644 --- a/weed/shell/command_volume_list_test.go +++ b/weed/shell/command_volume_list_test.go @@ -86,2265 +86,808 @@ func parseOutput(output string) *master_pb.TopologyInfo { } const topoData = ` -Topology volumeSizeLimit:20000 MB nvme(volume:1600/1601 active:1419 free:1 remote:0) hdd(volume:426/2759 active:18446744073709551344 free:2333 remote:0) - DataCenter DefaultDataCenter hdd(volume:426/2759 active:18446744073709551344 free:2333 remote:0) nvme(volume:1600/1601 active:1419 free:1 remote:0) - Rack DefaultRack nvme(volume:1600/1601 active:1419 free:1 remote:0) hdd(volume:426/2759 active:18446744073709551344 free:2333 remote:0) - DataNode 10.244.107.16:8080 nvme(volume:32/33 active:33 free:1 remote:0) - Disk nvme(volume:32/33 active:33 free:1 remote:0) - volume id:36 size:3804920 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:10810 delete_count:9907 deleted_byte_count:2557278 version:3 compact_revision:6 modified_at_second:1627500575 disk_type:"nvme" - volume id:52 size:3834960 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:11124 delete_count:10252 deleted_byte_count:2599071 version:3 compact_revision:8 modified_at_second:1627504771 disk_type:"nvme" - volume id:515 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:3 modified_at_second:1627676213 disk_type:"nvme" - volume id:582 size:1087813800 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3719 delete_count:3716 deleted_byte_count:1074978006 version:3 compact_revision:1 modified_at_second:1627504948 disk_type:"nvme" - volume id:608 size:1083681304 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7883 delete_count:7882 deleted_byte_count:1078951183 version:3 modified_at_second:1627500577 disk_type:"nvme" - volume id:622 size:12583208 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1627672952 disk_type:"nvme" - volume id:633 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627672953 disk_type:"nvme" - volume id:664 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627517790 disk_type:"nvme" - volume id:727 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1627414988 disk_type:"nvme" - volume id:737 size:104857952 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1627415149 disk_type:"nvme" - volume id:739 size:117441120 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:1 modified_at_second:1627415464 disk_type:"nvme" - volume id:753 size:142606888 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1627415280 disk_type:"nvme" - volume id:754 size:109052352 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1627415433 disk_type:"nvme" - volume id:1079 size:20981451056 collection:"braingeneers-backups-swfs" file_count:12262 delete_count:225 deleted_byte_count:349314158 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1106 size:20974117232 collection:"braingeneers-backups-swfs" file_count:12258 delete_count:229 deleted_byte_count:383576860 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:246103 size:21017335272 collection:"hengenlab" file_count:8062 version:3 compact_revision:1 modified_at_second:1627416401 disk_type:"nvme" - volume id:246106 size:21091278592 collection:"hengenlab" file_count:8043 version:3 compact_revision:1 modified_at_second:1627416401 disk_type:"nvme" - volume id:246112 size:21141587752 collection:"hengenlab" file_count:8109 version:3 compact_revision:1 modified_at_second:1627416409 disk_type:"nvme" - volume id:246118 size:21027658872 collection:"hengenlab" file_count:8003 version:3 compact_revision:1 modified_at_second:1627416369 disk_type:"nvme" - volume id:246119 size:21090047592 collection:"hengenlab" file_count:8027 version:3 compact_revision:1 modified_at_second:1627416401 disk_type:"nvme" - volume id:246147 size:20993918552 collection:"hengenlab" file_count:8643 delete_count:496 deleted_byte_count:1229459895 version:3 modified_at_second:1627414743 disk_type:"nvme" - volume id:246148 size:20988892312 collection:"hengenlab" file_count:8641 delete_count:578 deleted_byte_count:1420198603 version:3 modified_at_second:1627414690 disk_type:"nvme" - volume id:246151 size:21067515568 collection:"hengenlab" file_count:8011 version:3 modified_at_second:1627416930 disk_type:"nvme" - volume id:246156 size:21374966256 collection:"hengenlab" file_count:8202 version:3 modified_at_second:1627416944 disk_type:"nvme" - volume id:246163 size:21293954224 collection:"hengenlab" file_count:8134 version:3 modified_at_second:1627417333 disk_type:"nvme" - volume id:246169 size:21649654648 collection:"hengenlab" file_count:8228 version:3 modified_at_second:1627417511 disk_type:"nvme" - volume id:246174 size:21118992920 collection:"hengenlab" file_count:8106 version:3 modified_at_second:1627418092 disk_type:"nvme" - volume id:246202 size:21384772480 collection:"hengenlab" file_count:8145 version:3 modified_at_second:1627420091 disk_type:"nvme" - volume id:246224 size:21800603816 collection:"hengenlab" file_count:8349 version:3 modified_at_second:1627421747 disk_type:"nvme" - volume id:246231 size:21151072736 collection:"hengenlab" file_count:8207 version:3 modified_at_second:1627422299 disk_type:"nvme" - volume id:246266 size:21310016776 collection:"hengenlab" file_count:8019 version:3 modified_at_second:1627423869 disk_type:"nvme" - volume id:246291 size:21563812856 collection:"hengenlab" file_count:8243 version:3 modified_at_second:1627425133 disk_type:"nvme" - volume id:246311 size:6461898408 collection:"hengenlab" file_count:2437 version:3 modified_at_second:1627425695 disk_type:"nvme" - Disk nvme total size:412228916664 file_count:199695 deleted_file:33285 deleted_bytes:5541635054 - DataNode 10.244.107.16:8080 total size:412228916664 file_count:199695 deleted_file:33285 deleted_bytes:5541635054 - DataNode 10.244.107.37:8080 nvme(volume:32/32 active:32 free:0 remote:0) - Disk nvme(volume:32/32 active:32 free:0 remote:0) - volume id:57 size:3954520 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:11025 delete_count:10133 deleted_byte_count:2654098 version:3 compact_revision:7 modified_at_second:1627504757 disk_type:"nvme" - volume id:60 size:4002800 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:11132 delete_count:10231 deleted_byte_count:2675670 version:3 compact_revision:7 modified_at_second:1627504774 disk_type:"nvme" - volume id:578 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1627516919 disk_type:"nvme" - volume id:599 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627517793 disk_type:"nvme" - volume id:610 size:8388808 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627516918 disk_type:"nvme" - volume id:760 size:41943328 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:3 modified_at_second:1627415104 disk_type:"nvme" - volume id:771 size:71303424 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1627415229 disk_type:"nvme" - volume id:779 size:46137712 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:2 modified_at_second:1627504940 disk_type:"nvme" - volume id:782 size:100663560 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1627415422 disk_type:"nvme" - volume id:804 size:41943312 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:1 modified_at_second:1627500575 disk_type:"nvme" - volume id:1124 size:20981558144 collection:"braingeneers-backups-swfs" file_count:12294 delete_count:238 deleted_byte_count:353310263 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1132 size:20972966960 collection:"braingeneers-backups-swfs" file_count:12252 delete_count:230 deleted_byte_count:365652225 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:133787 size:21301768216 collection:"hengenlab" file_count:8526 delete_count:8264 deleted_byte_count:20658424014 read_only:true version:3 modified_at_second:1627419537 disk_type:"nvme" - volume id:133819 size:21226668664 collection:"hengenlab" file_count:8129 delete_count:8129 deleted_byte_count:21226124008 read_only:true version:3 modified_at_second:1627420866 disk_type:"nvme" - volume id:133869 size:21571728944 collection:"hengenlab" file_count:8249 read_only:true version:3 compact_revision:1 modified_at_second:1627423103 disk_type:"nvme" - volume id:246099 size:93611912 file_count:110 version:3 modified_at_second:1627423623 disk_type:"nvme" - volume id:246100 size:102506304 file_count:118 version:3 modified_at_second:1627423803 disk_type:"nvme" - volume id:246101 size:105559656 file_count:128 version:3 modified_at_second:1627424043 disk_type:"nvme" - volume id:246110 size:21077107912 collection:"hengenlab" file_count:8028 read_only:true version:3 compact_revision:1 modified_at_second:1627416386 disk_type:"nvme" - volume id:246111 size:21238297720 collection:"hengenlab" file_count:8218 read_only:true version:3 compact_revision:1 modified_at_second:1627416416 disk_type:"nvme" - volume id:246116 size:21116990672 collection:"hengenlab" file_count:8000 read_only:true version:3 compact_revision:1 modified_at_second:1627416386 disk_type:"nvme" - volume id:246121 size:21025910752 collection:"hengenlab" file_count:7929 read_only:true version:3 compact_revision:1 modified_at_second:1627416401 disk_type:"nvme" - volume id:246126 size:21135866264 collection:"hengenlab" file_count:8120 read_only:true version:3 compact_revision:1 modified_at_second:1627416416 disk_type:"nvme" - volume id:246145 size:20996024600 collection:"hengenlab" file_count:8650 delete_count:569 deleted_byte_count:1406783580 read_only:true version:3 modified_at_second:1627414655 disk_type:"nvme" - volume id:246159 size:21483403792 collection:"hengenlab" file_count:8224 delete_count:3 deleted_byte_count:12582975 read_only:true version:3 modified_at_second:1627417144 disk_type:"nvme" - volume id:246170 size:21584773216 collection:"hengenlab" file_count:8255 read_only:true version:3 modified_at_second:1627417520 disk_type:"nvme" - volume id:246177 size:21240770832 collection:"hengenlab" file_count:8210 read_only:true version:3 modified_at_second:1627418752 disk_type:"nvme" - volume id:246239 size:21089256352 collection:"hengenlab" file_count:8018 read_only:true version:3 modified_at_second:1627423046 disk_type:"nvme" - volume id:246262 size:21394156680 collection:"hengenlab" file_count:8164 read_only:true version:3 modified_at_second:1627423585 disk_type:"nvme" - volume id:246265 size:21327729128 collection:"hengenlab" file_count:8186 read_only:true version:3 modified_at_second:1627423877 disk_type:"nvme" - volume id:246275 size:1338420296 collection:"hengenlab" file_count:515 version:3 modified_at_second:1627424194 disk_type:"nvme" - volume id:246277 size:1399878536 collection:"hengenlab" file_count:528 version:3 modified_at_second:1627424194 disk_type:"nvme" - Disk nvme total size:364135876200 file_count:171029 deleted_file:37799 deleted_bytes:44036595503 - DataNode 10.244.107.37:8080 total size:364135876200 file_count:171029 deleted_file:37799 deleted_bytes:44036595503 - DataNode 10.244.11.0:8080 nvme(volume:69/69 active:68 free:0 remote:0) - Disk nvme(volume:69/69 active:68 free:0 remote:0) - volume id:74 size:624088 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:910 read_only:true version:3 compact_revision:8 modified_at_second:1627507800 disk_type:"nvme" - volume id:76 size:575032 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:856 read_only:true version:3 compact_revision:6 modified_at_second:1627507800 disk_type:"nvme" - volume id:204 size:1214000688 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:580 read_only:true version:3 modified_at_second:1623182699 disk_type:"nvme" - volume id:227 size:1101811464 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:528 read_only:true version:3 modified_at_second:1623182338 disk_type:"nvme" - volume id:232 size:1164914112 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:562 read_only:true version:3 modified_at_second:1623181649 disk_type:"nvme" - volume id:286 size:1163548288 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:566 read_only:true version:3 modified_at_second:1623181548 disk_type:"nvme" - volume id:319 size:1189298656 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:593 read_only:true version:3 modified_at_second:1623182442 disk_type:"nvme" - volume id:369 size:1093083336 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:523 read_only:true version:3 modified_at_second:1623181034 disk_type:"nvme" - volume id:377 size:1103962224 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:554 read_only:true version:3 modified_at_second:1623180941 disk_type:"nvme" - volume id:378 size:1085340552 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:552 read_only:true version:3 modified_at_second:1623180833 disk_type:"nvme" - volume id:383 size:1169239608 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:591 read_only:true version:3 modified_at_second:1623181752 disk_type:"nvme" - volume id:404 size:1141464880 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:546 read_only:true version:3 modified_at_second:1623181966 disk_type:"nvme" - volume id:415 size:1134207256 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:552 read_only:true version:3 modified_at_second:1623181145 disk_type:"nvme" - volume id:440 size:1139081320 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:550 read_only:true version:3 modified_at_second:1623181245 disk_type:"nvme" - volume id:468 size:1178437616 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:637 read_only:true version:3 modified_at_second:1623182594 disk_type:"nvme" - volume id:475 size:1156692960 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:578 read_only:true version:3 modified_at_second:1623181446 disk_type:"nvme" - volume id:480 size:1091564648 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:538 read_only:true version:3 modified_at_second:1623180844 disk_type:"nvme" - volume id:521 size:1158613792 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:565 read_only:true version:3 modified_at_second:1623182103 disk_type:"nvme" - volume id:553 size:1089047024 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:608 read_only:true version:3 modified_at_second:1623181345 disk_type:"nvme" - volume id:561 size:1092313176 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:689 read_only:true version:3 modified_at_second:1623182209 disk_type:"nvme" - volume id:796 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 read_only:true version:3 compact_revision:2 modified_at_second:1623182856 disk_type:"nvme" - volume id:811 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 read_only:true version:3 compact_revision:1 modified_at_second:1623184702 disk_type:"nvme" - volume id:818 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 read_only:true version:3 compact_revision:2 modified_at_second:1623183494 disk_type:"nvme" - volume id:835 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 read_only:true version:3 compact_revision:2 modified_at_second:1623183822 disk_type:"nvme" - volume id:887 size:83886632 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194335 read_only:true version:3 compact_revision:1 modified_at_second:1627504764 disk_type:"nvme" - volume id:924 size:134218088 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 read_only:true version:3 compact_revision:1 modified_at_second:1623183679 disk_type:"nvme" - volume id:950 size:104857976 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 delete_count:1 deleted_byte_count:4194342 read_only:true version:3 compact_revision:1 modified_at_second:1627504751 disk_type:"nvme" - volume id:955 size:201327056 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 read_only:true version:3 compact_revision:2 modified_at_second:1623184026 disk_type:"nvme" - volume id:958 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 read_only:true version:3 compact_revision:1 modified_at_second:1623184142 disk_type:"nvme" - volume id:970 size:171966984 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 read_only:true version:3 compact_revision:2 modified_at_second:1623184419 disk_type:"nvme" - volume id:988 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 read_only:true version:3 compact_revision:1 modified_at_second:1623182867 disk_type:"nvme" - volume id:989 size:8388776 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 read_only:true version:3 compact_revision:1 modified_at_second:1623183080 disk_type:"nvme" - volume id:996 size:37748888 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 read_only:true version:3 compact_revision:2 modified_at_second:1623182972 disk_type:"nvme" - volume id:1023 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 read_only:true version:3 compact_revision:1 modified_at_second:1623183253 disk_type:"nvme" - volume id:1049 size:20975717256 collection:"braingeneers-backups-swfs" file_count:12279 delete_count:221 deleted_byte_count:347033818 read_only:true version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1080 size:20972503688 collection:"braingeneers-backups-swfs" file_count:12296 delete_count:244 deleted_byte_count:399119927 read_only:true version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1095 size:20974245384 collection:"braingeneers-backups-swfs" file_count:12208 delete_count:244 deleted_byte_count:389921617 read_only:true version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1112 size:20990798696 collection:"braingeneers-backups-swfs" file_count:12260 delete_count:238 deleted_byte_count:380046331 read_only:true version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:133789 size:735486336 collection:"hengenlab" file_count:282 read_only:true version:3 compact_revision:1 modified_at_second:1627507744 disk_type:"nvme" - volume id:133792 size:881869784 collection:"hengenlab" file_count:310 read_only:true version:3 compact_revision:1 modified_at_second:1627507554 disk_type:"nvme" - volume id:133802 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507782 disk_type:"nvme" - volume id:133811 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507782 disk_type:"nvme" - volume id:133812 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507744 disk_type:"nvme" - volume id:133815 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507555 disk_type:"nvme" - volume id:133816 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" - volume id:133832 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507788 disk_type:"nvme" - volume id:133834 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507788 disk_type:"nvme" - volume id:133837 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507634 disk_type:"nvme" - volume id:133845 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507574 disk_type:"nvme" - volume id:133855 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507364 disk_type:"nvme" - volume id:133867 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507096 disk_type:"nvme" - volume id:133876 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507649 disk_type:"nvme" - volume id:133880 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507428 disk_type:"nvme" - volume id:133881 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" - volume id:133882 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507171 disk_type:"nvme" - volume id:133905 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507634 disk_type:"nvme" - volume id:133907 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" - volume id:133908 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507555 disk_type:"nvme" - volume id:133913 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" - volume id:133928 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" - volume id:133932 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507555 disk_type:"nvme" - volume id:133952 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507152 disk_type:"nvme" - volume id:133956 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" - volume id:133959 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507170 disk_type:"nvme" - volume id:133960 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507153 disk_type:"nvme" - volume id:133971 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507574 disk_type:"nvme" - volume id:133972 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507046 disk_type:"nvme" - volume id:133986 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" - volume id:133992 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507786 disk_type:"nvme" - Disk nvme total size:107126713872 file_count:61758 deleted_file:949 deleted_bytes:1524510370 - DataNode 10.244.11.0:8080 total size:107126713872 file_count:61758 deleted_file:949 deleted_bytes:1524510370 - DataNode 10.244.11.19:8080 nvme(volume:66/66 active:62 free:0 remote:0) - Disk nvme(volume:66/66 active:62 free:0 remote:0) - volume id:70 size:529288 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:884 version:3 compact_revision:8 modified_at_second:1627507799 disk_type:"nvme" - volume id:157 size:1122476512 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:548 version:3 modified_at_second:1623181523 disk_type:"nvme" - volume id:158 size:1196081064 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:582 version:3 modified_at_second:1623182569 disk_type:"nvme" - volume id:177 size:1133337560 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:702 version:3 modified_at_second:1623181220 disk_type:"nvme" - volume id:277 size:1161156640 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:560 version:3 modified_at_second:1623181939 disk_type:"nvme" - volume id:315 size:1092148208 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:547 version:3 modified_at_second:1623181359 disk_type:"nvme" - volume id:323 size:1163779192 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:559 version:3 modified_at_second:1623182312 disk_type:"nvme" - volume id:342 size:1149035344 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:577 version:3 modified_at_second:1623181954 disk_type:"nvme" - volume id:353 size:1252673472 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:608 version:3 modified_at_second:1610497794 disk_type:"nvme" - volume id:418 size:1132380048 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:549 version:3 modified_at_second:1623181663 disk_type:"nvme" - volume id:456 size:1107957400 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:555 version:3 modified_at_second:1623180914 disk_type:"nvme" - volume id:457 size:1192491288 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:595 version:3 modified_at_second:1623182726 disk_type:"nvme" - volume id:476 size:1147841016 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:573 version:3 modified_at_second:1623182117 disk_type:"nvme" - volume id:488 size:1133874736 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:554 version:3 modified_at_second:1623181234 disk_type:"nvme" - volume id:489 size:1111273568 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:537 version:3 modified_at_second:1623181048 disk_type:"nvme" - volume id:490 size:1129110824 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:544 version:3 modified_at_second:1623181535 disk_type:"nvme" - volume id:507 size:1108618968 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:632 version:3 modified_at_second:1623180928 disk_type:"nvme" - volume id:540 size:1189084392 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:584 version:3 modified_at_second:1623182300 disk_type:"nvme" - volume id:558 size:1161785320 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:747 version:3 modified_at_second:1623182467 disk_type:"nvme" - volume id:894 size:67109000 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1623183878 disk_type:"nvme" - volume id:902 size:268436096 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1623184409 disk_type:"nvme" - volume id:909 size:138412488 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1623184037 disk_type:"nvme" - volume id:915 size:100663512 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623183176 disk_type:"nvme" - volume id:918 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623183739 disk_type:"nvme" - volume id:922 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1617901708 disk_type:"nvme" - volume id:923 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1617901544 disk_type:"nvme" - volume id:966 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623183298 disk_type:"nvme" - volume id:968 size:79692256 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 delete_count:2 deleted_byte_count:8388677 version:3 compact_revision:1 modified_at_second:1627504913 disk_type:"nvme" - volume id:997 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183186 disk_type:"nvme" - volume id:998 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623183727 disk_type:"nvme" - volume id:1001 size:8 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" replica_placement:1 version:3 compact_revision:2 modified_at_second:1623183459 disk_type:"nvme" - volume id:1002 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183449 disk_type:"nvme" - volume id:1014 size:205521504 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:1 modified_at_second:1623184132 disk_type:"nvme" - volume id:1042 size:376 collection:"pvc-0544e3a6-da8f-42fe-a149-3a103bcc8552" file_count:1 version:3 modified_at_second:1615234634 disk_type:"nvme" - volume id:1064 size:20974995560 collection:"braingeneers-backups-swfs" file_count:12287 delete_count:236 deleted_byte_count:359450306 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1086 size:20974060120 collection:"braingeneers-backups-swfs" file_count:12171 delete_count:223 deleted_byte_count:381767404 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1102 size:20974457480 collection:"braingeneers-backups-swfs" file_count:12357 delete_count:233 deleted_byte_count:380291056 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1105 size:20975999912 collection:"braingeneers-backups-swfs" file_count:12219 delete_count:205 deleted_byte_count:360816088 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1712 size:161457328 file_count:334 version:3 modified_at_second:1627079927 disk_type:"nvme" - volume id:133798 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507649 disk_type:"nvme" - volume id:133818 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627506992 disk_type:"nvme" - volume id:133824 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" - volume id:133835 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507329 disk_type:"nvme" - volume id:133844 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507153 disk_type:"nvme" - volume id:133846 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" - volume id:133847 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507574 disk_type:"nvme" - volume id:133849 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507782 disk_type:"nvme" - volume id:133854 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627506993 disk_type:"nvme" - volume id:133858 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507009 disk_type:"nvme" - volume id:133859 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507365 disk_type:"nvme" - volume id:133860 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507574 disk_type:"nvme" - volume id:133865 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" - volume id:133870 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627506993 disk_type:"nvme" - volume id:133872 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507788 disk_type:"nvme" - volume id:133877 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507114 disk_type:"nvme" - volume id:133897 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507046 disk_type:"nvme" - volume id:133904 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" - volume id:133942 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507114 disk_type:"nvme" - volume id:133967 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627507329 disk_type:"nvme" - volume id:133984 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507553 disk_type:"nvme" - volume id:134003 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507096 disk_type:"nvme" - volume id:134013 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507788 disk_type:"nvme" - volume id:134022 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" - volume id:134023 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507170 disk_type:"nvme" - volume id:134031 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507170 disk_type:"nvme" - volume id:134038 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507574 disk_type:"nvme" - Disk nvme total size:106118147352 file_count:60853 deleted_file:899 deleted_bytes:1490713531 - DataNode 10.244.11.19:8080 total size:106118147352 file_count:60853 deleted_file:899 deleted_bytes:1490713531 - DataNode 10.244.11.26:8080 nvme(volume:66/66 active:18446744073709551615 free:0 remote:0) - Disk nvme(volume:66/66 active:18446744073709551615 free:0 remote:0) - volume id:7 size:288797416 file_count:5629 delete_count:1 deleted_byte_count:266 version:3 modified_at_second:1627417083 disk_type:"nvme" - volume id:127 size:8 collection:"._.DS_Store" version:3 modified_at_second:1610069605 disk_type:"nvme" - volume id:144 size:1656454968 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:856 version:3 modified_at_second:1610491353 disk_type:"nvme" - volume id:145 size:1662083456 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:863 version:3 modified_at_second:1610491353 disk_type:"nvme" - volume id:183 size:1264059216 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:766 version:3 modified_at_second:1610494389 disk_type:"nvme" - volume id:201 size:1220315640 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:621 version:3 modified_at_second:1610494836 disk_type:"nvme" - volume id:222 size:1464201984 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:703 version:3 modified_at_second:1610496178 disk_type:"nvme" - volume id:230 size:1212205592 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:585 version:3 modified_at_second:1610496236 disk_type:"nvme" - volume id:234 size:1336320944 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:643 version:3 modified_at_second:1610496298 disk_type:"nvme" - volume id:235 size:1356021448 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:648 version:3 modified_at_second:1610496298 disk_type:"nvme" - volume id:247 size:1186730544 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:603 version:3 modified_at_second:1610496421 disk_type:"nvme" - volume id:298 size:1271544400 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:615 version:3 modified_at_second:1610497013 disk_type:"nvme" - volume id:303 size:1261139456 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:607 version:3 modified_at_second:1610497082 disk_type:"nvme" - volume id:310 size:1183449136 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:589 version:3 modified_at_second:1610497162 disk_type:"nvme" - volume id:328 size:1269368376 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:611 version:3 modified_at_second:1610497407 disk_type:"nvme" - volume id:330 size:1211938144 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:596 version:3 modified_at_second:1610497483 disk_type:"nvme" - volume id:355 size:1288125688 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:623 version:3 modified_at_second:1610497794 disk_type:"nvme" - volume id:409 size:1226643888 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:600 version:3 modified_at_second:1610498523 disk_type:"nvme" - volume id:420 size:1259995816 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:603 version:3 modified_at_second:1610498676 disk_type:"nvme" - volume id:432 size:1270209832 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:625 version:3 modified_at_second:1610498827 disk_type:"nvme" - volume id:470 size:1251179768 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:674 version:3 modified_at_second:1610499335 disk_type:"nvme" - volume id:550 size:1268929112 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:705 version:3 modified_at_second:1610644201 disk_type:"nvme" - volume id:725 size:157216216 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1618444181 disk_type:"nvme" - volume id:729 size:142606824 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:3 modified_at_second:1627500611 disk_type:"nvme" - volume id:775 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1619387453 disk_type:"nvme" - volume id:781 size:134218040 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1617901623 disk_type:"nvme" - volume id:824 size:142606856 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1619387455 disk_type:"nvme" - volume id:827 size:75497816 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1619387460 disk_type:"nvme" - volume id:889 size:71303408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1619387460 disk_type:"nvme" - volume id:938 size:171966944 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1619387452 disk_type:"nvme" - volume id:948 size:171967008 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:1 modified_at_second:1627500593 disk_type:"nvme" - volume id:977 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1617901619 disk_type:"nvme" - volume id:1026 size:104857944 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1618444164 disk_type:"nvme" - volume id:1043 size:8 collection:"pvc-73532100-54aa-469c-b8a7-1774be8c3b9e" version:3 compact_revision:3 modified_at_second:1625624761 disk_type:"nvme" - volume id:1045 size:8 collection:"pvc-73532100-54aa-469c-b8a7-1774be8c3b9e" version:3 compact_revision:3 modified_at_second:1625624761 disk_type:"nvme" - volume id:1081 size:20986367400 collection:"braingeneers-backups-swfs" file_count:12221 delete_count:259 deleted_byte_count:448102839 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1093 size:20975891280 collection:"braingeneers-backups-swfs" file_count:12292 delete_count:259 deleted_byte_count:412232025 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1096 size:20979632232 collection:"braingeneers-backups-swfs" file_count:12181 delete_count:212 deleted_byte_count:340140861 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1130 size:20973820192 collection:"braingeneers-backups-swfs" file_count:12337 delete_count:242 deleted_byte_count:369569018 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:133795 size:21385503576 collection:"hengenlab" file_count:8200 delete_count:8187 deleted_byte_count:21358739950 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" - volume id:133808 size:21202577760 collection:"hengenlab" file_count:8071 delete_count:8062 deleted_byte_count:21180017048 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" - volume id:133809 size:21230369728 collection:"hengenlab" file_count:8092 delete_count:8078 deleted_byte_count:21202564777 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" - volume id:133810 size:21235314952 collection:"hengenlab" file_count:8121 delete_count:8103 deleted_byte_count:21190730900 read_only:true version:3 modified_at_second:1627415000 disk_type:"nvme" - volume id:133813 size:21313247416 collection:"hengenlab" file_count:8254 delete_count:8237 deleted_byte_count:21279140176 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" - volume id:133814 size:21289223464 collection:"hengenlab" file_count:8186 delete_count:8173 deleted_byte_count:21249877828 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" - volume id:133820 size:21328570240 collection:"hengenlab" file_count:8104 delete_count:8092 deleted_byte_count:21296570114 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" - volume id:133839 size:21083537992 collection:"hengenlab" file_count:8122 delete_count:8113 deleted_byte_count:21064119544 read_only:true version:3 modified_at_second:1627415000 disk_type:"nvme" - volume id:133853 size:21604021952 collection:"hengenlab" file_count:8277 delete_count:8259 deleted_byte_count:21549990235 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" - volume id:133861 size:21144475920 collection:"hengenlab" file_count:8141 delete_count:8130 deleted_byte_count:21119813441 read_only:true version:3 modified_at_second:1627414998 disk_type:"nvme" - volume id:133868 size:21265175232 collection:"hengenlab" file_count:8180 delete_count:8173 deleted_byte_count:21247850068 read_only:true version:3 modified_at_second:1627415000 disk_type:"nvme" - volume id:133875 size:21037253832 collection:"hengenlab" file_count:7999 delete_count:7987 deleted_byte_count:21008406537 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" - volume id:133885 size:21496349080 collection:"hengenlab" file_count:8263 delete_count:8248 deleted_byte_count:21464338437 read_only:true version:3 modified_at_second:1627415000 disk_type:"nvme" - volume id:133887 size:21082600992 collection:"hengenlab" file_count:8108 delete_count:8101 deleted_byte_count:21062134970 read_only:true version:3 modified_at_second:1627415000 disk_type:"nvme" - volume id:133895 size:21227764056 collection:"hengenlab" file_count:8043 delete_count:8028 deleted_byte_count:21195768100 read_only:true version:3 modified_at_second:1627414998 disk_type:"nvme" - volume id:133912 size:21136149656 collection:"hengenlab" file_count:8097 delete_count:8083 deleted_byte_count:21102052930 read_only:true version:3 modified_at_second:1627415000 disk_type:"nvme" - volume id:133919 size:21105633736 collection:"hengenlab" file_count:8018 delete_count:8004 deleted_byte_count:21062105129 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" - volume id:133921 size:21380640952 collection:"hengenlab" file_count:8224 delete_count:8203 deleted_byte_count:21323467123 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" - volume id:133924 size:21496832784 collection:"hengenlab" file_count:8167 delete_count:8155 deleted_byte_count:21464828475 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" - volume id:133925 size:21108697560 collection:"hengenlab" file_count:8097 delete_count:8080 deleted_byte_count:21058872203 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" - volume id:133929 size:21172350416 collection:"hengenlab" file_count:8030 delete_count:8021 deleted_byte_count:21149792478 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" - volume id:133934 size:21249851816 collection:"hengenlab" file_count:8113 delete_count:8094 deleted_byte_count:21201073969 read_only:true version:3 modified_at_second:1627414999 disk_type:"nvme" - volume id:133941 size:21048173224 collection:"hengenlab" file_count:8022 delete_count:7869 deleted_byte_count:20648130020 read_only:true version:3 modified_at_second:1627415036 disk_type:"nvme" - volume id:133946 size:21038839736 collection:"hengenlab" file_count:8043 delete_count:7919 deleted_byte_count:20735263790 read_only:true version:3 modified_at_second:1627415027 disk_type:"nvme" - volume id:133947 size:21113908544 collection:"hengenlab" file_count:8042 delete_count:256 deleted_byte_count:664802560 read_only:true version:3 modified_at_second:1627416494 disk_type:"nvme" - volume id:133953 size:21149111216 collection:"hengenlab" file_count:7995 delete_count:277 deleted_byte_count:746591929 read_only:true version:3 modified_at_second:1627416480 disk_type:"nvme" - volume id:246168 size:19535090304 collection:"hengenlab" file_count:7417 delete_count:1 deleted_byte_count:4194325 version:3 modified_at_second:1627504928 disk_type:"nvme" - Disk nvme total size:683067985504 file_count:286274 deleted_file:195908 deleted_bytes:511209670735 - DataNode 10.244.11.26:8080 total size:683067985504 file_count:286274 deleted_file:195908 deleted_bytes:511209670735 - DataNode 10.244.11.35:8080 nvme(volume:67/67 active:64 free:0 remote:0) - Disk nvme(volume:67/67 active:64 free:0 remote:0) - volume id:45 size:545648 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:812 version:3 compact_revision:7 modified_at_second:1627507800 disk_type:"nvme" - volume id:111 size:662374536 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1034 version:3 compact_revision:2 modified_at_second:1627618182 disk_type:"nvme" - volume id:196 size:1159925296 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3382 version:3 modified_at_second:1623181741 disk_type:"nvme" - volume id:282 size:1173833248 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:568 version:3 modified_at_second:1623182545 disk_type:"nvme" - volume id:284 size:1106394184 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:535 version:3 modified_at_second:1623182351 disk_type:"nvme" - volume id:287 size:1166213152 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:589 version:3 modified_at_second:1623182558 disk_type:"nvme" - volume id:320 size:1105052992 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:554 version:3 modified_at_second:1623181433 disk_type:"nvme" - volume id:336 size:1148056416 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:569 version:3 modified_at_second:1623181562 disk_type:"nvme" - volume id:347 size:1587167392 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:842 version:3 modified_at_second:1610497707 disk_type:"nvme" - volume id:350 size:1117751376 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:535 version:3 modified_at_second:1623181421 disk_type:"nvme" - volume id:356 size:1196620360 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:583 version:3 modified_at_second:1623182739 disk_type:"nvme" - volume id:382 size:1118311696 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:558 version:3 modified_at_second:1623181132 disk_type:"nvme" - volume id:449 size:1154088216 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:554 version:3 modified_at_second:1623182198 disk_type:"nvme" - volume id:453 size:1164991128 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:562 version:3 modified_at_second:1623182184 disk_type:"nvme" - volume id:469 size:1140820728 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:612 version:3 modified_at_second:1610499328 disk_type:"nvme" - volume id:487 size:1111840200 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:563 version:3 modified_at_second:1623180952 disk_type:"nvme" - volume id:524 size:1121395600 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:543 version:3 modified_at_second:1623181119 disk_type:"nvme" - volume id:551 size:1085123224 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:614 version:3 modified_at_second:1623181256 disk_type:"nvme" - volume id:562 size:1156026888 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:717 version:3 modified_at_second:1623181993 disk_type:"nvme" - volume id:795 size:71303424 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623184096 disk_type:"nvme" - volume id:815 size:176161368 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 delete_count:2 deleted_byte_count:8388677 version:3 compact_revision:1 modified_at_second:1627500580 disk_type:"nvme" - volume id:850 size:79692200 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1623183658 disk_type:"nvme" - volume id:863 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623183379 disk_type:"nvme" - volume id:879 size:109052352 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1623184652 disk_type:"nvme" - volume id:896 size:138412464 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1623184233 disk_type:"nvme" - volume id:897 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623183286 disk_type:"nvme" - volume id:925 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1623183197 disk_type:"nvme" - volume id:932 size:79692248 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1623183959 disk_type:"nvme" - volume id:952 size:100663544 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623184374 disk_type:"nvme" - volume id:960 size:209715864 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1619387459 disk_type:"nvme" - volume id:973 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1623183469 disk_type:"nvme" - volume id:1015 size:8 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" replica_placement:1 version:3 compact_revision:1 modified_at_second:1623183110 disk_type:"nvme" - volume id:1017 size:155190024 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:9 delete_count:2 deleted_byte_count:8388670 version:3 compact_revision:1 modified_at_second:1627504926 disk_type:"nvme" - volume id:1052 size:20979135608 collection:"braingeneers-backups-swfs" file_count:12284 delete_count:262 deleted_byte_count:434825085 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1054 size:20975860960 collection:"braingeneers-backups-swfs" file_count:12206 delete_count:252 deleted_byte_count:416631769 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1069 size:20973437296 collection:"braingeneers-backups-swfs" file_count:12173 delete_count:192 deleted_byte_count:307674992 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1090 size:20976149576 collection:"braingeneers-backups-swfs" file_count:12258 delete_count:271 deleted_byte_count:438418834 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1690 size:52115880 file_count:18 version:3 modified_at_second:1627078487 disk_type:"nvme" - volume id:1691 size:127169592 file_count:41 version:3 modified_at_second:1627078607 disk_type:"nvme" - volume id:133793 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507170 disk_type:"nvme" - volume id:133800 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" - volume id:133801 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507555 disk_type:"nvme" - volume id:133806 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507096 disk_type:"nvme" - volume id:133807 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627506993 disk_type:"nvme" - volume id:133829 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507744 disk_type:"nvme" - volume id:133830 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627507364 disk_type:"nvme" - volume id:133850 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627507787 disk_type:"nvme" - volume id:133856 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507364 disk_type:"nvme" - volume id:133866 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507009 disk_type:"nvme" - volume id:133888 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507170 disk_type:"nvme" - volume id:133893 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507114 disk_type:"nvme" - volume id:133899 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" - volume id:133900 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507046 disk_type:"nvme" - volume id:133903 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507788 disk_type:"nvme" - volume id:133922 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507552 disk_type:"nvme" - volume id:133923 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507787 disk_type:"nvme" - volume id:133933 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507364 disk_type:"nvme" - volume id:133936 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507153 disk_type:"nvme" - volume id:133937 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507782 disk_type:"nvme" - volume id:133957 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507634 disk_type:"nvme" - volume id:133962 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507648 disk_type:"nvme" - volume id:133970 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507787 disk_type:"nvme" - volume id:133977 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507114 disk_type:"nvme" - volume id:133996 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507574 disk_type:"nvme" - volume id:133997 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507649 disk_type:"nvme" - volume id:134005 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627507648 disk_type:"nvme" - volume id:134006 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627507648 disk_type:"nvme" - Disk nvme total size:105852251944 file_count:63762 deleted_file:981 deleted_bytes:1614328027 - DataNode 10.244.11.35:8080 total size:105852251944 file_count:63762 deleted_file:981 deleted_bytes:1614328027 - DataNode 10.244.11.50:8080 nvme(volume:69/69 active:67 free:0 remote:0) - Disk nvme(volume:69/69 active:67 free:0 remote:0) - volume id:56 size:571720 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:835 version:3 compact_revision:8 modified_at_second:1627507798 disk_type:"nvme" - volume id:179 size:1109217312 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:640 version:3 modified_at_second:1623181587 disk_type:"nvme" - volume id:214 size:1167120904 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:565 version:3 modified_at_second:1623182362 disk_type:"nvme" - volume id:251 size:1123351664 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:552 version:3 modified_at_second:1623182621 disk_type:"nvme" - volume id:265 size:1110039368 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:539 version:3 modified_at_second:1623180975 disk_type:"nvme" - volume id:285 size:1128073600 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:546 version:3 modified_at_second:1623182798 disk_type:"nvme" - volume id:312 size:1150263504 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:582 version:3 modified_at_second:1623182048 disk_type:"nvme" - volume id:352 size:1102353264 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:529 version:3 modified_at_second:1623180892 disk_type:"nvme" - volume id:359 size:1139335592 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:549 version:3 modified_at_second:1623181386 disk_type:"nvme" - volume id:361 size:1165494896 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:563 version:3 modified_at_second:1623182289 disk_type:"nvme" - volume id:391 size:1137412944 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:543 version:3 modified_at_second:1623181294 disk_type:"nvme" - volume id:400 size:1135825296 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:548 version:3 modified_at_second:1623181701 disk_type:"nvme" - volume id:437 size:1134849896 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:548 version:3 modified_at_second:1623181886 disk_type:"nvme" - volume id:438 size:1103700792 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:532 version:3 modified_at_second:1623181497 disk_type:"nvme" - volume id:473 size:1113543640 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:553 version:3 modified_at_second:1623181081 disk_type:"nvme" - volume id:478 size:1126705440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:565 version:3 modified_at_second:1623181181 disk_type:"nvme" - volume id:559 size:1078866520 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:678 version:3 modified_at_second:1623180797 disk_type:"nvme" - volume id:560 size:1154208824 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:726 version:3 modified_at_second:1623182532 disk_type:"nvme" - volume id:565 size:907021680 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1411 version:3 modified_at_second:1623182131 disk_type:"nvme" - volume id:800 size:8 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" replica_placement:1 version:3 compact_revision:1 modified_at_second:1623182899 disk_type:"nvme" - volume id:810 size:71303432 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183787 disk_type:"nvme" - volume id:831 size:71303424 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:2 modified_at_second:1627500577 disk_type:"nvme" - volume id:832 size:109137960 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:3 modified_at_second:1627504759 disk_type:"nvme" - volume id:843 size:71303432 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183346 disk_type:"nvme" - volume id:855 size:134218040 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1623184455 disk_type:"nvme" - volume id:858 size:113246688 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1623183587 disk_type:"nvme" - volume id:861 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623184270 disk_type:"nvme" - volume id:885 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:3 modified_at_second:1623183222 disk_type:"nvme" - volume id:936 size:75497848 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:2 modified_at_second:1627500605 disk_type:"nvme" - volume id:964 size:75497848 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 delete_count:2 deleted_byte_count:8388670 version:3 compact_revision:1 modified_at_second:1627500575 disk_type:"nvme" - volume id:978 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:1 modified_at_second:1627504768 disk_type:"nvme" - volume id:990 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623183527 disk_type:"nvme" - volume id:999 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1623182824 disk_type:"nvme" - volume id:1058 size:20974301928 collection:"braingeneers-backups-swfs" file_count:12271 delete_count:226 deleted_byte_count:357273426 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1066 size:20983198856 collection:"braingeneers-backups-swfs" file_count:12295 delete_count:250 deleted_byte_count:377071913 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1070 size:20990443648 collection:"braingeneers-backups-swfs" file_count:12314 delete_count:243 deleted_byte_count:359409281 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1074 size:20973205968 collection:"braingeneers-backups-swfs" file_count:12296 delete_count:259 deleted_byte_count:436010847 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1689 size:86017768 file_count:28 version:3 modified_at_second:1627417983 disk_type:"nvme" - volume id:133794 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507153 disk_type:"nvme" - volume id:133796 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507046 disk_type:"nvme" - volume id:133803 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507649 disk_type:"nvme" - volume id:133804 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" - volume id:133821 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507170 disk_type:"nvme" - volume id:133822 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627507787 disk_type:"nvme" - volume id:133823 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" - volume id:133827 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" - volume id:133833 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507114 disk_type:"nvme" - volume id:133842 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507788 disk_type:"nvme" - volume id:133848 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507742 disk_type:"nvme" - volume id:133851 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" - volume id:133863 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" - volume id:133871 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" - volume id:133889 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507648 disk_type:"nvme" - volume id:133909 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507788 disk_type:"nvme" - volume id:133918 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507364 disk_type:"nvme" - volume id:133939 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507574 disk_type:"nvme" - volume id:133955 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" - volume id:133973 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" - volume id:133978 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627506993 disk_type:"nvme" - volume id:133981 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" - volume id:133983 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" - volume id:133987 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507744 disk_type:"nvme" - volume id:133988 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627506992 disk_type:"nvme" - volume id:133990 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" - volume id:134000 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507574 disk_type:"nvme" - volume id:134004 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507428 disk_type:"nvme" - volume id:134008 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507555 disk_type:"nvme" - volume id:134009 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507170 disk_type:"nvme" - volume id:134019 size:11910676920 collection:"hengenlab" file_count:4551 delete_count:759 deleted_byte_count:1984107610 version:3 modified_at_second:1627418220 disk_type:"nvme" - Disk nvme total size:117041884784 file_count:65804 deleted_file:1743 deleted_bytes:3539039087 - DataNode 10.244.11.50:8080 total size:117041884784 file_count:65804 deleted_file:1743 deleted_bytes:3539039087 - DataNode 10.244.11.52:8080 nvme(volume:69/69 active:18446744073709551613 free:0 remote:0) - Disk nvme(volume:69/69 active:18446744073709551613 free:0 remote:0) - volume id:5 size:867222824 file_count:5786 delete_count:1 deleted_byte_count:466 version:3 modified_at_second:1627416063 disk_type:"nvme" - volume id:51 size:3819480 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:10823 delete_count:9979 deleted_byte_count:2611708 version:3 compact_revision:6 modified_at_second:1627504769 disk_type:"nvme" - volume id:53 size:3907512 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:11182 delete_count:10273 deleted_byte_count:2626115 version:3 compact_revision:7 modified_at_second:1627504756 disk_type:"nvme" - volume id:156 size:1173203784 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:571 version:3 modified_at_second:1610491395 disk_type:"nvme" - volume id:165 size:1596585608 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:879 version:3 modified_at_second:1610491424 disk_type:"nvme" - volume id:169 size:1860837016 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:898 version:3 modified_at_second:1610491453 disk_type:"nvme" - volume id:211 size:1168359520 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:569 version:3 modified_at_second:1623182750 disk_type:"nvme" - volume id:243 size:1938336304 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:937 version:3 modified_at_second:1610496363 disk_type:"nvme" - volume id:290 size:1185325216 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:600 version:3 modified_at_second:1610496936 disk_type:"nvme" - volume id:294 size:1264804928 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:611 version:3 modified_at_second:1610497013 disk_type:"nvme" - volume id:313 size:1134907416 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:572 version:3 modified_at_second:1610497245 disk_type:"nvme" - volume id:314 size:1117357896 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:557 version:3 modified_at_second:1610497245 disk_type:"nvme" - volume id:331 size:1790162800 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:876 version:3 modified_at_second:1610497489 disk_type:"nvme" - volume id:387 size:1243238032 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:623 version:3 modified_at_second:1610498218 disk_type:"nvme" - volume id:402 size:1265153576 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:604 version:3 modified_at_second:1610498457 disk_type:"nvme" - volume id:405 size:1286493360 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:615 version:3 modified_at_second:1610498457 disk_type:"nvme" - volume id:411 size:1217380888 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:592 version:3 modified_at_second:1610498523 disk_type:"nvme" - volume id:443 size:1197826328 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:599 version:3 modified_at_second:1610498998 disk_type:"nvme" - volume id:495 size:1117441440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1161 version:3 modified_at_second:1610643719 disk_type:"nvme" - volume id:505 size:1214893912 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:682 version:3 modified_at_second:1610643815 disk_type:"nvme" - volume id:537 size:1286418000 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:653 version:3 modified_at_second:1610644085 disk_type:"nvme" - volume id:772 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1618444174 disk_type:"nvme" - volume id:774 size:138412488 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1618444167 disk_type:"nvme" - volume id:799 size:71303456 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:1 modified_at_second:1627504952 disk_type:"nvme" - volume id:807 size:109052376 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 delete_count:2 deleted_byte_count:8388677 version:3 compact_revision:1 modified_at_second:1627500582 disk_type:"nvme" - volume id:816 size:142606848 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:3 modified_at_second:1619387452 disk_type:"nvme" - volume id:845 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1618444179 disk_type:"nvme" - volume id:869 size:205521512 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:1 modified_at_second:1619387455 disk_type:"nvme" - volume id:886 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1617901709 disk_type:"nvme" - volume id:900 size:146801288 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:1 modified_at_second:1618444176 disk_type:"nvme" - volume id:901 size:71303408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1619387458 disk_type:"nvme" - volume id:953 size:138412488 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1618444190 disk_type:"nvme" - volume id:983 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1617901557 disk_type:"nvme" - volume id:993 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1617901738 disk_type:"nvme" - volume id:995 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:1 modified_at_second:1627500583 disk_type:"nvme" - volume id:1032 size:8 collection:"swfstest" version:3 modified_at_second:1613592642 disk_type:"nvme" - volume id:1034 size:314720 collection:"swfstest" file_count:1 version:3 modified_at_second:1615234671 disk_type:"nvme" - volume id:1036 size:8 collection:"swfstest" version:3 modified_at_second:1613592642 disk_type:"nvme" - volume id:1040 size:8 collection:"pvc-0544e3a6-da8f-42fe-a149-3a103bcc8552" version:3 modified_at_second:1615234634 disk_type:"nvme" - volume id:1108 size:20973179648 collection:"braingeneers-backups-swfs" file_count:12158 delete_count:244 deleted_byte_count:385586736 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1113 size:20973829552 collection:"braingeneers-backups-swfs" file_count:12295 delete_count:244 deleted_byte_count:373814340 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1118 size:20975423768 collection:"braingeneers-backups-swfs" file_count:12224 delete_count:241 deleted_byte_count:390765751 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1128 size:20973005760 collection:"braingeneers-backups-swfs" file_count:12190 delete_count:202 deleted_byte_count:344596437 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:133799 size:21750903688 collection:"hengenlab" file_count:8212 delete_count:8193 deleted_byte_count:21712289804 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" - volume id:133805 size:21273889584 collection:"hengenlab" file_count:8145 delete_count:8112 deleted_byte_count:21207557857 read_only:true version:3 modified_at_second:1627415108 disk_type:"nvme" - volume id:133838 size:21263362952 collection:"hengenlab" file_count:8081 delete_count:8049 deleted_byte_count:21206621302 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" - volume id:133840 size:21105726928 collection:"hengenlab" file_count:7979 delete_count:7955 deleted_byte_count:21053067891 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" - volume id:133843 size:21232229808 collection:"hengenlab" file_count:8165 delete_count:8136 deleted_byte_count:21165213558 read_only:true version:3 modified_at_second:1627415108 disk_type:"nvme" - volume id:133874 size:21388518216 collection:"hengenlab" file_count:8258 delete_count:8228 deleted_byte_count:21317668425 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" - volume id:133879 size:21308860696 collection:"hengenlab" file_count:8134 delete_count:8105 deleted_byte_count:21239616052 read_only:true version:3 modified_at_second:1627415108 disk_type:"nvme" - volume id:133891 size:21362969712 collection:"hengenlab" file_count:8224 delete_count:8191 deleted_byte_count:21288679522 read_only:true version:3 modified_at_second:1627415108 disk_type:"nvme" - volume id:133896 size:21320296680 collection:"hengenlab" file_count:8088 delete_count:8056 deleted_byte_count:21268045834 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" - volume id:133901 size:21452285712 collection:"hengenlab" file_count:8275 delete_count:8236 deleted_byte_count:21367797021 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" - volume id:133926 size:21496921192 collection:"hengenlab" file_count:8262 delete_count:8222 deleted_byte_count:21409836098 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" - volume id:133935 size:21569024976 collection:"hengenlab" file_count:8244 delete_count:8217 deleted_byte_count:21511029987 read_only:true version:3 modified_at_second:1627415106 disk_type:"nvme" - volume id:133943 size:21075121824 collection:"hengenlab" file_count:8036 delete_count:8003 deleted_byte_count:21024539839 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" - volume id:133950 size:21358468792 collection:"hengenlab" file_count:8146 delete_count:8124 deleted_byte_count:21307547425 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" - volume id:133954 size:21214186200 collection:"hengenlab" file_count:8146 delete_count:8117 deleted_byte_count:21148574345 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" - volume id:133963 size:21211632160 collection:"hengenlab" file_count:8117 delete_count:8080 deleted_byte_count:21136356572 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" - volume id:133974 size:21672456128 collection:"hengenlab" file_count:8256 delete_count:8229 deleted_byte_count:21621369690 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" - volume id:133976 size:21244430736 collection:"hengenlab" file_count:8169 delete_count:8151 deleted_byte_count:21202380779 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" - volume id:133982 size:21537083600 collection:"hengenlab" file_count:8294 delete_count:8263 deleted_byte_count:21478826246 read_only:true version:3 modified_at_second:1627415106 disk_type:"nvme" - volume id:133993 size:21564559944 collection:"hengenlab" file_count:8317 delete_count:8285 deleted_byte_count:21496628385 version:3 modified_at_second:1627504914 disk_type:"nvme" - volume id:133995 size:21423980504 collection:"hengenlab" file_count:8144 delete_count:8114 deleted_byte_count:21370150782 version:3 modified_at_second:1627504954 disk_type:"nvme" - volume id:134001 size:21561824664 collection:"hengenlab" file_count:8226 delete_count:8202 deleted_byte_count:21506874515 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" - volume id:134012 size:21315415112 collection:"hengenlab" file_count:8205 delete_count:8178 deleted_byte_count:21273728833 read_only:true version:3 modified_at_second:1627415108 disk_type:"nvme" - volume id:134017 size:21038970704 collection:"hengenlab" file_count:8041 delete_count:8019 deleted_byte_count:21006048043 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" - volume id:134021 size:21812890272 collection:"hengenlab" file_count:8169 delete_count:8146 deleted_byte_count:21758730994 read_only:true version:3 modified_at_second:1627415107 disk_type:"nvme" - volume id:246138 size:17534561016 collection:"hengenlab" file_count:6813 delete_count:4263 deleted_byte_count:11139431579 version:3 compact_revision:1 modified_at_second:1627607477 disk_type:"nvme" - Disk nvme total size:662392206984 file_count:300461 deleted_file:229062 deleted_bytes:545735390285 - DataNode 10.244.11.52:8080 total size:662392206984 file_count:300461 deleted_file:229062 deleted_bytes:545735390285 - DataNode 10.244.11.6:8080 nvme(volume:67/67 active:62 free:0 remote:0) - Disk nvme(volume:67/67 active:62 free:0 remote:0) - volume id:54 size:582088 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:866 version:3 compact_revision:7 modified_at_second:1627507800 disk_type:"nvme" - volume id:114 size:1177912456 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:600 version:3 compact_revision:2 modified_at_second:1623182645 disk_type:"nvme" - volume id:188 size:1121756368 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3593 version:3 modified_at_second:1623180997 disk_type:"nvme" - volume id:212 size:1085089760 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:525 version:3 modified_at_second:1623180819 disk_type:"nvme" - volume id:213 size:1093854120 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:533 version:3 modified_at_second:1623180866 disk_type:"nvme" - volume id:246 size:1131416216 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:569 version:3 modified_at_second:1623182775 disk_type:"nvme" - volume id:275 size:1110571296 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:535 version:3 modified_at_second:1623181614 disk_type:"nvme" - volume id:301 size:1146491504 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:550 version:3 modified_at_second:1623181914 disk_type:"nvme" - volume id:318 size:1161820360 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:580 version:3 modified_at_second:1623182159 disk_type:"nvme" - volume id:372 size:1109617464 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:534 version:3 modified_at_second:1623182389 disk_type:"nvme" - volume id:379 size:1130289520 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:563 version:3 modified_at_second:1623181676 disk_type:"nvme" - volume id:393 size:1093146672 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:521 version:3 modified_at_second:1623181269 disk_type:"nvme" - volume id:423 size:1161451208 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:556 version:3 modified_at_second:1623182020 disk_type:"nvme" - volume id:426 size:1105000584 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:534 version:3 modified_at_second:1623181408 disk_type:"nvme" - volume id:464 size:1159754728 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:570 version:3 modified_at_second:1623182262 disk_type:"nvme" - volume id:496 size:1156809856 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1127 version:3 modified_at_second:1623181470 disk_type:"nvme" - volume id:541 size:1125292336 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:557 version:3 modified_at_second:1623181059 disk_type:"nvme" - volume id:563 size:888898664 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1454 version:3 modified_at_second:1623182506 disk_type:"nvme" - volume id:566 size:848439816 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1364 version:3 modified_at_second:1623181207 disk_type:"nvme" - volume id:847 size:142606872 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1623184293 disk_type:"nvme" - volume id:870 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183901 disk_type:"nvme" - volume id:878 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1623182929 disk_type:"nvme" - volume id:913 size:176161392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:2 modified_at_second:1623184715 disk_type:"nvme" - volume id:914 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623183321 disk_type:"nvme" - volume id:939 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:1 modified_at_second:1627504756 disk_type:"nvme" - volume id:942 size:83886648 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1623184016 disk_type:"nvme" - volume id:943 size:75497848 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1623183611 disk_type:"nvme" - volume id:951 size:37748912 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623182985 disk_type:"nvme" - volume id:1005 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623182879 disk_type:"nvme" - volume id:1016 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1623183069 disk_type:"nvme" - volume id:1020 size:41943328 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183243 disk_type:"nvme" - volume id:1021 size:150995672 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1623184430 disk_type:"nvme" - volume id:1022 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183690 disk_type:"nvme" - volume id:1051 size:20975020608 collection:"braingeneers-backups-swfs" file_count:12343 delete_count:252 deleted_byte_count:417786404 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1067 size:20975862216 collection:"braingeneers-backups-swfs" file_count:12195 delete_count:239 deleted_byte_count:365540086 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1076 size:20973686664 collection:"braingeneers-backups-swfs" file_count:12181 delete_count:239 deleted_byte_count:386434480 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1101 size:20977481056 collection:"braingeneers-backups-swfs" file_count:12056 delete_count:235 deleted_byte_count:391033535 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1688 size:99418104 file_count:36 version:3 modified_at_second:1627079989 disk_type:"nvme" - volume id:133788 size:721435976 collection:"hengenlab" file_count:280 read_only:true version:3 compact_revision:1 modified_at_second:1627507172 disk_type:"nvme" - volume id:133790 size:760234520 collection:"hengenlab" file_count:302 read_only:true version:3 compact_revision:1 modified_at_second:1627507154 disk_type:"nvme" - volume id:133817 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507171 disk_type:"nvme" - volume id:133852 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507634 disk_type:"nvme" - volume id:133857 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507171 disk_type:"nvme" - volume id:133862 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507649 disk_type:"nvme" - volume id:133884 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507364 disk_type:"nvme" - volume id:133886 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507202 disk_type:"nvme" - volume id:133892 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507364 disk_type:"nvme" - volume id:133894 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507574 disk_type:"nvme" - volume id:133898 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" - volume id:133910 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" - volume id:133914 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507649 disk_type:"nvme" - volume id:133915 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" - volume id:133917 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507782 disk_type:"nvme" - volume id:133920 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507152 disk_type:"nvme" - volume id:133927 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507786 disk_type:"nvme" - volume id:133938 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507555 disk_type:"nvme" - volume id:133958 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507084 disk_type:"nvme" - volume id:133964 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507170 disk_type:"nvme" - volume id:133965 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507096 disk_type:"nvme" - volume id:133966 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627507788 disk_type:"nvme" - volume id:133968 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507783 disk_type:"nvme" - volume id:134007 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507635 disk_type:"nvme" - volume id:134010 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507555 disk_type:"nvme" - volume id:134014 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507009 disk_type:"nvme" - volume id:134015 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507046 disk_type:"nvme" - volume id:134020 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507555 disk_type:"nvme" - volume id:134032 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627507552 disk_type:"nvme" - Disk nvme total size:106360886704 file_count:65576 deleted_file:966 deleted_bytes:1564988840 - DataNode 10.244.11.6:8080 total size:106360886704 file_count:65576 deleted_file:966 deleted_bytes:1564988840 - DataNode 10.244.14.13:8080 nvme(volume:55/55 active:55 free:0 remote:0) - Disk nvme(volume:55/55 active:55 free:0 remote:0) - volume id:50 size:606568 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:875 version:3 compact_revision:8 modified_at_second:1627507801 disk_type:"nvme" - volume id:62 size:539952 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:845 version:3 compact_revision:8 modified_at_second:1627507800 disk_type:"nvme" - volume id:107 size:314720 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1 version:3 compact_revision:2 modified_at_second:1627507804 disk_type:"nvme" - volume id:187 size:1096273400 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3550 version:3 modified_at_second:1623181484 disk_type:"nvme" - volume id:225 size:1132809152 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:541 version:3 modified_at_second:1623181070 disk_type:"nvme" - volume id:240 size:1087756960 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:530 version:3 modified_at_second:1623180808 disk_type:"nvme" - volume id:241 size:1115629952 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:537 version:3 modified_at_second:1623182518 disk_type:"nvme" - volume id:256 size:1180952408 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:577 version:3 modified_at_second:1623182034 disk_type:"nvme" - volume id:260 size:1140938104 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:565 version:3 modified_at_second:1623181689 disk_type:"nvme" - volume id:280 size:1161495456 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:560 version:3 modified_at_second:1623182276 disk_type:"nvme" - volume id:332 size:1143200456 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:561 version:3 modified_at_second:1623181281 disk_type:"nvme" - volume id:375 size:1126027536 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:541 version:3 modified_at_second:1623182634 disk_type:"nvme" - volume id:417 size:1113452152 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:542 version:3 modified_at_second:1623180986 disk_type:"nvme" - volume id:421 size:1155229640 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:553 version:3 modified_at_second:1623181397 disk_type:"nvme" - volume id:442 size:1133829768 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:549 version:3 modified_at_second:1623181600 disk_type:"nvme" - volume id:462 size:1151065072 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:577 version:3 modified_at_second:1623182376 disk_type:"nvme" - volume id:465 size:1188575600 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:569 version:3 modified_at_second:1623182145 disk_type:"nvme" - volume id:482 size:1174497216 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:578 version:3 modified_at_second:1623181900 disk_type:"nvme" - volume id:484 size:1103270248 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:542 version:3 modified_at_second:1623182786 disk_type:"nvme" - volume id:535 size:1094099840 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:535 version:3 modified_at_second:1623180878 disk_type:"nvme" - volume id:738 size:117441120 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:2 modified_at_second:1627504861 disk_type:"nvme" - volume id:750 size:71303424 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1627507793 disk_type:"nvme" - volume id:768 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183232 disk_type:"nvme" - volume id:787 size:104857976 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:1 modified_at_second:1627504767 disk_type:"nvme" - volume id:791 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183799 disk_type:"nvme" - volume id:794 size:37748888 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1623183153 disk_type:"nvme" - volume id:828 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1623182834 disk_type:"nvme" - volume id:848 size:205521512 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:1 modified_at_second:1623184727 disk_type:"nvme" - volume id:865 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623183913 disk_type:"nvme" - volume id:899 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623184558 disk_type:"nvme" - volume id:903 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623182997 disk_type:"nvme" - volume id:906 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1623183416 disk_type:"nvme" - volume id:907 size:75497848 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:1 modified_at_second:1627504765 disk_type:"nvme" - volume id:910 size:71303400 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:2 modified_at_second:1627504866 disk_type:"nvme" - volume id:945 size:41943328 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623182919 disk_type:"nvme" - volume id:979 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623184004 disk_type:"nvme" - volume id:991 size:8 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" replica_placement:1 version:3 compact_revision:1 modified_at_second:1623182889 disk_type:"nvme" - volume id:1007 size:109052368 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1623183517 disk_type:"nvme" - volume id:1010 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:3 modified_at_second:1627507794 disk_type:"nvme" - volume id:1013 size:75497816 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623183059 disk_type:"nvme" - volume id:1057 size:20978064192 collection:"braingeneers-backups-swfs" file_count:12314 delete_count:266 deleted_byte_count:429920466 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1071 size:20983645528 collection:"braingeneers-backups-swfs" file_count:12232 delete_count:226 deleted_byte_count:337465633 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1085 size:20980098720 collection:"braingeneers-backups-swfs" file_count:12199 delete_count:219 deleted_byte_count:351274345 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1107 size:20976787256 collection:"braingeneers-backups-swfs" file_count:12172 delete_count:234 deleted_byte_count:390347084 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:246219 size:21568158600 collection:"hengenlab" file_count:8212 read_only:true version:3 modified_at_second:1627421476 disk_type:"nvme" - volume id:246280 size:21407063640 collection:"hengenlab" file_count:8202 read_only:true version:3 modified_at_second:1627424647 disk_type:"nvme" - volume id:246329 size:21804618416 collection:"hengenlab" file_count:7699 delete_count:45 deleted_byte_count:188745804 version:3 modified_at_second:1627427159 disk_type:"nvme" - volume id:246345 size:21686381280 collection:"hengenlab" file_count:7709 delete_count:114 deleted_byte_count:412094707 version:3 modified_at_second:1627427893 disk_type:"nvme" - volume id:246435 size:21127287088 collection:"hengenlab" file_count:8059 version:3 modified_at_second:1627432819 disk_type:"nvme" - volume id:246439 size:21187939544 collection:"hengenlab" file_count:8060 version:3 modified_at_second:1627433637 disk_type:"nvme" - volume id:246465 size:21302108360 collection:"hengenlab" file_count:8110 version:3 modified_at_second:1627435459 disk_type:"nvme" - volume id:246467 size:21106211024 collection:"hengenlab" file_count:7989 version:3 modified_at_second:1627435443 disk_type:"nvme" - volume id:246500 size:21299912208 collection:"hengenlab" file_count:8139 version:3 modified_at_second:1627437468 disk_type:"nvme" - volume id:246529 size:21387182640 collection:"hengenlab" file_count:7596 delete_count:1362 deleted_byte_count:5033550990 version:3 modified_at_second:1627521905 disk_type:"nvme" - volume id:246537 size:2061659304 collection:"hengenlab" file_count:789 version:3 compact_revision:1 modified_at_second:1627528630 disk_type:"nvme" - Disk nvme total size:320705385640 file_count:143670 deleted_file:2470 deleted_bytes:7160176376 - DataNode 10.244.14.13:8080 total size:320705385640 file_count:143670 deleted_file:2470 deleted_bytes:7160176376 - DataNode 10.244.14.16:8080 nvme(volume:51/51 active:51 free:0 remote:0) - Disk nvme(volume:51/51 active:51 free:0 remote:0) - volume id:30 size:648000 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:902 version:3 compact_revision:7 modified_at_second:1627505190 disk_type:"nvme" - volume id:32 size:564624 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:842 version:3 compact_revision:7 modified_at_second:1627500691 disk_type:"nvme" - volume id:161 size:1513609624 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:842 version:3 modified_at_second:1610491424 disk_type:"nvme" - volume id:185 size:1115169696 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3651 version:3 modified_at_second:1623182480 disk_type:"nvme" - volume id:186 size:1117871912 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3492 version:3 modified_at_second:1623182672 disk_type:"nvme" - volume id:208 size:1122742344 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:537 version:3 modified_at_second:1610494885 disk_type:"nvme" - volume id:210 size:1144331496 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:557 version:3 modified_at_second:1610495937 disk_type:"nvme" - volume id:239 size:1088423064 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:528 version:3 modified_at_second:1623182686 disk_type:"nvme" - volume id:242 size:1157461608 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:563 version:3 modified_at_second:1610496354 disk_type:"nvme" - volume id:261 size:1368092280 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:678 version:3 modified_at_second:1610496544 disk_type:"nvme" - volume id:267 size:1222228680 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:587 version:3 modified_at_second:1610496631 disk_type:"nvme" - volume id:295 size:1310628488 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:634 version:3 modified_at_second:1610497013 disk_type:"nvme" - volume id:335 size:1133122320 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:556 version:3 modified_at_second:1610497554 disk_type:"nvme" - volume id:370 size:1108723656 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:531 version:3 modified_at_second:1610497955 disk_type:"nvme" - volume id:414 size:1503127160 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:728 version:3 modified_at_second:1610498598 disk_type:"nvme" - volume id:451 size:1369016200 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:656 version:3 modified_at_second:1610499083 disk_type:"nvme" - volume id:479 size:1109948384 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:551 version:3 modified_at_second:1610499500 disk_type:"nvme" - volume id:486 size:1155571464 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:558 version:3 modified_at_second:1610499565 disk_type:"nvme" - volume id:508 size:1269203968 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:714 version:3 modified_at_second:1610643815 disk_type:"nvme" - volume id:532 size:1229401224 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:649 version:3 modified_at_second:1610644025 disk_type:"nvme" - volume id:603 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627500690 disk_type:"nvme" - volume id:640 size:8388808 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627500690 disk_type:"nvme" - volume id:723 size:201327112 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1617901713 disk_type:"nvme" - volume id:724 size:138412472 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1618444183 disk_type:"nvme" - volume id:735 size:146801240 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:2 modified_at_second:1619387461 disk_type:"nvme" - volume id:756 size:306185064 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:10 version:3 compact_revision:1 modified_at_second:1618444172 disk_type:"nvme" - volume id:767 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1617901606 disk_type:"nvme" - volume id:778 size:109052368 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1618444189 disk_type:"nvme" - volume id:809 size:37748912 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1619387464 disk_type:"nvme" - volume id:812 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1617901679 disk_type:"nvme" - volume id:817 size:205521504 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:2 modified_at_second:1623184210 disk_type:"nvme" - volume id:873 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1618444187 disk_type:"nvme" - volume id:883 size:109052376 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:1 modified_at_second:1627504925 disk_type:"nvme" - volume id:884 size:171966992 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1619387463 disk_type:"nvme" - volume id:893 size:8 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" version:3 compact_revision:2 modified_at_second:1612586373 disk_type:"nvme" - volume id:898 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623184398 disk_type:"nvme" - volume id:971 size:138412488 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1618444168 disk_type:"nvme" - volume id:972 size:138582776 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1623184122 disk_type:"nvme" - volume id:981 size:142606800 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1619387449 disk_type:"nvme" - volume id:1000 size:104857952 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623184677 disk_type:"nvme" - volume id:1073 size:20974354856 collection:"braingeneers-backups-swfs" file_count:12217 delete_count:265 deleted_byte_count:434691544 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1078 size:20971811752 collection:"braingeneers-backups-swfs" file_count:12332 delete_count:237 deleted_byte_count:394927193 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1109 size:20972641960 collection:"braingeneers-backups-swfs" file_count:12269 delete_count:242 deleted_byte_count:399545377 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1115 size:20982669168 collection:"braingeneers-backups-swfs" file_count:12209 delete_count:233 deleted_byte_count:385827098 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:246181 size:21492162832 collection:"hengenlab" file_count:8199 delete_count:1 deleted_byte_count:4194325 version:3 modified_at_second:1627504749 disk_type:"nvme" - volume id:246196 size:21810328512 collection:"hengenlab" file_count:8345 read_only:true version:3 modified_at_second:1627419331 disk_type:"nvme" - volume id:246308 size:22074879448 collection:"hengenlab" file_count:8483 version:3 modified_at_second:1627426119 disk_type:"nvme" - volume id:246314 size:22754854488 collection:"hengenlab" file_count:8677 version:3 modified_at_second:1627426211 disk_type:"nvme" - volume id:246442 size:21077837888 collection:"hengenlab" file_count:8039 version:3 modified_at_second:1627433651 disk_type:"nvme" - volume id:246473 size:587394360 collection:"hengenlab" file_count:227 version:3 modified_at_second:1627435784 disk_type:"nvme" - volume id:246475 size:713161392 collection:"hengenlab" file_count:268 version:3 modified_at_second:1627435784 disk_type:"nvme" - Disk nvme total size:218759028160 file_count:110110 deleted_file:979 deleted_bytes:1623379879 - DataNode 10.244.14.16:8080 total size:218759028160 file_count:110110 deleted_file:979 deleted_bytes:1623379879 - DataNode 10.244.14.38:8080 nvme(volume:48/48 active:48 free:0 remote:0) - Disk nvme(volume:48/48 active:48 free:0 remote:0) - volume id:46 size:588904 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:914 version:3 compact_revision:7 modified_at_second:1627505190 disk_type:"nvme" - volume id:67 size:607952 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:865 version:3 compact_revision:8 modified_at_second:1627507800 disk_type:"nvme" - volume id:82 size:624632 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:882 version:3 compact_revision:6 modified_at_second:1627507799 disk_type:"nvme" - volume id:151 size:1557314160 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:823 version:3 modified_at_second:1610491378 disk_type:"nvme" - volume id:173 size:1262093040 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:788 version:3 modified_at_second:1610491476 disk_type:"nvme" - volume id:181 size:1208448816 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:717 version:3 modified_at_second:1623182415 disk_type:"nvme" - volume id:262 size:1179347032 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:588 version:3 modified_at_second:1623182067 disk_type:"nvme" - volume id:266 size:1160008976 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:556 version:3 modified_at_second:1623182811 disk_type:"nvme" - volume id:311 size:1115993712 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:562 version:3 modified_at_second:1610497245 disk_type:"nvme" - volume id:363 size:1209730440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:582 version:3 modified_at_second:1610497862 disk_type:"nvme" - volume id:431 size:1126797960 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:555 version:3 modified_at_second:1623181873 disk_type:"nvme" - volume id:433 size:1209883088 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:591 version:3 modified_at_second:1623182608 disk_type:"nvme" - volume id:434 size:1167964704 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:569 version:3 modified_at_second:1610498827 disk_type:"nvme" - volume id:466 size:1170821024 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:575 version:3 modified_at_second:1623182429 disk_type:"nvme" - volume id:477 size:1112893904 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:555 version:3 modified_at_second:1610499421 disk_type:"nvme" - volume id:494 size:1154467824 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1137 version:3 modified_at_second:1610643725 disk_type:"nvme" - volume id:499 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:3 modified_at_second:1627507790 disk_type:"nvme" - volume id:534 size:1326592720 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:671 version:3 modified_at_second:1610644085 disk_type:"nvme" - volume id:547 size:1189140320 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:660 version:3 modified_at_second:1610644201 disk_type:"nvme" - volume id:549 size:1182767848 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:646 version:3 modified_at_second:1610644201 disk_type:"nvme" - volume id:567 size:913832888 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1438 version:3 modified_at_second:1623182236 disk_type:"nvme" - volume id:576 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1627507797 disk_type:"nvme" - volume id:616 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507796 disk_type:"nvme" - volume id:733 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1618444177 disk_type:"nvme" - volume id:792 size:167772560 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1623183949 disk_type:"nvme" - volume id:803 size:79692208 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:3 modified_at_second:1623183775 disk_type:"nvme" - volume id:814 size:150996760 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:9 version:3 compact_revision:2 modified_at_second:1623184502 disk_type:"nvme" - volume id:849 size:201327080 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1617901727 disk_type:"nvme" - volume id:851 size:109052368 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 delete_count:2 deleted_byte_count:8388670 version:3 compact_revision:1 modified_at_second:1627500577 disk_type:"nvme" - volume id:904 size:8 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" version:3 compact_revision:1 modified_at_second:1612382093 disk_type:"nvme" - volume id:926 size:138412400 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1623184109 disk_type:"nvme" - volume id:947 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:2 modified_at_second:1627504950 disk_type:"nvme" - volume id:980 size:138412472 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1623183938 disk_type:"nvme" - volume id:984 size:37748912 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623184386 disk_type:"nvme" - volume id:1004 size:134218040 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1623184665 disk_type:"nvme" - volume id:1028 size:142606840 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1623184223 disk_type:"nvme" - volume id:1046 size:8 collection:"pvc-73532100-54aa-469c-b8a7-1774be8c3b9e" version:3 compact_revision:3 modified_at_second:1625624761 disk_type:"nvme" - volume id:1050 size:20983327888 collection:"braingeneers-backups-swfs" file_count:12264 delete_count:230 deleted_byte_count:370961817 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1059 size:20995125632 collection:"braingeneers-backups-swfs" file_count:12209 delete_count:228 deleted_byte_count:354199353 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1063 size:20975272200 collection:"braingeneers-backups-swfs" file_count:12222 delete_count:239 deleted_byte_count:372617511 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1104 size:20971935200 collection:"braingeneers-backups-swfs" file_count:12292 delete_count:231 deleted_byte_count:350682314 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:246179 size:21257143840 collection:"hengenlab" file_count:8030 delete_count:1 deleted_byte_count:1048597 version:3 modified_at_second:1627500588 disk_type:"nvme" - volume id:246180 size:21162493216 collection:"hengenlab" file_count:8052 read_only:true version:3 modified_at_second:1627418743 disk_type:"nvme" - volume id:246188 size:21060079488 collection:"hengenlab" file_count:8045 read_only:true version:3 modified_at_second:1627418950 disk_type:"nvme" - volume id:246214 size:21471574352 collection:"hengenlab" file_count:8202 read_only:true version:3 modified_at_second:1627421176 disk_type:"nvme" - volume id:246286 size:21733675264 collection:"hengenlab" file_count:8331 read_only:true version:3 modified_at_second:1627424954 disk_type:"nvme" - volume id:246342 size:21201042600 collection:"hengenlab" file_count:7543 delete_count:192 deleted_byte_count:478154688 version:3 modified_at_second:1627427872 disk_type:"nvme" - volume id:246355 size:3325961784 collection:"hengenlab" file_count:1300 delete_count:24 deleted_byte_count:100664436 version:3 modified_at_second:1627500603 disk_type:"nvme" - Disk nvme total size:236842981136 file_count:113225 deleted_file:1148 deleted_bytes:2040911721 - DataNode 10.244.14.38:8080 total size:236842981136 file_count:113225 deleted_file:1148 deleted_bytes:2040911721 - DataNode 10.244.14.40:8080 nvme(volume:48/48 active:48 free:0 remote:0) - Disk nvme(volume:48/48 active:48 free:0 remote:0) - volume id:44 size:532120 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:847 version:3 compact_revision:8 modified_at_second:1627507799 disk_type:"nvme" - volume id:69 size:595808 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:852 version:3 compact_revision:7 modified_at_second:1627507798 disk_type:"nvme" - volume id:118 size:1179638096 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:601 version:3 compact_revision:2 modified_at_second:1610643741 disk_type:"nvme" - volume id:149 size:1504362152 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:800 version:3 modified_at_second:1610491378 disk_type:"nvme" - volume id:180 size:1214354616 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:738 version:3 modified_at_second:1610494389 disk_type:"nvme" - volume id:194 size:1251697440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3397 version:3 modified_at_second:1610494777 disk_type:"nvme" - volume id:198 size:1170992464 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:588 version:3 modified_at_second:1610494836 disk_type:"nvme" - volume id:199 size:1186136184 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:602 version:3 modified_at_second:1610494836 disk_type:"nvme" - volume id:218 size:1257822856 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:604 version:3 modified_at_second:1610496071 disk_type:"nvme" - volume id:221 size:1220325024 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:586 version:3 modified_at_second:1610496168 disk_type:"nvme" - volume id:248 size:1141899112 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:578 version:3 modified_at_second:1610496421 disk_type:"nvme" - volume id:334 size:1167170624 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:578 version:3 modified_at_second:1610497477 disk_type:"nvme" - volume id:338 size:1203090488 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:591 version:3 modified_at_second:1610497560 disk_type:"nvme" - volume id:343 size:1252389264 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:626 version:3 modified_at_second:1610497637 disk_type:"nvme" - volume id:366 size:1131643384 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:541 version:3 modified_at_second:1610497954 disk_type:"nvme" - volume id:491 size:1132250216 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1124 version:3 modified_at_second:1610643725 disk_type:"nvme" - volume id:510 size:1150974464 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:593 version:3 modified_at_second:1610643888 disk_type:"nvme" - volume id:512 size:1198198728 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:619 version:3 modified_at_second:1610643888 disk_type:"nvme" - volume id:513 size:1156946392 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:596 version:3 modified_at_second:1610643888 disk_type:"nvme" - volume id:548 size:1158916552 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:635 version:3 modified_at_second:1610644201 disk_type:"nvme" - volume id:556 size:1159536984 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:669 version:3 modified_at_second:1610644260 disk_type:"nvme" - volume id:602 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507793 disk_type:"nvme" - volume id:629 size:12583192 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1627507798 disk_type:"nvme" - volume id:652 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507790 disk_type:"nvme" - volume id:684 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507798 disk_type:"nvme" - volume id:716 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1627507794 disk_type:"nvme" - volume id:717 size:113246768 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1627507796 disk_type:"nvme" - volume id:726 size:138412448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1619387469 disk_type:"nvme" - volume id:742 size:134218088 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1617901677 disk_type:"nvme" - volume id:743 size:134218064 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1617901660 disk_type:"nvme" - volume id:777 size:138412472 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1619387462 disk_type:"nvme" - volume id:806 size:142606896 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:1 modified_at_second:1627504767 disk_type:"nvme" - volume id:819 size:109052360 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:1 modified_at_second:1627504744 disk_type:"nvme" - volume id:839 size:117276912 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1613770290 disk_type:"nvme" - volume id:841 size:176161392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:1 modified_at_second:1619387466 disk_type:"nvme" - volume id:929 size:239076048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1618444184 disk_type:"nvme" - volume id:1009 size:109052352 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1619387455 disk_type:"nvme" - volume id:1019 size:113246768 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1618444182 disk_type:"nvme" - volume id:1024 size:159384496 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:10 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:1 modified_at_second:1627500595 disk_type:"nvme" - volume id:1053 size:20978356456 collection:"braingeneers-backups-swfs" file_count:12212 delete_count:225 deleted_byte_count:358144375 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1055 size:20979735904 collection:"braingeneers-backups-swfs" file_count:12318 delete_count:218 deleted_byte_count:354130118 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1062 size:20986883784 collection:"braingeneers-backups-swfs" file_count:12136 delete_count:246 deleted_byte_count:397472684 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1123 size:20972215416 collection:"braingeneers-backups-swfs" file_count:12211 delete_count:227 deleted_byte_count:378646248 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:246213 size:21782268984 collection:"hengenlab" file_count:8350 read_only:true version:3 modified_at_second:1627421176 disk_type:"nvme" - volume id:246287 size:21163284272 collection:"hengenlab" file_count:8046 read_only:true version:3 modified_at_second:1627424941 disk_type:"nvme" - volume id:246357 size:21156503440 collection:"hengenlab" file_count:7702 delete_count:43 deleted_byte_count:176380261 version:3 modified_at_second:1627504939 disk_type:"nvme" - volume id:246488 size:21362137136 collection:"hengenlab" file_count:8153 version:3 modified_at_second:1627436797 disk_type:"nvme" - volume id:246578 size:4211530048 collection:"hengenlab" file_count:1619 version:3 modified_at_second:1627439154 disk_type:"nvme" - Disk nvme total size:198319668800 file_count:99595 deleted_file:962 deleted_bytes:1677356712 - DataNode 10.244.14.40:8080 total size:198319668800 file_count:99595 deleted_file:962 deleted_bytes:1677356712 - DataNode 10.244.14.42:8080 nvme(volume:53/53 active:53 free:0 remote:0) - Disk nvme(volume:53/53 active:53 free:0 remote:0) - volume id:34 size:559192 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:868 version:3 compact_revision:7 modified_at_second:1627507798 disk_type:"nvme" - volume id:72 size:535304 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:858 version:3 compact_revision:6 modified_at_second:1627507800 disk_type:"nvme" - volume id:113 size:1232309792 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:629 version:3 compact_revision:2 modified_at_second:1610643741 disk_type:"nvme" - volume id:122 size:12583192 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:3 modified_at_second:1627507797 disk_type:"nvme" - volume id:139 size:1565810440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:2438 delete_count:1883 deleted_byte_count:408258526 version:3 modified_at_second:1610491323 disk_type:"nvme" - volume id:148 size:1689304736 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:874 version:3 modified_at_second:1610491353 disk_type:"nvme" - volume id:152 size:1572132664 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:851 version:3 modified_at_second:1610491378 disk_type:"nvme" - volume id:154 size:1423748440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:750 version:3 modified_at_second:1610491378 disk_type:"nvme" - volume id:162 size:1466592168 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:826 version:3 modified_at_second:1610491424 disk_type:"nvme" - volume id:202 size:1216812728 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:616 version:3 modified_at_second:1610494836 disk_type:"nvme" - volume id:209 size:1392406504 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:673 version:3 modified_at_second:1610495945 disk_type:"nvme" - volume id:216 size:1187489448 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:571 version:3 modified_at_second:1610496064 disk_type:"nvme" - volume id:258 size:1285514928 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:636 version:3 modified_at_second:1610496544 disk_type:"nvme" - volume id:259 size:1418767640 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:708 version:3 modified_at_second:1610496544 disk_type:"nvme" - volume id:291 size:1205796160 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:600 version:3 modified_at_second:1610496936 disk_type:"nvme" - volume id:317 size:1197451080 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:602 version:3 modified_at_second:1610497331 disk_type:"nvme" - volume id:339 size:1198784320 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:588 version:3 modified_at_second:1610497560 disk_type:"nvme" - volume id:386 size:1255099232 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:631 version:3 modified_at_second:1610498218 disk_type:"nvme" - volume id:447 size:1200800168 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:599 version:3 modified_at_second:1610498999 disk_type:"nvme" - volume id:452 size:1312230328 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:629 version:3 modified_at_second:1610499083 disk_type:"nvme" - volume id:460 size:1303078744 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:645 version:3 modified_at_second:1610499157 disk_type:"nvme" - volume id:474 size:1887242272 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:925 version:3 modified_at_second:1610499431 disk_type:"nvme" - volume id:501 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:3 modified_at_second:1627507790 disk_type:"nvme" - volume id:530 size:1253806728 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:669 version:3 modified_at_second:1610644025 disk_type:"nvme" - volume id:581 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1627507794 disk_type:"nvme" - volume id:592 size:12583192 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1627507790 disk_type:"nvme" - volume id:593 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" - volume id:594 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" - volume id:597 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507797 disk_type:"nvme" - volume id:600 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" - volume id:606 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507794 disk_type:"nvme" - volume id:620 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507791 disk_type:"nvme" - volume id:663 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507793 disk_type:"nvme" - volume id:668 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507792 disk_type:"nvme" - volume id:719 size:159484792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:21072287 version:3 compact_revision:1 modified_at_second:1619387463 disk_type:"nvme" - volume id:763 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1618444180 disk_type:"nvme" - volume id:867 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:1 modified_at_second:1627500602 disk_type:"nvme" - volume id:891 size:244264328 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:10 version:3 compact_revision:2 modified_at_second:1619387474 disk_type:"nvme" - volume id:962 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1618444185 disk_type:"nvme" - volume id:975 size:71303432 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1619387462 disk_type:"nvme" - volume id:1035 size:2256 collection:"swfstest" file_count:1 version:3 modified_at_second:1613592642 disk_type:"nvme" - volume id:1039 size:314720 collection:"pvc-0544e3a6-da8f-42fe-a149-3a103bcc8552" file_count:1 version:3 modified_at_second:1615234636 disk_type:"nvme" - volume id:1098 size:20973674480 collection:"braingeneers-backups-swfs" file_count:12287 delete_count:227 deleted_byte_count:363217189 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1117 size:20976367656 collection:"braingeneers-backups-swfs" file_count:12224 delete_count:229 deleted_byte_count:381874187 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1137 size:20972013512 collection:"braingeneers-backups-swfs" file_count:12286 delete_count:223 deleted_byte_count:353515699 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1144 size:20980307664 collection:"braingeneers-backups-swfs" file_count:12301 delete_count:235 deleted_byte_count:370673355 version:3 compact_revision:2 modified_at_second:1627607153 disk_type:"nvme" - volume id:1645 size:8913611152 collection:"hengenlab" file_count:3433 version:3 compact_revision:4 modified_at_second:1627507573 disk_type:"nvme" - volume id:246364 size:21112377664 collection:"hengenlab" file_count:7936 delete_count:40 deleted_byte_count:167773973 version:3 modified_at_second:1627428720 disk_type:"nvme" - volume id:246370 size:21082313784 collection:"hengenlab" file_count:8692 delete_count:3 deleted_byte_count:12583023 version:3 modified_at_second:1627429075 disk_type:"nvme" - volume id:246422 size:21207507408 collection:"hengenlab" file_count:8115 version:3 modified_at_second:1627432018 disk_type:"nvme" - volume id:246457 size:21273517664 collection:"hengenlab" file_count:8120 version:3 modified_at_second:1627434466 disk_type:"nvme" - volume id:246458 size:21393938840 collection:"hengenlab" file_count:8159 version:3 modified_at_second:1627434473 disk_type:"nvme" - volume id:246587 size:6317115064 collection:"hengenlab" file_count:2412 version:3 modified_at_second:1627439213 disk_type:"nvme" - Disk nvme total size:233296711568 file_count:113200 deleted_file:2842 deleted_bytes:2083162574 - DataNode 10.244.14.42:8080 total size:233296711568 file_count:113200 deleted_file:2842 deleted_bytes:2083162574 - DataNode 10.244.14.54:8080 nvme(volume:49/49 active:49 free:0 remote:0) - Disk nvme(volume:49/49 active:49 free:0 remote:0) - volume id:65 size:592296 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:874 version:3 compact_revision:8 modified_at_second:1627507800 disk_type:"nvme" - volume id:68 size:550704 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:855 version:3 compact_revision:8 modified_at_second:1627507798 disk_type:"nvme" - volume id:115 size:1296619736 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:698 version:3 compact_revision:2 modified_at_second:1610643650 disk_type:"nvme" - volume id:120 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:4 modified_at_second:1627507792 disk_type:"nvme" - volume id:123 size:144 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:3 modified_at_second:1627507790 disk_type:"nvme" - volume id:133 size:8 collection:".DS_Store" version:3 compact_revision:1 modified_at_second:1610394116 disk_type:"nvme" - volume id:135 size:8 collection:".DS_Store" version:3 modified_at_second:1610069605 disk_type:"nvme" - volume id:175 size:1122297720 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:700 version:3 compact_revision:1 modified_at_second:1627507803 disk_type:"nvme" - volume id:191 size:1245408440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3312 version:3 modified_at_second:1610494777 disk_type:"nvme" - volume id:206 size:1254471552 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:602 version:3 modified_at_second:1610494893 disk_type:"nvme" - volume id:236 size:1214762280 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:582 version:3 modified_at_second:1610496298 disk_type:"nvme" - volume id:238 size:1283041256 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:615 version:3 modified_at_second:1610496298 disk_type:"nvme" - volume id:245 size:1265549600 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:645 version:3 modified_at_second:1610496421 disk_type:"nvme" - volume id:254 size:1250499056 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:607 version:3 modified_at_second:1610496480 disk_type:"nvme" - volume id:297 size:1283466864 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:622 version:3 modified_at_second:1610497013 disk_type:"nvme" - volume id:337 size:1167874736 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:574 version:3 modified_at_second:1610497560 disk_type:"nvme" - volume id:348 size:1184975696 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:568 version:3 modified_at_second:1610497700 disk_type:"nvme" - volume id:406 size:1185077976 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:566 version:3 modified_at_second:1610498457 disk_type:"nvme" - volume id:413 size:1445852896 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:702 version:3 modified_at_second:1610498598 disk_type:"nvme" - volume id:448 size:1198099808 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:598 version:3 modified_at_second:1610498999 disk_type:"nvme" - volume id:471 size:1251064952 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:674 version:3 modified_at_second:1610499335 disk_type:"nvme" - volume id:472 size:1250977184 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:660 version:3 modified_at_second:1610499335 disk_type:"nvme" - volume id:514 size:1262797752 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:661 version:3 modified_at_second:1610643888 disk_type:"nvme" - volume id:544 size:1193792688 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:585 version:3 modified_at_second:1610644140 disk_type:"nvme" - volume id:545 size:1240097296 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:681 version:3 modified_at_second:1610644201 disk_type:"nvme" - volume id:635 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" - volume id:643 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507791 disk_type:"nvme" - volume id:644 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507791 disk_type:"nvme" - volume id:658 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507794 disk_type:"nvme" - volume id:685 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" - volume id:690 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507792 disk_type:"nvme" - volume id:701 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" - volume id:710 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507798 disk_type:"nvme" - volume id:721 size:176181264 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:1 modified_at_second:1618444188 disk_type:"nvme" - volume id:744 size:180355792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:1 modified_at_second:1619387456 disk_type:"nvme" - volume id:805 size:234881624 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:2 modified_at_second:1617901683 disk_type:"nvme" - volume id:820 size:205521528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:1 modified_at_second:1627500582 disk_type:"nvme" - volume id:821 size:215866544 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1619387465 disk_type:"nvme" - volume id:856 size:188744560 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:10 delete_count:2 deleted_byte_count:8388677 version:3 compact_revision:2 modified_at_second:1627500585 disk_type:"nvme" - volume id:1089 size:20983270464 collection:"braingeneers-backups-swfs" file_count:12230 delete_count:236 deleted_byte_count:367424623 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1114 size:20974105816 collection:"braingeneers-backups-swfs" file_count:12247 delete_count:242 deleted_byte_count:379897789 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1121 size:20974478768 collection:"braingeneers-backups-swfs" file_count:12198 delete_count:223 deleted_byte_count:357455804 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1142 size:20981836200 collection:"braingeneers-backups-swfs" file_count:12177 delete_count:236 deleted_byte_count:361487567 version:3 compact_revision:2 modified_at_second:1627607153 disk_type:"nvme" - volume id:1643 size:8931501032 collection:"hengenlab" file_count:3424 version:3 compact_revision:4 modified_at_second:1627507114 disk_type:"nvme" - volume id:246257 size:21208314368 collection:"hengenlab" file_count:8148 read_only:true version:3 modified_at_second:1627423488 disk_type:"nvme" - volume id:246361 size:21246477600 collection:"hengenlab" file_count:7577 delete_count:74 deleted_byte_count:310381990 version:3 modified_at_second:1627428479 disk_type:"nvme" - volume id:246437 size:19655019848 collection:"hengenlab" file_count:7518 version:3 modified_at_second:1627432971 disk_type:"nvme" - volume id:246443 size:217060280 collection:"hengenlab" file_count:90 version:3 modified_at_second:1627432971 disk_type:"nvme" - volume id:246444 size:210768488 collection:"hengenlab" file_count:84 version:3 modified_at_second:1627432971 disk_type:"nvme" - Disk nvme total size:180228393200 file_count:92134 deleted_file:1014 deleted_bytes:1789230792 - DataNode 10.244.14.54:8080 total size:180228393200 file_count:92134 deleted_file:1014 deleted_bytes:1789230792 - DataNode 10.244.14.7:8080 nvme(volume:52/52 active:52 free:0 remote:0) - Disk nvme(volume:52/52 active:52 free:0 remote:0) - volume id:41 size:583672 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:866 version:3 compact_revision:7 modified_at_second:1627500691 disk_type:"nvme" - volume id:63 size:559088 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:847 version:3 compact_revision:8 modified_at_second:1627500691 disk_type:"nvme" - volume id:109 size:376 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1 version:3 compact_revision:2 modified_at_second:1627500691 disk_type:"nvme" - volume id:190 size:1109040768 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3551 version:3 modified_at_second:1623180963 disk_type:"nvme" - volume id:192 size:1182930304 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3450 version:3 modified_at_second:1623182172 disk_type:"nvme" - volume id:228 size:1155850784 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:558 version:3 modified_at_second:1623182659 disk_type:"nvme" - volume id:252 size:1136211808 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:554 version:3 modified_at_second:1623181714 disk_type:"nvme" - volume id:253 size:1152299312 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:562 version:3 modified_at_second:1623182006 disk_type:"nvme" - volume id:268 size:1110550136 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:534 version:3 modified_at_second:1623181510 disk_type:"nvme" - volume id:305 size:1130166824 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:561 version:3 modified_at_second:1623182762 disk_type:"nvme" - volume id:380 size:1117994288 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:567 version:3 modified_at_second:1623182493 disk_type:"nvme" - volume id:416 size:1143219176 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:556 version:3 modified_at_second:1623181372 disk_type:"nvme" - volume id:425 size:1129231688 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:546 version:3 modified_at_second:1623181170 disk_type:"nvme" - volume id:427 size:1102357232 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:529 version:3 modified_at_second:1623180903 disk_type:"nvme" - volume id:429 size:1161577792 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:558 version:3 modified_at_second:1623181575 disk_type:"nvme" - volume id:435 size:1110503240 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:544 version:3 modified_at_second:1623181106 disk_type:"nvme" - volume id:439 size:1150908624 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:554 version:3 modified_at_second:1623182249 disk_type:"nvme" - volume id:467 size:1172172720 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:625 version:3 modified_at_second:1623181927 disk_type:"nvme" - volume id:481 size:1139901224 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:565 version:3 modified_at_second:1623181308 disk_type:"nvme" - volume id:720 size:176161336 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:2 modified_at_second:1623184640 disk_type:"nvme" - volume id:732 size:138412448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1623183855 disk_type:"nvme" - volume id:746 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:1 modified_at_second:1627504769 disk_type:"nvme" - volume id:758 size:88081016 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:2 modified_at_second:1623184084 disk_type:"nvme" - volume id:785 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623184363 disk_type:"nvme" - volume id:801 size:75497816 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1623183090 disk_type:"nvme" - volume id:802 size:37748912 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623183634 disk_type:"nvme" - volume id:822 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1623183646 disk_type:"nvme" - volume id:823 size:134218088 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623183762 disk_type:"nvme" - volume id:829 size:71303432 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623184246 disk_type:"nvme" - volume id:833 size:335545152 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:10 delete_count:2 deleted_byte_count:67108968 version:3 compact_revision:1 modified_at_second:1623184525 disk_type:"nvme" - volume id:857 size:79692200 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1623183100 disk_type:"nvme" - volume id:905 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623183209 disk_type:"nvme" - volume id:933 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1627500690 disk_type:"nvme" - volume id:934 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1617901485 disk_type:"nvme" - volume id:949 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623182950 disk_type:"nvme" - volume id:985 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1623182962 disk_type:"nvme" - volume id:1011 size:104857984 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:3 modified_at_second:1623183368 disk_type:"nvme" - volume id:1018 size:109052336 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1623183356 disk_type:"nvme" - volume id:1030 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1623183482 disk_type:"nvme" - volume id:1056 size:20979047696 collection:"braingeneers-backups-swfs" file_count:12172 delete_count:222 deleted_byte_count:354862328 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1065 size:20982781936 collection:"braingeneers-backups-swfs" file_count:12329 delete_count:263 deleted_byte_count:405184167 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1082 size:20973680512 collection:"braingeneers-backups-swfs" file_count:12203 delete_count:240 deleted_byte_count:375809328 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1083 size:20973117760 collection:"braingeneers-backups-swfs" file_count:12201 delete_count:253 deleted_byte_count:408689779 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:246189 size:21300912680 collection:"hengenlab" file_count:8155 read_only:true version:3 modified_at_second:1627418950 disk_type:"nvme" - volume id:246216 size:21826498352 collection:"hengenlab" file_count:8319 read_only:true version:3 modified_at_second:1627421278 disk_type:"nvme" - volume id:246300 size:21224168192 collection:"hengenlab" file_count:8084 read_only:true version:3 modified_at_second:1627425325 disk_type:"nvme" - volume id:246330 size:21362892376 collection:"hengenlab" file_count:7442 delete_count:52 deleted_byte_count:218106224 version:3 modified_at_second:1627427138 disk_type:"nvme" - volume id:246358 size:21661297032 collection:"hengenlab" file_count:7879 delete_count:48 deleted_byte_count:192554346 version:3 modified_at_second:1627500593 disk_type:"nvme" - volume id:246380 size:21133425560 collection:"hengenlab" file_count:8075 delete_count:6 deleted_byte_count:25166106 version:3 modified_at_second:1627429671 disk_type:"nvme" - volume id:246384 size:21720995776 collection:"hengenlab" file_count:8262 version:3 modified_at_second:1627429845 disk_type:"nvme" - volume id:246434 size:20981185168 collection:"hengenlab" file_count:7956 version:3 modified_at_second:1627432809 disk_type:"nvme" - volume id:246451 size:257955584 collection:"hengenlab" file_count:105 version:3 modified_at_second:1627433574 disk_type:"nvme" - Disk nvme total size:275421129336 file_count:129784 deleted_file:1087 deleted_bytes:2051675588 - DataNode 10.244.14.7:8080 total size:275421129336 file_count:129784 deleted_file:1087 deleted_bytes:2051675588 - DataNode 10.244.16.105:8080 hdd(volume:11/91 active:18446744073709551607 free:80 remote:0) - Disk hdd(volume:11/91 active:18446744073709551607 free:80 remote:0) - volume id:411672 size:20977426496 collection:"hengenlab" file_count:8034 delete_count:3 deleted_byte_count:9437247 version:3 compact_revision:2 modified_at_second:1627703997 - volume id:411766 size:20991227544 collection:"hengenlab" file_count:8102 delete_count:2113 deleted_byte_count:5206960233 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411768 size:16217247664 collection:"hengenlab" file_count:6290 delete_count:663 deleted_byte_count:1560694285 version:3 compact_revision:2 modified_at_second:1627843742 - volume id:411771 size:17830653080 collection:"hengenlab" file_count:6980 delete_count:557 deleted_byte_count:1299266257 version:3 compact_revision:2 modified_at_second:1627843714 - volume id:411786 size:58721720 collection:"hengenlab" file_count:26 version:3 compact_revision:1 modified_at_second:1627526065 - volume id:411879 size:21019024920 collection:"hengenlab" file_count:8021 delete_count:1428 deleted_byte_count:3713951935 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411880 size:11365571592 collection:"hengenlab" file_count:4493 delete_count:38 deleted_byte_count:87032606 version:3 compact_revision:4 modified_at_second:1627843726 - volume id:411898 size:21028460248 collection:"hengenlab" file_count:8071 delete_count:1536 deleted_byte_count:3924994777 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411944 size:19968845784 collection:"hengenlab" file_count:7711 delete_count:4 deleted_byte_count:10485844 version:3 compact_revision:1 modified_at_second:1627843719 - volume id:411978 size:9744231728 collection:"hengenlab" file_count:3819 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:2 modified_at_second:1627843736 - volume id:412029 size:9916864984 collection:"hengenlab" file_count:3805 delete_count:4 deleted_byte_count:13631572 version:3 compact_revision:1 modified_at_second:1627843726 - Disk hdd total size:169118275760 file_count:65352 deleted_file:6347 deleted_bytes:15827503353 - DataNode 10.244.16.105:8080 total size:169118275760 file_count:65352 deleted_file:6347 deleted_bytes:15827503353 - DataNode 10.244.16.109:8080 hdd(volume:28/91 active:18446744073709551606 free:63 remote:0) - Disk hdd(volume:28/91 active:18446744073709551606 free:63 remote:0) - volume id:246132 size:21058344480 collection:"hengenlab" file_count:8073 version:3 compact_revision:1 modified_at_second:1627670913 - volume id:246143 size:21022971736 collection:"hengenlab" file_count:8725 delete_count:531 deleted_byte_count:1341449919 version:3 modified_at_second:1627670233 - volume id:246155 size:21165681304 collection:"hengenlab" file_count:8155 version:3 modified_at_second:1627670725 - volume id:246162 size:21326008384 collection:"hengenlab" file_count:8116 version:3 modified_at_second:1627672622 - volume id:246207 size:21287198904 collection:"hengenlab" file_count:8110 version:3 modified_at_second:1627671903 - volume id:246232 size:21071010368 collection:"hengenlab" file_count:8060 version:3 modified_at_second:1627675625 - volume id:246316 size:22111171216 collection:"hengenlab" file_count:8799 version:3 modified_at_second:1627672922 - volume id:246325 size:21683026640 collection:"hengenlab" file_count:7991 version:3 modified_at_second:1627669902 - volume id:246349 size:21491426128 collection:"hengenlab" file_count:7636 delete_count:32 deleted_byte_count:134219209 version:3 modified_at_second:1627671706 - volume id:246379 size:21234733048 collection:"hengenlab" file_count:8120 delete_count:5 deleted_byte_count:20971735 version:3 modified_at_second:1627674784 - volume id:246386 size:21134592392 collection:"hengenlab" file_count:8086 version:3 modified_at_second:1627672234 - volume id:246396 size:21297928576 collection:"hengenlab" file_count:8118 version:3 modified_at_second:1627674285 - volume id:246409 size:21669134560 collection:"hengenlab" file_count:8298 version:3 modified_at_second:1627670400 - volume id:246441 size:21123695696 collection:"hengenlab" file_count:8042 version:3 modified_at_second:1627671141 - volume id:246480 size:21194588824 collection:"hengenlab" file_count:8054 version:3 modified_at_second:1627671344 - volume id:246511 size:21111213688 collection:"hengenlab" file_count:8047 version:3 modified_at_second:1627670557 - volume id:246572 size:21475386200 collection:"hengenlab" file_count:8204 version:3 modified_at_second:1627673715 - volume id:246655 size:21200635416 collection:"hengenlab" file_count:8029 version:3 modified_at_second:1627671522 - volume id:246788 size:20972680848 collection:"hengenlab" file_count:7999 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:1 modified_at_second:1627700090 - volume id:247162 size:11805700264 collection:"hengenlab" file_count:4496 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:1 modified_at_second:1627843719 - volume id:411734 size:13092644032 collection:"hengenlab" file_count:5032 delete_count:139 deleted_byte_count:279103045 version:3 compact_revision:2 modified_at_second:1627571096 - volume id:411746 size:20974925368 collection:"hengenlab" file_count:8084 delete_count:57 deleted_byte_count:100810404 version:3 compact_revision:2 modified_at_second:1627701127 - volume id:411886 size:19405906328 collection:"hengenlab" file_count:7519 delete_count:1146 deleted_byte_count:2736462084 version:3 compact_revision:3 modified_at_second:1627843702 - volume id:411906 size:21000741928 collection:"hengenlab" file_count:7933 delete_count:1408 deleted_byte_count:3731223029 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411910 size:9184924704 collection:"hengenlab" file_count:3548 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:2 modified_at_second:1627843718 - volume id:411915 size:9321638088 collection:"hengenlab" file_count:3655 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:2 modified_at_second:1627843702 - volume id:411921 size:14239631728 collection:"hengenlab" file_count:5509 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:3 modified_at_second:1627843735 - volume id:411997 size:10613401472 collection:"hengenlab" file_count:4082 delete_count:8 deleted_byte_count:17825960 version:3 compact_revision:2 modified_at_second:1627843724 - Disk hdd total size:534270942320 file_count:204520 deleted_file:3335 deleted_bytes:8387231398 - DataNode 10.244.16.109:8080 total size:534270942320 file_count:204520 deleted_file:3335 deleted_bytes:8387231398 - DataNode 10.244.16.111:8080 hdd(volume:10/91 active:18446744073709551608 free:81 remote:0) - Disk hdd(volume:10/91 active:18446744073709551608 free:81 remote:0) - volume id:411731 size:11041845712 collection:"hengenlab" file_count:4328 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:4 modified_at_second:1627843736 - volume id:411749 size:15839442992 collection:"hengenlab" file_count:6152 delete_count:691 deleted_byte_count:1661617930 version:3 compact_revision:2 modified_at_second:1627843732 - volume id:411800 size:21002193408 collection:"hengenlab" file_count:8047 delete_count:1553 deleted_byte_count:3945690961 version:3 compact_revision:1 modified_at_second:1627571055 - volume id:411801 size:5243000 collection:"hengenlab" file_count:2 version:3 compact_revision:1 modified_at_second:1627524409 - volume id:411825 size:20983314512 collection:"hengenlab" file_count:8152 delete_count:1565 deleted_byte_count:3892032612 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411830 size:20979666360 collection:"hengenlab" file_count:8090 delete_count:1619 deleted_byte_count:4121810760 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411903 size:21028663960 collection:"hengenlab" file_count:8085 delete_count:2311 deleted_byte_count:5888622291 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411935 size:7822161536 collection:"hengenlab" file_count:3129 version:3 compact_revision:1 modified_at_second:1627618125 - volume id:411989 size:10108862568 collection:"hengenlab" file_count:3947 delete_count:88 deleted_byte_count:210180878 version:3 compact_revision:2 modified_at_second:1627843720 - volume id:411996 size:11119897928 collection:"hengenlab" file_count:4242 delete_count:10 deleted_byte_count:29360338 version:3 compact_revision:2 modified_at_second:1627843744 - Disk hdd total size:139931291976 file_count:54174 deleted_file:7839 deleted_bytes:19757704420 - DataNode 10.244.16.111:8080 total size:139931291976 file_count:54174 deleted_file:7839 deleted_bytes:19757704420 - DataNode 10.244.16.113:8080 hdd(volume:16/87 active:18446744073709551599 free:71 remote:0) - Disk hdd(volume:16/87 active:18446744073709551599 free:71 remote:0) - volume id:411666 size:9016547472 collection:"hengenlab" file_count:3452 delete_count:2 deleted_byte_count:2097194 version:3 compact_revision:1 modified_at_second:1627843715 - volume id:411668 size:9202893840 collection:"hengenlab" file_count:3543 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:1 modified_at_second:1627843684 - volume id:411683 size:11181630688 collection:"hengenlab" file_count:4245 version:3 compact_revision:2 modified_at_second:1627608542 - volume id:411718 size:11338532520 collection:"hengenlab" file_count:4397 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:4 modified_at_second:1627843730 - volume id:411719 size:20980243888 collection:"hengenlab" file_count:8154 delete_count:150 deleted_byte_count:339264245 version:3 compact_revision:2 modified_at_second:1627704643 - volume id:411742 size:11220642024 collection:"hengenlab" file_count:4406 delete_count:5 deleted_byte_count:17825897 version:3 compact_revision:4 modified_at_second:1627843723 - volume id:411774 size:413147104 collection:"hengenlab" file_count:145 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411776 size:20986017496 collection:"hengenlab" file_count:8124 delete_count:51 deleted_byte_count:85309527 version:3 compact_revision:2 modified_at_second:1627701780 - volume id:411835 size:21006400216 collection:"hengenlab" file_count:8087 delete_count:1548 deleted_byte_count:3986368184 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411846 size:11200737944 collection:"hengenlab" file_count:4348 version:3 compact_revision:4 modified_at_second:1627843734 - volume id:411893 size:12886872008 collection:"hengenlab" file_count:4990 delete_count:273 deleted_byte_count:608551124 version:3 compact_revision:2 modified_at_second:1627609261 - volume id:411908 size:10337525600 collection:"hengenlab" file_count:4062 delete_count:1165 deleted_byte_count:2920129545 version:3 compact_revision:2 modified_at_second:1627607477 - volume id:411969 size:10956589432 collection:"hengenlab" file_count:4158 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:2 modified_at_second:1627843737 - volume id:411973 size:12219002136 collection:"hengenlab" file_count:4488 delete_count:5 deleted_byte_count:8388713 version:3 compact_revision:2 modified_at_second:1627843722 - volume id:411998 size:10714716832 collection:"hengenlab" file_count:4196 delete_count:7 deleted_byte_count:16777363 version:3 compact_revision:2 modified_at_second:1627843742 - volume id:412024 size:9351795144 collection:"hengenlab" file_count:3622 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:2 modified_at_second:1627843689 - Disk hdd total size:193013294344 file_count:74417 deleted_file:3215 deleted_bytes:8003586349 - DataNode 10.244.16.113:8080 total size:193013294344 file_count:74417 deleted_file:3215 deleted_bytes:8003586349 - DataNode 10.244.16.115:8080 hdd(volume:14/88 active:18446744073709551606 free:74 remote:0) - Disk hdd(volume:14/88 active:18446744073709551606 free:74 remote:0) - volume id:411680 size:15080342928 collection:"hengenlab" file_count:5850 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:3 modified_at_second:1627843721 - volume id:411699 size:20999744272 collection:"hengenlab" file_count:8116 delete_count:1445 deleted_byte_count:3651895668 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411702 size:13631720 collection:"hengenlab" file_count:4 version:3 compact_revision:1 modified_at_second:1627527081 - volume id:411721 size:12804978144 collection:"hengenlab" file_count:4933 delete_count:225 deleted_byte_count:495367244 version:3 compact_revision:4 modified_at_second:1627843718 - volume id:411754 size:20997906008 collection:"hengenlab" file_count:8186 delete_count:2465 deleted_byte_count:5961803335 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411807 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627524245 - volume id:411828 size:21010056688 collection:"hengenlab" file_count:8163 delete_count:1717 deleted_byte_count:4249377968 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411857 size:13134025448 collection:"hengenlab" file_count:5091 delete_count:117 deleted_byte_count:189209269 version:3 compact_revision:2 modified_at_second:1627571096 - volume id:411864 size:423554448 collection:"pvc-98352fb2-44e8-4c55-984c-b81bc55fc4bf" file_count:9339 delete_count:250 deleted_byte_count:39111669 version:3 compact_revision:1 modified_at_second:1627763831 - volume id:411890 size:10544130960 collection:"hengenlab" file_count:4119 delete_count:12 deleted_byte_count:31457532 version:3 compact_revision:4 modified_at_second:1627843710 - volume id:411896 size:9116052272 collection:"hengenlab" file_count:3576 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:2 modified_at_second:1627843728 - volume id:411930 size:17108060688 collection:"hengenlab" file_count:6799 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:1 modified_at_second:1627843724 - volume id:412019 size:11051418808 collection:"hengenlab" file_count:4147 delete_count:142 deleted_byte_count:391121830 version:3 compact_revision:2 modified_at_second:1627843719 - volume id:412033 size:9757944808 collection:"hengenlab" file_count:3709 delete_count:4 deleted_byte_count:16777300 version:3 compact_revision:1 modified_at_second:1627843742 - Disk hdd total size:162041847200 file_count:72032 deleted_file:6382 deleted_bytes:15040801984 - DataNode 10.244.16.115:8080 total size:162041847200 file_count:72032 deleted_file:6382 deleted_bytes:15040801984 - DataNode 10.244.16.119:8080 hdd(volume:11/91 active:18446744073709551606 free:80 remote:0) - Disk hdd(volume:11/91 active:18446744073709551606 free:80 remote:0) - volume id:411700 size:1048640 collection:"hengenlab" file_count:1 version:3 compact_revision:1 modified_at_second:1627526056 - volume id:411709 size:20972820528 collection:"hengenlab" file_count:8109 delete_count:115 deleted_byte_count:250133345 version:3 compact_revision:2 modified_at_second:1627703138 - volume id:411795 size:20979805704 collection:"hengenlab" file_count:8145 delete_count:145 deleted_byte_count:307755521 version:3 compact_revision:2 modified_at_second:1627703294 - volume id:411827 size:21034784864 collection:"hengenlab" file_count:8260 delete_count:2542 deleted_byte_count:6147081247 version:3 compact_revision:1 modified_at_second:1627571069 - volume id:411841 size:16717792160 collection:"hengenlab" file_count:6492 delete_count:721 deleted_byte_count:1744708457 version:3 compact_revision:2 modified_at_second:1627843729 - volume id:411918 size:10276162736 collection:"hengenlab" file_count:3946 delete_count:4 deleted_byte_count:13631572 version:3 compact_revision:3 modified_at_second:1627843737 - volume id:411929 size:7918028088 collection:"hengenlab" file_count:3176 version:3 compact_revision:1 modified_at_second:1627611409 - volume id:411943 size:19730459888 collection:"hengenlab" file_count:7574 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:1 modified_at_second:1627843740 - volume id:411949 size:20296779920 collection:"hengenlab" file_count:7730 delete_count:5 deleted_byte_count:5242985 version:3 compact_revision:1 modified_at_second:1627843733 - volume id:411959 size:20972517216 collection:"hengenlab" file_count:8066 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:1 modified_at_second:1627703107 - volume id:412017 size:10396379712 collection:"hengenlab" file_count:4002 delete_count:163 deleted_byte_count:425725279 version:3 compact_revision:2 modified_at_second:1627843742 - Disk hdd total size:169296579456 file_count:65501 deleted_file:3699 deleted_bytes:8904764250 - DataNode 10.244.16.119:8080 total size:169296579456 file_count:65501 deleted_file:3699 deleted_bytes:8904764250 - DataNode 10.244.16.120:8080 hdd(volume:12/88 active:18446744073709551606 free:76 remote:0) - Disk hdd(volume:12/88 active:18446744073709551606 free:76 remote:0) - volume id:411691 size:17329839840 collection:"hengenlab" file_count:6725 delete_count:568 deleted_byte_count:1368138726 version:3 compact_revision:2 modified_at_second:1627843733 - volume id:411725 size:12490053632 collection:"hengenlab" file_count:4880 version:3 compact_revision:4 modified_at_second:1627843686 - volume id:411735 size:13217507528 collection:"hengenlab" file_count:5150 delete_count:186 deleted_byte_count:337558326 version:3 compact_revision:3 modified_at_second:1627607477 - volume id:411772 size:15612258448 collection:"hengenlab" file_count:5910 delete_count:3 deleted_byte_count:9437247 version:3 compact_revision:3 modified_at_second:1627607477 - volume id:411842 size:16614826248 collection:"hengenlab" file_count:6483 delete_count:597 deleted_byte_count:1458708031 version:3 compact_revision:2 modified_at_second:1627843701 - volume id:411870 size:13632056 collection:"hengenlab" file_count:10 version:3 compact_revision:1 modified_at_second:1627523623 - volume id:411974 size:13700151256 collection:"hengenlab" file_count:5015 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:2 modified_at_second:1627843680 - volume id:411975 size:9862483768 collection:"hengenlab" file_count:3854 delete_count:3 deleted_byte_count:9437247 version:3 compact_revision:3 modified_at_second:1627843733 - volume id:411983 size:10304232208 collection:"hengenlab" file_count:3967 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:2 modified_at_second:1627843743 - volume id:411987 size:10362849136 collection:"hengenlab" file_count:4021 delete_count:14 deleted_byte_count:33554726 version:3 compact_revision:2 modified_at_second:1627843696 - volume id:412025 size:9611253592 collection:"hengenlab" file_count:3683 delete_count:3 deleted_byte_count:12582975 version:3 compact_revision:2 modified_at_second:1627843741 - volume id:412028 size:9540573984 collection:"hengenlab" file_count:3715 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:1 modified_at_second:1627843737 - Disk hdd total size:138659661696 file_count:53413 deleted_file:1380 deleted_bytes:3242000316 - DataNode 10.244.16.120:8080 total size:138659661696 file_count:53413 deleted_file:1380 deleted_bytes:3242000316 - DataNode 10.244.16.65:8080 hdd(volume:9/90 active:18446744073709551610 free:81 remote:0) - Disk hdd(volume:9/90 active:18446744073709551610 free:81 remote:0) - volume id:411667 size:9502047744 collection:"hengenlab" file_count:3591 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:1 modified_at_second:1627843728 - volume id:411697 size:5243168 collection:"hengenlab" file_count:5 version:3 compact_revision:1 modified_at_second:1627527081 - volume id:411714 size:17491395904 collection:"hengenlab" file_count:6885 delete_count:651 deleted_byte_count:1495790614 version:3 compact_revision:2 modified_at_second:1627843723 - volume id:411733 size:10485992 collection:"hengenlab" file_count:4 version:3 compact_revision:1 modified_at_second:1627526516 - volume id:411813 size:20755617216 collection:"hengenlab" file_count:8108 delete_count:240 deleted_byte_count:541743222 version:3 compact_revision:2 modified_at_second:1627843732 - volume id:411818 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627522290 - volume id:411866 size:20988360592 collection:"hengenlab" file_count:8016 delete_count:1508 deleted_byte_count:3928332868 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411946 size:19825586120 collection:"hengenlab" file_count:7513 version:3 compact_revision:1 modified_at_second:1627843732 - volume id:412000 size:10448263664 collection:"hengenlab" file_count:4006 delete_count:36 deleted_byte_count:88081140 version:3 compact_revision:2 modified_at_second:1627843733 - Disk hdd total size:99027000408 file_count:38128 deleted_file:2438 deleted_bytes:6060239363 - DataNode 10.244.16.65:8080 total size:99027000408 file_count:38128 deleted_file:2438 deleted_bytes:6060239363 - DataNode 10.244.16.69:8080 hdd(volume:15/88 active:18446744073709551606 free:73 remote:0) - Disk hdd(volume:15/88 active:18446744073709551606 free:73 remote:0) - volume id:411713 size:13818469408 collection:"hengenlab" file_count:5424 delete_count:112 deleted_byte_count:208359274 version:3 compact_revision:2 modified_at_second:1627571096 - volume id:411793 size:21005328904 collection:"hengenlab" file_count:8295 delete_count:1819 deleted_byte_count:4450705254 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411837 size:20988574632 collection:"hengenlab" file_count:8160 delete_count:1567 deleted_byte_count:3925691116 version:3 compact_revision:1 modified_at_second:1627571055 - volume id:411838 size:15008508456 collection:"hengenlab" file_count:5849 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:4 modified_at_second:1627843719 - volume id:411850 size:1048640 collection:"hengenlab" file_count:1 version:3 compact_revision:1 modified_at_second:1627523809 - volume id:411860 size:420112720 collection:"pvc-98352fb2-44e8-4c55-984c-b81bc55fc4bf" file_count:9442 delete_count:271 deleted_byte_count:29546350 version:3 compact_revision:1 modified_at_second:1627762123 - volume id:411865 size:442392768 collection:"pvc-98352fb2-44e8-4c55-984c-b81bc55fc4bf" file_count:9478 delete_count:244 deleted_byte_count:32475539 version:3 compact_revision:1 modified_at_second:1627764191 - volume id:411868 size:20972398400 collection:"hengenlab" file_count:8101 delete_count:985 deleted_byte_count:2180106940 version:3 compact_revision:3 modified_at_second:1627696649 - volume id:411871 size:12329805552 collection:"hengenlab" file_count:4808 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:4 modified_at_second:1627843725 - volume id:411874 size:16113797624 collection:"hengenlab" file_count:6334 delete_count:729 deleted_byte_count:1622141539 version:3 compact_revision:3 modified_at_second:1627843734 - volume id:411914 size:20984608288 collection:"hengenlab" file_count:8157 delete_count:2343 deleted_byte_count:6026008543 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411942 size:19899798504 collection:"hengenlab" file_count:7735 delete_count:2 deleted_byte_count:2097194 version:3 compact_revision:1 modified_at_second:1627843722 - volume id:411971 size:11924701448 collection:"hengenlab" file_count:4300 delete_count:4 deleted_byte_count:13631572 version:3 compact_revision:2 modified_at_second:1627843729 - volume id:412005 size:10520767216 collection:"hengenlab" file_count:4093 delete_count:49 deleted_byte_count:133170181 version:3 compact_revision:2 modified_at_second:1627843727 - volume id:412027 size:9725406568 collection:"hengenlab" file_count:3734 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:1 modified_at_second:1627843739 - Disk hdd total size:194155719128 file_count:93911 deleted_file:8130 deleted_bytes:18635467943 - DataNode 10.244.16.69:8080 total size:194155719128 file_count:93911 deleted_file:8130 deleted_bytes:18635467943 - DataNode 10.244.16.89:8080 hdd(volume:11/91 active:18446744073709551608 free:80 remote:0) - Disk hdd(volume:11/91 active:18446744073709551608 free:80 remote:0) - volume id:411689 size:17721480736 collection:"hengenlab" file_count:6838 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:3 modified_at_second:1627843728 - volume id:411736 size:6291632 collection:"hengenlab" file_count:3 version:3 compact_revision:1 modified_at_second:1627526065 - volume id:411744 size:20992042128 collection:"hengenlab" file_count:8139 delete_count:1649 deleted_byte_count:3997475113 version:3 compact_revision:1 modified_at_second:1627571069 - volume id:411826 size:21055317568 collection:"hengenlab" file_count:8254 delete_count:2279 deleted_byte_count:5438881964 version:3 compact_revision:1 modified_at_second:1627571069 - volume id:411892 size:21019062712 collection:"hengenlab" file_count:8082 delete_count:1574 deleted_byte_count:3995713981 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411917 size:16156430128 collection:"hengenlab" file_count:6270 delete_count:68 deleted_byte_count:159054334 version:3 compact_revision:3 modified_at_second:1627843741 - volume id:411932 size:17476189904 collection:"hengenlab" file_count:6824 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:1 modified_at_second:1627843737 - volume id:411934 size:17662154256 collection:"hengenlab" file_count:6889 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:1 modified_at_second:1627843706 - volume id:411951 size:18886558064 collection:"hengenlab" file_count:7225 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:1 modified_at_second:1627843724 - volume id:411988 size:10240976400 collection:"hengenlab" file_count:3905 delete_count:91 deleted_byte_count:205024517 version:3 compact_revision:2 modified_at_second:1627843695 - volume id:412009 size:11811033752 collection:"hengenlab" file_count:4406 delete_count:61 deleted_byte_count:155190529 version:3 compact_revision:2 modified_at_second:1627843739 - Disk hdd total size:173027537280 file_count:66835 deleted_file:5728 deleted_bytes:13973360660 - DataNode 10.244.16.89:8080 total size:173027537280 file_count:66835 deleted_file:5728 deleted_bytes:13973360660 - DataNode 10.244.16.97:8080 hdd(volume:10/88 active:18446744073709551610 free:78 remote:0) - Disk hdd(volume:10/88 active:18446744073709551610 free:78 remote:0) - volume id:411694 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627522738 - volume id:411745 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627523320 - volume id:411812 size:21025219208 collection:"hengenlab" file_count:8162 delete_count:1641 deleted_byte_count:4120037316 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411831 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627523132 - volume id:411851 size:20707778976 collection:"hengenlab" file_count:8133 delete_count:246 deleted_byte_count:560626694 version:3 compact_revision:2 modified_at_second:1627843736 - volume id:411862 size:431544360 collection:"pvc-98352fb2-44e8-4c55-984c-b81bc55fc4bf" file_count:9319 delete_count:259 deleted_byte_count:31888543 version:3 compact_revision:1 modified_at_second:1627576156 - volume id:411957 size:13489303224 collection:"hengenlab" file_count:5173 version:3 compact_revision:1 modified_at_second:1627614963 - volume id:411966 size:10782973592 collection:"hengenlab" file_count:4115 delete_count:3 deleted_byte_count:3145791 version:3 compact_revision:2 modified_at_second:1627843707 - volume id:411972 size:12313393160 collection:"hengenlab" file_count:4472 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:2 modified_at_second:1627843745 - volume id:412004 size:10772632176 collection:"hengenlab" file_count:4140 delete_count:28 deleted_byte_count:79692364 version:3 compact_revision:2 modified_at_second:1627843733 - Disk hdd total size:89522844720 file_count:43514 deleted_file:2180 deleted_bytes:4801682227 - DataNode 10.244.16.97:8080 total size:89522844720 file_count:43514 deleted_file:2180 deleted_bytes:4801682227 - DataNode 10.244.16.98:8080 hdd(volume:16/90 active:18446744073709551592 free:74 remote:0) - Disk hdd(volume:16/90 active:18446744073709551592 free:74 remote:0) - volume id:411673 size:20976550232 collection:"hengenlab" file_count:8071 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:2 modified_at_second:1627703449 - volume id:411707 size:17874044264 collection:"hengenlab" file_count:6894 delete_count:36 deleted_byte_count:100664052 version:3 compact_revision:4 modified_at_second:1627843733 - volume id:411720 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627524407 - volume id:411748 size:21000373448 collection:"hengenlab" file_count:7970 delete_count:1380 deleted_byte_count:3565195673 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411760 size:14333970528 collection:"hengenlab" file_count:5564 version:3 compact_revision:3 modified_at_second:1627611016 - volume id:411809 size:11310452088 collection:"hengenlab" file_count:4415 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:4 modified_at_second:1627843729 - volume id:411810 size:20976280960 collection:"hengenlab" file_count:8157 delete_count:141 deleted_byte_count:296091258 version:3 compact_revision:2 modified_at_second:1627703861 - volume id:411811 size:20993007800 collection:"hengenlab" file_count:8261 delete_count:1346 deleted_byte_count:3385831758 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411815 size:20984547408 collection:"hengenlab" file_count:8148 delete_count:133 deleted_byte_count:239143575 version:3 compact_revision:2 modified_at_second:1627702576 - volume id:411821 size:21006604824 collection:"hengenlab" file_count:8070 delete_count:1458 deleted_byte_count:3653227255 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411853 size:20985752376 collection:"hengenlab" file_count:8066 delete_count:1465 deleted_byte_count:3668882240 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411881 size:18276124664 collection:"hengenlab" file_count:7091 delete_count:468 deleted_byte_count:1040392637 version:3 compact_revision:2 modified_at_second:1627843735 - volume id:411895 size:21080309584 collection:"hengenlab" file_count:8146 delete_count:2420 deleted_byte_count:5989979359 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411913 size:20984013304 collection:"hengenlab" file_count:8035 version:3 compact_revision:2 modified_at_second:1627703453 - volume id:411920 size:9411225816 collection:"hengenlab" file_count:3640 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:2 modified_at_second:1627843721 - volume id:411925 size:8018464800 collection:"hengenlab" file_count:3147 version:3 compact_revision:2 modified_at_second:1627616331 - Disk hdd total size:268211722104 file_count:103675 deleted_file:8854 deleted_bytes:21953039442 - DataNode 10.244.16.98:8080 total size:268211722104 file_count:103675 deleted_file:8854 deleted_bytes:21953039442 - DataNode 10.244.216.104:8080 nvme(volume:92/92 active:92 free:0 remote:0) - Disk nvme(volume:92/92 active:92 free:0 remote:0) - volume id:6 size:154572064 file_count:5480 version:3 modified_at_second:1626566497 disk_type:"nvme" - volume id:31 size:632704 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:843 version:3 compact_revision:7 modified_at_second:1627507800 disk_type:"nvme" - volume id:58 size:601456 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:900 version:3 compact_revision:8 modified_at_second:1627507798 disk_type:"nvme" - volume id:79 size:606224 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:854 version:3 compact_revision:6 modified_at_second:1627507799 disk_type:"nvme" - volume id:81 size:622232 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:901 version:3 compact_revision:7 modified_at_second:1627507799 disk_type:"nvme" - volume id:116 size:2202353384 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1126 version:3 compact_revision:2 modified_at_second:1623132644 disk_type:"nvme" - volume id:126 size:8 collection:"._.DS_Store" replica_placement:1 version:3 modified_at_second:1623132657 disk_type:"nvme" - volume id:129 size:8 collection:"._.DS_Store" replica_placement:1 version:3 modified_at_second:1623132667 disk_type:"nvme" - volume id:130 size:8 collection:"._.DS_Store" version:3 modified_at_second:1610069605 disk_type:"nvme" - volume id:137 size:1630156472 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:2460 delete_count:1887 deleted_byte_count:432763215 version:3 modified_at_second:1610491324 disk_type:"nvme" - volume id:138 size:1603047968 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:2449 delete_count:1881 deleted_byte_count:418068489 version:3 modified_at_second:1610491324 disk_type:"nvme" - volume id:150 size:1575240048 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:839 version:3 modified_at_second:1610491378 disk_type:"nvme" - volume id:153 size:1494952944 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:787 version:3 modified_at_second:1623132680 disk_type:"nvme" - volume id:159 size:3110118664 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1495 version:3 modified_at_second:1610491401 disk_type:"nvme" - volume id:164 size:1458776248 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:813 version:3 modified_at_second:1623132694 disk_type:"nvme" - volume id:167 size:1764458648 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:850 version:3 modified_at_second:1610491453 disk_type:"nvme" - volume id:168 size:1695114936 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:816 version:3 modified_at_second:1610491453 disk_type:"nvme" - volume id:200 size:1152898088 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:588 version:3 modified_at_second:1610494836 disk_type:"nvme" - volume id:205 size:1154243552 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:553 version:3 modified_at_second:1610494893 disk_type:"nvme" - volume id:231 size:1152295576 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:558 version:3 modified_at_second:1610496236 disk_type:"nvme" - volume id:244 size:1174086520 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:568 version:3 modified_at_second:1610496354 disk_type:"nvme" - volume id:264 size:1234236192 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:593 version:3 modified_at_second:1610496631 disk_type:"nvme" - volume id:269 size:1187392304 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:600 version:3 modified_at_second:1623132737 disk_type:"nvme" - volume id:276 size:1246990632 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:601 version:3 modified_at_second:1623132751 disk_type:"nvme" - volume id:281 size:1753868488 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:919 version:3 modified_at_second:1610496873 disk_type:"nvme" - volume id:288 size:1181077768 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:592 version:3 modified_at_second:1623132779 disk_type:"nvme" - volume id:293 size:1302889432 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:629 version:3 modified_at_second:1610497013 disk_type:"nvme" - volume id:300 size:1246727888 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:598 version:3 modified_at_second:1623132794 disk_type:"nvme" - volume id:302 size:1342897048 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:644 version:3 modified_at_second:1610497082 disk_type:"nvme" - volume id:321 size:1138789880 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:562 version:3 modified_at_second:1623132808 disk_type:"nvme" - volume id:340 size:1161117576 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:568 version:3 modified_at_second:1623132822 disk_type:"nvme" - volume id:346 size:1288754128 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:645 version:3 modified_at_second:1610497637 disk_type:"nvme" - volume id:358 size:1151521568 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:559 version:3 modified_at_second:1610497787 disk_type:"nvme" - volume id:371 size:1312268072 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:628 version:3 modified_at_second:1610498031 disk_type:"nvme" - volume id:374 size:1323581208 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:634 version:3 modified_at_second:1623132836 disk_type:"nvme" - volume id:376 size:1302828304 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:626 version:3 modified_at_second:1623132865 disk_type:"nvme" - volume id:388 size:1324169520 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:664 version:3 modified_at_second:1610498218 disk_type:"nvme" - volume id:392 size:1134250720 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:545 version:3 modified_at_second:1610498311 disk_type:"nvme" - volume id:394 size:1341215576 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:641 version:3 modified_at_second:1623132879 disk_type:"nvme" - volume id:401 size:1150668440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:552 version:3 modified_at_second:1610498457 disk_type:"nvme" - volume id:408 size:1367251616 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:668 version:3 modified_at_second:1610498529 disk_type:"nvme" - volume id:412 size:1156052976 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:564 version:3 modified_at_second:1623132893 disk_type:"nvme" - volume id:419 size:1133426832 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:545 version:3 modified_at_second:1610498668 disk_type:"nvme" - volume id:430 size:1145801792 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:552 version:3 modified_at_second:1610498760 disk_type:"nvme" - volume id:450 size:1278326168 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:616 version:3 modified_at_second:1610499083 disk_type:"nvme" - volume id:459 size:1212072184 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:601 version:3 modified_at_second:1623132908 disk_type:"nvme" - volume id:503 size:1795992728 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:969 version:3 modified_at_second:1610643823 disk_type:"nvme" - volume id:590 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507789 disk_type:"nvme" - volume id:618 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507790 disk_type:"nvme" - volume id:649 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507792 disk_type:"nvme" - volume id:707 size:8388808 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507793 disk_type:"nvme" - volume id:734 size:100663544 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1617901669 disk_type:"nvme" - volume id:745 size:75497848 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1618444184 disk_type:"nvme" - volume id:755 size:109052328 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1619387454 disk_type:"nvme" - volume id:759 size:82165760 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1619387464 disk_type:"nvme" - volume id:773 size:142606856 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1619387462 disk_type:"nvme" - volume id:780 size:142606832 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1619387455 disk_type:"nvme" - volume id:784 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623184338 disk_type:"nvme" - volume id:786 size:239076032 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1619387472 disk_type:"nvme" - volume id:825 size:100663544 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1617901627 disk_type:"nvme" - volume id:840 size:109052368 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1623184606 disk_type:"nvme" - volume id:852 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1618444171 disk_type:"nvme" - volume id:864 size:113246768 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:2 modified_at_second:1627504954 disk_type:"nvme" - volume id:866 size:109052312 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1619387472 disk_type:"nvme" - volume id:871 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623184200 disk_type:"nvme" - volume id:875 size:104857952 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623184328 disk_type:"nvme" - volume id:880 size:104857920 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1618444170 disk_type:"nvme" - volume id:881 size:104857952 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623184479 disk_type:"nvme" - volume id:895 size:142606888 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1618444171 disk_type:"nvme" - volume id:911 size:146801232 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:2 modified_at_second:1619387449 disk_type:"nvme" - volume id:916 size:111997040 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:33557045 version:3 compact_revision:2 modified_at_second:1627500611 disk_type:"nvme" - volume id:921 size:50332080 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:2 modified_at_second:1627504749 disk_type:"nvme" - volume id:927 size:113438912 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:2 modified_at_second:1627504916 disk_type:"nvme" - volume id:930 size:71303432 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:2 modified_at_second:1627504956 disk_type:"nvme" - volume id:940 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1617901476 disk_type:"nvme" - volume id:944 size:104857928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1623184059 disk_type:"nvme" - volume id:946 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623184187 disk_type:"nvme" - volume id:969 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623184467 disk_type:"nvme" - volume id:986 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:1 modified_at_second:1627504742 disk_type:"nvme" - volume id:992 size:46137696 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1619387463 disk_type:"nvme" - volume id:994 size:37748912 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1619387462 disk_type:"nvme" - volume id:1003 size:142606848 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1619387458 disk_type:"nvme" - volume id:1006 size:168896560 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1617901572 disk_type:"nvme" - volume id:1025 size:138412488 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1618444180 disk_type:"nvme" - volume id:1072 size:20977959168 collection:"braingeneers-backups-swfs" file_count:12243 delete_count:214 deleted_byte_count:368569899 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1084 size:20974675784 collection:"braingeneers-backups-swfs" file_count:12149 delete_count:216 deleted_byte_count:352173501 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1087 size:20975802264 collection:"braingeneers-backups-swfs" file_count:12268 delete_count:249 deleted_byte_count:384729337 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1092 size:20973656776 collection:"braingeneers-backups-swfs" file_count:12162 delete_count:244 deleted_byte_count:385207912 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1094 size:20972954464 collection:"braingeneers-backups-swfs" file_count:12254 delete_count:230 deleted_byte_count:352275616 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1097 size:20972823488 collection:"braingeneers-backups-swfs" file_count:12260 delete_count:225 deleted_byte_count:369502703 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1119 size:20973407464 collection:"braingeneers-backups-swfs" file_count:12191 delete_count:251 deleted_byte_count:429317624 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1133 size:20979013528 collection:"braingeneers-backups-swfs" file_count:12195 delete_count:228 deleted_byte_count:369277930 version:3 modified_at_second:1627607153 disk_type:"nvme" - Disk nvme total size:225927923296 file_count:137074 deleted_file:5631 deleted_bytes:3916414967 - DataNode 10.244.216.104:8080 total size:225927923296 file_count:137074 deleted_file:5631 deleted_bytes:3916414967 - DataNode 10.244.216.115:8080 nvme(volume:74/74 active:69 free:0 remote:0) - Disk nvme(volume:74/74 active:69 free:0 remote:0) - volume id:3 size:297552792 file_count:290 version:3 modified_at_second:1626640527 disk_type:"nvme" - volume id:55 size:661136 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:892 version:3 compact_revision:7 modified_at_second:1627507799 disk_type:"nvme" - volume id:73 size:628400 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:948 version:3 compact_revision:7 modified_at_second:1627507800 disk_type:"nvme" - volume id:117 size:8 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" replica_placement:1 version:3 compact_revision:2 modified_at_second:1623174832 disk_type:"nvme" - volume id:131 size:8 collection:".DS_Store" replica_placement:1 version:3 modified_at_second:1623174313 disk_type:"nvme" - volume id:134 size:8 collection:".DS_Store" replica_placement:1 version:3 modified_at_second:1623174842 disk_type:"nvme" - volume id:142 size:1559633608 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:2416 delete_count:1853 deleted_byte_count:384450144 version:3 modified_at_second:1623174854 disk_type:"nvme" - volume id:155 size:1270832232 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:620 version:3 modified_at_second:1623174868 disk_type:"nvme" - volume id:163 size:1474682472 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:831 version:3 modified_at_second:1623174882 disk_type:"nvme" - volume id:170 size:1847542352 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:887 version:3 modified_at_second:1623174896 disk_type:"nvme" - volume id:174 size:1212956456 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:755 version:3 modified_at_second:1623174910 disk_type:"nvme" - volume id:178 size:1225699864 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:774 version:3 modified_at_second:1623174339 disk_type:"nvme" - volume id:184 size:1303411928 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:785 version:3 modified_at_second:1623174924 disk_type:"nvme" - volume id:263 size:1204740008 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:578 version:3 modified_at_second:1610496631 disk_type:"nvme" - volume id:304 size:1347904096 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:646 version:3 modified_at_second:1610497082 disk_type:"nvme" - volume id:309 size:1703950792 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:837 version:3 modified_at_second:1610497170 disk_type:"nvme" - volume id:360 size:1169493040 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:562 version:3 modified_at_second:1623174407 disk_type:"nvme" - volume id:396 size:1191652408 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:575 version:3 modified_at_second:1610498385 disk_type:"nvme" - volume id:398 size:1245932376 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:600 version:3 modified_at_second:1610498385 disk_type:"nvme" - volume id:407 size:1387053048 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:673 version:3 modified_at_second:1610498529 disk_type:"nvme" - volume id:410 size:1175456952 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:572 version:3 modified_at_second:1610498523 disk_type:"nvme" - volume id:424 size:1195974440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:575 version:3 modified_at_second:1623174435 disk_type:"nvme" - volume id:522 size:1342299832 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:668 version:3 modified_at_second:1610643966 disk_type:"nvme" - volume id:538 size:1210268872 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:613 version:3 modified_at_second:1623174463 disk_type:"nvme" - volume id:554 size:1174587720 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:688 version:3 modified_at_second:1623174476 disk_type:"nvme" - volume id:580 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1627507790 disk_type:"nvme" - volume id:639 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507791 disk_type:"nvme" - volume id:642 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" - volume id:679 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507798 disk_type:"nvme" - volume id:765 size:239076024 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1618444183 disk_type:"nvme" - volume id:834 size:213910272 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:9 version:3 compact_revision:1 modified_at_second:1619387469 disk_type:"nvme" - volume id:836 size:171967008 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1618444183 disk_type:"nvme" - volume id:872 size:134218088 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1617901725 disk_type:"nvme" - volume id:874 size:134218064 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1623172843 disk_type:"nvme" - volume id:876 size:209715896 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:1 modified_at_second:1623172869 disk_type:"nvme" - volume id:882 size:113246752 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:1 modified_at_second:1627504745 disk_type:"nvme" - volume id:908 size:138412464 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1618444165 disk_type:"nvme" - volume id:919 size:134218088 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623172907 disk_type:"nvme" - volume id:920 size:113246768 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1623174569 disk_type:"nvme" - volume id:928 size:138412440 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1623172920 disk_type:"nvme" - volume id:937 size:113246760 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:1 modified_at_second:1627504745 disk_type:"nvme" - volume id:963 size:201327128 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1623172983 disk_type:"nvme" - volume id:965 size:134218088 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623172996 disk_type:"nvme" - volume id:1008 size:138412448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:3 modified_at_second:1623174608 disk_type:"nvme" - volume id:1012 size:272679104 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:10 version:3 compact_revision:3 modified_at_second:1623173022 disk_type:"nvme" - volume id:1110 size:20986677760 collection:"braingeneers-backups-swfs" file_count:12129 delete_count:225 deleted_byte_count:373699582 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1125 size:20979792272 collection:"braingeneers-backups-swfs" file_count:12312 delete_count:253 deleted_byte_count:400756796 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1126 size:20976056280 collection:"braingeneers-backups-swfs" file_count:12266 delete_count:248 deleted_byte_count:398799062 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1138 size:20989427240 collection:"braingeneers-backups-swfs" file_count:12263 delete_count:204 deleted_byte_count:311650638 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:246201 size:21384261328 collection:"hengenlab" file_count:8215 read_only:true version:3 modified_at_second:1627420098 disk_type:"nvme" - volume id:246240 size:21135039848 collection:"hengenlab" file_count:8095 read_only:true version:3 modified_at_second:1627423054 disk_type:"nvme" - volume id:246276 size:21144142368 collection:"hengenlab" file_count:8052 read_only:true version:3 modified_at_second:1627424647 disk_type:"nvme" - volume id:246372 size:21212400664 collection:"hengenlab" file_count:8684 delete_count:13 deleted_byte_count:54526463 version:3 modified_at_second:1627429092 disk_type:"nvme" - volume id:246378 size:20998753624 collection:"hengenlab" file_count:8038 delete_count:3 deleted_byte_count:12583053 version:3 modified_at_second:1627429662 disk_type:"nvme" - volume id:246433 size:21298865592 collection:"hengenlab" file_count:8174 version:3 modified_at_second:1627432819 disk_type:"nvme" - volume id:246450 size:21345526048 collection:"hengenlab" file_count:8173 version:3 modified_at_second:1627433965 disk_type:"nvme" - volume id:246462 size:21191151728 collection:"hengenlab" file_count:8097 version:3 modified_at_second:1627434848 disk_type:"nvme" - volume id:246471 size:21128006912 collection:"hengenlab" file_count:8081 delete_count:1 deleted_byte_count:4194325 version:3 modified_at_second:1627500576 disk_type:"nvme" - volume id:246483 size:21077677080 collection:"hengenlab" file_count:8114 version:3 modified_at_second:1627436472 disk_type:"nvme" - volume id:246491 size:21520002056 collection:"hengenlab" file_count:8203 version:3 modified_at_second:1627436960 disk_type:"nvme" - volume id:246602 size:21426843352 collection:"hengenlab" file_count:8195 version:3 modified_at_second:1627439899 disk_type:"nvme" - volume id:246642 size:21299151352 collection:"hengenlab" file_count:8150 version:3 modified_at_second:1627441211 disk_type:"nvme" - volume id:246671 size:13369876656 collection:"hengenlab" file_count:5164 version:3 compact_revision:1 modified_at_second:1627528747 disk_type:"nvme" - volume id:246744 size:14194623656 collection:"hengenlab" file_count:5431 version:3 compact_revision:1 modified_at_second:1627528659 disk_type:"nvme" - volume id:246760 size:13673325384 collection:"hengenlab" file_count:5196 version:3 compact_revision:1 modified_at_second:1627528688 disk_type:"nvme" - volume id:246786 size:14171590384 collection:"hengenlab" file_count:5416 version:3 compact_revision:1 modified_at_second:1627528615 disk_type:"nvme" - volume id:246809 size:13970260096 collection:"hengenlab" file_count:5350 version:3 compact_revision:1 modified_at_second:1627618163 disk_type:"nvme" - volume id:246828 size:8240065248 collection:"hengenlab" file_count:3142 version:3 compact_revision:1 modified_at_second:1627618178 disk_type:"nvme" - volume id:246896 size:2700383904 collection:"hengenlab" file_count:1022 version:3 compact_revision:1 modified_at_second:1627528627 disk_type:"nvme" - volume id:246901 size:1741901064 collection:"hengenlab" file_count:665 version:3 compact_revision:1 modified_at_second:1627528633 disk_type:"nvme" - volume id:246920 size:2612123096 collection:"hengenlab" file_count:998 version:3 compact_revision:1 modified_at_second:1627528664 disk_type:"nvme" - volume id:246950 size:2879566056 collection:"hengenlab" file_count:1101 version:3 compact_revision:1 modified_at_second:1627528777 disk_type:"nvme" - volume id:247055 size:4170454488 collection:"hengenlab" file_count:1583 version:3 compact_revision:1 modified_at_second:1627528697 disk_type:"nvme" - volume id:247057 size:3690312136 collection:"hengenlab" file_count:1418 version:3 compact_revision:1 modified_at_second:1627528724 disk_type:"nvme" - Disk nvme total size:483676864296 file_count:208614 deleted_file:2802 deleted_bytes:1949048740 - DataNode 10.244.216.115:8080 total size:483676864296 file_count:208614 deleted_file:2802 deleted_bytes:1949048740 - DataNode 10.244.216.119:8080 nvme(volume:47/47 active:47 free:0 remote:0) - Disk nvme(volume:47/47 active:47 free:0 remote:0) - volume id:59 size:562688 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:907 version:3 compact_revision:8 modified_at_second:1627507800 disk_type:"nvme" - volume id:80 size:587552 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:839 version:3 compact_revision:8 modified_at_second:1627507798 disk_type:"nvme" - volume id:124 size:8388776 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1627507793 disk_type:"nvme" - volume id:132 size:8 collection:".DS_Store" version:3 modified_at_second:1610069605 disk_type:"nvme" - volume id:143 size:1402413064 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:692 version:3 modified_at_second:1610491343 disk_type:"nvme" - volume id:146 size:1604797608 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:834 version:3 modified_at_second:1610491353 disk_type:"nvme" - volume id:171 size:1814029024 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:874 version:3 modified_at_second:1610491453 disk_type:"nvme" - volume id:176 size:1218650056 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:761 version:3 modified_at_second:1610491476 disk_type:"nvme" - volume id:182 size:1299684992 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:786 version:3 modified_at_second:1610494389 disk_type:"nvme" - volume id:203 size:1269298488 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:606 version:3 modified_at_second:1610494892 disk_type:"nvme" - volume id:207 size:1259353968 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:603 version:3 modified_at_second:1610494893 disk_type:"nvme" - volume id:223 size:1430634688 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:689 version:3 modified_at_second:1610496178 disk_type:"nvme" - volume id:308 size:1218204048 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:600 version:3 modified_at_second:1610497162 disk_type:"nvme" - volume id:316 size:1481558640 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:730 version:3 modified_at_second:1610497252 disk_type:"nvme" - volume id:354 size:1228968456 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:595 version:3 modified_at_second:1610497794 disk_type:"nvme" - volume id:368 size:1356782040 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:649 version:3 modified_at_second:1610497960 disk_type:"nvme" - volume id:389 size:1298978368 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:623 version:3 modified_at_second:1610498317 disk_type:"nvme" - volume id:395 size:1221106984 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:590 version:3 modified_at_second:1610498385 disk_type:"nvme" - volume id:397 size:1321427632 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:635 version:3 modified_at_second:1610498385 disk_type:"nvme" - volume id:399 size:1217579976 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:588 version:3 modified_at_second:1610498385 disk_type:"nvme" - volume id:455 size:1272114416 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:626 version:3 modified_at_second:1610499157 disk_type:"nvme" - volume id:539 size:1217814168 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:598 version:3 modified_at_second:1610644140 disk_type:"nvme" - volume id:552 size:2693106344 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1558 version:3 modified_at_second:1610644276 disk_type:"nvme" - volume id:570 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1627507798 disk_type:"nvme" - volume id:571 size:8388808 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1627507797 disk_type:"nvme" - volume id:591 size:8388808 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507793 disk_type:"nvme" - volume id:612 size:471736 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" - volume id:636 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507792 disk_type:"nvme" - volume id:655 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507794 disk_type:"nvme" - volume id:656 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507796 disk_type:"nvme" - volume id:722 size:256445448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:9 version:3 compact_revision:1 modified_at_second:1619387453 disk_type:"nvme" - volume id:751 size:247464832 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:10 version:3 compact_revision:1 modified_at_second:1619387464 disk_type:"nvme" - volume id:808 size:171966944 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1619387469 disk_type:"nvme" - volume id:813 size:276824936 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:10 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:2 modified_at_second:1627504924 disk_type:"nvme" - volume id:844 size:171966992 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:2 modified_at_second:1627500598 disk_type:"nvme" - volume id:854 size:142606888 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1618444185 disk_type:"nvme" - volume id:935 size:268436096 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1617901650 disk_type:"nvme" - volume id:982 size:218104648 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:10 version:3 compact_revision:3 modified_at_second:1619387472 disk_type:"nvme" - volume id:1038 size:8 collection:"pvc-0544e3a6-da8f-42fe-a149-3a103bcc8552" version:3 modified_at_second:1615234634 disk_type:"nvme" - volume id:1111 size:20992311808 collection:"braingeneers-backups-swfs" file_count:12332 delete_count:227 deleted_byte_count:340575187 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1131 size:20975001016 collection:"braingeneers-backups-swfs" file_count:12212 delete_count:254 deleted_byte_count:409474937 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1136 size:20971824008 collection:"braingeneers-backups-swfs" file_count:12174 delete_count:218 deleted_byte_count:362416322 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1141 size:21083986224 collection:"braingeneers-backups-swfs" file_count:12362 delete_count:224 deleted_byte_count:343942797 version:3 compact_revision:4 modified_at_second:1627607153 disk_type:"nvme" - volume id:1644 size:9426453224 collection:"hengenlab" file_count:3614 delete_count:27 deleted_byte_count:62915127 version:3 compact_revision:4 modified_at_second:1627521882 disk_type:"nvme" - volume id:246178 size:21711767592 collection:"hengenlab" file_count:8273 delete_count:31 deleted_byte_count:70255243 version:3 modified_at_second:1627521882 disk_type:"nvme" - volume id:246193 size:21502111304 collection:"hengenlab" file_count:8179 delete_count:24 deleted_byte_count:56623608 read_only:true version:3 modified_at_second:1627521882 disk_type:"nvme" - volume id:246227 size:9440774688 collection:"hengenlab" file_count:3598 version:3 compact_revision:1 modified_at_second:1627528715 disk_type:"nvme" - Disk nvme total size:174728115592 file_count:88203 deleted_file:1007 deleted_bytes:1654591905 - DataNode 10.244.216.119:8080 total size:174728115592 file_count:88203 deleted_file:1007 deleted_bytes:1654591905 - DataNode 10.244.216.121:8080 nvme(volume:68/68 active:67 free:0 remote:0) - Disk nvme(volume:68/68 active:67 free:0 remote:0) - volume id:1 size:467947296 file_count:5823 delete_count:1 deleted_byte_count:294 version:3 modified_at_second:1627443123 disk_type:"nvme" - volume id:4 size:441258608 file_count:5832 version:3 modified_at_second:1627443063 disk_type:"nvme" - volume id:71 size:610784 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:859 version:3 compact_revision:7 modified_at_second:1627507799 disk_type:"nvme" - volume id:75 size:580576 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:881 version:3 compact_revision:8 modified_at_second:1627507801 disk_type:"nvme" - volume id:140 size:1506928952 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:2396 delete_count:1864 deleted_byte_count:399350512 version:3 modified_at_second:1623171889 disk_type:"nvme" - volume id:147 size:1667938056 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:854 version:3 modified_at_second:1623171904 disk_type:"nvme" - volume id:160 size:1194083240 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:581 version:3 modified_at_second:1610491395 disk_type:"nvme" - volume id:166 size:1467965456 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:817 version:3 modified_at_second:1623171919 disk_type:"nvme" - volume id:172 size:1691025904 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:812 version:3 modified_at_second:1623171934 disk_type:"nvme" - volume id:189 size:1220039200 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:4642 version:3 modified_at_second:1610494518 disk_type:"nvme" - volume id:195 size:1242480352 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3468 version:3 modified_at_second:1623171976 disk_type:"nvme" - volume id:233 size:1338611528 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:641 version:3 modified_at_second:1623172005 disk_type:"nvme" - volume id:273 size:1200692744 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:615 version:3 modified_at_second:1623172033 disk_type:"nvme" - volume id:274 size:1590254712 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:791 version:3 modified_at_second:1610496726 disk_type:"nvme" - volume id:278 size:1229501720 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:595 version:3 modified_at_second:1623172048 disk_type:"nvme" - volume id:279 size:1259710904 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:610 version:3 modified_at_second:1623172062 disk_type:"nvme" - volume id:324 size:1228986784 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:592 version:3 modified_at_second:1623172076 disk_type:"nvme" - volume id:326 size:1222977192 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:587 version:3 modified_at_second:1610497407 disk_type:"nvme" - volume id:403 size:1223593064 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:586 version:3 modified_at_second:1623172133 disk_type:"nvme" - volume id:422 size:1235862880 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:593 version:3 modified_at_second:1623172190 disk_type:"nvme" - volume id:461 size:1196079944 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:589 version:3 modified_at_second:1623172247 disk_type:"nvme" - volume id:493 size:1214228208 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1166 version:3 modified_at_second:1623172318 disk_type:"nvme" - volume id:506 size:1262940608 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:710 version:3 modified_at_second:1623172332 disk_type:"nvme" - volume id:529 size:1293102176 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:681 version:3 modified_at_second:1623172359 disk_type:"nvme" - volume id:572 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1627507791 disk_type:"nvme" - volume id:584 size:8388776 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1627507794 disk_type:"nvme" - volume id:625 size:8388808 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507796 disk_type:"nvme" - volume id:660 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507793 disk_type:"nvme" - volume id:677 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507796 disk_type:"nvme" - volume id:681 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507798 disk_type:"nvme" - volume id:689 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507796 disk_type:"nvme" - volume id:699 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507790 disk_type:"nvme" - volume id:706 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507791 disk_type:"nvme" - volume id:711 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507797 disk_type:"nvme" - volume id:730 size:109052320 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1623172569 disk_type:"nvme" - volume id:736 size:184550104 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:9 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:2 modified_at_second:1627500600 disk_type:"nvme" - volume id:740 size:138412464 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1618444166 disk_type:"nvme" - volume id:752 size:209715912 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:1 modified_at_second:1619387458 disk_type:"nvme" - volume id:797 size:167772584 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1623171556 disk_type:"nvme" - volume id:941 size:268436144 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:2 modified_at_second:1617901734 disk_type:"nvme" - volume id:1044 size:86712 collection:"pvc-73532100-54aa-469c-b8a7-1774be8c3b9e" file_count:1 version:3 compact_revision:3 modified_at_second:1625624761 disk_type:"nvme" - volume id:1047 size:8 collection:"pvc-73532100-54aa-469c-b8a7-1774be8c3b9e" version:3 compact_revision:3 modified_at_second:1625624761 disk_type:"nvme" - volume id:1088 size:20974667904 collection:"braingeneers-backups-swfs" file_count:12173 delete_count:242 deleted_byte_count:374645876 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1120 size:20996395720 collection:"braingeneers-backups-swfs" file_count:12233 delete_count:212 deleted_byte_count:348970606 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1122 size:20992144360 collection:"braingeneers-backups-swfs" file_count:12207 delete_count:230 deleted_byte_count:363012031 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1127 size:20976711152 collection:"braingeneers-backups-swfs" file_count:12297 delete_count:229 deleted_byte_count:364484950 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:133787 size:21301768216 collection:"hengenlab" file_count:8526 delete_count:8264 deleted_byte_count:20658424014 read_only:true version:3 modified_at_second:1627419563 disk_type:"nvme" - volume id:133789 size:735486336 collection:"hengenlab" file_count:282 read_only:true version:3 compact_revision:1 modified_at_second:1627507743 disk_type:"nvme" - volume id:133792 size:881869784 collection:"hengenlab" file_count:310 read_only:true version:3 compact_revision:1 modified_at_second:1627507554 disk_type:"nvme" - volume id:133819 size:21226668664 collection:"hengenlab" file_count:8129 delete_count:8129 deleted_byte_count:21226124008 read_only:true version:3 modified_at_second:1627419753 disk_type:"nvme" - volume id:133873 size:21645954720 collection:"hengenlab" file_count:8361 read_only:true version:3 compact_revision:1 modified_at_second:1627423103 disk_type:"nvme" - volume id:246278 size:21216024872 collection:"hengenlab" file_count:8116 delete_count:1 deleted_byte_count:4194325 version:3 modified_at_second:1627504758 disk_type:"nvme" - volume id:246304 size:21180999232 collection:"hengenlab" file_count:8115 read_only:true version:3 modified_at_second:1627425536 disk_type:"nvme" - volume id:246305 size:21253580256 collection:"hengenlab" file_count:8113 read_only:true version:3 modified_at_second:1627425536 disk_type:"nvme" - volume id:246331 size:21139438032 collection:"hengenlab" file_count:7420 delete_count:50 deleted_byte_count:209717518 version:3 modified_at_second:1627427144 disk_type:"nvme" - volume id:246392 size:21483531064 collection:"hengenlab" file_count:8199 version:3 modified_at_second:1627430347 disk_type:"nvme" - volume id:246418 size:21437637296 collection:"hengenlab" file_count:8201 version:3 modified_at_second:1627431671 disk_type:"nvme" - volume id:246509 size:21324437576 collection:"hengenlab" file_count:8131 delete_count:1 deleted_byte_count:85 version:3 modified_at_second:1627521514 disk_type:"nvme" - volume id:246523 size:21022332720 collection:"hengenlab" file_count:7739 delete_count:827 deleted_byte_count:2901782526 version:3 modified_at_second:1627521905 disk_type:"nvme" - volume id:246589 size:21164642208 collection:"hengenlab" file_count:8073 version:3 modified_at_second:1627439400 disk_type:"nvme" - volume id:246595 size:21191150048 collection:"hengenlab" file_count:8067 version:3 modified_at_second:1627439729 disk_type:"nvme" - volume id:246620 size:21362763672 collection:"hengenlab" file_count:8162 version:3 modified_at_second:1627440399 disk_type:"nvme" - volume id:246648 size:21280598032 collection:"hengenlab" file_count:8102 version:3 modified_at_second:1627441550 disk_type:"nvme" - volume id:246670 size:13572658056 collection:"hengenlab" file_count:5124 version:3 compact_revision:1 modified_at_second:1627671372 disk_type:"nvme" - volume id:246700 size:12345506560 collection:"hengenlab" file_count:4699 version:3 compact_revision:1 modified_at_second:1627672427 disk_type:"nvme" - volume id:246721 size:12449856352 collection:"hengenlab" file_count:4762 version:3 compact_revision:1 modified_at_second:1627671671 disk_type:"nvme" - volume id:246742 size:20670639592 collection:"hengenlab" file_count:7916 delete_count:2237 deleted_byte_count:5824138895 version:3 modified_at_second:1627521784 disk_type:"nvme" - volume id:246746 size:1430471024 collection:"hengenlab" file_count:536 delete_count:133 deleted_byte_count:362810089 version:3 modified_at_second:1627521784 disk_type:"nvme" - Disk nvme total size:493787887720 file_count:229768 deleted_file:22421 deleted_bytes:53041850064 - DataNode 10.244.216.121:8080 total size:493787887720 file_count:229768 deleted_file:22421 deleted_bytes:53041850064 - DataNode 10.244.216.124:8080 nvme(volume:69/69 active:67 free:0 remote:0) - Disk nvme(volume:69/69 active:67 free:0 remote:0) - volume id:61 size:615912 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:879 version:3 compact_revision:8 modified_at_second:1627513382 disk_type:"nvme" - volume id:237 size:1364951800 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:655 version:3 modified_at_second:1610496298 disk_type:"nvme" - volume id:249 size:1156345656 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:589 version:3 modified_at_second:1610496421 disk_type:"nvme" - volume id:292 size:1238778960 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:620 version:3 modified_at_second:1610496936 disk_type:"nvme" - volume id:296 size:1162877928 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:562 version:3 modified_at_second:1610497004 disk_type:"nvme" - volume id:307 size:1167087136 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:582 version:3 modified_at_second:1610497162 disk_type:"nvme" - volume id:327 size:1206497736 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:579 version:3 modified_at_second:1610497407 disk_type:"nvme" - volume id:357 size:1129977984 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:549 version:3 modified_at_second:1610497787 disk_type:"nvme" - volume id:364 size:1183530952 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:569 version:3 modified_at_second:1610497862 disk_type:"nvme" - volume id:373 size:1278907048 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:611 version:3 modified_at_second:1610498031 disk_type:"nvme" - volume id:436 size:1117460680 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:547 version:3 modified_at_second:1610498821 disk_type:"nvme" - volume id:463 size:1106554216 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:553 version:3 modified_at_second:1623133765 disk_type:"nvme" - volume id:485 size:1235448568 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:598 version:3 modified_at_second:1623133793 disk_type:"nvme" - volume id:492 size:1147160824 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1139 version:3 modified_at_second:1623133807 disk_type:"nvme" - volume id:509 size:1207966936 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:619 version:3 modified_at_second:1610643888 disk_type:"nvme" - volume id:523 size:1335123824 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:670 version:3 modified_at_second:1623133850 disk_type:"nvme" - volume id:527 size:1253834800 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:663 version:3 modified_at_second:1623133864 disk_type:"nvme" - volume id:531 size:1287189864 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:678 version:3 modified_at_second:1623133878 disk_type:"nvme" - volume id:536 size:1290519256 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:654 version:3 modified_at_second:1623133893 disk_type:"nvme" - volume id:557 size:1123381424 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:701 version:3 modified_at_second:1623133907 disk_type:"nvme" - volume id:647 size:8388808 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627672953 disk_type:"nvme" - volume id:653 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627513390 disk_type:"nvme" - volume id:662 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627513387 disk_type:"nvme" - volume id:669 size:1082993928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:9738 delete_count:9737 deleted_byte_count:1078157927 version:3 modified_at_second:1627500596 disk_type:"nvme" - volume id:674 size:1083867360 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8810 delete_count:8808 deleted_byte_count:1074892513 version:3 modified_at_second:1627504775 disk_type:"nvme" - volume id:697 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627515992 disk_type:"nvme" - volume id:704 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627513391 disk_type:"nvme" - volume id:1033 size:376 collection:"swfstest" file_count:1 version:3 modified_at_second:1623134314 disk_type:"nvme" - volume id:1037 size:8 collection:"pvc-0544e3a6-da8f-42fe-a149-3a103bcc8552" replica_placement:1 version:3 modified_at_second:1623134327 disk_type:"nvme" - volume id:1124 size:20981558144 collection:"braingeneers-backups-swfs" file_count:12294 delete_count:238 deleted_byte_count:353310263 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1132 size:20972966960 collection:"braingeneers-backups-swfs" file_count:12252 delete_count:230 deleted_byte_count:365652225 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1134 size:20972489728 collection:"braingeneers-backups-swfs" file_count:12218 delete_count:217 deleted_byte_count:359714514 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1135 size:20972086640 collection:"braingeneers-backups-swfs" file_count:12232 delete_count:233 deleted_byte_count:370529147 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1140 size:21014815008 collection:"braingeneers-backups-swfs" file_count:12261 delete_count:220 deleted_byte_count:364939661 version:3 compact_revision:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1767 size:245280920 file_count:112 version:3 modified_at_second:1627431723 disk_type:"nvme" - volume id:133787 size:21301768216 collection:"hengenlab" file_count:8526 delete_count:8264 deleted_byte_count:20658424014 read_only:true version:3 modified_at_second:1627413970 disk_type:"nvme" - volume id:133819 size:21226668664 collection:"hengenlab" file_count:8129 delete_count:8129 deleted_byte_count:21226124008 read_only:true version:3 modified_at_second:1627413963 disk_type:"nvme" - volume id:133878 size:13631888 collection:"hengenlab" file_count:7 read_only:true version:3 compact_revision:1 modified_at_second:1627513374 disk_type:"nvme" - volume id:133883 size:18874712 collection:"hengenlab" file_count:6 read_only:true version:3 compact_revision:1 modified_at_second:1627513357 disk_type:"nvme" - volume id:133902 size:15728984 collection:"hengenlab" file_count:6 read_only:true version:3 compact_revision:1 modified_at_second:1627513353 disk_type:"nvme" - volume id:133906 size:9437360 collection:"hengenlab" file_count:3 read_only:true version:3 compact_revision:1 modified_at_second:1627513371 disk_type:"nvme" - volume id:133916 size:10485992 collection:"hengenlab" file_count:4 read_only:true version:3 compact_revision:1 modified_at_second:1627513365 disk_type:"nvme" - volume id:133930 size:9437360 collection:"hengenlab" file_count:3 read_only:true version:3 compact_revision:1 modified_at_second:1627513375 disk_type:"nvme" - volume id:133931 size:30409160 collection:"hengenlab" file_count:8 read_only:true version:3 compact_revision:1 modified_at_second:1627513362 disk_type:"nvme" - volume id:133940 size:10485992 collection:"hengenlab" file_count:4 read_only:true version:3 compact_revision:1 modified_at_second:1627513381 disk_type:"nvme" - volume id:133944 size:27263432 collection:"hengenlab" file_count:8 read_only:true version:3 compact_revision:1 modified_at_second:1627513361 disk_type:"nvme" - volume id:133998 size:20971976 collection:"hengenlab" file_count:8 read_only:true version:3 compact_revision:1 modified_at_second:1627513353 disk_type:"nvme" - volume id:134016 size:27263432 collection:"hengenlab" file_count:8 read_only:true version:3 compact_revision:1 modified_at_second:1627513354 disk_type:"nvme" - volume id:134026 size:11534624 collection:"hengenlab" file_count:5 read_only:true version:3 compact_revision:1 modified_at_second:1627513367 disk_type:"nvme" - volume id:134027 size:18874712 collection:"hengenlab" file_count:6 read_only:true version:3 compact_revision:1 modified_at_second:1627513378 disk_type:"nvme" - volume id:134035 size:7340432 collection:"hengenlab" file_count:7 read_only:true version:3 compact_revision:1 modified_at_second:1627513356 disk_type:"nvme" - volume id:134044 size:13631720 collection:"hengenlab" file_count:4 read_only:true version:3 compact_revision:1 modified_at_second:1627513373 disk_type:"nvme" - volume id:134080 size:20971976 collection:"hengenlab" file_count:8 read_only:true version:3 compact_revision:1 modified_at_second:1627513354 disk_type:"nvme" - volume id:134097 size:9437528 collection:"hengenlab" file_count:6 read_only:true version:3 compact_revision:1 modified_at_second:1627513365 disk_type:"nvme" - volume id:134098 size:8388728 collection:"hengenlab" file_count:2 read_only:true version:3 compact_revision:1 modified_at_second:1627513356 disk_type:"nvme" - volume id:134124 size:23069240 collection:"hengenlab" file_count:10 read_only:true version:3 compact_revision:1 modified_at_second:1627513352 disk_type:"nvme" - volume id:134126 size:5243000 collection:"hengenlab" file_count:2 read_only:true version:3 compact_revision:1 modified_at_second:1627513372 disk_type:"nvme" - volume id:134130 size:9437360 collection:"hengenlab" file_count:3 read_only:true version:3 compact_revision:1 modified_at_second:1627513373 disk_type:"nvme" - volume id:134152 size:15728984 collection:"hengenlab" file_count:6 read_only:true version:3 compact_revision:1 modified_at_second:1627513371 disk_type:"nvme" - volume id:134170 size:18874712 collection:"hengenlab" file_count:6 version:3 compact_revision:1 modified_at_second:1627513372 disk_type:"nvme" - volume id:134194 size:11534624 collection:"hengenlab" file_count:5 version:3 compact_revision:1 modified_at_second:1627513370 disk_type:"nvme" - volume id:134245 size:21333464920 collection:"hengenlab" file_count:8233 delete_count:1356 deleted_byte_count:3363590657 version:3 modified_at_second:1627504865 disk_type:"nvme" - volume id:246154 size:21297033344 collection:"hengenlab" file_count:8121 read_only:true version:3 modified_at_second:1627419656 disk_type:"nvme" - volume id:246255 size:21292259792 collection:"hengenlab" file_count:8058 read_only:true version:3 modified_at_second:1627423488 disk_type:"nvme" - volume id:246282 size:21406049120 collection:"hengenlab" file_count:8163 read_only:true version:3 modified_at_second:1627424758 disk_type:"nvme" - volume id:246322 size:21614436384 collection:"hengenlab" file_count:9033 version:3 modified_at_second:1627426441 disk_type:"nvme" - volume id:246400 size:21121703536 collection:"hengenlab" file_count:8120 version:3 modified_at_second:1627431006 disk_type:"nvme" - volume id:246414 size:21486611344 collection:"hengenlab" file_count:8180 version:3 modified_at_second:1627431506 disk_type:"nvme" - volume id:246425 size:1747029080 collection:"hengenlab" file_count:662 version:3 modified_at_second:1627432019 disk_type:"nvme" - Disk nvme total size:324540519312 file_count:168301 deleted_file:37432 deleted_bytes:49215334929 - DataNode 10.244.216.124:8080 total size:324540519312 file_count:168301 deleted_file:37432 deleted_bytes:49215334929 - DataNode 10.244.216.77:8080 nvme(volume:58/58 active:57 free:0 remote:0) - Disk nvme(volume:58/58 active:57 free:0 remote:0) - volume id:2 size:237058544 file_count:5594 delete_count:1 deleted_byte_count:197 version:3 modified_at_second:1626640345 disk_type:"nvme" - volume id:38 size:604200 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:869 version:3 compact_revision:7 modified_at_second:1627507800 disk_type:"nvme" - volume id:39 size:578216 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:848 version:3 compact_revision:7 modified_at_second:1627507799 disk_type:"nvme" - volume id:121 size:12583160 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:3 modified_at_second:1627507796 disk_type:"nvme" - volume id:128 size:8 collection:"._.DS_Store" version:3 modified_at_second:1610069605 disk_type:"nvme" - volume id:136 size:8 collection:".DS_Store" version:3 compact_revision:1 modified_at_second:1610070116 disk_type:"nvme" - volume id:217 size:1209636576 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:581 version:3 modified_at_second:1623175319 disk_type:"nvme" - volume id:219 size:1197692984 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:577 version:3 modified_at_second:1623175333 disk_type:"nvme" - volume id:226 size:1461113792 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:702 version:3 modified_at_second:1623175360 disk_type:"nvme" - volume id:271 size:1536308152 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:765 version:3 modified_at_second:1623175388 disk_type:"nvme" - volume id:299 size:1258933600 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:603 version:3 modified_at_second:1623175402 disk_type:"nvme" - volume id:325 size:1246875352 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:598 version:3 modified_at_second:1623175416 disk_type:"nvme" - volume id:329 size:1218014304 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:601 version:3 modified_at_second:1623175430 disk_type:"nvme" - volume id:333 size:1196940808 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:589 version:3 modified_at_second:1623175443 disk_type:"nvme" - volume id:345 size:1205177112 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:609 version:3 modified_at_second:1623175471 disk_type:"nvme" - volume id:367 size:1257405952 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:602 version:3 modified_at_second:1610497960 disk_type:"nvme" - volume id:384 size:1245513472 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:627 version:3 modified_at_second:1623175540 disk_type:"nvme" - volume id:385 size:1265778408 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:635 version:3 modified_at_second:1610498218 disk_type:"nvme" - volume id:441 size:1220881832 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:589 version:3 modified_at_second:1623175568 disk_type:"nvme" - volume id:445 size:1568529440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:779 version:3 modified_at_second:1610499009 disk_type:"nvme" - volume id:483 size:1215104824 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:597 version:3 modified_at_second:1623175595 disk_type:"nvme" - volume id:498 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1627507790 disk_type:"nvme" - volume id:504 size:1226829928 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:697 version:3 modified_at_second:1623175637 disk_type:"nvme" - volume id:525 size:1377305584 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:687 version:3 modified_at_second:1610643966 disk_type:"nvme" - volume id:526 size:1282701392 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:641 version:3 modified_at_second:1610643966 disk_type:"nvme" - volume id:528 size:1327751736 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:695 version:3 modified_at_second:1610644025 disk_type:"nvme" - volume id:596 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" - volume id:648 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507798 disk_type:"nvme" - volume id:666 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507791 disk_type:"nvme" - volume id:671 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507796 disk_type:"nvme" - volume id:687 size:16777576 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1627507796 disk_type:"nvme" - volume id:713 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1627507792 disk_type:"nvme" - volume id:747 size:138412464 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1618444173 disk_type:"nvme" - volume id:749 size:138412488 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1618444179 disk_type:"nvme" - volume id:770 size:171967016 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:2 modified_at_second:1627504767 disk_type:"nvme" - volume id:776 size:205521416 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:2 modified_at_second:1619387461 disk_type:"nvme" - volume id:846 size:180355792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:1 modified_at_second:1619387463 disk_type:"nvme" - volume id:931 size:134218088 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1617901742 disk_type:"nvme" - volume id:961 size:209715936 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:2 modified_at_second:1627500580 disk_type:"nvme" - volume id:974 size:207600392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:8 version:3 compact_revision:1 modified_at_second:1619387472 disk_type:"nvme" - volume id:976 size:142606864 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 delete_count:2 deleted_byte_count:8388677 version:3 compact_revision:2 modified_at_second:1627504752 disk_type:"nvme" - volume id:1029 size:167772560 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1613770360 disk_type:"nvme" - volume id:1041 size:8 collection:"pvc-0544e3a6-da8f-42fe-a149-3a103bcc8552" version:3 modified_at_second:1615234634 disk_type:"nvme" - volume id:1048 size:8 collection:"pvc-73532100-54aa-469c-b8a7-1774be8c3b9e" version:3 compact_revision:3 modified_at_second:1625624761 disk_type:"nvme" - volume id:1075 size:20980265944 collection:"braingeneers-backups-swfs" file_count:12204 delete_count:220 deleted_byte_count:341737893 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1091 size:20979698232 collection:"braingeneers-backups-swfs" file_count:12215 delete_count:233 deleted_byte_count:385517642 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1099 size:20972466088 collection:"braingeneers-backups-swfs" file_count:12236 delete_count:240 deleted_byte_count:404330634 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1129 size:20973262376 collection:"braingeneers-backups-swfs" file_count:12222 delete_count:221 deleted_byte_count:345307871 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:246272 size:21262264696 collection:"hengenlab" file_count:8123 read_only:true version:3 modified_at_second:1627424197 disk_type:"nvme" - volume id:246389 size:21190435064 collection:"hengenlab" file_count:8096 delete_count:6 deleted_byte_count:12583038 version:3 modified_at_second:1627504944 disk_type:"nvme" - volume id:246464 size:21333635120 collection:"hengenlab" file_count:8201 version:3 modified_at_second:1627435459 disk_type:"nvme" - volume id:246484 size:21157516152 collection:"hengenlab" file_count:8049 version:3 modified_at_second:1627436478 disk_type:"nvme" - volume id:246539 size:12094202280 collection:"hengenlab" file_count:4624 version:3 compact_revision:1 modified_at_second:1627528771 disk_type:"nvme" - volume id:246591 size:21264489512 collection:"hengenlab" file_count:8130 read_only:true version:3 modified_at_second:1627439571 disk_type:"nvme" - volume id:246617 size:21144028736 collection:"hengenlab" file_count:8071 version:3 modified_at_second:1627440224 disk_type:"nvme" - volume id:246635 size:21297929752 collection:"hengenlab" file_count:8139 version:3 modified_at_second:1627440889 disk_type:"nvme" - volume id:246652 size:21099579176 collection:"hengenlab" file_count:8055 version:3 modified_at_second:1627442183 disk_type:"nvme" - volume id:246690 size:2794514912 collection:"hengenlab" file_count:1069 version:3 compact_revision:1 modified_at_second:1627528591 disk_type:"nvme" - Disk nvme total size:295115049088 file_count:138995 deleted_file:925 deleted_bytes:1506254636 - DataNode 10.244.216.77:8080 total size:295115049088 file_count:138995 deleted_file:925 deleted_bytes:1506254636 - DataNode 10.244.216.96:8080 nvme(volume:54/54 active:54 free:0 remote:0) - Disk nvme(volume:54/54 active:54 free:0 remote:0) - volume id:49 size:620856 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:891 version:3 compact_revision:8 modified_at_second:1627507799 disk_type:"nvme" - volume id:77 size:619536 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:892 version:3 compact_revision:7 modified_at_second:1627507800 disk_type:"nvme" - volume id:125 size:8 collection:"._.DS_Store" version:3 compact_revision:1 modified_at_second:1610394116 disk_type:"nvme" - volume id:193 size:1251540904 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:3472 version:3 modified_at_second:1610494777 disk_type:"nvme" - volume id:224 size:1473093376 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:708 version:3 modified_at_second:1610496178 disk_type:"nvme" - volume id:257 size:1145971536 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:577 version:3 modified_at_second:1610496537 disk_type:"nvme" - volume id:272 size:1208778992 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:608 version:3 modified_at_second:1610496719 disk_type:"nvme" - volume id:283 size:1241199976 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:600 version:3 modified_at_second:1610496866 disk_type:"nvme" - volume id:289 size:1243481280 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:623 version:3 modified_at_second:1610496936 disk_type:"nvme" - volume id:306 size:1195553616 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:591 version:3 modified_at_second:1610497162 disk_type:"nvme" - volume id:322 size:1195975408 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:596 version:3 modified_at_second:1610497331 disk_type:"nvme" - volume id:341 size:1239397416 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:629 version:3 modified_at_second:1610497637 disk_type:"nvme" - volume id:349 size:1142160784 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:549 version:3 modified_at_second:1610497700 disk_type:"nvme" - volume id:351 size:1137331600 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:547 version:3 modified_at_second:1610497700 disk_type:"nvme" - volume id:362 size:1154734680 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:558 version:3 modified_at_second:1610497862 disk_type:"nvme" - volume id:365 size:1089066584 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:521 version:3 modified_at_second:1610497955 disk_type:"nvme" - volume id:444 size:1487526264 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:738 version:3 modified_at_second:1610499008 disk_type:"nvme" - volume id:454 size:1228957688 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:592 version:3 modified_at_second:1610499083 disk_type:"nvme" - volume id:511 size:2214084672 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1106 version:3 modified_at_second:1623175727 disk_type:"nvme" - volume id:518 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1627507789 disk_type:"nvme" - volume id:533 size:1103653736 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:540 version:3 modified_at_second:1610644079 disk_type:"nvme" - volume id:542 size:1175342904 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:582 version:3 modified_at_second:1623175755 disk_type:"nvme" - volume id:564 size:884884392 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1452 version:3 modified_at_second:1623175768 disk_type:"nvme" - volume id:585 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1627507797 disk_type:"nvme" - volume id:587 size:8388808 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507797 disk_type:"nvme" - volume id:605 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507791 disk_type:"nvme" - volume id:607 size:8388808 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" - volume id:611 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507792 disk_type:"nvme" - volume id:645 size:12583192 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1627507789 disk_type:"nvme" - volume id:650 size:8388776 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627507793 disk_type:"nvme" - volume id:659 size:12583176 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1627507790 disk_type:"nvme" - volume id:672 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507794 disk_type:"nvme" - volume id:680 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507792 disk_type:"nvme" - volume id:693 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507796 disk_type:"nvme" - volume id:694 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507797 disk_type:"nvme" - volume id:696 size:12583176 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1627507792 disk_type:"nvme" - volume id:705 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" - volume id:709 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627507795 disk_type:"nvme" - volume id:748 size:234881648 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:7 version:3 compact_revision:1 modified_at_second:1617901734 disk_type:"nvme" - volume id:1027 size:222299096 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:11 version:3 compact_revision:2 modified_at_second:1619387473 disk_type:"nvme" - volume id:1031 size:8 collection:"swfstest" replica_placement:1 version:3 modified_at_second:1623176448 disk_type:"nvme" - volume id:1103 size:20977418120 collection:"braingeneers-backups-swfs" file_count:12141 delete_count:222 deleted_byte_count:349264316 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1139 size:20986196552 collection:"braingeneers-backups-swfs" file_count:12267 delete_count:223 deleted_byte_count:356436042 version:3 compact_revision:2 modified_at_second:1627607153 disk_type:"nvme" - volume id:1143 size:20972913568 collection:"braingeneers-backups-swfs" file_count:12178 delete_count:224 deleted_byte_count:363552822 version:3 compact_revision:2 modified_at_second:1627607153 disk_type:"nvme" - volume id:1145 size:21048148008 collection:"braingeneers-backups-swfs" file_count:12399 delete_count:230 deleted_byte_count:379166350 version:3 compact_revision:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1642 size:9100146128 collection:"hengenlab" file_count:3480 delete_count:16 deleted_byte_count:41943376 version:3 compact_revision:4 modified_at_second:1627521882 disk_type:"nvme" - volume id:246199 size:21403378272 collection:"hengenlab" file_count:8154 delete_count:9 deleted_byte_count:34603197 version:3 modified_at_second:1627521882 disk_type:"nvme" - volume id:246205 size:21375756440 collection:"hengenlab" file_count:8181 delete_count:10 deleted_byte_count:35651794 version:3 modified_at_second:1627521882 disk_type:"nvme" - volume id:246252 size:21526280816 collection:"hengenlab" file_count:8194 delete_count:12 deleted_byte_count:34603260 version:3 modified_at_second:1627521882 disk_type:"nvme" - volume id:246269 size:21725222792 collection:"hengenlab" file_count:8334 delete_count:11 deleted_byte_count:27263207 version:3 modified_at_second:1627521881 disk_type:"nvme" - volume id:246290 size:21724377808 collection:"hengenlab" file_count:8308 delete_count:13 deleted_byte_count:38797585 version:3 modified_at_second:1627521882 disk_type:"nvme" - volume id:246307 size:21390829120 collection:"hengenlab" file_count:8104 delete_count:19 deleted_byte_count:41943439 version:3 modified_at_second:1627521881 disk_type:"nvme" - volume id:246340 size:21378038880 collection:"hengenlab" file_count:7477 delete_count:65 deleted_byte_count:253758075 version:3 modified_at_second:1627521882 disk_type:"nvme" - volume id:246360 size:3123609192 collection:"hengenlab" file_count:1192 version:3 compact_revision:1 modified_at_second:1627528621 disk_type:"nvme" - Disk nvme total size:271112526976 file_count:127825 deleted_file:1054 deleted_bytes:1956983463 - DataNode 10.244.216.96:8080 total size:271112526976 file_count:127825 deleted_file:1054 deleted_bytes:1956983463 - DataNode 10.244.216.99:8080 nvme(volume:49/49 active:49 free:0 remote:0) - Disk nvme(volume:49/49 active:49 free:0 remote:0) - volume id:29 size:529376 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:857 version:3 compact_revision:6 modified_at_second:1627500690 disk_type:"nvme" - volume id:47 size:598712 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:920 version:3 compact_revision:8 modified_at_second:1627505190 disk_type:"nvme" - volume id:197 size:1091620784 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:548 version:3 modified_at_second:1623182091 disk_type:"nvme" - volume id:220 size:1152092072 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:555 version:3 modified_at_second:1623181638 disk_type:"nvme" - volume id:229 size:1134909392 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:543 version:3 modified_at_second:1623181157 disk_type:"nvme" - volume id:250 size:1142798728 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:580 version:3 modified_at_second:1623181979 disk_type:"nvme" - volume id:255 size:1095269672 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:535 version:3 modified_at_second:1623182222 disk_type:"nvme" - volume id:270 size:1199706512 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:609 version:3 modified_at_second:1623182325 disk_type:"nvme" - volume id:344 size:1187094264 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:591 version:3 modified_at_second:1623182455 disk_type:"nvme" - volume id:381 size:1077258400 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:542 version:3 modified_at_second:1623181321 disk_type:"nvme" - volume id:390 size:1110493800 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:529 version:3 modified_at_second:1623181008 disk_type:"nvme" - volume id:428 size:1178569608 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:568 version:3 modified_at_second:1623182712 disk_type:"nvme" - volume id:431 size:1126797960 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:555 version:3 modified_at_second:1623181763 disk_type:"nvme" - volume id:446 size:1404180928 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:696 version:3 modified_at_second:1610499009 disk_type:"nvme" - volume id:458 size:1141606496 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:572 version:3 modified_at_second:1623181457 disk_type:"nvme" - volume id:543 size:1190882840 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:586 version:3 modified_at_second:1623182582 disk_type:"nvme" - volume id:546 size:1168631080 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:644 version:3 modified_at_second:1623181627 disk_type:"nvme" - volume id:555 size:1099880440 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:613 version:3 modified_at_second:1623180855 disk_type:"nvme" - volume id:568 size:853097112 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:1356 version:3 modified_at_second:1623181021 disk_type:"nvme" - volume id:637 size:4194392 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627505191 disk_type:"nvme" - volume id:798 size:104857952 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623183273 disk_type:"nvme" - volume id:826 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1623183121 disk_type:"nvme" - volume id:837 size:104857952 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1623184072 disk_type:"nvme" - volume id:838 size:75497856 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 delete_count:2 deleted_byte_count:8388677 version:3 compact_revision:1 modified_at_second:1627500577 disk_type:"nvme" - volume id:853 size:79692216 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1623183834 disk_type:"nvme" - volume id:859 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1618444183 disk_type:"nvme" - volume id:860 size:100663568 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623183263 disk_type:"nvme" - volume id:862 size:109052376 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:2 modified_at_second:1627500582 disk_type:"nvme" - volume id:877 size:37748912 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:2 modified_at_second:1623183981 disk_type:"nvme" - volume id:888 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623183552 disk_type:"nvme" - volume id:892 size:104857944 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1618444168 disk_type:"nvme" - volume id:912 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1623183539 disk_type:"nvme" - volume id:917 size:41943304 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1623183391 disk_type:"nvme" - volume id:954 size:201327128 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1623184630 disk_type:"nvme" - volume id:956 size:142606872 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:1 modified_at_second:1623183845 disk_type:"nvme" - volume id:957 size:75497848 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:3 modified_at_second:1627505191 disk_type:"nvme" - volume id:959 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1623184258 disk_type:"nvme" - volume id:967 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 delete_count:1 deleted_byte_count:4194335 version:3 compact_revision:2 modified_at_second:1627504756 disk_type:"nvme" - volume id:987 size:109052360 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 delete_count:1 deleted_byte_count:4194342 version:3 compact_revision:2 modified_at_second:1627504764 disk_type:"nvme" - volume id:1060 size:20977909896 collection:"braingeneers-backups-swfs" file_count:12264 delete_count:231 deleted_byte_count:360228000 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1061 size:20972527616 collection:"braingeneers-backups-swfs" file_count:12244 delete_count:226 deleted_byte_count:351170696 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1068 size:20983266928 collection:"braingeneers-backups-swfs" file_count:12188 delete_count:222 deleted_byte_count:372826219 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1116 size:20977766728 collection:"braingeneers-backups-swfs" file_count:12176 delete_count:211 deleted_byte_count:317023642 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:246192 size:21569860624 collection:"hengenlab" file_count:8239 read_only:true version:3 modified_at_second:1627419229 disk_type:"nvme" - volume id:246198 size:21638300624 collection:"hengenlab" file_count:8250 read_only:true version:3 modified_at_second:1627419609 disk_type:"nvme" - volume id:246256 size:21605810464 collection:"hengenlab" file_count:8279 read_only:true version:3 modified_at_second:1627423494 disk_type:"nvme" - volume id:246309 size:21136409392 collection:"hengenlab" file_count:8118 version:3 modified_at_second:1627426109 disk_type:"nvme" - volume id:246313 size:21143966648 collection:"hengenlab" file_count:8112 version:3 modified_at_second:1627426110 disk_type:"nvme" - volume id:246390 size:2639501832 collection:"hengenlab" file_count:1017 version:3 modified_at_second:1627430033 disk_type:"nvme" - Disk nvme total size:214645512456 file_count:103356 deleted_file:895 deleted_bytes:1422220253 - DataNode 10.244.216.99:8080 total size:214645512456 file_count:103356 deleted_file:895 deleted_bytes:1422220253 - DataNode 10.244.80.134:8080 hdd(volume:12/90 active:18446744073709551605 free:78 remote:0) - Disk hdd(volume:12/90 active:18446744073709551605 free:78 remote:0) - volume id:411675 size:10925121480 collection:"hengenlab" file_count:4168 delete_count:4 deleted_byte_count:10485844 version:3 compact_revision:4 modified_at_second:1627843728 - volume id:411687 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627523170 - volume id:411737 size:21003049800 collection:"hengenlab" file_count:8134 delete_count:1736 deleted_byte_count:4244054587 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411758 size:21013439504 collection:"hengenlab" file_count:8127 delete_count:1471 deleted_byte_count:3755111049 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411791 size:20974119312 collection:"hengenlab" file_count:8078 delete_count:156 deleted_byte_count:335792052 version:3 compact_revision:2 modified_at_second:1627704288 - volume id:411814 size:99191032 collection:"hengenlab" file_count:50 version:3 compact_revision:1 modified_at_second:1627525396 - volume id:411889 size:10659886216 collection:"hengenlab" file_count:4215 delete_count:29 deleted_byte_count:71303777 version:3 compact_revision:4 modified_at_second:1627843740 - volume id:411960 size:20973696416 collection:"hengenlab" file_count:7972 delete_count:4 deleted_byte_count:10485844 version:3 compact_revision:1 modified_at_second:1627702876 - volume id:411963 size:20980601448 collection:"hengenlab" file_count:7939 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:1 modified_at_second:1627702925 - volume id:411964 size:10968757944 collection:"hengenlab" file_count:4217 delete_count:3 deleted_byte_count:3145791 version:3 compact_revision:2 modified_at_second:1627843733 - volume id:411976 size:12354509912 collection:"hengenlab" file_count:4562 delete_count:9 deleted_byte_count:15728829 version:3 compact_revision:2 modified_at_second:1627843737 - volume id:412010 size:11502343208 collection:"hengenlab" file_count:4471 delete_count:63 deleted_byte_count:176162091 version:3 compact_revision:2 modified_at_second:1627843736 - Disk hdd total size:161454716280 file_count:61933 deleted_file:3476 deleted_bytes:8623318461 - DataNode 10.244.80.134:8080 total size:161454716280 file_count:61933 deleted_file:3476 deleted_bytes:8623318461 - DataNode 10.244.80.140:8080 hdd(volume:13/90 active:9 free:77 remote:0) - Disk hdd(volume:13/90 active:9 free:77 remote:0) - volume id:411682 size:10224440944 collection:"hengenlab" file_count:4003 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:3 modified_at_second:1627843736 - volume id:411695 size:20976107224 collection:"hengenlab" file_count:8196 delete_count:107 deleted_byte_count:213840753 version:3 compact_revision:2 modified_at_second:1627703622 - volume id:411708 size:13297386192 collection:"hengenlab" file_count:5126 delete_count:118 deleted_byte_count:219681828 version:3 compact_revision:2 modified_at_second:1627571096 - volume id:411730 size:9409806072 collection:"hengenlab" file_count:3635 delete_count:4 deleted_byte_count:10485844 version:3 compact_revision:2 modified_at_second:1627843741 - volume id:411803 size:21002314288 collection:"hengenlab" file_count:8072 delete_count:1602 deleted_byte_count:3980876253 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411817 size:20995447416 collection:"hengenlab" file_count:8091 delete_count:1581 deleted_byte_count:4004982858 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411829 size:21001195528 collection:"hengenlab" file_count:8166 delete_count:1438 deleted_byte_count:3647096970 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411852 size:12087574080 collection:"hengenlab" file_count:4685 delete_count:177 deleted_byte_count:464608069 version:3 compact_revision:3 modified_at_second:1627843741 - volume id:411905 size:20996535136 collection:"hengenlab" file_count:8084 delete_count:1680 deleted_byte_count:4385158464 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411962 size:20973083080 collection:"hengenlab" file_count:8056 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:1 modified_at_second:1627702680 - volume id:412013 size:9106611576 collection:"hengenlab" file_count:3574 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:3 modified_at_second:1627843705 - volume id:412016 size:11357864984 collection:"hengenlab" file_count:4329 delete_count:169 deleted_byte_count:438308317 version:3 compact_revision:2 modified_at_second:1627843734 - volume id:412031 size:9574720120 collection:"hengenlab" file_count:3767 delete_count:3 deleted_byte_count:3145791 version:3 compact_revision:1 modified_at_second:1627843736 - Disk hdd total size:201003086640 file_count:77784 deleted_file:6883 deleted_bytes:17381816719 - DataNode 10.244.80.140:8080 total size:201003086640 file_count:77784 deleted_file:6883 deleted_bytes:17381816719 - DataNode 10.244.80.141:8080 hdd(volume:20/90 active:18446744073709551611 free:70 remote:0) - Disk hdd(volume:20/90 active:18446744073709551611 free:70 remote:0) - volume id:133842 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627503390 - volume id:133871 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627502492 - volume id:133872 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627502512 - volume id:133928 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627501592 - volume id:134023 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627501592 - volume id:134031 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627503392 - volume id:411670 size:20991493528 collection:"hengenlab" file_count:8089 delete_count:1595 deleted_byte_count:4184556443 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411705 size:21016882360 collection:"hengenlab" file_count:8153 delete_count:1679 deleted_byte_count:4279403246 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411782 size:72353264 collection:"hengenlab" file_count:27 version:3 compact_revision:1 modified_at_second:1627526155 - volume id:411798 size:20985823160 collection:"hengenlab" file_count:8133 delete_count:1706 deleted_byte_count:4257830234 version:3 compact_revision:1 modified_at_second:1627609261 - volume id:411822 size:20339366800 collection:"hengenlab" file_count:8024 delete_count:1131 deleted_byte_count:2661575468 version:3 compact_revision:3 modified_at_second:1627843706 - volume id:411833 size:21010453856 collection:"hengenlab" file_count:8013 delete_count:1428 deleted_byte_count:3577934150 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411847 size:8961732960 collection:"hengenlab" file_count:3492 delete_count:402 deleted_byte_count:899558882 version:3 compact_revision:2 modified_at_second:1627571096 - volume id:411863 size:450799120 collection:"pvc-98352fb2-44e8-4c55-984c-b81bc55fc4bf" file_count:9286 delete_count:226 deleted_byte_count:52260686 version:3 compact_revision:1 modified_at_second:1627576155 - volume id:411924 size:19830101072 collection:"hengenlab" file_count:7535 delete_count:4 deleted_byte_count:7340116 version:3 compact_revision:2 modified_at_second:1627843739 - volume id:411945 size:19297621912 collection:"hengenlab" file_count:7484 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:1 modified_at_second:1627843728 - volume id:411954 size:18566585328 collection:"hengenlab" file_count:7083 delete_count:3 deleted_byte_count:12582975 version:3 compact_revision:1 modified_at_second:1627843706 - volume id:411977 size:12048972160 collection:"hengenlab" file_count:4472 delete_count:3 deleted_byte_count:12582975 version:3 compact_revision:2 modified_at_second:1627843731 - volume id:412011 size:13056698352 collection:"hengenlab" file_count:4880 delete_count:67 deleted_byte_count:183502207 version:3 compact_revision:2 modified_at_second:1627843731 - volume id:412012 size:12884104024 collection:"hengenlab" file_count:4865 delete_count:65 deleted_byte_count:153093461 version:3 compact_revision:2 modified_at_second:1627843740 - Disk hdd total size:209512987944 file_count:89536 deleted_file:8310 deleted_bytes:20283269440 - DataNode 10.244.80.141:8080 total size:209512987944 file_count:89536 deleted_file:8310 deleted_bytes:20283269440 - DataNode 10.244.80.143:8080 nvme(volume:101/101 active:95 free:0 remote:0) - Disk nvme(volume:101/101 active:95 free:0 remote:0) - volume id:35 size:552064 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:868 version:3 compact_revision:7 modified_at_second:1627672955 disk_type:"nvme" - volume id:37 size:591040 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:887 version:3 compact_revision:6 modified_at_second:1627507799 disk_type:"nvme" - volume id:42 size:955456 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:915 version:3 compact_revision:8 modified_at_second:1627507799 disk_type:"nvme" - volume id:48 size:648448 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:871 version:3 compact_revision:7 modified_at_second:1627672955 disk_type:"nvme" - volume id:64 size:517592 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:842 version:3 compact_revision:4 modified_at_second:1627515234 disk_type:"nvme" - volume id:119 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:4 modified_at_second:1627507794 disk_type:"nvme" - volume id:215 size:1201648024 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:577 version:3 modified_at_second:1627446041 disk_type:"nvme" - volume id:519 size:104857968 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1627415028 disk_type:"nvme" - volume id:586 size:83886632 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:6 version:3 compact_revision:2 modified_at_second:1627415114 disk_type:"nvme" - volume id:728 size:109052352 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1627415218 disk_type:"nvme" - volume id:731 size:71303424 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1627415300 disk_type:"nvme" - volume id:757 size:134220680 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 delete_count:1 deleted_byte_count:33557046 version:3 compact_revision:2 modified_at_second:1627504753 disk_type:"nvme" - volume id:761 size:37748928 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627415208 disk_type:"nvme" - volume id:762 size:104857944 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:2 modified_at_second:1627415311 disk_type:"nvme" - volume id:766 size:109052352 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:1 modified_at_second:1627415411 disk_type:"nvme" - volume id:769 size:67109048 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627415401 disk_type:"nvme" - volume id:788 size:46137712 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:4 version:3 compact_revision:1 modified_at_second:1627415497 disk_type:"nvme" - volume id:790 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1627415486 disk_type:"nvme" - volume id:1124 size:20981558144 collection:"braingeneers-backups-swfs" file_count:12294 delete_count:238 deleted_byte_count:353310263 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:133787 size:21301768216 collection:"hengenlab" file_count:8526 delete_count:8264 deleted_byte_count:20658424014 read_only:true version:3 modified_at_second:1627418836 disk_type:"nvme" - volume id:133819 size:21226668664 collection:"hengenlab" file_count:8129 delete_count:8129 deleted_byte_count:21226124008 read_only:true version:3 modified_at_second:1627419166 disk_type:"nvme" - volume id:133826 size:20996386664 collection:"hengenlab" file_count:7925 read_only:true version:3 compact_revision:1 modified_at_second:1627420219 disk_type:"nvme" - volume id:133828 size:3386232504 collection:"hengenlab" file_count:1299 version:3 compact_revision:2 modified_at_second:1627672815 disk_type:"nvme" - volume id:133831 size:21149835000 collection:"hengenlab" file_count:8102 read_only:true version:3 compact_revision:1 modified_at_second:1627420246 disk_type:"nvme" - volume id:133864 size:21147725272 collection:"hengenlab" file_count:8062 read_only:true version:3 compact_revision:1 modified_at_second:1627420790 disk_type:"nvme" - volume id:246129 size:20996663480 collection:"hengenlab" file_count:7985 read_only:true version:3 compact_revision:1 modified_at_second:1627416369 disk_type:"nvme" - volume id:246134 size:21102062712 collection:"hengenlab" file_count:8107 read_only:true version:3 compact_revision:1 modified_at_second:1627416409 disk_type:"nvme" - volume id:246137 size:21070660448 collection:"hengenlab" file_count:8067 read_only:true version:3 compact_revision:1 modified_at_second:1627416015 disk_type:"nvme" - volume id:246139 size:21087378424 collection:"hengenlab" file_count:8143 read_only:true version:3 compact_revision:1 modified_at_second:1627416103 disk_type:"nvme" - volume id:246160 size:21173604912 collection:"hengenlab" file_count:8044 read_only:true version:3 modified_at_second:1627417136 disk_type:"nvme" - volume id:246191 size:21109310752 collection:"hengenlab" file_count:8066 read_only:true version:3 modified_at_second:1627419229 disk_type:"nvme" - volume id:246206 size:21228541464 collection:"hengenlab" file_count:8082 read_only:true version:3 modified_at_second:1627420699 disk_type:"nvme" - volume id:246208 size:21065433552 collection:"hengenlab" file_count:8030 read_only:true version:3 modified_at_second:1627420700 disk_type:"nvme" - volume id:246209 size:21226447896 collection:"hengenlab" file_count:8146 read_only:true version:3 modified_at_second:1627420707 disk_type:"nvme" - volume id:246211 size:21042204688 collection:"hengenlab" file_count:8116 read_only:true version:3 modified_at_second:1627421160 disk_type:"nvme" - volume id:246223 size:21155858416 collection:"hengenlab" file_count:8099 read_only:true version:3 modified_at_second:1627421741 disk_type:"nvme" - volume id:246225 size:21707382056 collection:"hengenlab" file_count:8258 read_only:true version:3 modified_at_second:1627421741 disk_type:"nvme" - volume id:246241 size:21374844896 collection:"hengenlab" file_count:8083 read_only:true version:3 modified_at_second:1627423054 disk_type:"nvme" - volume id:246279 size:21178668712 collection:"hengenlab" file_count:8084 read_only:true version:3 modified_at_second:1627424647 disk_type:"nvme" - volume id:246310 size:21256214592 collection:"hengenlab" file_count:8112 read_only:true version:3 modified_at_second:1627426110 disk_type:"nvme" - volume id:246312 size:21139384064 collection:"hengenlab" file_count:8010 read_only:true version:3 modified_at_second:1627426100 disk_type:"nvme" - volume id:246324 size:21423012704 collection:"hengenlab" file_count:7876 version:3 modified_at_second:1627426646 disk_type:"nvme" - volume id:246327 size:21333965256 collection:"hengenlab" file_count:7432 version:3 modified_at_second:1627426798 disk_type:"nvme" - volume id:246353 size:21539528792 collection:"hengenlab" file_count:7623 version:3 modified_at_second:1627428047 disk_type:"nvme" - volume id:246363 size:21104327016 collection:"hengenlab" file_count:7931 delete_count:36 deleted_byte_count:150996633 version:3 modified_at_second:1627428714 disk_type:"nvme" - volume id:246401 size:21233335320 collection:"hengenlab" file_count:8045 version:3 modified_at_second:1627431006 disk_type:"nvme" - volume id:246412 size:21402967832 collection:"hengenlab" file_count:8164 version:3 modified_at_second:1627431341 disk_type:"nvme" - volume id:246432 size:21349863192 collection:"hengenlab" file_count:8173 version:3 modified_at_second:1627432826 disk_type:"nvme" - volume id:246440 size:21214912272 collection:"hengenlab" file_count:8123 version:3 modified_at_second:1627433651 disk_type:"nvme" - volume id:246454 size:21182583592 collection:"hengenlab" file_count:8089 version:3 modified_at_second:1627434137 disk_type:"nvme" - volume id:246460 size:21313723000 collection:"hengenlab" file_count:8143 version:3 modified_at_second:1627434637 disk_type:"nvme" - volume id:246474 size:21485514192 collection:"hengenlab" file_count:8211 version:3 modified_at_second:1627435962 disk_type:"nvme" - volume id:246508 size:21254246712 collection:"hengenlab" file_count:8121 read_only:true version:3 modified_at_second:1627437774 disk_type:"nvme" - volume id:246515 size:21255182720 collection:"hengenlab" file_count:8159 version:3 modified_at_second:1627438116 disk_type:"nvme" - volume id:246534 size:11952411712 collection:"hengenlab" file_count:4563 version:3 compact_revision:1 modified_at_second:1627672900 disk_type:"nvme" - volume id:246568 size:21482416816 collection:"hengenlab" file_count:8176 version:3 modified_at_second:1627438973 disk_type:"nvme" - volume id:246643 size:21212728664 collection:"hengenlab" file_count:8091 version:3 modified_at_second:1627441212 disk_type:"nvme" - volume id:246646 size:21230091592 collection:"hengenlab" file_count:8110 version:3 modified_at_second:1627441365 disk_type:"nvme" - volume id:246654 size:21256629168 collection:"hengenlab" file_count:8221 version:3 modified_at_second:1627442183 disk_type:"nvme" - volume id:246667 size:21470296632 collection:"hengenlab" file_count:7833 delete_count:696 deleted_byte_count:2816158582 version:3 modified_at_second:1627521906 disk_type:"nvme" - volume id:246762 size:13993967752 collection:"hengenlab" file_count:5330 version:3 compact_revision:1 modified_at_second:1627671971 disk_type:"nvme" - volume id:246804 size:14747219496 collection:"hengenlab" file_count:5616 version:3 compact_revision:1 modified_at_second:1627672312 disk_type:"nvme" - volume id:246821 size:5053374912 collection:"hengenlab" file_count:1930 version:3 compact_revision:1 modified_at_second:1627671741 disk_type:"nvme" - volume id:246846 size:15621328600 collection:"hengenlab" file_count:5960 version:3 compact_revision:1 modified_at_second:1627672550 disk_type:"nvme" - volume id:246857 size:9179967608 collection:"hengenlab" file_count:3501 version:3 compact_revision:1 modified_at_second:1627671462 disk_type:"nvme" - volume id:246860 size:3318059704 collection:"hengenlab" file_count:1276 version:3 compact_revision:1 modified_at_second:1627672026 disk_type:"nvme" - volume id:246908 size:2606815832 collection:"hengenlab" file_count:998 version:3 compact_revision:1 modified_at_second:1627671547 disk_type:"nvme" - volume id:246919 size:2756880144 collection:"hengenlab" file_count:1056 version:3 compact_revision:1 modified_at_second:1627672233 disk_type:"nvme" - volume id:246923 size:3006331520 collection:"hengenlab" file_count:1145 version:3 compact_revision:1 modified_at_second:1627672445 disk_type:"nvme" - volume id:246927 size:2843798936 collection:"hengenlab" file_count:1086 version:3 compact_revision:1 modified_at_second:1627672947 disk_type:"nvme" - volume id:246928 size:2784207504 collection:"hengenlab" file_count:1056 version:3 compact_revision:1 modified_at_second:1627671756 disk_type:"nvme" - volume id:246951 size:3024285968 collection:"hengenlab" file_count:1143 version:3 compact_revision:1 modified_at_second:1627671257 disk_type:"nvme" - volume id:246984 size:2888888600 collection:"hengenlab" file_count:1102 version:3 compact_revision:1 modified_at_second:1627672088 disk_type:"nvme" - volume id:247014 size:2794514912 collection:"hengenlab" file_count:1069 version:3 compact_revision:1 modified_at_second:1627672123 disk_type:"nvme" - volume id:247016 size:3105078816 collection:"hengenlab" file_count:1182 version:3 compact_revision:1 modified_at_second:1627672389 disk_type:"nvme" - volume id:247074 size:2857610056 collection:"hengenlab" file_count:1096 version:3 compact_revision:1 modified_at_second:1627672645 disk_type:"nvme" - volume id:247093 size:2576585584 collection:"hengenlab" file_count:987 version:3 compact_revision:1 modified_at_second:1627671649 disk_type:"nvme" - volume id:247098 size:2826037632 collection:"hengenlab" file_count:1088 version:3 compact_revision:1 modified_at_second:1627671893 disk_type:"nvme" - volume id:247108 size:2750832040 collection:"hengenlab" file_count:1054 version:3 compact_revision:1 modified_at_second:1627672601 disk_type:"nvme" - volume id:247111 size:2410727864 collection:"hengenlab" file_count:922 version:3 compact_revision:1 modified_at_second:1627672153 disk_type:"nvme" - volume id:247142 size:2827020992 collection:"hengenlab" file_count:1073 version:3 compact_revision:1 modified_at_second:1627671400 disk_type:"nvme" - volume id:247147 size:2616432096 collection:"hengenlab" file_count:998 version:3 compact_revision:1 modified_at_second:1627671796 disk_type:"nvme" - volume id:247162 size:2420165216 collection:"hengenlab" file_count:925 read_only:true version:3 compact_revision:1 modified_at_second:1627672615 disk_type:"nvme" - volume id:247167 size:2300624864 collection:"hengenlab" file_count:877 version:3 compact_revision:1 modified_at_second:1627671995 disk_type:"nvme" - volume id:247194 size:2024843552 collection:"hengenlab" file_count:773 version:3 compact_revision:1 modified_at_second:1627672342 disk_type:"nvme" - volume id:247196 size:2161275312 collection:"hengenlab" file_count:812 version:3 compact_revision:1 modified_at_second:1627672048 disk_type:"nvme" - volume id:247197 size:1916903432 collection:"hengenlab" file_count:752 version:3 compact_revision:1 modified_at_second:1627672928 disk_type:"nvme" - volume id:247205 size:1991582056 collection:"hengenlab" file_count:758 version:3 compact_revision:1 modified_at_second:1627671698 disk_type:"nvme" - volume id:247209 size:1645315304 collection:"hengenlab" file_count:628 version:3 compact_revision:2 modified_at_second:1627671498 disk_type:"nvme" - volume id:247216 size:1438677080 collection:"hengenlab" file_count:550 version:3 compact_revision:2 modified_at_second:1627671781 disk_type:"nvme" - volume id:247227 size:1227907928 collection:"hengenlab" file_count:454 version:3 compact_revision:2 modified_at_second:1627671503 disk_type:"nvme" - volume id:247229 size:1125684104 collection:"hengenlab" file_count:443 version:3 compact_revision:2 modified_at_second:1627671636 disk_type:"nvme" - volume id:247238 size:853559408 collection:"hengenlab" file_count:331 version:3 compact_revision:2 modified_at_second:1627671676 disk_type:"nvme" - volume id:247242 size:28755752 file_count:11 version:3 modified_at_second:1627449005 disk_type:"nvme" - volume id:247261 size:831538304 collection:"hengenlab" file_count:313 version:3 compact_revision:2 modified_at_second:1627672052 disk_type:"nvme" - volume id:247267 size:819070200 collection:"hengenlab" file_count:315 version:3 compact_revision:2 modified_at_second:1627672798 disk_type:"nvme" - volume id:247285 size:693188024 collection:"hengenlab" file_count:266 version:3 compact_revision:2 modified_at_second:1627671388 disk_type:"nvme" - volume id:247295 size:683865312 collection:"hengenlab" file_count:262 version:3 compact_revision:2 modified_at_second:1627672648 disk_type:"nvme" - volume id:247313 size:527444936 collection:"hengenlab" file_count:200 version:3 compact_revision:2 modified_at_second:1627672586 disk_type:"nvme" - volume id:247323 size:420846328 collection:"hengenlab" file_count:164 version:3 compact_revision:1 modified_at_second:1627507786 disk_type:"nvme" - volume id:247328 size:54706272 collection:"hengenlab" file_count:22 version:3 compact_revision:1 modified_at_second:1627507787 disk_type:"nvme" - Disk nvme total size:996707130184 file_count:387380 deleted_file:17364 deleted_bytes:45238570546 - DataNode 10.244.80.143:8080 total size:996707130184 file_count:387380 deleted_file:17364 deleted_bytes:45238570546 - DataNode 10.244.80.144:8080 hdd(volume:8/92 active:18446744073709551613 free:84 remote:0) - Disk hdd(volume:8/92 active:18446744073709551613 free:84 remote:0) - volume id:411663 size:9165165000 collection:"hengenlab" file_count:3579 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:1 modified_at_second:1627843722 - volume id:411899 size:20987709344 collection:"hengenlab" file_count:8172 delete_count:1670 deleted_byte_count:4186581607 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411912 size:9780260536 collection:"hengenlab" file_count:3675 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:2 modified_at_second:1627843741 - volume id:411936 size:19749281296 collection:"hengenlab" file_count:7667 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:1 modified_at_second:1627843740 - volume id:411937 size:19947403744 collection:"hengenlab" file_count:7664 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:1 modified_at_second:1627843745 - volume id:411939 size:19769183072 collection:"hengenlab" file_count:7606 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:1 modified_at_second:1627843732 - volume id:411991 size:9944244000 collection:"hengenlab" file_count:3865 delete_count:89 deleted_byte_count:206005689 version:3 compact_revision:2 modified_at_second:1627843715 - volume id:412001 size:10948213800 collection:"hengenlab" file_count:4180 delete_count:52 deleted_byte_count:145753156 version:3 compact_revision:2 modified_at_second:1627843742 - Disk hdd total size:120291460792 file_count:46408 deleted_file:1820 deleted_bytes:4566652193 - DataNode 10.244.80.144:8080 total size:120291460792 file_count:46408 deleted_file:1820 deleted_bytes:4566652193 - DataNode 10.244.80.145:8080 hdd(volume:10/90 active:18446744073709551613 free:80 remote:0) - Disk hdd(volume:10/90 active:18446744073709551613 free:80 remote:0) - volume id:411693 size:21005745488 collection:"hengenlab" file_count:8183 delete_count:2267 deleted_byte_count:5584520032 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411726 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627523126 - volume id:411836 size:17758175912 collection:"hengenlab" file_count:6899 delete_count:454 deleted_byte_count:1105798495 version:3 compact_revision:2 modified_at_second:1627843725 - volume id:411873 size:16990152440 collection:"hengenlab" file_count:6670 delete_count:543 deleted_byte_count:1298690618 version:3 compact_revision:2 modified_at_second:1627843738 - volume id:411875 size:9036328584 collection:"hengenlab" file_count:3519 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:2 modified_at_second:1627843742 - volume id:411878 size:21015592712 collection:"hengenlab" file_count:8082 delete_count:1402 deleted_byte_count:3597776530 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411887 size:18731439016 collection:"hengenlab" file_count:7261 delete_count:471 deleted_byte_count:1103119223 version:3 compact_revision:2 modified_at_second:1627843715 - volume id:411888 size:6917160672 collection:"hengenlab" file_count:2753 delete_count:673 deleted_byte_count:1567438719 version:3 compact_revision:2 modified_at_second:1627607477 - volume id:411970 size:11036248712 collection:"hengenlab" file_count:4155 delete_count:4 deleted_byte_count:13631572 version:3 compact_revision:2 modified_at_second:1627843730 - volume id:411994 size:11059388320 collection:"hengenlab" file_count:4249 delete_count:5 deleted_byte_count:8388713 version:3 compact_revision:2 modified_at_second:1627843719 - Disk hdd total size:133550231864 file_count:51771 deleted_file:5821 deleted_bytes:14284606824 - DataNode 10.244.80.145:8080 total size:133550231864 file_count:51771 deleted_file:5821 deleted_bytes:14284606824 - DataNode 10.244.80.146:8080 hdd(volume:13/88 active:18446744073709551608 free:75 remote:0) - Disk hdd(volume:13/88 active:18446744073709551608 free:75 remote:0) - volume id:133825 size:9225833640 collection:"hengenlab" file_count:3559 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:2 modified_at_second:1627843739 - volume id:411686 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627522290 - volume id:411690 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627522290 - volume id:411738 size:21025894536 collection:"hengenlab" file_count:8089 delete_count:1639 deleted_byte_count:4127582642 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411750 size:13765460952 collection:"hengenlab" file_count:5365 version:3 compact_revision:3 modified_at_second:1627843735 - volume id:411777 size:21046474416 collection:"hengenlab" file_count:8289 delete_count:2487 deleted_byte_count:5924696211 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411796 size:20993425872 collection:"hengenlab" file_count:8135 delete_count:1502 deleted_byte_count:3870962435 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411858 size:21046206000 collection:"hengenlab" file_count:8220 delete_count:2471 deleted_byte_count:6063418663 version:3 compact_revision:1 modified_at_second:1627571069 - volume id:411928 size:9095454264 collection:"hengenlab" file_count:3558 delete_count:3 deleted_byte_count:9437247 version:3 compact_revision:2 modified_at_second:1627843703 - volume id:411982 size:10421317104 collection:"hengenlab" file_count:3989 delete_count:3 deleted_byte_count:9437247 version:3 compact_revision:2 modified_at_second:1627843728 - volume id:411984 size:10009814624 collection:"hengenlab" file_count:3842 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:2 modified_at_second:1627843737 - volume id:412008 size:11965793208 collection:"hengenlab" file_count:4456 delete_count:52 deleted_byte_count:117441604 version:3 compact_revision:2 modified_at_second:1627843740 - volume id:412030 size:9624310920 collection:"hengenlab" file_count:3749 delete_count:6 deleted_byte_count:22020222 version:3 compact_revision:1 modified_at_second:1627843722 - Disk hdd total size:158219985552 file_count:61251 deleted_file:8167 deleted_bytes:20155482115 - DataNode 10.244.80.146:8080 total size:158219985552 file_count:61251 deleted_file:8167 deleted_bytes:20155482115 - DataNode 10.244.80.147:8080 hdd(volume:16/90 active:18446744073709551601 free:74 remote:0) - Disk hdd(volume:16/90 active:18446744073709551601 free:74 remote:0) - volume id:411665 size:9234805288 collection:"hengenlab" file_count:3527 delete_count:3 deleted_byte_count:3145791 version:3 compact_revision:1 modified_at_second:1627843728 - volume id:411703 size:20979965400 collection:"hengenlab" file_count:8104 delete_count:104 deleted_byte_count:195001608 version:3 compact_revision:2 modified_at_second:1627703324 - volume id:411704 size:21002179704 collection:"hengenlab" file_count:8067 delete_count:1578 deleted_byte_count:4010373136 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411710 size:9437360 collection:"hengenlab" file_count:3 version:3 compact_revision:1 modified_at_second:1627523993 - volume id:411759 size:20996758312 collection:"hengenlab" file_count:8123 delete_count:1537 deleted_byte_count:4018732086 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411775 size:21001393496 collection:"hengenlab" file_count:8112 delete_count:1564 deleted_byte_count:3918816453 version:3 compact_revision:1 modified_at_second:1627571069 - volume id:411778 size:12775626152 collection:"hengenlab" file_count:5044 delete_count:152 deleted_byte_count:303006707 version:3 compact_revision:2 modified_at_second:1627571096 - volume id:411843 size:20980953512 collection:"hengenlab" file_count:8010 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:2 modified_at_second:1627700684 - volume id:411869 size:20977725816 collection:"hengenlab" file_count:7982 delete_count:1468 deleted_byte_count:3804294082 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411901 size:21004990728 collection:"hengenlab" file_count:8077 delete_count:1658 deleted_byte_count:4312970222 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411902 size:20971945640 collection:"hengenlab" file_count:8017 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:2 modified_at_second:1627703277 - volume id:411933 size:8098190912 collection:"hengenlab" file_count:3255 version:3 compact_revision:1 modified_at_second:1627617095 - volume id:411941 size:19573411416 collection:"hengenlab" file_count:7597 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:1 modified_at_second:1627843731 - volume id:411947 size:19830507872 collection:"hengenlab" file_count:7612 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:1 modified_at_second:1627843738 - volume id:411965 size:11001156144 collection:"hengenlab" file_count:4207 delete_count:4 deleted_byte_count:10485844 version:3 compact_revision:2 modified_at_second:1627843736 - volume id:411990 size:10037202472 collection:"hengenlab" file_count:3877 delete_count:14 deleted_byte_count:36700454 version:3 compact_revision:2 modified_at_second:1627843737 - Disk hdd total size:258476250224 file_count:99614 deleted_file:8088 deleted_bytes:20632400877 - DataNode 10.244.80.147:8080 total size:258476250224 file_count:99614 deleted_file:8088 deleted_bytes:20632400877 - DataNode 10.244.80.149:8080 hdd(volume:13/89 active:18446744073709551602 free:76 remote:0) - Disk hdd(volume:13/89 active:18446744073709551602 free:76 remote:0) - volume id:411679 size:12243575888 collection:"hengenlab" file_count:4729 version:3 compact_revision:2 modified_at_second:1627609576 - volume id:411698 size:21007978464 collection:"hengenlab" file_count:8153 delete_count:1602 deleted_byte_count:3988154444 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411701 size:11149355920 collection:"hengenlab" file_count:4403 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:4 modified_at_second:1627843731 - volume id:411723 size:20998589440 collection:"hengenlab" file_count:8033 delete_count:1442 deleted_byte_count:3716214068 version:3 compact_revision:1 modified_at_second:1627571055 - volume id:411747 size:17553131856 collection:"hengenlab" file_count:6786 delete_count:568 deleted_byte_count:1366271174 version:3 compact_revision:2 modified_at_second:1627843702 - volume id:411797 size:20983185336 collection:"hengenlab" file_count:8029 delete_count:249 deleted_byte_count:572789818 version:3 compact_revision:2 modified_at_second:1627703704 - volume id:411824 size:5243000 collection:"hengenlab" file_count:2 version:3 compact_revision:1 modified_at_second:1627524780 - volume id:411844 size:20972143216 collection:"hengenlab" file_count:8159 delete_count:103 deleted_byte_count:178069635 version:3 compact_revision:2 modified_at_second:1627702135 - volume id:411856 size:14680352 collection:"hengenlab" file_count:5 version:3 compact_revision:1 modified_at_second:1627524554 - volume id:411876 size:15729016 collection:"hengenlab" file_count:6 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411938 size:19410846296 collection:"hengenlab" file_count:7506 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:1 modified_at_second:1627843746 - volume id:411955 size:18257393928 collection:"hengenlab" file_count:7002 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:1 modified_at_second:1627843738 - volume id:412021 size:9340989152 collection:"hengenlab" file_count:3602 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:2 modified_at_second:1627843737 - Disk hdd total size:171952841864 file_count:66415 deleted_file:3971 deleted_bytes:9838276502 - DataNode 10.244.80.149:8080 total size:171952841864 file_count:66415 deleted_file:3971 deleted_bytes:9838276502 - DataNode 10.244.80.154:8080 hdd(volume:18/86 active:18446744073709551608 free:68 remote:0) - Disk hdd(volume:18/86 active:18446744073709551608 free:68 remote:0) - volume id:411685 size:11497499296 collection:"hengenlab" file_count:4471 delete_count:232 deleted_byte_count:565885294 version:3 compact_revision:5 modified_at_second:1627843741 - volume id:411727 size:21009339472 collection:"hengenlab" file_count:8110 delete_count:1372 deleted_byte_count:3442446742 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411761 size:526395800 collection:"hengenlab" file_count:190 version:3 compact_revision:1 modified_at_second:1627523320 - volume id:411762 size:447751592 collection:"hengenlab" file_count:172 version:3 compact_revision:1 modified_at_second:1627528127 - volume id:411764 size:553660064 collection:"hengenlab" file_count:213 version:3 compact_revision:1 modified_at_second:1627523303 - volume id:411773 size:13331768832 collection:"hengenlab" file_count:5154 delete_count:80 deleted_byte_count:135261209 version:3 compact_revision:2 modified_at_second:1627571096 - volume id:411790 size:20973104848 collection:"hengenlab" file_count:8121 delete_count:61 deleted_byte_count:109090481 version:3 compact_revision:2 modified_at_second:1627701472 - volume id:411845 size:10660662160 collection:"hengenlab" file_count:4137 delete_count:2 deleted_byte_count:2097194 version:3 compact_revision:4 modified_at_second:1627843743 - volume id:411859 size:387887048 collection:"pvc-98352fb2-44e8-4c55-984c-b81bc55fc4bf" file_count:9443 delete_count:260 deleted_byte_count:41241326 version:3 compact_revision:1 modified_at_second:1627576152 - volume id:411923 size:19872622400 collection:"hengenlab" file_count:7565 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:2 modified_at_second:1627843737 - volume id:411927 size:9718495064 collection:"hengenlab" file_count:3691 delete_count:4 deleted_byte_count:13631572 version:3 compact_revision:2 modified_at_second:1627843739 - volume id:411931 size:17603523536 collection:"hengenlab" file_count:6851 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:1 modified_at_second:1627843724 - volume id:411940 size:19854630176 collection:"hengenlab" file_count:7645 delete_count:6 deleted_byte_count:15728766 version:3 compact_revision:1 modified_at_second:1627843724 - volume id:411948 size:19574509752 collection:"hengenlab" file_count:7522 delete_count:2 deleted_byte_count:2097194 version:3 compact_revision:1 modified_at_second:1627843690 - volume id:411952 size:18109160600 collection:"hengenlab" file_count:7019 delete_count:4 deleted_byte_count:4194388 version:3 compact_revision:1 modified_at_second:1627843737 - volume id:411953 size:18466850312 collection:"hengenlab" file_count:7138 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:1 modified_at_second:1627843717 - volume id:412007 size:9615085776 collection:"hengenlab" file_count:3780 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:3 modified_at_second:1627843727 - volume id:412026 size:9292320696 collection:"hengenlab" file_count:3635 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:2 modified_at_second:1627843732 - Disk hdd total size:221495267424 file_count:94857 deleted_file:2030 deleted_bytes:4354742985 - DataNode 10.244.80.154:8080 total size:221495267424 file_count:94857 deleted_file:2030 deleted_bytes:4354742985 - DataNode 10.244.80.156:8080 hdd(volume:10/92 active:18446744073709551604 free:82 remote:0) - Disk hdd(volume:10/92 active:18446744073709551604 free:82 remote:0) - volume id:411717 size:20997625840 collection:"hengenlab" file_count:8202 delete_count:2565 deleted_byte_count:6264865093 version:3 compact_revision:1 modified_at_second:1627609261 - volume id:411732 size:20991507016 collection:"hengenlab" file_count:8199 delete_count:247 deleted_byte_count:545925375 version:3 compact_revision:2 modified_at_second:1627704861 - volume id:411751 size:20212871392 collection:"hengenlab" file_count:7862 delete_count:1412 deleted_byte_count:3283153607 version:3 compact_revision:3 modified_at_second:1627843654 - volume id:411757 size:20990395952 collection:"hengenlab" file_count:8057 delete_count:1422 deleted_byte_count:3698718144 version:3 compact_revision:1 modified_at_second:1627571055 - volume id:411765 size:9785726448 collection:"hengenlab" file_count:3862 delete_count:663 deleted_byte_count:1629992501 version:3 compact_revision:2 modified_at_second:1627609260 - volume id:411794 size:20976658824 collection:"hengenlab" file_count:8166 delete_count:270 deleted_byte_count:585165817 version:3 compact_revision:2 modified_at_second:1627704628 - volume id:411802 size:21042465576 collection:"hengenlab" file_count:8226 delete_count:2425 deleted_byte_count:5780431329 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411883 size:9412521008 collection:"hengenlab" file_count:3590 version:3 compact_revision:2 modified_at_second:1627843731 - volume id:411956 size:18249829552 collection:"hengenlab" file_count:7068 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:1 modified_at_second:1627843717 - volume id:412002 size:10651729792 collection:"hengenlab" file_count:4165 delete_count:47 deleted_byte_count:109052891 version:3 compact_revision:2 modified_at_second:1627843726 - Disk hdd total size:173311331400 file_count:67397 deleted_file:9054 deleted_bytes:21903596276 - DataNode 10.244.80.156:8080 total size:173311331400 file_count:67397 deleted_file:9054 deleted_bytes:21903596276 - DataNode 10.244.80.159:8080 hdd(volume:11/90 active:18446744073709551602 free:79 remote:0) - Disk hdd(volume:11/90 active:18446744073709551602 free:79 remote:0) - volume id:411711 size:20998456432 collection:"hengenlab" file_count:8257 delete_count:1816 deleted_byte_count:4499105022 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411722 size:20971941296 collection:"hengenlab" file_count:8232 delete_count:520 deleted_byte_count:1055575931 version:3 compact_revision:3 modified_at_second:1627701826 - volume id:411752 size:20988602232 collection:"hengenlab" file_count:8206 delete_count:1696 deleted_byte_count:4160916433 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411753 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627523703 - volume id:411788 size:11274978584 collection:"hengenlab" file_count:4428 version:3 compact_revision:4 modified_at_second:1627843737 - volume id:411808 size:13631720 collection:"hengenlab" file_count:4 version:3 compact_revision:1 modified_at_second:1627524409 - volume id:411823 size:21031622392 collection:"hengenlab" file_count:8205 delete_count:1724 deleted_byte_count:4309731628 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411832 size:16472150072 collection:"hengenlab" file_count:6453 delete_count:661 deleted_byte_count:1619461643 version:3 compact_revision:2 modified_at_second:1627843737 - volume id:411834 size:11871131760 collection:"hengenlab" file_count:4592 delete_count:2 deleted_byte_count:2097194 version:3 compact_revision:5 modified_at_second:1627843724 - volume id:411877 size:10679734288 collection:"hengenlab" file_count:4199 delete_count:8 deleted_byte_count:24117416 version:3 compact_revision:4 modified_at_second:1627843739 - volume id:411981 size:10156297120 collection:"hengenlab" file_count:3939 delete_count:4 deleted_byte_count:7340116 version:3 compact_revision:2 modified_at_second:1627843742 - Disk hdd total size:144458545904 file_count:56515 deleted_file:6431 deleted_bytes:15678345383 - DataNode 10.244.80.159:8080 total size:144458545904 file_count:56515 deleted_file:6431 deleted_bytes:15678345383 - DataNode 10.244.80.163:8080 hdd(volume:14/87 active:18446744073709551599 free:73 remote:0) - Disk hdd(volume:14/87 active:18446744073709551599 free:73 remote:0) - volume id:411669 size:9380712976 collection:"hengenlab" file_count:3655 delete_count:4 deleted_byte_count:7340116 version:3 compact_revision:1 modified_at_second:1627843729 - volume id:411671 size:20974522272 collection:"hengenlab" file_count:8085 delete_count:4 deleted_byte_count:7340116 version:3 compact_revision:2 modified_at_second:1627705070 - volume id:411674 size:8911531000 collection:"hengenlab" file_count:3483 delete_count:5 deleted_byte_count:11534441 version:3 compact_revision:2 modified_at_second:1627843740 - volume id:411692 size:20984704840 collection:"hengenlab" file_count:8098 delete_count:129 deleted_byte_count:240002133 version:3 compact_revision:2 modified_at_second:1627703500 - volume id:411728 size:4194368 collection:"hengenlab" file_count:1 version:3 compact_revision:1 modified_at_second:1627527447 - volume id:411779 size:20987091896 collection:"hengenlab" file_count:8114 delete_count:1339 deleted_byte_count:3399261701 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411783 size:20988873016 collection:"hengenlab" file_count:8215 delete_count:2331 deleted_byte_count:5603388342 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411785 size:22020608 collection:"hengenlab" file_count:9 version:3 compact_revision:1 modified_at_second:1627528037 - volume id:411789 size:8554822576 collection:"hengenlab" file_count:3407 delete_count:494 deleted_byte_count:1140851375 version:3 compact_revision:2 modified_at_second:1627571096 - volume id:411799 size:2097272 collection:"hengenlab" file_count:2 version:3 compact_revision:1 modified_at_second:1627526065 - volume id:411854 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627523170 - volume id:411909 size:12933339696 collection:"hengenlab" file_count:5011 version:3 compact_revision:2 modified_at_second:1627610271 - volume id:411926 size:9212697120 collection:"hengenlab" file_count:3565 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:2 modified_at_second:1627843706 - volume id:411985 size:9946696984 collection:"hengenlab" file_count:3893 delete_count:7 deleted_byte_count:19923091 version:3 compact_revision:2 modified_at_second:1627843743 - Disk hdd total size:142903304632 file_count:55538 deleted_file:4315 deleted_bytes:10438029965 - DataNode 10.244.80.163:8080 total size:142903304632 file_count:55538 deleted_file:4315 deleted_bytes:10438029965 - DataNode 10.244.80.167:8080 hdd(volume:9/88 active:18446744073709551609 free:79 remote:0) - Disk hdd(volume:9/88 active:18446744073709551609 free:79 remote:0) - volume id:411684 size:12251200536 collection:"hengenlab" file_count:4821 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:4 modified_at_second:1627843737 - volume id:411784 size:14100248744 collection:"hengenlab" file_count:5363 delete_count:283 deleted_byte_count:612749267 version:3 compact_revision:2 modified_at_second:1627609259 - volume id:411839 size:22020608 collection:"hengenlab" file_count:9 version:3 compact_revision:1 modified_at_second:1627527081 - volume id:411849 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627524849 - volume id:411861 size:454823872 collection:"pvc-98352fb2-44e8-4c55-984c-b81bc55fc4bf" file_count:9416 delete_count:261 deleted_byte_count:31921284 version:3 compact_revision:1 modified_at_second:1627576153 - volume id:411904 size:9251995464 collection:"hengenlab" file_count:3548 delete_count:5 deleted_byte_count:14680169 version:3 compact_revision:2 modified_at_second:1627843724 - volume id:411979 size:10175624520 collection:"hengenlab" file_count:3946 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:2 modified_at_second:1627843729 - volume id:411993 size:10925752072 collection:"hengenlab" file_count:4148 delete_count:10 deleted_byte_count:35651794 version:3 compact_revision:2 modified_at_second:1627843741 - volume id:412014 size:10762886152 collection:"hengenlab" file_count:4192 delete_count:153 deleted_byte_count:396364941 version:3 compact_revision:2 modified_at_second:1627843733 - Disk hdd total size:67944551976 file_count:35443 deleted_file:717 deleted_bytes:1102901896 - DataNode 10.244.80.167:8080 total size:67944551976 file_count:35443 deleted_file:717 deleted_bytes:1102901896 - DataNode 10.244.80.169:8080 nvme(volume:95/95 active:82 free:0 remote:0) - Disk nvme(volume:95/95 active:82 free:0 remote:0) - volume id:33 size:561568 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:851 version:3 compact_revision:7 modified_at_second:1627672955 disk_type:"nvme" - volume id:40 size:592816 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:826 version:3 compact_revision:7 modified_at_second:1627672955 disk_type:"nvme" - volume id:43 size:617000 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:895 version:3 compact_revision:7 modified_at_second:1627672955 disk_type:"nvme" - volume id:66 size:610664 collection:"pvc-f7b4a7e3-32ed-4cbc-8fd4-0665a7c36118" file_count:901 version:3 compact_revision:7 modified_at_second:1627672956 disk_type:"nvme" - volume id:141 size:1506022288 collection:"pvc-4d87da96-2523-4cca-9fea-25d115ee25ce" file_count:2374 delete_count:1841 deleted_byte_count:388723784 version:3 modified_at_second:1627446024 disk_type:"nvme" - volume id:569 size:12583192 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:2 modified_at_second:1627507790 disk_type:"nvme" - volume id:595 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627672953 disk_type:"nvme" - volume id:631 size:4194408 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627515990 disk_type:"nvme" - volume id:692 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627516917 disk_type:"nvme" - volume id:741 size:8388792 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:2 version:3 compact_revision:1 modified_at_second:1627415160 disk_type:"nvme" - volume id:764 size:71303448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1627414976 disk_type:"nvme" - volume id:783 size:243270432 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:9 version:3 compact_revision:1 modified_at_second:1627415079 disk_type:"nvme" - volume id:789 size:138412448 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:5 version:3 compact_revision:2 modified_at_second:1627415170 disk_type:"nvme" - volume id:793 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:1 modified_at_second:1627415443 disk_type:"nvme" - volume id:842 size:71303432 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:1 modified_at_second:1627415269 disk_type:"nvme" - volume id:868 size:33554528 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:1 version:3 compact_revision:2 modified_at_second:1627415362 disk_type:"nvme" - volume id:890 size:71303432 collection:"pvc-d93e0b88-4dfb-4c5f-8b46-da97bba24e34" file_count:3 version:3 compact_revision:3 modified_at_second:1627672952 disk_type:"nvme" - volume id:1077 size:20972998352 collection:"braingeneers-backups-swfs" file_count:12147 delete_count:243 deleted_byte_count:396660056 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:1100 size:20974608920 collection:"braingeneers-backups-swfs" file_count:12252 delete_count:198 deleted_byte_count:303236107 version:3 modified_at_second:1627607153 disk_type:"nvme" - volume id:133787 size:21301728024 collection:"hengenlab" file_count:8526 delete_count:7008 deleted_byte_count:17425588517 version:3 modified_at_second:1627414007 disk_type:"nvme" - volume id:133819 size:21226668664 collection:"hengenlab" file_count:8129 delete_count:8129 deleted_byte_count:21226124008 version:3 modified_at_second:1627414332 disk_type:"nvme" - volume id:133836 size:21244742400 collection:"hengenlab" file_count:8072 version:3 compact_revision:1 modified_at_second:1627420253 disk_type:"nvme" - volume id:133841 size:21140030384 collection:"hengenlab" file_count:8121 version:3 compact_revision:1 modified_at_second:1627420233 disk_type:"nvme" - volume id:246127 size:21101266560 collection:"hengenlab" file_count:8038 version:3 compact_revision:1 modified_at_second:1627416392 disk_type:"nvme" - volume id:246135 size:21064817840 collection:"hengenlab" file_count:8081 version:3 compact_revision:1 modified_at_second:1627416409 disk_type:"nvme" - volume id:246144 size:21013850264 collection:"hengenlab" file_count:8635 delete_count:571 deleted_byte_count:1461299369 version:3 modified_at_second:1627414577 disk_type:"nvme" - volume id:246146 size:21054935360 collection:"hengenlab" file_count:8719 delete_count:541 deleted_byte_count:1370414224 version:3 modified_at_second:1627414663 disk_type:"nvme" - volume id:246153 size:21183691960 collection:"hengenlab" file_count:8007 version:3 modified_at_second:1627416939 disk_type:"nvme" - volume id:246172 size:21660385832 collection:"hengenlab" file_count:8263 version:3 modified_at_second:1627417612 disk_type:"nvme" - volume id:246175 size:21159383464 collection:"hengenlab" file_count:8041 version:3 modified_at_second:1627418084 disk_type:"nvme" - volume id:246176 size:21083567776 collection:"hengenlab" file_count:8043 version:3 modified_at_second:1627418076 disk_type:"nvme" - volume id:246212 size:21414255232 collection:"hengenlab" file_count:8102 version:3 modified_at_second:1627421166 disk_type:"nvme" - volume id:246233 size:21086043664 collection:"hengenlab" file_count:7972 version:3 modified_at_second:1627422283 disk_type:"nvme" - volume id:246242 size:21198462832 collection:"hengenlab" file_count:8083 version:3 modified_at_second:1627423046 disk_type:"nvme" - volume id:246243 size:21048018304 collection:"hengenlab" file_count:8027 version:3 modified_at_second:1627423041 disk_type:"nvme" - volume id:246274 size:21422008664 collection:"hengenlab" file_count:8150 version:3 modified_at_second:1627424647 disk_type:"nvme" - volume id:246296 size:21490999024 collection:"hengenlab" file_count:8184 version:3 modified_at_second:1627425220 disk_type:"nvme" - volume id:246336 size:21351235904 collection:"hengenlab" file_count:7410 delete_count:36 deleted_byte_count:150996609 version:3 modified_at_second:1627427287 disk_type:"nvme" - volume id:246343 size:21586547488 collection:"hengenlab" file_count:7771 delete_count:194 deleted_byte_count:540020714 version:3 modified_at_second:1627427872 disk_type:"nvme" - volume id:246371 size:21197726272 collection:"hengenlab" file_count:8666 delete_count:6 deleted_byte_count:25166061 version:3 modified_at_second:1627429075 disk_type:"nvme" - volume id:246381 size:21060855608 collection:"hengenlab" file_count:8048 delete_count:4 deleted_byte_count:16777409 version:3 modified_at_second:1627429671 disk_type:"nvme" - volume id:246394 size:21418696808 collection:"hengenlab" file_count:8170 version:3 modified_at_second:1627430517 disk_type:"nvme" - volume id:246420 size:21577098968 collection:"hengenlab" file_count:8220 version:3 modified_at_second:1627431839 disk_type:"nvme" - volume id:246426 size:21286509368 collection:"hengenlab" file_count:8124 delete_count:3 deleted_byte_count:6291519 version:3 modified_at_second:1627504948 disk_type:"nvme" - volume id:246452 size:21078835312 collection:"hengenlab" file_count:8024 version:3 modified_at_second:1627433959 disk_type:"nvme" - volume id:246466 size:21127956848 collection:"hengenlab" file_count:8086 version:3 modified_at_second:1627435449 disk_type:"nvme" - volume id:246469 size:21609542120 collection:"hengenlab" file_count:8250 version:3 modified_at_second:1627435620 disk_type:"nvme" - volume id:246487 size:21287442424 collection:"hengenlab" file_count:8111 version:3 modified_at_second:1627436797 disk_type:"nvme" - volume id:246496 size:21027864400 collection:"hengenlab" file_count:8039 version:3 modified_at_second:1627437129 disk_type:"nvme" - volume id:246501 size:21129973720 collection:"hengenlab" file_count:8052 delete_count:1 deleted_byte_count:70 version:3 modified_at_second:1627437461 disk_type:"nvme" - volume id:246535 size:11664276264 collection:"hengenlab" file_count:4448 version:3 compact_revision:1 modified_at_second:1627672220 disk_type:"nvme" - volume id:246548 size:21269863608 collection:"hengenlab" file_count:8644 delete_count:2931 deleted_byte_count:6309826926 version:3 modified_at_second:1627607477 disk_type:"nvme" - volume id:246605 size:21525654920 collection:"hengenlab" file_count:8230 version:3 modified_at_second:1627440065 disk_type:"nvme" - volume id:246623 size:21661971032 collection:"hengenlab" file_count:8252 version:3 modified_at_second:1627440566 disk_type:"nvme" - volume id:246626 size:21767879672 collection:"hengenlab" file_count:8296 version:3 modified_at_second:1627440723 disk_type:"nvme" - volume id:246653 size:21162084032 collection:"hengenlab" file_count:8033 version:3 modified_at_second:1627442174 disk_type:"nvme" - volume id:246664 size:21353108088 collection:"hengenlab" file_count:8128 delete_count:41 deleted_byte_count:169115246 version:3 modified_at_second:1627521905 disk_type:"nvme" - volume id:246686 size:13168463584 collection:"hengenlab" file_count:5027 version:3 compact_revision:1 modified_at_second:1627672794 disk_type:"nvme" - volume id:246745 size:14926452688 collection:"hengenlab" file_count:5708 version:3 compact_revision:1 modified_at_second:1627671345 disk_type:"nvme" - volume id:246757 size:233525928 file_count:104 version:3 modified_at_second:1627448403 disk_type:"nvme" - volume id:246769 size:14123240184 collection:"hengenlab" file_count:5398 version:3 compact_revision:1 modified_at_second:1627672734 disk_type:"nvme" - volume id:246796 size:21705124144 collection:"hengenlab" file_count:8278 delete_count:2278 deleted_byte_count:5994511715 version:3 modified_at_second:1627521784 disk_type:"nvme" - volume id:246839 size:12223358896 collection:"hengenlab" file_count:4672 version:3 compact_revision:1 modified_at_second:1627671863 disk_type:"nvme" - volume id:246942 size:2901945320 collection:"hengenlab" file_count:1119 version:3 compact_revision:1 modified_at_second:1627672918 disk_type:"nvme" - volume id:246955 size:3110322144 collection:"hengenlab" file_count:1190 version:3 compact_revision:1 modified_at_second:1627672330 disk_type:"nvme" - volume id:246989 size:2874322224 collection:"hengenlab" file_count:1084 version:3 compact_revision:1 modified_at_second:1627671536 disk_type:"nvme" - volume id:246990 size:2839669520 collection:"hengenlab" file_count:1095 version:3 compact_revision:1 modified_at_second:1627672139 disk_type:"nvme" - volume id:247029 size:2995960680 collection:"hengenlab" file_count:1149 version:3 compact_revision:1 modified_at_second:1627672107 disk_type:"nvme" - volume id:247035 size:3044324616 collection:"hengenlab" file_count:1161 version:3 compact_revision:1 modified_at_second:1627671489 disk_type:"nvme" - volume id:247060 size:4516542160 collection:"hengenlab" file_count:1713 version:3 compact_revision:1 modified_at_second:1627671421 disk_type:"nvme" - volume id:247062 size:3386103288 collection:"hengenlab" file_count:1291 version:3 compact_revision:1 modified_at_second:1627672464 disk_type:"nvme" - volume id:247065 size:2715064920 collection:"hengenlab" file_count:1039 version:3 compact_revision:1 modified_at_second:1627671384 disk_type:"nvme" - volume id:247066 size:3114565864 collection:"hengenlab" file_count:1174 version:3 compact_revision:1 modified_at_second:1627671272 disk_type:"nvme" - volume id:247068 size:2946626792 collection:"hengenlab" file_count:1140 version:3 compact_revision:1 modified_at_second:1627671242 disk_type:"nvme" - volume id:247070 size:3063134704 collection:"hengenlab" file_count:1163 version:3 compact_revision:1 modified_at_second:1627672630 disk_type:"nvme" - volume id:247076 size:2890986032 collection:"hengenlab" file_count:1107 version:3 compact_revision:1 modified_at_second:1627671631 disk_type:"nvme" - volume id:247086 size:2627787296 collection:"hengenlab" file_count:997 version:3 compact_revision:1 modified_at_second:1627672356 disk_type:"nvme" - volume id:247097 size:2613221424 collection:"hengenlab" file_count:988 version:3 compact_revision:1 modified_at_second:1627672370 disk_type:"nvme" - volume id:247101 size:2876305016 collection:"hengenlab" file_count:1090 version:3 compact_revision:1 modified_at_second:1627672039 disk_type:"nvme" - volume id:247114 size:2354168024 collection:"hengenlab" file_count:902 version:3 compact_revision:1 modified_at_second:1627672062 disk_type:"nvme" - volume id:247115 size:2451737640 collection:"hengenlab" file_count:933 version:3 compact_revision:1 modified_at_second:1627671474 disk_type:"nvme" - volume id:247117 size:2789630248 collection:"hengenlab" file_count:1070 version:3 compact_revision:1 modified_at_second:1627672567 disk_type:"nvme" - volume id:247126 size:2820039224 collection:"hengenlab" file_count:1075 version:3 compact_revision:1 modified_at_second:1627671773 disk_type:"nvme" - volume id:247133 size:2842750640 collection:"hengenlab" file_count:1091 version:3 compact_revision:1 modified_at_second:1627671713 disk_type:"nvme" - volume id:247135 size:2751521840 collection:"hengenlab" file_count:1043 version:3 compact_revision:1 modified_at_second:1627671688 disk_type:"nvme" - volume id:247138 size:2870193144 collection:"hengenlab" file_count:1099 version:3 compact_revision:1 modified_at_second:1627672405 disk_type:"nvme" - volume id:247148 size:2617301984 collection:"hengenlab" file_count:1005 version:3 compact_revision:1 modified_at_second:1627672663 disk_type:"nvme" - volume id:247150 size:2775998200 collection:"hengenlab" file_count:1060 version:3 compact_revision:1 modified_at_second:1627672010 disk_type:"nvme" - volume id:247158 size:2585958672 collection:"hengenlab" file_count:992 version:3 compact_revision:1 modified_at_second:1627672582 disk_type:"nvme" - volume id:247159 size:2615447568 collection:"hengenlab" file_count:992 version:3 compact_revision:1 modified_at_second:1627672828 disk_type:"nvme" - volume id:247168 size:2231596584 collection:"hengenlab" file_count:853 version:3 compact_revision:1 modified_at_second:1627672165 disk_type:"nvme" - volume id:247170 size:2424359408 collection:"hengenlab" file_count:923 version:3 compact_revision:1 modified_at_second:1627671876 disk_type:"nvme" - volume id:247183 size:2262005904 collection:"hengenlab" file_count:864 version:3 compact_revision:1 modified_at_second:1627672072 disk_type:"nvme" - volume id:247211 size:1684227816 collection:"hengenlab" file_count:637 version:3 compact_revision:2 modified_at_second:1627671981 disk_type:"nvme" - volume id:247228 size:293786808 collection:"hengenlab" file_count:115 version:3 compact_revision:2 modified_at_second:1627672090 disk_type:"nvme" - Disk nvme total size:1006464213680 file_count:398816 deleted_file:24025 deleted_bytes:55784752334 - DataNode 10.244.80.169:8080 total size:1006464213680 file_count:398816 deleted_file:24025 deleted_bytes:55784752334 - DataNode 10.244.80.171:8080 hdd(volume:16/87 active:18446744073709551600 free:71 remote:0) - Disk hdd(volume:16/87 active:18446744073709551600 free:71 remote:0) - volume id:411664 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627610818 - volume id:411696 size:4194368 collection:"hengenlab" file_count:1 version:3 compact_revision:1 modified_at_second:1627523809 - volume id:411706 size:7340264 collection:"hengenlab" file_count:4 version:3 compact_revision:1 modified_at_second:1627526515 - volume id:411716 size:21000296976 collection:"hengenlab" file_count:7985 delete_count:1370 deleted_byte_count:3528378174 version:3 compact_revision:1 modified_at_second:1627571055 - volume id:411724 size:21010819184 collection:"hengenlab" file_count:8067 delete_count:1483 deleted_byte_count:3767887994 version:3 compact_revision:1 modified_at_second:1627571055 - volume id:411729 size:20979764560 collection:"hengenlab" file_count:8138 delete_count:96 deleted_byte_count:198275837 version:3 compact_revision:2 modified_at_second:1627703346 - volume id:411739 size:12749517664 collection:"hengenlab" file_count:4940 delete_count:115 deleted_byte_count:299895151 version:3 compact_revision:5 modified_at_second:1627843697 - volume id:411755 size:18084502720 collection:"hengenlab" file_count:7125 delete_count:422 deleted_byte_count:938718302 version:3 compact_revision:2 modified_at_second:1627843726 - volume id:411767 size:446702960 collection:"hengenlab" file_count:171 version:3 compact_revision:1 modified_at_second:1627523183 - volume id:411891 size:21026997376 collection:"hengenlab" file_count:8220 delete_count:1701 deleted_byte_count:4238119698 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411894 size:18091922800 collection:"hengenlab" file_count:7112 delete_count:637 deleted_byte_count:1508635198 version:3 compact_revision:2 modified_at_second:1627843713 - volume id:411911 size:20978548352 collection:"hengenlab" file_count:8159 delete_count:954 deleted_byte_count:2385829477 version:3 compact_revision:2 modified_at_second:1627702924 - volume id:411950 size:18275154328 collection:"hengenlab" file_count:7069 version:3 compact_revision:1 modified_at_second:1627843717 - volume id:411967 size:10834082264 collection:"hengenlab" file_count:4109 delete_count:3 deleted_byte_count:6291519 version:3 compact_revision:2 modified_at_second:1627843721 - volume id:411980 size:10315093016 collection:"hengenlab" file_count:3929 delete_count:3 deleted_byte_count:9437247 version:3 compact_revision:2 modified_at_second:1627843689 - volume id:412015 size:11693275568 collection:"hengenlab" file_count:4421 delete_count:166 deleted_byte_count:416288158 version:3 compact_revision:2 modified_at_second:1627843708 - Disk hdd total size:205498212408 file_count:79450 deleted_file:6950 deleted_bytes:17297756755 - DataNode 10.244.80.171:8080 total size:205498212408 file_count:79450 deleted_file:6950 deleted_bytes:17297756755 - DataNode 10.244.80.173:8080 hdd(volume:10/90 active:18446744073709551606 free:80 remote:0) - Disk hdd(volume:10/90 active:18446744073709551606 free:80 remote:0) - volume id:411677 size:9413657016 collection:"hengenlab" file_count:3666 delete_count:3 deleted_byte_count:9437247 version:3 compact_revision:2 modified_at_second:1627843735 - volume id:411681 size:16491608416 collection:"hengenlab" file_count:6383 delete_count:4 deleted_byte_count:4194388 version:3 compact_revision:2 modified_at_second:1627843744 - volume id:411770 size:351280976 collection:"hengenlab" file_count:143 version:3 compact_revision:1 modified_at_second:1627524409 - volume id:411804 size:20983729728 collection:"hengenlab" file_count:8192 delete_count:1837 deleted_byte_count:4536925211 version:3 compact_revision:1 modified_at_second:1627571068 - volume id:411872 size:11827184528 collection:"hengenlab" file_count:4564 delete_count:1 deleted_byte_count:4194325 version:3 compact_revision:3 modified_at_second:1627843711 - volume id:411900 size:12062763200 collection:"hengenlab" file_count:4738 delete_count:195 deleted_byte_count:493883391 version:3 compact_revision:4 modified_at_second:1627843709 - volume id:411919 size:9444792736 collection:"hengenlab" file_count:3652 delete_count:7 deleted_byte_count:23068819 version:3 compact_revision:2 modified_at_second:1627843730 - volume id:411958 size:20976107664 collection:"hengenlab" file_count:8056 delete_count:4 deleted_byte_count:13631572 version:3 compact_revision:1 modified_at_second:1627703962 - volume id:412003 size:10447815176 collection:"hengenlab" file_count:4044 delete_count:35 deleted_byte_count:87032543 version:3 compact_revision:2 modified_at_second:1627843720 - volume id:412006 size:11528445368 collection:"hengenlab" file_count:4317 delete_count:71 deleted_byte_count:178259411 version:3 compact_revision:2 modified_at_second:1627843723 - Disk hdd total size:123527384808 file_count:47755 deleted_file:2157 deleted_bytes:5350626907 - DataNode 10.244.80.173:8080 total size:123527384808 file_count:47755 deleted_file:2157 deleted_bytes:5350626907 - DataNode 10.244.80.182:8080 hdd(volume:23/81 active:18446744073709551597 free:58 remote:0) - Disk hdd(volume:23/81 active:18446744073709551597 free:58 remote:0) - volume id:133822 size:9348388960 collection:"hengenlab" file_count:3621 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:2 modified_at_second:1627843731 - volume id:133830 size:8 collection:"hengenlab" version:3 compact_revision:2 modified_at_second:1627618126 - volume id:133850 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627506991 - volume id:133966 size:9472294744 collection:"hengenlab" file_count:3634 delete_count:6 deleted_byte_count:22020222 version:3 compact_revision:2 modified_at_second:1627843677 - volume id:134022 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627506992 - volume id:411676 size:20995380656 collection:"hengenlab" file_count:8083 delete_count:1628 deleted_byte_count:4232086349 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411741 size:20978338976 collection:"hengenlab" file_count:8026 delete_count:81 deleted_byte_count:161965983 version:3 compact_revision:2 modified_at_second:1627702345 - volume id:411787 size:21004437928 collection:"hengenlab" file_count:8063 delete_count:1635 deleted_byte_count:4174116078 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411805 size:21010830360 collection:"hengenlab" file_count:8058 delete_count:1452 deleted_byte_count:3663707621 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411806 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627526064 - volume id:411816 size:7972844136 collection:"hengenlab" file_count:3173 delete_count:535 deleted_byte_count:1274718168 version:3 compact_revision:2 modified_at_second:1627571096 - volume id:411820 size:11103604584 collection:"hengenlab" file_count:4416 delete_count:2 deleted_byte_count:5242922 version:3 compact_revision:3 modified_at_second:1627843718 - volume id:411840 size:8 collection:"hengenlab" version:3 compact_revision:1 modified_at_second:1627522290 - volume id:411882 size:9476786448 collection:"hengenlab" file_count:3569 delete_count:1 deleted_byte_count:1048597 version:3 compact_revision:2 modified_at_second:1627843743 - volume id:411884 size:20975768288 collection:"hengenlab" file_count:8098 delete_count:189 deleted_byte_count:394743945 version:3 compact_revision:2 modified_at_second:1627703989 - volume id:411885 size:10611745152 collection:"hengenlab" file_count:4129 delete_count:34 deleted_byte_count:95421130 version:3 compact_revision:4 modified_at_second:1627843724 - volume id:411907 size:20994844640 collection:"hengenlab" file_count:8070 delete_count:1605 deleted_byte_count:4107716304 version:3 compact_revision:1 modified_at_second:1627609259 - volume id:411916 size:11843699336 collection:"hengenlab" file_count:4592 delete_count:2 deleted_byte_count:8388650 version:3 compact_revision:3 modified_at_second:1627843732 - volume id:411922 size:19872656216 collection:"hengenlab" file_count:7602 delete_count:6 deleted_byte_count:18874494 version:3 compact_revision:2 modified_at_second:1627843738 - volume id:411986 size:10450097872 collection:"hengenlab" file_count:3984 delete_count:12 deleted_byte_count:31457532 version:3 compact_revision:2 modified_at_second:1627843739 - volume id:411995 size:10589403672 collection:"hengenlab" file_count:4040 delete_count:7 deleted_byte_count:19923091 version:3 compact_revision:2 modified_at_second:1627843694 - volume id:412020 size:9992180880 collection:"hengenlab" file_count:3848 delete_count:7 deleted_byte_count:19923091 version:3 compact_revision:2 modified_at_second:1627843728 - volume id:412023 size:11391321408 collection:"hengenlab" file_count:4442 delete_count:191 deleted_byte_count:399495827 version:3 compact_revision:1 modified_at_second:1627843730 - Disk hdd total size:258084624296 file_count:99448 deleted_file:7395 deleted_bytes:18639238654 - DataNode 10.244.80.182:8080 total size:258084624296 file_count:99448 deleted_file:7395 deleted_bytes:18639238654 - DataNode 10.244.80.187:8080 hdd(volume:9/91 active:18446744073709551608 free:82 remote:0) - Disk hdd(volume:9/91 active:18446744073709551608 free:82 remote:0) - volume id:133842 size:8 collection:"hengenlab" read_only:true version:3 compact_revision:1 modified_at_second:1627506990 - volume id:411712 size:20998686088 collection:"hengenlab" file_count:8257 delete_count:1802 deleted_byte_count:4297127481 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411740 size:20987167216 collection:"hengenlab" file_count:8054 delete_count:1417 deleted_byte_count:3594015227 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411743 size:10176141608 collection:"hengenlab" file_count:3972 delete_count:4 deleted_byte_count:10485844 version:3 compact_revision:4 modified_at_second:1627843724 - volume id:411763 size:12703548240 collection:"hengenlab" file_count:4968 delete_count:3 deleted_byte_count:12582975 version:3 compact_revision:3 modified_at_second:1627843743 - volume id:411848 size:11875047160 collection:"hengenlab" file_count:4644 delete_count:4 deleted_byte_count:7340116 version:3 compact_revision:4 modified_at_second:1627843716 - volume id:411897 size:9159541464 collection:"hengenlab" file_count:3605 delete_count:3 deleted_byte_count:9437247 version:3 compact_revision:2 modified_at_second:1627843743 - volume id:411961 size:13624062208 collection:"hengenlab" file_count:5228 version:3 compact_revision:1 modified_at_second:1627613659 - volume id:411992 size:10680394344 collection:"hengenlab" file_count:4112 delete_count:8 deleted_byte_count:14680232 version:3 compact_revision:2 modified_at_second:1627843740 - Disk hdd total size:110204588336 file_count:42840 deleted_file:3241 deleted_bytes:7945669122 - DataNode 10.244.80.187:8080 total size:110204588336 file_count:42840 deleted_file:3241 deleted_bytes:7945669122 - DataNode 10.244.80.188:8080 hdd(volume:22/89 active:20 free:67 remote:0) - Disk hdd(volume:22/89 active:20 free:67 remote:0) - volume id:133787 size:20977333768 collection:"hengenlab" file_count:8145 delete_count:373 deleted_byte_count:852883566 version:3 compact_revision:3 modified_at_second:1627704822 - volume id:133791 size:12894894240 collection:"hengenlab" file_count:4990 version:3 compact_revision:4 modified_at_second:1627843739 - volume id:133797 size:20976269128 collection:"hengenlab" file_count:8074 delete_count:1365 deleted_byte_count:3624138703 version:3 compact_revision:2 modified_at_second:1627571055 - volume id:133890 size:20973749832 collection:"hengenlab" file_count:8105 delete_count:87 deleted_byte_count:158198416 version:3 compact_revision:3 modified_at_second:1627704768 - volume id:133911 size:7193833056 collection:"hengenlab" file_count:2839 version:3 compact_revision:2 modified_at_second:1627843714 - volume id:133949 size:7705370032 collection:"hengenlab" file_count:2945 version:3 compact_revision:2 modified_at_second:1627843735 - volume id:133980 size:12177944664 collection:"hengenlab" file_count:4754 version:3 compact_revision:4 modified_at_second:1627843741 - volume id:134024 size:20987628488 collection:"hengenlab" file_count:8147 delete_count:1533 deleted_byte_count:3904661820 version:3 compact_revision:2 modified_at_second:1627571060 - volume id:246130 size:21628018400 collection:"hengenlab" file_count:8140 delete_count:282 deleted_byte_count:761272098 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:246152 size:21460301248 collection:"hengenlab" file_count:8216 delete_count:91 deleted_byte_count:236980087 version:3 modified_at_second:1627521766 - volume id:246218 size:22123069400 collection:"hengenlab" file_count:8438 delete_count:259 deleted_byte_count:689149263 version:3 modified_at_second:1627521766 - volume id:246234 size:21548861680 collection:"hengenlab" file_count:8177 delete_count:184 deleted_byte_count:504368920 version:3 modified_at_second:1627521636 - volume id:246235 size:21563474080 collection:"hengenlab" file_count:8243 delete_count:166 deleted_byte_count:400559518 version:3 modified_at_second:1627521732 - volume id:246238 size:21939256008 collection:"hengenlab" file_count:8327 delete_count:305 deleted_byte_count:819992837 version:3 modified_at_second:1627521732 - volume id:246244 size:21177236216 collection:"hengenlab" file_count:8091 delete_count:73 deleted_byte_count:164635721 version:3 modified_at_second:1627521821 - volume id:246264 size:21709311176 collection:"hengenlab" file_count:8377 delete_count:137 deleted_byte_count:344984381 version:3 modified_at_second:1627521766 - volume id:246270 size:22130167328 collection:"hengenlab" file_count:8420 delete_count:333 deleted_byte_count:868227921 version:3 modified_at_second:1627521633 - volume id:411756 size:20991502016 collection:"hengenlab" file_count:8230 delete_count:2438 deleted_byte_count:5914063320 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411855 size:7178928632 collection:"hengenlab" file_count:2749 version:3 compact_revision:1 modified_at_second:1627843726 - volume id:411867 size:7349929896 collection:"hengenlab" file_count:2873 version:3 compact_revision:1 modified_at_second:1627843701 - volume id:411968 size:10013989648 collection:"hengenlab" file_count:3769 version:3 compact_revision:2 modified_at_second:1627843711 - volume id:412018 size:9021709232 collection:"hengenlab" file_count:3500 version:3 compact_revision:3 modified_at_second:1627843738 - Disk hdd total size:373722778168 file_count:143549 deleted_file:7626 deleted_bytes:19244116571 - DataNode 10.244.80.188:8080 total size:373722778168 file_count:143549 deleted_file:7626 deleted_bytes:19244116571 - DataNode 10.244.80.190:8080 hdd(volume:16/85 active:18446744073709551613 free:69 remote:0) - Disk hdd(volume:16/85 active:18446744073709551613 free:69 remote:0) - volume id:411656 size:312783808 file_count:853 delete_count:21 deleted_byte_count:1104358 version:3 modified_at_second:1627843685 - volume id:411657 size:406532592 file_count:915 delete_count:33 deleted_byte_count:1879726 version:3 modified_at_second:1627843741 - volume id:411658 size:391617112 file_count:935 delete_count:19 deleted_byte_count:1293103 version:3 modified_at_second:1627843686 - volume id:411659 size:378765040 file_count:891 delete_count:17 deleted_byte_count:1501286 version:3 modified_at_second:1627843688 - volume id:411660 size:381905776 file_count:919 delete_count:32 deleted_byte_count:6239636 version:3 modified_at_second:1627843740 - volume id:411661 size:374743672 file_count:865 delete_count:19 deleted_byte_count:853319 version:3 modified_at_second:1627843741 - volume id:411662 size:453987360 file_count:933 delete_count:14 deleted_byte_count:807287 version:3 modified_at_second:1627843687 - volume id:411678 size:13310756544 collection:"hengenlab" file_count:5141 delete_count:7 deleted_byte_count:16777363 version:3 compact_revision:3 modified_at_second:1627843723 - volume id:411688 size:11320049832 collection:"hengenlab" file_count:4445 delete_count:3 deleted_byte_count:9437247 version:3 compact_revision:4 modified_at_second:1627843734 - volume id:411715 size:20979163616 collection:"hengenlab" file_count:8105 delete_count:128 deleted_byte_count:229514021 version:3 compact_revision:2 modified_at_second:1627703154 - volume id:411769 size:21020447216 collection:"hengenlab" file_count:8257 delete_count:2450 deleted_byte_count:5980737503 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411780 size:21027400496 collection:"hengenlab" file_count:8122 delete_count:2251 deleted_byte_count:5533972074 version:3 compact_revision:1 modified_at_second:1627571060 - volume id:411781 size:21037408832 collection:"hengenlab" file_count:8108 delete_count:1304 deleted_byte_count:3224044243 version:3 compact_revision:1 modified_at_second:1627607477 - volume id:411792 size:21012031144 collection:"hengenlab" file_count:8191 delete_count:1701 deleted_byte_count:4217474712 version:3 compact_revision:1 modified_at_second:1627571055 - volume id:411819 size:13154203544 collection:"hengenlab" file_count:5103 delete_count:211 deleted_byte_count:478778819 version:3 compact_revision:2 modified_at_second:1627609260 - volume id:411999 size:10404127864 collection:"hengenlab" file_count:4016 delete_count:79 deleted_byte_count:217723915 version:3 compact_revision:2 modified_at_second:1627843731 - Disk hdd total size:155965924448 file_count:65799 deleted_file:8289 deleted_bytes:19922138612 - DataNode 10.244.80.190:8080 total size:155965924448 file_count:65799 deleted_file:8289 deleted_bytes:19922138612 - Rack DefaultRack total size:14536458701800 file_count:6344037 deleted_file:789918 deleted_bytes:1752599154873 - DataCenter DefaultDataCenter total size:14536458701800 file_count:6344037 deleted_file:789918 deleted_bytes:1752599154873 -total size:14536458701800 file_count:6344037 deleted_file:789918 deleted_bytes:1752599154873 +Topology volumeSizeLimit:1024 MB hdd(volume:760/7280 active:760 free:6520 remote:0) + DataCenter dc1 hdd(volume:0/0 active:0 free:0 remote:0) + Rack DefaultRack hdd(volume:0/0 active:0 free:0 remote:0) + Rack DefaultRack total size:0 file_count:0 + DataCenter dc1 total size:0 file_count:0 + DataCenter dc2 hdd(volume:86/430 active:86 free:344 remote:0) + Rack rack1 hdd(volume:50/240 active:50 free:190 remote:0) + DataNode 192.168.1.4:8080 hdd(volume:50/240 active:50 free:190 remote:0) + Disk hdd(volume:50/240 active:50 free:190 remote:0) + volume id:15 size:1115965064 collection:"collection0" file_count:83 replica_placement:100 version:3 modified_at_second:1609923671 + volume id:21 size:1097631536 collection:"collection0" file_count:82 delete_count:7 deleted_byte_count:68975485 replica_placement:100 version:3 modified_at_second:1609929578 + volume id:22 size:1086828272 collection:"collection0" file_count:75 replica_placement:100 version:3 modified_at_second:1609930001 + volume id:23 size:1076380216 collection:"collection0" file_count:68 replica_placement:100 version:3 modified_at_second:1609930434 + volume id:24 size:1074139776 collection:"collection0" file_count:90 replica_placement:100 version:3 modified_at_second:1609930909 + volume id:25 size:690757512 collection:"collection0" file_count:38 replica_placement:100 version:3 modified_at_second:1611144216 + volume id:27 size:298886792 file_count:1608 replica_placement:100 version:3 modified_at_second:1615632482 + volume id:28 size:308919192 file_count:1591 delete_count:1 deleted_byte_count:125280 replica_placement:100 version:3 modified_at_second:1615631762 + volume id:29 size:281582680 file_count:1537 replica_placement:100 version:3 modified_at_second:1615629422 + volume id:30 size:289466144 file_count:1566 delete_count:1 deleted_byte_count:124972 replica_placement:100 version:3 modified_at_second:1615632422 + volume id:31 size:273363256 file_count:1498 replica_placement:100 version:3 modified_at_second:1615631642 + volume id:33 size:1130226400 collection:"collection1" file_count:7322 delete_count:172 deleted_byte_count:45199399 replica_placement:100 version:3 modified_at_second:1615618789 + volume id:38 size:1075545744 collection:"collection1" file_count:13324 delete_count:100 deleted_byte_count:25223906 replica_placement:100 version:3 modified_at_second:1615569830 + volume id:51 size:1076796120 collection:"collection1" file_count:10550 delete_count:39 deleted_byte_count:12723654 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615547786 + volume id:52 size:1083529728 collection:"collection1" file_count:10128 delete_count:32 deleted_byte_count:10608391 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615599195 + volume id:54 size:1045022344 collection:"collection1" file_count:9408 delete_count:30 deleted_byte_count:15132106 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630812 + volume id:63 size:956941112 collection:"collection1" file_count:8271 delete_count:32 deleted_byte_count:15876189 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632036 + volume id:69 size:869213648 collection:"collection1" file_count:7293 delete_count:102 deleted_byte_count:30643207 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630534 + volume id:74 size:957046128 collection:"collection1" file_count:6982 delete_count:258 deleted_byte_count:73054259 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615631460 + volume id:80 size:827912928 collection:"collection1" file_count:6914 delete_count:17 deleted_byte_count:5689635 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615631157 + volume id:84 size:873121856 collection:"collection1" file_count:8200 delete_count:13 deleted_byte_count:3131676 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631161 + volume id:85 size:1023869320 collection:"collection1" file_count:7788 delete_count:234 deleted_byte_count:78037967 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631723 + volume id:97 size:1053112992 collection:"collection1" file_count:6789 delete_count:50 deleted_byte_count:38894001 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631193 + volume id:98 size:1077836440 collection:"collection1" file_count:7605 delete_count:202 deleted_byte_count:73180379 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615523691 + volume id:105 size:1073996824 collection:"collection1" file_count:6872 delete_count:20 deleted_byte_count:14482293 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615499757 + volume id:106 size:1075458664 collection:"collection1" file_count:7182 delete_count:307 deleted_byte_count:69349053 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615598137 + volume id:112 size:1076392512 collection:"collection1" file_count:8291 delete_count:156 deleted_byte_count:74120183 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615569823 + volume id:116 size:1074489504 collection:"collection1" file_count:9981 delete_count:174 deleted_byte_count:53998777 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615611565 + volume id:119 size:1075940104 collection:"collection1" file_count:9003 delete_count:12 deleted_byte_count:9128155 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615573878 + volume id:128 size:1074874632 collection:"collection1" file_count:9821 delete_count:148 deleted_byte_count:43633334 replica_placement:100 version:3 modified_at_second:1615602670 + volume id:133 size:1075952760 collection:"collection1" file_count:9538 delete_count:74 deleted_byte_count:19558008 replica_placement:100 version:3 modified_at_second:1615584779 + volume id:136 size:1074433552 collection:"collection1" file_count:9593 delete_count:72 deleted_byte_count:26912512 replica_placement:100 version:3 modified_at_second:1615376036 + volume id:138 size:1074465744 collection:"collection1" file_count:10120 delete_count:55 deleted_byte_count:15875438 replica_placement:100 version:3 modified_at_second:1615572231 + volume id:140 size:1076203744 collection:"collection1" file_count:11219 delete_count:57 deleted_byte_count:19864498 replica_placement:100 version:3 modified_at_second:1615571947 + volume id:144 size:1074549720 collection:"collection1" file_count:8780 delete_count:50 deleted_byte_count:52475146 replica_placement:100 version:3 modified_at_second:1615573451 + volume id:161 size:1077397192 collection:"collection1" file_count:9988 delete_count:28 deleted_byte_count:12509164 replica_placement:100 version:3 modified_at_second:1615631452 + volume id:173 size:1074154704 collection:"collection1" file_count:30884 delete_count:34 deleted_byte_count:2578509 replica_placement:100 version:3 modified_at_second:1615591904 + volume id:174 size:1073824232 collection:"collection1" file_count:30689 delete_count:36 deleted_byte_count:2160116 replica_placement:100 version:3 modified_at_second:1615598914 + volume id:197 size:1075423240 collection:"collection1" file_count:16473 delete_count:15 deleted_byte_count:12552442 replica_placement:100 version:3 modified_at_second:1615485254 + volume id:219 size:1092298904 collection:"collection1" file_count:3193 delete_count:17 deleted_byte_count:2047576 replica_placement:100 version:3 modified_at_second:1615579316 + volume id:263 size:1077167352 collection:"collection2" file_count:20227 delete_count:4 deleted_byte_count:97887 replica_placement:100 version:3 modified_at_second:1614871567 + volume id:272 size:1076146040 collection:"collection2" file_count:21034 delete_count:2 deleted_byte_count:216564 replica_placement:100 version:3 modified_at_second:1614884139 + volume id:291 size:1076256760 collection:"collection2" file_count:28301 delete_count:5 deleted_byte_count:116027 replica_placement:100 version:3 modified_at_second:1614904924 + volume id:299 size:1075147824 collection:"collection2" file_count:22927 delete_count:4 deleted_byte_count:345569 replica_placement:100 version:3 modified_at_second:1614918454 + volume id:301 size:1074655600 collection:"collection2" file_count:22543 delete_count:6 deleted_byte_count:136968 replica_placement:100 version:3 modified_at_second:1614918378 + volume id:302 size:1077559792 collection:"collection2" file_count:23124 delete_count:7 deleted_byte_count:293111 replica_placement:100 version:3 modified_at_second:1614925500 + volume id:339 size:1078402392 collection:"collection2" file_count:22309 replica_placement:100 version:3 modified_at_second:1614969996 + volume id:345 size:1074560760 collection:"collection2" file_count:22117 delete_count:2 deleted_byte_count:373286 replica_placement:100 version:3 modified_at_second:1614977458 + volume id:355 size:1075239792 collection:"collection2" file_count:22244 delete_count:1 deleted_byte_count:23282 replica_placement:100 version:3 modified_at_second:1614992157 + volume id:373 size:1080928000 collection:"collection2" file_count:22617 delete_count:4 deleted_byte_count:91849 replica_placement:100 version:3 modified_at_second:1615016877 + Disk hdd total size:48630015544 file_count:537880 deleted_file:2580 deleted_bytes:929560253 + DataNode 192.168.1.4:8080 total size:48630015544 file_count:537880 deleted_file:2580 deleted_bytes:929560253 + Rack rack1 total size:48630015544 file_count:537880 deleted_file:2580 deleted_bytes:929560253 + Rack rack2 hdd(volume:36/190 active:36 free:154 remote:0) + DataNode 192.168.1.2:8080 hdd(volume:36/190 active:36 free:154 remote:0) + Disk hdd(volume:36/190 active:36 free:154 remote:0) + volume id:2 size:289228560 file_count:1640 delete_count:4 deleted_byte_count:480564 replica_placement:100 version:3 compact_revision:6 modified_at_second:1615630622 + volume id:3 size:308743136 file_count:1638 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632242 + volume id:4 size:285986968 file_count:1641 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632302 + volume id:6 size:302411024 file_count:1604 delete_count:2 deleted_byte_count:274587 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631402 + volume id:7 size:1924728 collection:"collection4" file_count:15 replica_placement:100 version:3 modified_at_second:1609331040 + volume id:9 size:77337416 collection:"collection3" file_count:58 replica_placement:100 version:3 ttl:772 modified_at_second:1615513762 + volume id:10 size:1212784656 collection:"collection0" file_count:58 replica_placement:100 version:3 modified_at_second:1609814550 + volume id:12 size:1110923848 collection:"collection0" file_count:45 replica_placement:100 version:3 modified_at_second:1609819732 + volume id:13 size:1184910656 collection:"collection0" file_count:47 replica_placement:100 version:3 modified_at_second:1609827837 + volume id:14 size:1107475720 collection:"collection0" file_count:80 delete_count:3 deleted_byte_count:6870 replica_placement:100 version:3 modified_at_second:1612956980 + volume id:16 size:1113666104 collection:"collection0" file_count:73 delete_count:5 deleted_byte_count:6318 replica_placement:100 version:3 modified_at_second:1612957007 + volume id:17 size:1095115800 collection:"collection0" file_count:83 delete_count:3 deleted_byte_count:7099 replica_placement:100 version:3 modified_at_second:1612957000 + volume id:21 size:1097631664 collection:"collection0" file_count:82 delete_count:11 deleted_byte_count:68985100 replica_placement:100 version:3 modified_at_second:1612957007 + volume id:56 size:1001897616 collection:"collection1" file_count:8762 delete_count:37 deleted_byte_count:65375405 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615632014 + volume id:81 size:880693104 collection:"collection1" file_count:7481 delete_count:236 deleted_byte_count:80386421 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615631396 + volume id:104 size:1076383624 collection:"collection1" file_count:7663 delete_count:184 deleted_byte_count:100728071 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615602658 + volume id:107 size:1073811840 collection:"collection1" file_count:7436 delete_count:168 deleted_byte_count:57747484 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615293569 + volume id:113 size:1076709184 collection:"collection1" file_count:9355 delete_count:177 deleted_byte_count:59796765 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615569822 + volume id:139 size:1074163936 collection:"collection1" file_count:9315 delete_count:42 deleted_byte_count:10630966 replica_placement:100 version:3 modified_at_second:1615571946 + volume id:151 size:1098659752 collection:"collection1" file_count:10808 delete_count:24 deleted_byte_count:7088102 replica_placement:100 version:3 modified_at_second:1615586389 + volume id:155 size:1075140688 collection:"collection1" file_count:10882 delete_count:32 deleted_byte_count:9076141 replica_placement:100 version:3 modified_at_second:1615606614 + volume id:167 size:1073958176 collection:"collection1" file_count:25229 delete_count:48 deleted_byte_count:25871565 replica_placement:100 version:3 modified_at_second:1615602669 + volume id:177 size:1074120216 collection:"collection1" file_count:22293 delete_count:16 deleted_byte_count:3803952 replica_placement:100 version:3 modified_at_second:1615516892 + volume id:179 size:1074313920 collection:"collection1" file_count:21829 delete_count:24 deleted_byte_count:45552859 replica_placement:100 version:3 modified_at_second:1615580308 + volume id:182 size:1076131280 collection:"collection1" file_count:31987 delete_count:21 deleted_byte_count:1452346 replica_placement:100 version:3 modified_at_second:1615568922 + volume id:215 size:1068268216 collection:"collection1" file_count:2813 delete_count:10 deleted_byte_count:5676795 replica_placement:100 version:3 modified_at_second:1615586386 + volume id:217 size:1075381872 collection:"collection1" file_count:3331 delete_count:14 deleted_byte_count:2009141 replica_placement:100 version:3 modified_at_second:1615401638 + volume id:283 size:1080178944 collection:"collection2" file_count:19462 delete_count:7 deleted_byte_count:660407 replica_placement:100 version:3 modified_at_second:1614896626 + volume id:303 size:1075944504 collection:"collection2" file_count:22541 delete_count:2 deleted_byte_count:13617 replica_placement:100 version:3 modified_at_second:1614925431 + volume id:309 size:1075178624 collection:"collection2" file_count:22692 delete_count:3 deleted_byte_count:171124 replica_placement:100 version:3 modified_at_second:1614931409 + volume id:323 size:1074608200 collection:"collection2" file_count:21605 delete_count:4 deleted_byte_count:172090 replica_placement:100 version:3 modified_at_second:1614950526 + volume id:344 size:1075035448 collection:"collection2" file_count:21765 delete_count:1 deleted_byte_count:24623 replica_placement:100 version:3 modified_at_second:1614977465 + volume id:347 size:1075145496 collection:"collection2" file_count:22178 delete_count:1 deleted_byte_count:79392 replica_placement:100 version:3 modified_at_second:1614984727 + volume id:357 size:1074276208 collection:"collection2" file_count:23137 delete_count:4 deleted_byte_count:188487 replica_placement:100 version:3 modified_at_second:1614998792 + volume id:380 size:1010760456 collection:"collection2" file_count:14921 delete_count:6 deleted_byte_count:65678 replica_placement:100 version:3 modified_at_second:1615632322 + volume id:381 size:939292792 collection:"collection2" file_count:14619 delete_count:2 deleted_byte_count:5119 replica_placement:100 version:3 modified_at_second:1615632324 + Disk hdd total size:33468194376 file_count:369168 deleted_file:1091 deleted_bytes:546337088 + DataNode 192.168.1.2:8080 total size:33468194376 file_count:369168 deleted_file:1091 deleted_bytes:546337088 + Rack rack2 total size:33468194376 file_count:369168 deleted_file:1091 deleted_bytes:546337088 + DataCenter dc2 total size:82098209920 file_count:907048 deleted_file:3671 deleted_bytes:1475897341 + DataCenter dc3 hdd(volume:108/1850 active:108 free:1742 remote:0) + Rack rack3 hdd(volume:108/1850 active:108 free:1742 remote:0) + DataNode 192.168.1.6:8080 hdd(volume:108/1850 active:108 free:1742 remote:0) + Disk hdd(volume:108/1850 active:108 free:1742 remote:0) + volume id:1 size:284685936 file_count:1557 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632062 + volume id:32 size:281390512 file_count:1496 delete_count:6 deleted_byte_count:546403 replica_placement:100 version:3 modified_at_second:1615632362 + volume id:47 size:444599784 collection:"collection1" file_count:709 delete_count:19 deleted_byte_count:11913451 replica_placement:100 version:3 modified_at_second:1615632397 + volume id:49 size:1078775288 collection:"collection1" file_count:9636 delete_count:22 deleted_byte_count:5625976 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630446 + volume id:68 size:898630584 collection:"collection1" file_count:6934 delete_count:95 deleted_byte_count:27460707 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632284 + volume id:88 size:1073767976 collection:"collection1" file_count:14995 delete_count:206 deleted_byte_count:81222360 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615629897 + volume id:202 size:1077533160 collection:"collection1" file_count:2847 delete_count:67 deleted_byte_count:65172985 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615588497 + volume id:203 size:1027316272 collection:"collection1" file_count:3040 delete_count:11 deleted_byte_count:3993230 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615631728 + volume id:205 size:1078485304 collection:"collection1" file_count:2869 delete_count:43 deleted_byte_count:18290259 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615579314 + volume id:206 size:1082045848 collection:"collection1" file_count:2979 delete_count:225 deleted_byte_count:88220074 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615564274 + volume id:209 size:1074083592 collection:"collection1" file_count:3238 delete_count:4 deleted_byte_count:1494244 replica_placement:100 version:3 modified_at_second:1615419954 + volume id:211 size:1080610712 collection:"collection1" file_count:3247 delete_count:7 deleted_byte_count:1891456 replica_placement:100 version:3 modified_at_second:1615269124 + volume id:212 size:1078293360 collection:"collection1" file_count:3106 delete_count:6 deleted_byte_count:2085755 replica_placement:100 version:3 modified_at_second:1615586387 + volume id:213 size:1093587976 collection:"collection1" file_count:3681 delete_count:12 deleted_byte_count:3138791 replica_placement:100 version:3 modified_at_second:1615586387 + volume id:214 size:1074486992 collection:"collection1" file_count:3217 delete_count:10 deleted_byte_count:6392871 replica_placement:100 version:3 modified_at_second:1615586383 + volume id:216 size:1080073496 collection:"collection1" file_count:3316 delete_count:4 deleted_byte_count:179819 replica_placement:100 version:3 modified_at_second:1615586387 + volume id:222 size:1106623104 collection:"collection1" file_count:3273 delete_count:11 deleted_byte_count:2114627 replica_placement:100 version:3 modified_at_second:1615586243 + volume id:223 size:1075233064 collection:"collection1" file_count:2966 delete_count:9 deleted_byte_count:744001 replica_placement:100 version:3 modified_at_second:1615586244 + volume id:227 size:1106699896 collection:"collection1" file_count:2827 delete_count:20 deleted_byte_count:5496790 replica_placement:100 version:3 modified_at_second:1615609989 + volume id:229 size:1109855312 collection:"collection1" file_count:2857 delete_count:22 deleted_byte_count:2839883 replica_placement:100 version:3 modified_at_second:1615609988 + volume id:230 size:1080722984 collection:"collection1" file_count:2898 delete_count:15 deleted_byte_count:3929261 replica_placement:100 version:3 modified_at_second:1615610537 + volume id:231 size:1112917696 collection:"collection1" file_count:3151 delete_count:20 deleted_byte_count:2989828 replica_placement:100 version:3 modified_at_second:1615611350 + volume id:233 size:1080526464 collection:"collection1" file_count:3136 delete_count:61 deleted_byte_count:17991717 replica_placement:100 version:3 modified_at_second:1615611352 + volume id:234 size:1073835280 collection:"collection1" file_count:2965 delete_count:41 deleted_byte_count:4960354 replica_placement:100 version:3 modified_at_second:1615611351 + volume id:235 size:1075586104 collection:"collection1" file_count:2767 delete_count:33 deleted_byte_count:3216540 replica_placement:100 version:3 modified_at_second:1615611354 + volume id:237 size:375722792 collection:"collection1" file_count:736 delete_count:16 deleted_byte_count:4464870 replica_placement:100 version:3 modified_at_second:1615631727 + volume id:239 size:426569024 collection:"collection1" file_count:693 delete_count:19 deleted_byte_count:13020783 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630838 + volume id:241 size:380217424 collection:"collection1" file_count:633 delete_count:6 deleted_byte_count:1715768 replica_placement:100 version:3 modified_at_second:1615632006 + volume id:244 size:1080295352 collection:"collection2" file_count:10812 delete_count:1 deleted_byte_count:795 replica_placement:100 version:3 modified_at_second:1614852171 + volume id:245 size:1074597056 collection:"collection2" file_count:10371 delete_count:3 deleted_byte_count:209701 replica_placement:100 version:3 modified_at_second:1614852093 + volume id:246 size:1075998648 collection:"collection2" file_count:10365 delete_count:1 deleted_byte_count:13112 replica_placement:100 version:3 modified_at_second:1614852105 + volume id:248 size:1084301184 collection:"collection2" file_count:11217 delete_count:4 deleted_byte_count:746488 replica_placement:100 version:3 modified_at_second:1614856285 + volume id:249 size:1074819136 collection:"collection2" file_count:10763 delete_count:2 deleted_byte_count:271699 replica_placement:100 version:3 modified_at_second:1614856230 + volume id:251 size:1075684488 collection:"collection2" file_count:10847 replica_placement:100 version:3 modified_at_second:1614856270 + volume id:252 size:1075065208 collection:"collection2" file_count:14622 delete_count:2 deleted_byte_count:5228 replica_placement:100 version:3 modified_at_second:1614861196 + volume id:253 size:1087328816 collection:"collection2" file_count:14920 delete_count:3 deleted_byte_count:522994 replica_placement:100 version:3 modified_at_second:1614861255 + volume id:255 size:1079581640 collection:"collection2" file_count:14877 delete_count:3 deleted_byte_count:101223 replica_placement:100 version:3 modified_at_second:1614861233 + volume id:256 size:1074283592 collection:"collection2" file_count:14157 delete_count:1 deleted_byte_count:18156 replica_placement:100 version:3 modified_at_second:1614861100 + volume id:258 size:1075527216 collection:"collection2" file_count:18421 delete_count:4 deleted_byte_count:267833 replica_placement:100 version:3 modified_at_second:1614866420 + volume id:259 size:1075507776 collection:"collection2" file_count:18079 delete_count:2 deleted_byte_count:71992 replica_placement:100 version:3 modified_at_second:1614866381 + volume id:264 size:1081624192 collection:"collection2" file_count:21151 replica_placement:100 version:3 modified_at_second:1614871629 + volume id:265 size:1076401104 collection:"collection2" file_count:19932 delete_count:2 deleted_byte_count:160823 replica_placement:100 version:3 modified_at_second:1615629130 + volume id:266 size:1075617464 collection:"collection2" file_count:20075 delete_count:1 deleted_byte_count:1039 replica_placement:100 version:3 modified_at_second:1614871526 + volume id:267 size:1075699544 collection:"collection2" file_count:21039 delete_count:3 deleted_byte_count:59956 replica_placement:100 version:3 modified_at_second:1614877294 + volume id:268 size:1074490592 collection:"collection2" file_count:21698 delete_count:1 deleted_byte_count:33968 replica_placement:100 version:3 modified_at_second:1614877434 + volume id:269 size:1077552872 collection:"collection2" file_count:21875 delete_count:4 deleted_byte_count:347272 replica_placement:100 version:3 modified_at_second:1614877481 + volume id:270 size:1076876568 collection:"collection2" file_count:22057 delete_count:1 deleted_byte_count:43916 replica_placement:100 version:3 modified_at_second:1614877469 + volume id:275 size:1078349024 collection:"collection2" file_count:20808 delete_count:1 deleted_byte_count:1118 replica_placement:100 version:3 modified_at_second:1614884147 + volume id:277 size:1074956288 collection:"collection2" file_count:19260 delete_count:2 deleted_byte_count:172356 replica_placement:100 version:3 modified_at_second:1614889988 + volume id:278 size:1078798640 collection:"collection2" file_count:20597 delete_count:5 deleted_byte_count:400060 replica_placement:100 version:3 modified_at_second:1614890292 + volume id:279 size:1077325040 collection:"collection2" file_count:19671 delete_count:6 deleted_byte_count:379116 replica_placement:100 version:3 modified_at_second:1614890229 + volume id:280 size:1077432216 collection:"collection2" file_count:20286 delete_count:1 deleted_byte_count:879 replica_placement:100 version:3 modified_at_second:1614890262 + volume id:281 size:1077581096 collection:"collection2" file_count:20206 delete_count:3 deleted_byte_count:143964 replica_placement:100 version:3 modified_at_second:1614890237 + volume id:284 size:1074533384 collection:"collection2" file_count:22196 delete_count:4 deleted_byte_count:154683 replica_placement:100 version:3 modified_at_second:1614897231 + volume id:285 size:1082128688 collection:"collection2" file_count:21804 delete_count:1 deleted_byte_count:1064 replica_placement:100 version:3 modified_at_second:1614897165 + volume id:289 size:1075284256 collection:"collection2" file_count:29342 delete_count:5 deleted_byte_count:100454 replica_placement:100 version:3 modified_at_second:1614904977 + volume id:290 size:1074723792 collection:"collection2" file_count:28340 delete_count:4 deleted_byte_count:199064 replica_placement:100 version:3 modified_at_second:1614904924 + volume id:291 size:1076256768 collection:"collection2" file_count:28301 delete_count:5 deleted_byte_count:116027 replica_placement:100 version:3 modified_at_second:1614904924 + volume id:293 size:1075409792 collection:"collection2" file_count:26063 delete_count:4 deleted_byte_count:183834 replica_placement:100 version:3 modified_at_second:1614912235 + volume id:294 size:1075444048 collection:"collection2" file_count:26076 delete_count:4 deleted_byte_count:194914 replica_placement:100 version:3 modified_at_second:1614912220 + volume id:296 size:1077824032 collection:"collection2" file_count:26741 delete_count:4 deleted_byte_count:199906 replica_placement:100 version:3 modified_at_second:1614912301 + volume id:297 size:1080229136 collection:"collection2" file_count:23409 delete_count:5 deleted_byte_count:46268 replica_placement:100 version:3 modified_at_second:1614918481 + volume id:298 size:1075410136 collection:"collection2" file_count:23222 delete_count:2 deleted_byte_count:46110 replica_placement:100 version:3 modified_at_second:1614918474 + volume id:299 size:1075147936 collection:"collection2" file_count:22927 delete_count:4 deleted_byte_count:345569 replica_placement:100 version:3 modified_at_second:1614918455 + volume id:300 size:1076212392 collection:"collection2" file_count:22892 delete_count:2 deleted_byte_count:61320 replica_placement:100 version:3 modified_at_second:1614918464 + volume id:301 size:1074655600 collection:"collection2" file_count:22543 delete_count:6 deleted_byte_count:136968 replica_placement:100 version:3 modified_at_second:1614918378 + volume id:303 size:1075944480 collection:"collection2" file_count:22541 delete_count:2 deleted_byte_count:13617 replica_placement:100 version:3 modified_at_second:1614925431 + volume id:306 size:1074764016 collection:"collection2" file_count:22939 replica_placement:100 version:3 modified_at_second:1614925462 + volume id:307 size:1076568000 collection:"collection2" file_count:23377 delete_count:2 deleted_byte_count:25453 replica_placement:100 version:3 modified_at_second:1614931448 + volume id:308 size:1074022392 collection:"collection2" file_count:23086 delete_count:2 deleted_byte_count:2127 replica_placement:100 version:3 modified_at_second:1614931401 + volume id:309 size:1075178664 collection:"collection2" file_count:22692 delete_count:3 deleted_byte_count:171124 replica_placement:100 version:3 modified_at_second:1614931409 + volume id:310 size:1074761528 collection:"collection2" file_count:21441 delete_count:3 deleted_byte_count:13934 replica_placement:100 version:3 modified_at_second:1614931077 + volume id:314 size:1074670840 collection:"collection2" file_count:20964 delete_count:4 deleted_byte_count:304291 replica_placement:100 version:3 modified_at_second:1614937441 + volume id:315 size:1084153544 collection:"collection2" file_count:23638 delete_count:2 deleted_byte_count:53956 replica_placement:100 version:3 modified_at_second:1614937885 + volume id:317 size:1076215096 collection:"collection2" file_count:23572 delete_count:2 deleted_byte_count:1441356 replica_placement:100 version:3 modified_at_second:1614943965 + volume id:318 size:1075965168 collection:"collection2" file_count:22459 delete_count:2 deleted_byte_count:37778 replica_placement:100 version:3 modified_at_second:1614943862 + volume id:319 size:1073952880 collection:"collection2" file_count:22286 delete_count:2 deleted_byte_count:43421 replica_placement:100 version:3 modified_at_second:1614943810 + volume id:320 size:1082437792 collection:"collection2" file_count:21544 delete_count:3 deleted_byte_count:16712 replica_placement:100 version:3 modified_at_second:1614943599 + volume id:321 size:1081477904 collection:"collection2" file_count:23531 delete_count:5 deleted_byte_count:262564 replica_placement:100 version:3 modified_at_second:1614943982 + volume id:324 size:1075606680 collection:"collection2" file_count:20799 delete_count:1 deleted_byte_count:251210 replica_placement:100 version:3 modified_at_second:1614950310 + volume id:325 size:1080701144 collection:"collection2" file_count:21735 replica_placement:100 version:3 modified_at_second:1614950525 + volume id:330 size:1080825832 collection:"collection2" file_count:22464 delete_count:2 deleted_byte_count:15771 replica_placement:100 version:3 modified_at_second:1614956477 + volume id:332 size:1075569928 collection:"collection2" file_count:22097 delete_count:3 deleted_byte_count:98273 replica_placement:100 version:3 modified_at_second:1614962869 + volume id:334 size:1075607880 collection:"collection2" file_count:22546 delete_count:6 deleted_byte_count:101538 replica_placement:100 version:3 modified_at_second:1614962978 + volume id:336 size:1087853056 collection:"collection2" file_count:22801 delete_count:2 deleted_byte_count:26394 replica_placement:100 version:3 modified_at_second:1614963005 + volume id:337 size:1075646784 collection:"collection2" file_count:21934 delete_count:1 deleted_byte_count:3397 replica_placement:100 version:3 modified_at_second:1614969937 + volume id:338 size:1076118304 collection:"collection2" file_count:21680 replica_placement:100 version:3 modified_at_second:1614969850 + volume id:340 size:1079462184 collection:"collection2" file_count:22319 delete_count:4 deleted_byte_count:93620 replica_placement:100 version:3 modified_at_second:1614969978 + volume id:341 size:1074448400 collection:"collection2" file_count:21590 delete_count:5 deleted_byte_count:160085 replica_placement:100 version:3 modified_at_second:1614969858 + volume id:342 size:1080186424 collection:"collection2" file_count:22405 delete_count:4 deleted_byte_count:64819 replica_placement:100 version:3 modified_at_second:1614977521 + volume id:344 size:1075035416 collection:"collection2" file_count:21765 delete_count:1 deleted_byte_count:24623 replica_placement:100 version:3 modified_at_second:1614977465 + volume id:345 size:1074560760 collection:"collection2" file_count:22117 delete_count:2 deleted_byte_count:373286 replica_placement:100 version:3 modified_at_second:1614977457 + volume id:346 size:1076464112 collection:"collection2" file_count:22320 delete_count:4 deleted_byte_count:798258 replica_placement:100 version:3 modified_at_second:1615631322 + volume id:348 size:1080623640 collection:"collection2" file_count:21667 delete_count:1 deleted_byte_count:2443 replica_placement:100 version:3 modified_at_second:1614984606 + volume id:350 size:1074756688 collection:"collection2" file_count:21990 delete_count:3 deleted_byte_count:233881 replica_placement:100 version:3 modified_at_second:1614984682 + volume id:351 size:1078795112 collection:"collection2" file_count:23660 delete_count:3 deleted_byte_count:102141 replica_placement:100 version:3 modified_at_second:1614984816 + volume id:352 size:1077145936 collection:"collection2" file_count:22066 delete_count:1 deleted_byte_count:1018 replica_placement:100 version:3 modified_at_second:1614992130 + volume id:353 size:1074897496 collection:"collection2" file_count:21266 delete_count:2 deleted_byte_count:3105374 replica_placement:100 version:3 modified_at_second:1614991951 + volume id:355 size:1075239728 collection:"collection2" file_count:22244 delete_count:1 deleted_byte_count:23282 replica_placement:100 version:3 modified_at_second:1614992157 + volume id:356 size:1083305048 collection:"collection2" file_count:21552 delete_count:4 deleted_byte_count:14472 replica_placement:100 version:3 modified_at_second:1614992028 + volume id:358 size:1085152368 collection:"collection2" file_count:23756 delete_count:3 deleted_byte_count:44531 replica_placement:100 version:3 modified_at_second:1614998824 + volume id:360 size:1075532456 collection:"collection2" file_count:22574 delete_count:3 deleted_byte_count:1774776 replica_placement:100 version:3 modified_at_second:1614998770 + volume id:361 size:1075362744 collection:"collection2" file_count:22272 delete_count:1 deleted_byte_count:3497 replica_placement:100 version:3 modified_at_second:1614998668 + volume id:375 size:1076140568 collection:"collection2" file_count:21880 delete_count:2 deleted_byte_count:51103 replica_placement:100 version:3 modified_at_second:1615016787 + volume id:376 size:1074845944 collection:"collection2" file_count:22908 delete_count:4 deleted_byte_count:432305 replica_placement:100 version:3 modified_at_second:1615016916 + volume id:377 size:957284144 collection:"collection2" file_count:14923 delete_count:1 deleted_byte_count:1797 replica_placement:100 version:3 modified_at_second:1615632323 + volume id:378 size:959273936 collection:"collection2" file_count:15027 delete_count:4 deleted_byte_count:231414 replica_placement:100 version:3 modified_at_second:1615632323 + volume id:381 size:939261032 collection:"collection2" file_count:14615 delete_count:5 deleted_byte_count:1192272 replica_placement:100 version:3 modified_at_second:1615632324 + Disk hdd total size:111617646696 file_count:1762773 deleted_file:1221 deleted_bytes:398484585 + DataNode 192.168.1.6:8080 total size:111617646696 file_count:1762773 deleted_file:1221 deleted_bytes:398484585 + Rack rack3 total size:111617646696 file_count:1762773 deleted_file:1221 deleted_bytes:398484585 + DataCenter dc3 total size:111617646696 file_count:1762773 deleted_file:1221 deleted_bytes:398484585 + DataCenter dc4 hdd(volume:267/2000 active:267 free:1733 remote:0) + Rack DefaultRack hdd(volume:267/2000 active:267 free:1733 remote:0) + DataNode 192.168.1.1:8080 hdd(volume:267/2000 active:267 free:1733 remote:0) + Disk hdd(volume:267/2000 active:267 free:1733 remote:0) + volume id:1 size:284693256 file_count:1558 delete_count:2 deleted_byte_count:4818 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632062 + volume id:2 size:289228560 file_count:1640 delete_count:4 deleted_byte_count:464508 replica_placement:100 version:3 compact_revision:6 modified_at_second:1615630622 + volume id:3 size:308741952 file_count:1637 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632242 + volume id:4 size:285986968 file_count:1640 delete_count:1 deleted_byte_count:145095 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632302 + volume id:5 size:293806008 file_count:1669 delete_count:2 deleted_byte_count:274334 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631342 + volume id:6 size:302411024 file_count:1604 delete_count:2 deleted_byte_count:274587 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631402 + volume id:7 size:1924728 collection:"collection4" file_count:15 replica_placement:100 version:3 modified_at_second:1609331040 + volume id:9 size:77337416 collection:"collection3" file_count:58 replica_placement:100 version:3 ttl:772 modified_at_second:1615513762 + volume id:10 size:1212784656 collection:"collection0" file_count:58 replica_placement:100 version:3 modified_at_second:1609814543 + volume id:11 size:1109224552 collection:"collection0" file_count:44 replica_placement:100 version:3 modified_at_second:1609815123 + volume id:12 size:1110923848 collection:"collection0" file_count:45 replica_placement:100 version:3 modified_at_second:1609819726 + volume id:13 size:1184910656 collection:"collection0" file_count:47 replica_placement:100 version:3 modified_at_second:1609827832 + volume id:14 size:1107475720 collection:"collection0" file_count:80 delete_count:3 deleted_byte_count:6870 replica_placement:100 version:3 modified_at_second:1612956983 + volume id:15 size:1115965160 collection:"collection0" file_count:83 delete_count:3 deleted_byte_count:4956 replica_placement:100 version:3 modified_at_second:1612957001 + volume id:16 size:1113666048 collection:"collection0" file_count:73 delete_count:5 deleted_byte_count:6318 replica_placement:100 version:3 modified_at_second:1612957007 + volume id:17 size:1095115800 collection:"collection0" file_count:83 delete_count:3 deleted_byte_count:7099 replica_placement:100 version:3 modified_at_second:1612957000 + volume id:18 size:1096678688 collection:"collection0" file_count:88 delete_count:4 deleted_byte_count:8633 replica_placement:100 version:3 modified_at_second:1612957000 + volume id:19 size:1096923792 collection:"collection0" file_count:100 delete_count:10 deleted_byte_count:75779917 replica_placement:100 version:3 compact_revision:4 modified_at_second:1612957011 + volume id:20 size:1074760432 collection:"collection0" file_count:82 delete_count:5 deleted_byte_count:12156 replica_placement:100 version:3 compact_revision:2 modified_at_second:1612957011 + volume id:22 size:1086828368 collection:"collection0" file_count:75 delete_count:3 deleted_byte_count:5551 replica_placement:100 version:3 modified_at_second:1612957007 + volume id:23 size:1076380280 collection:"collection0" file_count:68 delete_count:2 deleted_byte_count:2910 replica_placement:100 version:3 modified_at_second:1612957011 + volume id:24 size:1074139808 collection:"collection0" file_count:90 delete_count:1 deleted_byte_count:1977 replica_placement:100 version:3 modified_at_second:1612957011 + volume id:25 size:690757544 collection:"collection0" file_count:38 delete_count:1 deleted_byte_count:1944 replica_placement:100 version:3 modified_at_second:1612956995 + volume id:26 size:532657632 collection:"collection0" file_count:100 delete_count:4 deleted_byte_count:9081 replica_placement:100 version:3 modified_at_second:1614170023 + volume id:34 size:1077111136 collection:"collection1" file_count:9781 delete_count:110 deleted_byte_count:20894827 replica_placement:100 version:3 modified_at_second:1615619366 + volume id:35 size:1075241656 collection:"collection1" file_count:10523 delete_count:96 deleted_byte_count:46618989 replica_placement:100 version:3 modified_at_second:1615618790 + volume id:36 size:1075118360 collection:"collection1" file_count:10342 delete_count:116 deleted_byte_count:25493106 replica_placement:100 version:3 modified_at_second:1615606148 + volume id:37 size:1075895584 collection:"collection1" file_count:12013 delete_count:98 deleted_byte_count:50747932 replica_placement:100 version:3 modified_at_second:1615594777 + volume id:39 size:1076606536 collection:"collection1" file_count:12612 delete_count:78 deleted_byte_count:17462730 replica_placement:100 version:3 modified_at_second:1615611959 + volume id:40 size:1075358552 collection:"collection1" file_count:12597 delete_count:62 deleted_byte_count:11657901 replica_placement:100 version:3 modified_at_second:1615612994 + volume id:41 size:1076283528 collection:"collection1" file_count:12088 delete_count:84 deleted_byte_count:19319268 replica_placement:100 version:3 modified_at_second:1615596736 + volume id:42 size:1093948352 collection:"collection1" file_count:7889 delete_count:47 deleted_byte_count:5697275 replica_placement:100 version:3 modified_at_second:1615548908 + volume id:43 size:1116445864 collection:"collection1" file_count:7358 delete_count:54 deleted_byte_count:9534379 replica_placement:100 version:3 modified_at_second:1615566170 + volume id:44 size:1077582560 collection:"collection1" file_count:7295 delete_count:50 deleted_byte_count:12618414 replica_placement:100 version:3 modified_at_second:1615566170 + volume id:45 size:1075254640 collection:"collection1" file_count:10772 delete_count:76 deleted_byte_count:22426345 replica_placement:100 version:3 modified_at_second:1615573499 + volume id:46 size:1075286056 collection:"collection1" file_count:9947 delete_count:309 deleted_byte_count:105601163 replica_placement:100 version:3 modified_at_second:1615569826 + volume id:48 size:1076778720 collection:"collection1" file_count:9850 delete_count:77 deleted_byte_count:16641907 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630690 + volume id:50 size:1076688224 collection:"collection1" file_count:7921 delete_count:26 deleted_byte_count:5162032 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615610879 + volume id:52 size:1083529704 collection:"collection1" file_count:10128 delete_count:32 deleted_byte_count:10608391 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615599195 + volume id:53 size:1063089216 collection:"collection1" file_count:9832 delete_count:31 deleted_byte_count:9273066 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632156 + volume id:55 size:1012890016 collection:"collection1" file_count:8651 delete_count:27 deleted_byte_count:9418841 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631452 + volume id:57 size:839849792 collection:"collection1" file_count:7514 delete_count:24 deleted_byte_count:6228543 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631774 + volume id:58 size:908064200 collection:"collection1" file_count:8128 delete_count:21 deleted_byte_count:6113731 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632342 + volume id:59 size:988302272 collection:"collection1" file_count:8098 delete_count:20 deleted_byte_count:3947615 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632238 + volume id:60 size:1010702480 collection:"collection1" file_count:8969 delete_count:79 deleted_byte_count:24782814 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615632439 + volume id:61 size:975604488 collection:"collection1" file_count:8683 delete_count:20 deleted_byte_count:10276072 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615631176 + volume id:62 size:873845936 collection:"collection1" file_count:7897 delete_count:23 deleted_byte_count:10920170 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631133 + volume id:64 size:965638488 collection:"collection1" file_count:8218 delete_count:27 deleted_byte_count:6922489 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631031 + volume id:65 size:823283552 collection:"collection1" file_count:7834 delete_count:29 deleted_byte_count:5950610 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632306 + volume id:66 size:821343440 collection:"collection1" file_count:7383 delete_count:29 deleted_byte_count:12010343 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631968 + volume id:67 size:878713872 collection:"collection1" file_count:7299 delete_count:117 deleted_byte_count:24857326 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632156 + volume id:68 size:898630584 collection:"collection1" file_count:6934 delete_count:95 deleted_byte_count:27460707 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632284 + volume id:70 size:886695472 collection:"collection1" file_count:7769 delete_count:164 deleted_byte_count:45162513 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632398 + volume id:71 size:907608392 collection:"collection1" file_count:7658 delete_count:122 deleted_byte_count:27622941 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632307 + volume id:72 size:903990720 collection:"collection1" file_count:6996 delete_count:240 deleted_byte_count:74147727 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630982 + volume id:73 size:929047664 collection:"collection1" file_count:7038 delete_count:227 deleted_byte_count:65336664 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630707 + volume id:74 size:957046128 collection:"collection1" file_count:6981 delete_count:259 deleted_byte_count:73080838 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615631460 + volume id:75 size:908044992 collection:"collection1" file_count:6911 delete_count:268 deleted_byte_count:73934373 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632430 + volume id:76 size:985296744 collection:"collection1" file_count:6566 delete_count:61 deleted_byte_count:44464430 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632284 + volume id:77 size:929398296 collection:"collection1" file_count:7427 delete_count:238 deleted_byte_count:59581579 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632013 + volume id:78 size:1075671512 collection:"collection1" file_count:7540 delete_count:258 deleted_byte_count:71726846 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615582829 + volume id:79 size:948225472 collection:"collection1" file_count:6997 delete_count:227 deleted_byte_count:60625763 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631326 + volume id:82 size:1041661800 collection:"collection1" file_count:7043 delete_count:207 deleted_byte_count:52275724 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632430 + volume id:83 size:936195856 collection:"collection1" file_count:7593 delete_count:13 deleted_byte_count:4633917 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632029 + volume id:85 size:1023867520 collection:"collection1" file_count:7787 delete_count:240 deleted_byte_count:82091742 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631723 + volume id:86 size:1009437488 collection:"collection1" file_count:8474 delete_count:236 deleted_byte_count:64543674 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630812 + volume id:87 size:922276640 collection:"collection1" file_count:12902 delete_count:13 deleted_byte_count:3412959 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632438 + volume id:89 size:1044401976 collection:"collection1" file_count:14943 delete_count:243 deleted_byte_count:58543159 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632208 + volume id:90 size:891145784 collection:"collection1" file_count:14608 delete_count:10 deleted_byte_count:2564369 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615629390 + volume id:91 size:936572832 collection:"collection1" file_count:14686 delete_count:11 deleted_byte_count:4717727 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631851 + volume id:92 size:992440712 collection:"collection1" file_count:7061 delete_count:195 deleted_byte_count:60649573 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630566 + volume id:93 size:1079603768 collection:"collection1" file_count:7878 delete_count:270 deleted_byte_count:74150048 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615556015 + volume id:94 size:1030685824 collection:"collection1" file_count:7660 delete_count:207 deleted_byte_count:70150733 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631616 + volume id:95 size:990879168 collection:"collection1" file_count:6620 delete_count:206 deleted_byte_count:60363604 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615631866 + volume id:96 size:989296136 collection:"collection1" file_count:7544 delete_count:229 deleted_byte_count:59931853 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630778 + volume id:97 size:1053112992 collection:"collection1" file_count:6789 delete_count:50 deleted_byte_count:38894001 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631194 + volume id:99 size:1071718504 collection:"collection1" file_count:7470 delete_count:8 deleted_byte_count:9624950 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631175 + volume id:100 size:1083617440 collection:"collection1" file_count:7018 delete_count:187 deleted_byte_count:61304236 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615505917 + volume id:101 size:1077109520 collection:"collection1" file_count:7706 delete_count:226 deleted_byte_count:77864841 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630994 + volume id:102 size:1074359920 collection:"collection1" file_count:7338 delete_count:7 deleted_byte_count:6499151 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615626683 + volume id:103 size:1075863904 collection:"collection1" file_count:7184 delete_count:186 deleted_byte_count:58872238 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615628417 + volume id:104 size:1076383768 collection:"collection1" file_count:7663 delete_count:184 deleted_byte_count:100578087 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615602661 + volume id:105 size:1073996824 collection:"collection1" file_count:6873 delete_count:19 deleted_byte_count:14271533 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615499756 + volume id:108 size:1074648024 collection:"collection1" file_count:7472 delete_count:194 deleted_byte_count:70864699 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615593232 + volume id:109 size:1075254560 collection:"collection1" file_count:7556 delete_count:263 deleted_byte_count:55155265 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615502487 + volume id:110 size:1076575744 collection:"collection1" file_count:6996 delete_count:163 deleted_byte_count:52954032 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615590786 + volume id:111 size:1073826232 collection:"collection1" file_count:7355 delete_count:155 deleted_byte_count:50083578 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615593233 + volume id:114 size:1074762784 collection:"collection1" file_count:8802 delete_count:156 deleted_byte_count:38470055 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615591826 + volume id:115 size:1076192240 collection:"collection1" file_count:7690 delete_count:154 deleted_byte_count:32267193 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615285295 + volume id:116 size:1074489504 collection:"collection1" file_count:9981 delete_count:174 deleted_byte_count:53998777 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615611567 + volume id:117 size:1073917192 collection:"collection1" file_count:9520 delete_count:114 deleted_byte_count:21835126 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615573714 + volume id:118 size:1074064400 collection:"collection1" file_count:8738 delete_count:15 deleted_byte_count:3460697 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615516265 + volume id:119 size:1075940104 collection:"collection1" file_count:9003 delete_count:12 deleted_byte_count:9128155 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615573880 + volume id:120 size:1076115928 collection:"collection1" file_count:9639 delete_count:118 deleted_byte_count:33357871 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615482567 + volume id:121 size:1078803248 collection:"collection1" file_count:10113 delete_count:441 deleted_byte_count:94128627 replica_placement:100 version:3 modified_at_second:1615506629 + volume id:122 size:1076235312 collection:"collection1" file_count:9106 delete_count:252 deleted_byte_count:93041272 replica_placement:100 version:3 modified_at_second:1615585913 + volume id:123 size:1080491112 collection:"collection1" file_count:10623 delete_count:302 deleted_byte_count:83956998 replica_placement:100 version:3 modified_at_second:1615585916 + volume id:124 size:1074519360 collection:"collection1" file_count:9457 delete_count:286 deleted_byte_count:74752459 replica_placement:100 version:3 modified_at_second:1615585916 + volume id:125 size:1088687040 collection:"collection1" file_count:9518 delete_count:281 deleted_byte_count:76037905 replica_placement:100 version:3 modified_at_second:1615585913 + volume id:126 size:1073867464 collection:"collection1" file_count:9320 delete_count:278 deleted_byte_count:94547424 replica_placement:100 version:3 modified_at_second:1615585912 + volume id:127 size:1074907336 collection:"collection1" file_count:9900 delete_count:133 deleted_byte_count:48570820 replica_placement:100 version:3 modified_at_second:1615612991 + volume id:129 size:1074704272 collection:"collection1" file_count:10012 delete_count:150 deleted_byte_count:64491721 replica_placement:100 version:3 modified_at_second:1615627566 + volume id:130 size:1075000632 collection:"collection1" file_count:10633 delete_count:161 deleted_byte_count:34768201 replica_placement:100 version:3 modified_at_second:1615582330 + volume id:131 size:1075279584 collection:"collection1" file_count:10075 delete_count:135 deleted_byte_count:29795712 replica_placement:100 version:3 modified_at_second:1615523898 + volume id:132 size:1088539496 collection:"collection1" file_count:11051 delete_count:71 deleted_byte_count:17178322 replica_placement:100 version:3 modified_at_second:1615619584 + volume id:133 size:1075952760 collection:"collection1" file_count:9538 delete_count:74 deleted_byte_count:19558008 replica_placement:100 version:3 modified_at_second:1615584780 + volume id:134 size:1074367304 collection:"collection1" file_count:10662 delete_count:69 deleted_byte_count:25530139 replica_placement:100 version:3 modified_at_second:1615555876 + volume id:135 size:1073906720 collection:"collection1" file_count:10446 delete_count:71 deleted_byte_count:28599975 replica_placement:100 version:3 modified_at_second:1615569816 + volume id:137 size:1074309264 collection:"collection1" file_count:9633 delete_count:50 deleted_byte_count:27487972 replica_placement:100 version:3 modified_at_second:1615572231 + volume id:139 size:1074163936 collection:"collection1" file_count:9314 delete_count:43 deleted_byte_count:10631353 replica_placement:100 version:3 modified_at_second:1615571946 + volume id:141 size:1074619488 collection:"collection1" file_count:9840 delete_count:45 deleted_byte_count:40890181 replica_placement:100 version:3 modified_at_second:1615630994 + volume id:142 size:1075732992 collection:"collection1" file_count:9009 delete_count:48 deleted_byte_count:9912854 replica_placement:100 version:3 modified_at_second:1615598914 + volume id:143 size:1075011280 collection:"collection1" file_count:9608 delete_count:51 deleted_byte_count:37282460 replica_placement:100 version:3 modified_at_second:1615488586 + volume id:145 size:1074394928 collection:"collection1" file_count:9255 delete_count:34 deleted_byte_count:38011392 replica_placement:100 version:3 modified_at_second:1615591825 + volume id:146 size:1076337520 collection:"collection1" file_count:10492 delete_count:50 deleted_byte_count:17071505 replica_placement:100 version:3 modified_at_second:1615632005 + volume id:147 size:1077130544 collection:"collection1" file_count:10451 delete_count:27 deleted_byte_count:8290907 replica_placement:100 version:3 modified_at_second:1615604117 + volume id:148 size:1076066568 collection:"collection1" file_count:9547 delete_count:33 deleted_byte_count:7034089 replica_placement:100 version:3 modified_at_second:1615586393 + volume id:149 size:1074989016 collection:"collection1" file_count:8352 delete_count:35 deleted_byte_count:7179742 replica_placement:100 version:3 modified_at_second:1615494496 + volume id:150 size:1076290408 collection:"collection1" file_count:9328 delete_count:33 deleted_byte_count:43417791 replica_placement:100 version:3 modified_at_second:1615611569 + volume id:151 size:1098659752 collection:"collection1" file_count:10805 delete_count:27 deleted_byte_count:7209106 replica_placement:100 version:3 modified_at_second:1615586390 + volume id:152 size:1075941376 collection:"collection1" file_count:9951 delete_count:36 deleted_byte_count:25348335 replica_placement:100 version:3 modified_at_second:1615606614 + volume id:153 size:1078539784 collection:"collection1" file_count:10924 delete_count:34 deleted_byte_count:12603081 replica_placement:100 version:3 modified_at_second:1615606614 + volume id:154 size:1081244752 collection:"collection1" file_count:11002 delete_count:31 deleted_byte_count:8467560 replica_placement:100 version:3 modified_at_second:1615478471 + volume id:156 size:1074975832 collection:"collection1" file_count:9535 delete_count:40 deleted_byte_count:11426621 replica_placement:100 version:3 modified_at_second:1615628342 + volume id:157 size:1076758536 collection:"collection1" file_count:10012 delete_count:19 deleted_byte_count:11688737 replica_placement:100 version:3 modified_at_second:1615597782 + volume id:158 size:1087251976 collection:"collection1" file_count:9972 delete_count:20 deleted_byte_count:10328429 replica_placement:100 version:3 modified_at_second:1615588879 + volume id:159 size:1074132336 collection:"collection1" file_count:9382 delete_count:27 deleted_byte_count:11474574 replica_placement:100 version:3 modified_at_second:1615593593 + volume id:160 size:1075680976 collection:"collection1" file_count:9772 delete_count:22 deleted_byte_count:4981968 replica_placement:100 version:3 modified_at_second:1615597782 + volume id:161 size:1077397136 collection:"collection1" file_count:9988 delete_count:28 deleted_byte_count:12509164 replica_placement:100 version:3 modified_at_second:1615631452 + volume id:162 size:1074286880 collection:"collection1" file_count:11220 delete_count:17 deleted_byte_count:1815547 replica_placement:100 version:3 modified_at_second:1615478127 + volume id:163 size:1074457224 collection:"collection1" file_count:12524 delete_count:27 deleted_byte_count:6359619 replica_placement:100 version:3 modified_at_second:1615579313 + volume id:164 size:1074261256 collection:"collection1" file_count:11922 delete_count:25 deleted_byte_count:2923288 replica_placement:100 version:3 modified_at_second:1615620085 + volume id:165 size:1073891080 collection:"collection1" file_count:9152 delete_count:12 deleted_byte_count:19164659 replica_placement:100 version:3 modified_at_second:1615471910 + volume id:166 size:1075637536 collection:"collection1" file_count:14211 delete_count:24 deleted_byte_count:20415490 replica_placement:100 version:3 modified_at_second:1615491021 + volume id:167 size:1073958280 collection:"collection1" file_count:25231 delete_count:48 deleted_byte_count:26022344 replica_placement:100 version:3 modified_at_second:1615620014 + volume id:168 size:1074718864 collection:"collection1" file_count:25702 delete_count:40 deleted_byte_count:4024775 replica_placement:100 version:3 modified_at_second:1615585664 + volume id:169 size:1073863032 collection:"collection1" file_count:25248 delete_count:43 deleted_byte_count:3013817 replica_placement:100 version:3 modified_at_second:1615569832 + volume id:170 size:1075747088 collection:"collection1" file_count:24596 delete_count:41 deleted_byte_count:3494711 replica_placement:100 version:3 modified_at_second:1615579207 + volume id:171 size:1081881400 collection:"collection1" file_count:24215 delete_count:36 deleted_byte_count:3191335 replica_placement:100 version:3 modified_at_second:1615596486 + volume id:172 size:1074787304 collection:"collection1" file_count:31236 delete_count:50 deleted_byte_count:3316482 replica_placement:100 version:3 modified_at_second:1615612385 + volume id:174 size:1073824160 collection:"collection1" file_count:30689 delete_count:36 deleted_byte_count:2160116 replica_placement:100 version:3 modified_at_second:1615598914 + volume id:175 size:1077742472 collection:"collection1" file_count:32353 delete_count:33 deleted_byte_count:1861403 replica_placement:100 version:3 modified_at_second:1615559516 + volume id:176 size:1073854800 collection:"collection1" file_count:30582 delete_count:34 deleted_byte_count:7701976 replica_placement:100 version:3 modified_at_second:1615626169 + volume id:178 size:1087560112 collection:"collection1" file_count:23482 delete_count:22 deleted_byte_count:18810492 replica_placement:100 version:3 modified_at_second:1615541369 + volume id:179 size:1074313920 collection:"collection1" file_count:21829 delete_count:24 deleted_byte_count:45574435 replica_placement:100 version:3 modified_at_second:1615580308 + volume id:180 size:1078438448 collection:"collection1" file_count:23614 delete_count:12 deleted_byte_count:4496474 replica_placement:100 version:3 modified_at_second:1614773243 + volume id:181 size:1074571672 collection:"collection1" file_count:22898 delete_count:19 deleted_byte_count:6628413 replica_placement:100 version:3 modified_at_second:1614745117 + volume id:183 size:1076361616 collection:"collection1" file_count:31293 delete_count:16 deleted_byte_count:468841 replica_placement:100 version:3 modified_at_second:1615572985 + volume id:184 size:1074594216 collection:"collection1" file_count:31368 delete_count:22 deleted_byte_count:857453 replica_placement:100 version:3 modified_at_second:1615586578 + volume id:185 size:1074099592 collection:"collection1" file_count:30612 delete_count:17 deleted_byte_count:2610847 replica_placement:100 version:3 modified_at_second:1615506835 + volume id:186 size:1074220664 collection:"collection1" file_count:31450 delete_count:15 deleted_byte_count:391855 replica_placement:100 version:3 modified_at_second:1615614934 + volume id:187 size:1074396112 collection:"collection1" file_count:31853 delete_count:17 deleted_byte_count:454283 replica_placement:100 version:3 modified_at_second:1615590491 + volume id:188 size:1074732632 collection:"collection1" file_count:31867 delete_count:19 deleted_byte_count:393743 replica_placement:100 version:3 modified_at_second:1615487645 + volume id:189 size:1074847824 collection:"collection1" file_count:31450 delete_count:16 deleted_byte_count:1040552 replica_placement:100 version:3 modified_at_second:1615335661 + volume id:190 size:1074008968 collection:"collection1" file_count:31987 delete_count:11 deleted_byte_count:685125 replica_placement:100 version:3 modified_at_second:1615447162 + volume id:191 size:1075492960 collection:"collection1" file_count:31301 delete_count:19 deleted_byte_count:708401 replica_placement:100 version:3 modified_at_second:1615357457 + volume id:192 size:1075857384 collection:"collection1" file_count:31490 delete_count:25 deleted_byte_count:720617 replica_placement:100 version:3 modified_at_second:1615621632 + volume id:193 size:1076616760 collection:"collection1" file_count:31907 delete_count:16 deleted_byte_count:464900 replica_placement:100 version:3 modified_at_second:1615507877 + volume id:194 size:1073985792 collection:"collection1" file_count:31434 delete_count:18 deleted_byte_count:391432 replica_placement:100 version:3 modified_at_second:1615559502 + volume id:195 size:1074158304 collection:"collection1" file_count:31453 delete_count:15 deleted_byte_count:718266 replica_placement:100 version:3 modified_at_second:1615559331 + volume id:196 size:1074594640 collection:"collection1" file_count:31665 delete_count:18 deleted_byte_count:3468922 replica_placement:100 version:3 modified_at_second:1615501690 + volume id:198 size:1075104624 collection:"collection1" file_count:16577 delete_count:18 deleted_byte_count:6583181 replica_placement:100 version:3 modified_at_second:1615623371 + volume id:199 size:1078117688 collection:"collection1" file_count:16497 delete_count:14 deleted_byte_count:1514286 replica_placement:100 version:3 modified_at_second:1615585987 + volume id:200 size:1075630464 collection:"collection1" file_count:16380 delete_count:18 deleted_byte_count:1103109 replica_placement:100 version:3 modified_at_second:1615485252 + volume id:201 size:1091460440 collection:"collection1" file_count:16684 delete_count:26 deleted_byte_count:5590335 replica_placement:100 version:3 modified_at_second:1615585987 + volume id:204 size:1079766904 collection:"collection1" file_count:3233 delete_count:255 deleted_byte_count:104707641 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615565702 + volume id:207 size:1081939960 collection:"collection1" file_count:3010 delete_count:4 deleted_byte_count:692350 replica_placement:100 version:3 modified_at_second:1615269061 + volume id:208 size:1077863624 collection:"collection1" file_count:3147 delete_count:6 deleted_byte_count:858726 replica_placement:100 version:3 modified_at_second:1615495515 + volume id:209 size:1074083592 collection:"collection1" file_count:3238 delete_count:4 deleted_byte_count:1494244 replica_placement:100 version:3 modified_at_second:1615419954 + volume id:210 size:1094311304 collection:"collection1" file_count:3468 delete_count:4 deleted_byte_count:466433 replica_placement:100 version:3 modified_at_second:1615495515 + volume id:211 size:1080610712 collection:"collection1" file_count:3247 delete_count:7 deleted_byte_count:1891456 replica_placement:100 version:3 modified_at_second:1615269124 + volume id:216 size:1080073496 collection:"collection1" file_count:3316 delete_count:4 deleted_byte_count:179819 replica_placement:100 version:3 modified_at_second:1615586387 + volume id:218 size:1081263944 collection:"collection1" file_count:3433 delete_count:14 deleted_byte_count:3454237 replica_placement:100 version:3 modified_at_second:1615603637 + volume id:220 size:1081928312 collection:"collection1" file_count:3166 delete_count:13 deleted_byte_count:4127709 replica_placement:100 version:3 modified_at_second:1615579317 + volume id:221 size:1106545536 collection:"collection1" file_count:3153 delete_count:11 deleted_byte_count:1496835 replica_placement:100 version:3 modified_at_second:1615269138 + volume id:224 size:1093691520 collection:"collection1" file_count:3463 delete_count:10 deleted_byte_count:1128328 replica_placement:100 version:3 modified_at_second:1615601870 + volume id:225 size:1080698928 collection:"collection1" file_count:3115 delete_count:7 deleted_byte_count:18170416 replica_placement:100 version:3 modified_at_second:1615434685 + volume id:226 size:1103504792 collection:"collection1" file_count:2965 delete_count:10 deleted_byte_count:2639254 replica_placement:100 version:3 modified_at_second:1615601870 + volume id:227 size:1106699864 collection:"collection1" file_count:2827 delete_count:19 deleted_byte_count:5393310 replica_placement:100 version:3 modified_at_second:1615609989 + volume id:228 size:1109784072 collection:"collection1" file_count:2504 delete_count:24 deleted_byte_count:5458950 replica_placement:100 version:3 modified_at_second:1615610489 + volume id:229 size:1109855256 collection:"collection1" file_count:2857 delete_count:22 deleted_byte_count:2839883 replica_placement:100 version:3 modified_at_second:1615609989 + volume id:231 size:1112917664 collection:"collection1" file_count:3151 delete_count:19 deleted_byte_count:2852517 replica_placement:100 version:3 modified_at_second:1615611350 + volume id:232 size:1073901520 collection:"collection1" file_count:3004 delete_count:54 deleted_byte_count:10273081 replica_placement:100 version:3 modified_at_second:1615611352 + volume id:233 size:1080526464 collection:"collection1" file_count:3136 delete_count:61 deleted_byte_count:17991717 replica_placement:100 version:3 modified_at_second:1615611354 + volume id:236 size:1089476200 collection:"collection1" file_count:3231 delete_count:53 deleted_byte_count:11625921 replica_placement:100 version:3 modified_at_second:1615611351 + volume id:238 size:354320000 collection:"collection1" file_count:701 delete_count:17 deleted_byte_count:5940420 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615632030 + volume id:240 size:424791528 collection:"collection1" file_count:734 delete_count:12 deleted_byte_count:7353071 replica_placement:100 version:3 modified_at_second:1615631669 + volume id:242 size:1075383304 collection:"collection2" file_count:10470 replica_placement:100 version:3 modified_at_second:1614852115 + volume id:243 size:1088174560 collection:"collection2" file_count:11109 delete_count:1 deleted_byte_count:938 replica_placement:100 version:3 modified_at_second:1614852202 + volume id:245 size:1074597056 collection:"collection2" file_count:10371 delete_count:3 deleted_byte_count:209701 replica_placement:100 version:3 modified_at_second:1614852093 + volume id:247 size:1075859784 collection:"collection2" file_count:10443 delete_count:2 deleted_byte_count:564486 replica_placement:100 version:3 modified_at_second:1614856152 + volume id:249 size:1074819168 collection:"collection2" file_count:10763 delete_count:2 deleted_byte_count:271699 replica_placement:100 version:3 modified_at_second:1614856231 + volume id:250 size:1080572256 collection:"collection2" file_count:10220 replica_placement:100 version:3 modified_at_second:1614856129 + volume id:251 size:1075684408 collection:"collection2" file_count:10847 replica_placement:100 version:3 modified_at_second:1614856270 + volume id:254 size:1074830800 collection:"collection2" file_count:14140 delete_count:2 deleted_byte_count:105892 replica_placement:100 version:3 modified_at_second:1614861115 + volume id:257 size:1082621664 collection:"collection2" file_count:18172 delete_count:2 deleted_byte_count:25125 replica_placement:100 version:3 modified_at_second:1614866395 + volume id:260 size:1075105664 collection:"collection2" file_count:17316 delete_count:4 deleted_byte_count:2015310 replica_placement:100 version:3 modified_at_second:1614866226 + volume id:261 size:1076628592 collection:"collection2" file_count:18355 delete_count:1 deleted_byte_count:1155 replica_placement:100 version:3 modified_at_second:1614866420 + volume id:262 size:1078492464 collection:"collection2" file_count:20390 delete_count:3 deleted_byte_count:287601 replica_placement:100 version:3 modified_at_second:1614871601 + volume id:263 size:1077167440 collection:"collection2" file_count:20227 delete_count:4 deleted_byte_count:97887 replica_placement:100 version:3 modified_at_second:1614871567 + volume id:268 size:1074490592 collection:"collection2" file_count:21698 delete_count:1 deleted_byte_count:33968 replica_placement:100 version:3 modified_at_second:1614877435 + volume id:269 size:1077552720 collection:"collection2" file_count:21875 delete_count:4 deleted_byte_count:347272 replica_placement:100 version:3 modified_at_second:1614877481 + volume id:271 size:1076992648 collection:"collection2" file_count:22640 delete_count:1 deleted_byte_count:30645 replica_placement:100 version:3 modified_at_second:1614877504 + volume id:273 size:1074873432 collection:"collection2" file_count:20511 delete_count:3 deleted_byte_count:46076 replica_placement:100 version:3 modified_at_second:1614884046 + volume id:274 size:1075994128 collection:"collection2" file_count:20997 replica_placement:100 version:3 modified_at_second:1614884113 + volume id:276 size:1076899888 collection:"collection2" file_count:20190 delete_count:1 deleted_byte_count:8798 replica_placement:100 version:3 modified_at_second:1614884003 + volume id:277 size:1074956160 collection:"collection2" file_count:19260 delete_count:2 deleted_byte_count:172356 replica_placement:100 version:3 modified_at_second:1614889988 + volume id:279 size:1077325096 collection:"collection2" file_count:19671 delete_count:6 deleted_byte_count:379116 replica_placement:100 version:3 modified_at_second:1614890230 + volume id:282 size:1075232240 collection:"collection2" file_count:22659 delete_count:4 deleted_byte_count:67915 replica_placement:100 version:3 modified_at_second:1614897304 + volume id:284 size:1074533384 collection:"collection2" file_count:22196 delete_count:4 deleted_byte_count:154683 replica_placement:100 version:3 modified_at_second:1614897231 + volume id:285 size:1082128576 collection:"collection2" file_count:21804 delete_count:1 deleted_byte_count:1064 replica_placement:100 version:3 modified_at_second:1614897165 + volume id:286 size:1077464824 collection:"collection2" file_count:23905 delete_count:6 deleted_byte_count:630577 replica_placement:100 version:3 modified_at_second:1614897401 + volume id:287 size:1074590528 collection:"collection2" file_count:28163 delete_count:5 deleted_byte_count:35727 replica_placement:100 version:3 modified_at_second:1614904874 + volume id:288 size:1075406800 collection:"collection2" file_count:27243 delete_count:2 deleted_byte_count:51519 replica_placement:100 version:3 modified_at_second:1614904738 + volume id:292 size:1092010744 collection:"collection2" file_count:26781 delete_count:5 deleted_byte_count:508910 replica_placement:100 version:3 modified_at_second:1614912327 + volume id:293 size:1075409776 collection:"collection2" file_count:26063 delete_count:4 deleted_byte_count:183834 replica_placement:100 version:3 modified_at_second:1614912235 + volume id:294 size:1075443992 collection:"collection2" file_count:26076 delete_count:4 deleted_byte_count:194914 replica_placement:100 version:3 modified_at_second:1614912220 + volume id:295 size:1074702376 collection:"collection2" file_count:24488 delete_count:3 deleted_byte_count:48555 replica_placement:100 version:3 modified_at_second:1614911929 + volume id:300 size:1076212424 collection:"collection2" file_count:22892 delete_count:2 deleted_byte_count:61320 replica_placement:100 version:3 modified_at_second:1614918464 + volume id:304 size:1081038888 collection:"collection2" file_count:24505 delete_count:2 deleted_byte_count:124447 replica_placement:100 version:3 modified_at_second:1614925567 + volume id:305 size:1074185552 collection:"collection2" file_count:22074 delete_count:5 deleted_byte_count:20221 replica_placement:100 version:3 modified_at_second:1614925312 + volume id:310 size:1074761520 collection:"collection2" file_count:21441 delete_count:3 deleted_byte_count:13934 replica_placement:100 version:3 modified_at_second:1614931077 + volume id:311 size:1088248208 collection:"collection2" file_count:23553 delete_count:6 deleted_byte_count:191716 replica_placement:100 version:3 modified_at_second:1614931460 + volume id:312 size:1075037808 collection:"collection2" file_count:22524 replica_placement:100 version:3 modified_at_second:1614937832 + volume id:313 size:1074876016 collection:"collection2" file_count:22404 delete_count:4 deleted_byte_count:51728 replica_placement:100 version:3 modified_at_second:1614937755 + volume id:314 size:1074670840 collection:"collection2" file_count:20964 delete_count:4 deleted_byte_count:304291 replica_placement:100 version:3 modified_at_second:1614937441 + volume id:315 size:1084153456 collection:"collection2" file_count:23638 delete_count:2 deleted_byte_count:53956 replica_placement:100 version:3 modified_at_second:1614937884 + volume id:316 size:1077720784 collection:"collection2" file_count:22605 delete_count:1 deleted_byte_count:8503 replica_placement:100 version:3 modified_at_second:1614937838 + volume id:317 size:1076215040 collection:"collection2" file_count:23572 delete_count:2 deleted_byte_count:1441356 replica_placement:100 version:3 modified_at_second:1614943965 + volume id:319 size:1073952744 collection:"collection2" file_count:22286 delete_count:2 deleted_byte_count:43421 replica_placement:100 version:3 modified_at_second:1614943810 + volume id:320 size:1082437736 collection:"collection2" file_count:21544 delete_count:3 deleted_byte_count:16712 replica_placement:100 version:3 modified_at_second:1614943591 + volume id:321 size:1081477960 collection:"collection2" file_count:23531 delete_count:5 deleted_byte_count:262564 replica_placement:100 version:3 modified_at_second:1614943982 + volume id:322 size:1078471600 collection:"collection2" file_count:21905 delete_count:3 deleted_byte_count:145002 replica_placement:100 version:3 modified_at_second:1614950574 + volume id:324 size:1075606712 collection:"collection2" file_count:20799 delete_count:1 deleted_byte_count:251210 replica_placement:100 version:3 modified_at_second:1614950310 + volume id:326 size:1076059936 collection:"collection2" file_count:22564 delete_count:2 deleted_byte_count:192886 replica_placement:100 version:3 modified_at_second:1614950619 + volume id:327 size:1076121224 collection:"collection2" file_count:22007 delete_count:3 deleted_byte_count:60358 replica_placement:100 version:3 modified_at_second:1614956487 + volume id:328 size:1074767928 collection:"collection2" file_count:21720 delete_count:3 deleted_byte_count:56429 replica_placement:100 version:3 modified_at_second:1614956362 + volume id:329 size:1076691776 collection:"collection2" file_count:22411 delete_count:5 deleted_byte_count:214092 replica_placement:100 version:3 modified_at_second:1614956485 + volume id:331 size:1074957192 collection:"collection2" file_count:21230 delete_count:4 deleted_byte_count:62145 replica_placement:100 version:3 modified_at_second:1614956259 + volume id:333 size:1074270192 collection:"collection2" file_count:21271 delete_count:2 deleted_byte_count:168122 replica_placement:100 version:3 modified_at_second:1614962697 + volume id:335 size:1076235176 collection:"collection2" file_count:22391 delete_count:3 deleted_byte_count:8838 replica_placement:100 version:3 modified_at_second:1614962970 + volume id:336 size:1087853032 collection:"collection2" file_count:22801 delete_count:2 deleted_byte_count:26394 replica_placement:100 version:3 modified_at_second:1614963003 + volume id:338 size:1076118360 collection:"collection2" file_count:21680 replica_placement:100 version:3 modified_at_second:1614969850 + volume id:342 size:1080186296 collection:"collection2" file_count:22405 delete_count:4 deleted_byte_count:64819 replica_placement:100 version:3 modified_at_second:1614977518 + volume id:343 size:1075345184 collection:"collection2" file_count:21095 delete_count:2 deleted_byte_count:20581 replica_placement:100 version:3 modified_at_second:1614977148 + volume id:349 size:1075957824 collection:"collection2" file_count:22395 delete_count:2 deleted_byte_count:61565 replica_placement:100 version:3 modified_at_second:1614984748 + volume id:350 size:1074756688 collection:"collection2" file_count:21990 delete_count:3 deleted_byte_count:233881 replica_placement:100 version:3 modified_at_second:1614984682 + volume id:354 size:1085213992 collection:"collection2" file_count:23150 delete_count:4 deleted_byte_count:82391 replica_placement:100 version:3 modified_at_second:1614992207 + volume id:356 size:1083304992 collection:"collection2" file_count:21552 delete_count:4 deleted_byte_count:14472 replica_placement:100 version:3 modified_at_second:1614992027 + volume id:358 size:1085152312 collection:"collection2" file_count:23756 delete_count:3 deleted_byte_count:44531 replica_placement:100 version:3 modified_at_second:1614998824 + volume id:359 size:1074211240 collection:"collection2" file_count:22437 delete_count:2 deleted_byte_count:187953 replica_placement:100 version:3 modified_at_second:1614998711 + volume id:362 size:1074074120 collection:"collection2" file_count:20595 delete_count:1 deleted_byte_count:112145 replica_placement:100 version:3 modified_at_second:1615004407 + volume id:363 size:1078859496 collection:"collection2" file_count:23177 delete_count:4 deleted_byte_count:9601 replica_placement:100 version:3 modified_at_second:1615004822 + volume id:364 size:1081280816 collection:"collection2" file_count:22686 delete_count:1 deleted_byte_count:84375 replica_placement:100 version:3 modified_at_second:1615004813 + volume id:365 size:1075736632 collection:"collection2" file_count:22193 delete_count:5 deleted_byte_count:259033 replica_placement:100 version:3 modified_at_second:1615004776 + volume id:366 size:1075267272 collection:"collection2" file_count:21856 delete_count:5 deleted_byte_count:138363 replica_placement:100 version:3 modified_at_second:1615004703 + volume id:367 size:1076403648 collection:"collection2" file_count:22995 delete_count:2 deleted_byte_count:36955 replica_placement:100 version:3 modified_at_second:1615010985 + volume id:368 size:1074822016 collection:"collection2" file_count:22252 delete_count:4 deleted_byte_count:3291946 replica_placement:100 version:3 modified_at_second:1615010878 + volume id:369 size:1091472040 collection:"collection2" file_count:23709 delete_count:4 deleted_byte_count:400876 replica_placement:100 version:3 modified_at_second:1615011019 + volume id:370 size:1076040480 collection:"collection2" file_count:22092 delete_count:2 deleted_byte_count:115388 replica_placement:100 version:3 modified_at_second:1615010877 + volume id:371 size:1078806160 collection:"collection2" file_count:22685 delete_count:2 deleted_byte_count:68905 replica_placement:100 version:3 modified_at_second:1615010994 + volume id:372 size:1076193312 collection:"collection2" file_count:22774 delete_count:1 deleted_byte_count:3495 replica_placement:100 version:3 modified_at_second:1615016911 + volume id:374 size:1085011080 collection:"collection2" file_count:23054 delete_count:2 deleted_byte_count:89034 replica_placement:100 version:3 modified_at_second:1615016917 + volume id:375 size:1076140688 collection:"collection2" file_count:21880 delete_count:2 deleted_byte_count:51103 replica_placement:100 version:3 modified_at_second:1615016787 + volume id:378 size:959273824 collection:"collection2" file_count:15031 replica_placement:100 version:3 modified_at_second:1615632323 + volume id:379 size:1014108592 collection:"collection2" file_count:15360 delete_count:8 deleted_byte_count:2524591 replica_placement:100 version:3 modified_at_second:1615632323 + volume id:380 size:1010760464 collection:"collection2" file_count:14920 delete_count:7 deleted_byte_count:134859 replica_placement:100 version:3 modified_at_second:1615632322 + Disk hdd total size:274627838960 file_count:3607097 deleted_file:13594 deleted_bytes:4185524457 + DataNode 192.168.1.1:8080 total size:274627838960 file_count:3607097 deleted_file:13594 deleted_bytes:4185524457 + Rack DefaultRack total size:274627838960 file_count:3607097 deleted_file:13594 deleted_bytes:4185524457 + DataCenter dc4 total size:274627838960 file_count:3607097 deleted_file:13594 deleted_bytes:4185524457 + DataCenter dc5 hdd(volume:299/3000 active:299 free:2701 remote:0) + Rack DefaultRack hdd(volume:299/3000 active:299 free:2701 remote:0) + DataNode 192.168.1.5:8080 hdd(volume:299/3000 active:299 free:2701 remote:0) + Disk hdd(volume:299/3000 active:299 free:2701 remote:0) + volume id:5 size:293806008 file_count:1669 delete_count:2 deleted_byte_count:274334 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631342 + volume id:11 size:1109224552 collection:"collection0" file_count:44 replica_placement:100 version:3 modified_at_second:1615629606 + volume id:18 size:1096678688 collection:"collection0" file_count:88 delete_count:4 deleted_byte_count:8633 replica_placement:100 version:3 modified_at_second:1615631673 + volume id:19 size:1096923792 collection:"collection0" file_count:100 delete_count:10 deleted_byte_count:75779917 replica_placement:100 version:3 compact_revision:4 modified_at_second:1615630117 + volume id:20 size:1074760432 collection:"collection0" file_count:82 delete_count:5 deleted_byte_count:12156 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615629340 + volume id:26 size:532657632 collection:"collection0" file_count:100 delete_count:4 deleted_byte_count:9081 replica_placement:100 version:3 modified_at_second:1614170024 + volume id:27 size:298886792 file_count:1608 replica_placement:100 version:3 modified_at_second:1615632482 + volume id:28 size:308919192 file_count:1591 delete_count:1 deleted_byte_count:125280 replica_placement:100 version:3 modified_at_second:1615631762 + volume id:29 size:281582688 file_count:1537 replica_placement:100 version:3 modified_at_second:1615629422 + volume id:30 size:289466144 file_count:1566 delete_count:1 deleted_byte_count:124972 replica_placement:100 version:3 modified_at_second:1615632422 + volume id:31 size:273363256 file_count:1498 replica_placement:100 version:3 modified_at_second:1615631642 + volume id:32 size:281343360 file_count:1497 replica_placement:100 version:3 modified_at_second:1615632362 + volume id:33 size:1130226344 collection:"collection1" file_count:7322 delete_count:172 deleted_byte_count:45199399 replica_placement:100 version:3 modified_at_second:1615618789 + volume id:34 size:1077111136 collection:"collection1" file_count:9781 delete_count:110 deleted_byte_count:20894827 replica_placement:100 version:3 modified_at_second:1615619366 + volume id:35 size:1075241744 collection:"collection1" file_count:10523 delete_count:97 deleted_byte_count:46586217 replica_placement:100 version:3 modified_at_second:1615618790 + volume id:36 size:1075118336 collection:"collection1" file_count:10341 delete_count:118 deleted_byte_count:24753278 replica_placement:100 version:3 modified_at_second:1615606148 + volume id:37 size:1075895576 collection:"collection1" file_count:12013 delete_count:98 deleted_byte_count:50747932 replica_placement:100 version:3 modified_at_second:1615594776 + volume id:38 size:1075545744 collection:"collection1" file_count:13324 delete_count:100 deleted_byte_count:25223906 replica_placement:100 version:3 modified_at_second:1615569830 + volume id:39 size:1076606536 collection:"collection1" file_count:12612 delete_count:78 deleted_byte_count:17462730 replica_placement:100 version:3 modified_at_second:1615611959 + volume id:40 size:1075358552 collection:"collection1" file_count:12597 delete_count:62 deleted_byte_count:11657901 replica_placement:100 version:3 modified_at_second:1615612994 + volume id:41 size:1076283592 collection:"collection1" file_count:12088 delete_count:84 deleted_byte_count:19311237 replica_placement:100 version:3 modified_at_second:1615596736 + volume id:42 size:1093948352 collection:"collection1" file_count:7889 delete_count:47 deleted_byte_count:5697275 replica_placement:100 version:3 modified_at_second:1615548906 + volume id:43 size:1116445864 collection:"collection1" file_count:7355 delete_count:57 deleted_byte_count:9727158 replica_placement:100 version:3 modified_at_second:1615566167 + volume id:44 size:1077582560 collection:"collection1" file_count:7295 delete_count:50 deleted_byte_count:12618414 replica_placement:100 version:3 modified_at_second:1615566170 + volume id:45 size:1075254640 collection:"collection1" file_count:10772 delete_count:76 deleted_byte_count:22426345 replica_placement:100 version:3 modified_at_second:1615573498 + volume id:46 size:1075286056 collection:"collection1" file_count:9947 delete_count:309 deleted_byte_count:105601163 replica_placement:100 version:3 modified_at_second:1615569825 + volume id:47 size:444599784 collection:"collection1" file_count:709 delete_count:19 deleted_byte_count:11913451 replica_placement:100 version:3 modified_at_second:1615632397 + volume id:48 size:1076778664 collection:"collection1" file_count:9850 delete_count:77 deleted_byte_count:16641907 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630690 + volume id:49 size:1078775288 collection:"collection1" file_count:9631 delete_count:27 deleted_byte_count:5985628 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615575823 + volume id:50 size:1076688288 collection:"collection1" file_count:7921 delete_count:26 deleted_byte_count:5162032 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615610876 + volume id:51 size:1076796120 collection:"collection1" file_count:10550 delete_count:39 deleted_byte_count:12723654 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615547786 + volume id:53 size:1063089216 collection:"collection1" file_count:9832 delete_count:31 deleted_byte_count:9273066 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632156 + volume id:54 size:1045022288 collection:"collection1" file_count:9409 delete_count:29 deleted_byte_count:15102818 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630813 + volume id:55 size:1012890016 collection:"collection1" file_count:8651 delete_count:27 deleted_byte_count:9418841 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631453 + volume id:56 size:1002412240 collection:"collection1" file_count:8762 delete_count:40 deleted_byte_count:65885831 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615632014 + volume id:57 size:839849792 collection:"collection1" file_count:7514 delete_count:24 deleted_byte_count:6228543 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631775 + volume id:58 size:908064192 collection:"collection1" file_count:8128 delete_count:21 deleted_byte_count:6113731 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632343 + volume id:59 size:988302272 collection:"collection1" file_count:8098 delete_count:20 deleted_byte_count:3947615 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632238 + volume id:60 size:1010702480 collection:"collection1" file_count:8969 delete_count:79 deleted_byte_count:24782814 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615632439 + volume id:61 size:975604544 collection:"collection1" file_count:8683 delete_count:20 deleted_byte_count:10276072 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615631176 + volume id:62 size:873845904 collection:"collection1" file_count:7897 delete_count:23 deleted_byte_count:10920170 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631133 + volume id:63 size:956941176 collection:"collection1" file_count:8271 delete_count:32 deleted_byte_count:15876189 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632036 + volume id:64 size:965638424 collection:"collection1" file_count:8218 delete_count:27 deleted_byte_count:6922489 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631032 + volume id:65 size:823283608 collection:"collection1" file_count:7834 delete_count:29 deleted_byte_count:5950610 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632307 + volume id:66 size:821343440 collection:"collection1" file_count:7383 delete_count:29 deleted_byte_count:12010343 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631968 + volume id:67 size:878713880 collection:"collection1" file_count:7299 delete_count:117 deleted_byte_count:24857326 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632156 + volume id:69 size:863913896 collection:"collection1" file_count:7291 delete_count:100 deleted_byte_count:25335024 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630534 + volume id:70 size:886695472 collection:"collection1" file_count:7769 delete_count:164 deleted_byte_count:45162513 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632398 + volume id:71 size:907608392 collection:"collection1" file_count:7658 delete_count:122 deleted_byte_count:27622941 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632307 + volume id:72 size:903990720 collection:"collection1" file_count:6996 delete_count:240 deleted_byte_count:74147727 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630985 + volume id:73 size:929047544 collection:"collection1" file_count:7038 delete_count:227 deleted_byte_count:65336664 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630707 + volume id:75 size:908045000 collection:"collection1" file_count:6911 delete_count:268 deleted_byte_count:73934373 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632430 + volume id:76 size:985296744 collection:"collection1" file_count:6566 delete_count:61 deleted_byte_count:44464430 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632284 + volume id:77 size:929398296 collection:"collection1" file_count:7427 delete_count:238 deleted_byte_count:59581579 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632014 + volume id:78 size:1075671512 collection:"collection1" file_count:7540 delete_count:258 deleted_byte_count:71726846 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615582829 + volume id:79 size:948225472 collection:"collection1" file_count:6997 delete_count:227 deleted_byte_count:60625763 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631326 + volume id:80 size:827912928 collection:"collection1" file_count:6916 delete_count:15 deleted_byte_count:5611604 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615631159 + volume id:81 size:880693168 collection:"collection1" file_count:7481 delete_count:238 deleted_byte_count:80880878 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615631395 + volume id:82 size:1041660512 collection:"collection1" file_count:7043 delete_count:207 deleted_byte_count:52275724 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632430 + volume id:83 size:936194288 collection:"collection1" file_count:7593 delete_count:13 deleted_byte_count:4633917 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632029 + volume id:84 size:871262320 collection:"collection1" file_count:8190 delete_count:14 deleted_byte_count:3150948 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631161 + volume id:86 size:1009434632 collection:"collection1" file_count:8474 delete_count:236 deleted_byte_count:64543674 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630812 + volume id:87 size:922274624 collection:"collection1" file_count:12902 delete_count:13 deleted_byte_count:3412959 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615632438 + volume id:88 size:1073767976 collection:"collection1" file_count:14994 delete_count:207 deleted_byte_count:82380696 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615541383 + volume id:89 size:1044421824 collection:"collection1" file_count:14943 delete_count:243 deleted_byte_count:58543159 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615632208 + volume id:90 size:891163760 collection:"collection1" file_count:14608 delete_count:10 deleted_byte_count:2564369 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615629392 + volume id:91 size:936573952 collection:"collection1" file_count:14686 delete_count:11 deleted_byte_count:4717727 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631851 + volume id:92 size:992439144 collection:"collection1" file_count:7061 delete_count:195 deleted_byte_count:60649573 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630566 + volume id:93 size:1079602592 collection:"collection1" file_count:7878 delete_count:270 deleted_byte_count:74150048 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615556013 + volume id:94 size:1030684704 collection:"collection1" file_count:7660 delete_count:207 deleted_byte_count:70150733 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631616 + volume id:95 size:990877824 collection:"collection1" file_count:6620 delete_count:206 deleted_byte_count:60363604 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615631867 + volume id:96 size:989294848 collection:"collection1" file_count:7544 delete_count:229 deleted_byte_count:59931853 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630778 + volume id:98 size:1077836472 collection:"collection1" file_count:7605 delete_count:202 deleted_byte_count:73180379 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615523691 + volume id:99 size:1071718496 collection:"collection1" file_count:7470 delete_count:8 deleted_byte_count:9624950 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615631175 + volume id:100 size:1083617472 collection:"collection1" file_count:7018 delete_count:187 deleted_byte_count:61304236 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615505914 + volume id:101 size:1077109408 collection:"collection1" file_count:7706 delete_count:226 deleted_byte_count:77864780 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615630994 + volume id:102 size:1074359920 collection:"collection1" file_count:7338 delete_count:7 deleted_byte_count:6499151 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615626682 + volume id:103 size:1075863904 collection:"collection1" file_count:7184 delete_count:186 deleted_byte_count:58872238 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615628417 + volume id:106 size:1075458680 collection:"collection1" file_count:7182 delete_count:307 deleted_byte_count:69349053 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615598137 + volume id:107 size:1073811776 collection:"collection1" file_count:7436 delete_count:168 deleted_byte_count:57747428 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615293569 + volume id:108 size:1074648024 collection:"collection1" file_count:7472 delete_count:194 deleted_byte_count:70864699 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615593231 + volume id:109 size:1075254560 collection:"collection1" file_count:7556 delete_count:263 deleted_byte_count:55155265 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615502487 + volume id:110 size:1076575744 collection:"collection1" file_count:6996 delete_count:163 deleted_byte_count:52954032 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615590786 + volume id:111 size:1073826176 collection:"collection1" file_count:7355 delete_count:155 deleted_byte_count:50083578 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615593232 + volume id:112 size:1076392512 collection:"collection1" file_count:8291 delete_count:156 deleted_byte_count:74120183 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615569823 + volume id:113 size:1076709184 collection:"collection1" file_count:9355 delete_count:177 deleted_byte_count:59796765 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615569822 + volume id:114 size:1074762792 collection:"collection1" file_count:8802 delete_count:156 deleted_byte_count:38470055 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615591826 + volume id:115 size:1076192296 collection:"collection1" file_count:7690 delete_count:154 deleted_byte_count:32267193 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615285296 + volume id:117 size:1073917192 collection:"collection1" file_count:9520 delete_count:114 deleted_byte_count:21835126 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615573712 + volume id:118 size:1074064344 collection:"collection1" file_count:8738 delete_count:15 deleted_byte_count:3460697 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615516264 + volume id:120 size:1076115928 collection:"collection1" file_count:9639 delete_count:118 deleted_byte_count:33357871 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615482567 + volume id:121 size:1078803320 collection:"collection1" file_count:10113 delete_count:441 deleted_byte_count:94128627 replica_placement:100 version:3 modified_at_second:1615506626 + volume id:122 size:1076235312 collection:"collection1" file_count:9106 delete_count:252 deleted_byte_count:93041272 replica_placement:100 version:3 modified_at_second:1615585912 + volume id:123 size:1080491112 collection:"collection1" file_count:10623 delete_count:302 deleted_byte_count:83956998 replica_placement:100 version:3 modified_at_second:1615585916 + volume id:124 size:1074519360 collection:"collection1" file_count:9457 delete_count:286 deleted_byte_count:74752459 replica_placement:100 version:3 modified_at_second:1615585913 + volume id:125 size:1088687040 collection:"collection1" file_count:9518 delete_count:281 deleted_byte_count:76037905 replica_placement:100 version:3 modified_at_second:1615585913 + volume id:126 size:1073867408 collection:"collection1" file_count:9320 delete_count:278 deleted_byte_count:94547424 replica_placement:100 version:3 modified_at_second:1615585911 + volume id:127 size:1074907336 collection:"collection1" file_count:9900 delete_count:133 deleted_byte_count:48570820 replica_placement:100 version:3 modified_at_second:1615612990 + volume id:128 size:1074874632 collection:"collection1" file_count:9821 delete_count:148 deleted_byte_count:43633334 replica_placement:100 version:3 modified_at_second:1615602670 + volume id:129 size:1074704328 collection:"collection1" file_count:10012 delete_count:150 deleted_byte_count:64491721 replica_placement:100 version:3 modified_at_second:1615627566 + volume id:130 size:1075000632 collection:"collection1" file_count:10633 delete_count:161 deleted_byte_count:34768201 replica_placement:100 version:3 modified_at_second:1615582327 + volume id:131 size:1075279584 collection:"collection1" file_count:10075 delete_count:135 deleted_byte_count:29795712 replica_placement:100 version:3 modified_at_second:1615523898 + volume id:132 size:1088539552 collection:"collection1" file_count:11051 delete_count:71 deleted_byte_count:17178322 replica_placement:100 version:3 modified_at_second:1615619581 + volume id:134 size:1074367304 collection:"collection1" file_count:10662 delete_count:69 deleted_byte_count:25530139 replica_placement:100 version:3 modified_at_second:1615555873 + volume id:135 size:1073906776 collection:"collection1" file_count:10446 delete_count:71 deleted_byte_count:28599975 replica_placement:100 version:3 modified_at_second:1615569816 + volume id:136 size:1074433552 collection:"collection1" file_count:9593 delete_count:72 deleted_byte_count:26912512 replica_placement:100 version:3 modified_at_second:1615376036 + volume id:137 size:1074309264 collection:"collection1" file_count:9633 delete_count:50 deleted_byte_count:27487972 replica_placement:100 version:3 modified_at_second:1615572231 + volume id:138 size:1074465744 collection:"collection1" file_count:10120 delete_count:55 deleted_byte_count:15875438 replica_placement:100 version:3 modified_at_second:1615572231 + volume id:140 size:1076203744 collection:"collection1" file_count:11219 delete_count:57 deleted_byte_count:19864498 replica_placement:100 version:3 modified_at_second:1615571947 + volume id:141 size:1074619488 collection:"collection1" file_count:9840 delete_count:45 deleted_byte_count:40890181 replica_placement:100 version:3 modified_at_second:1615630994 + volume id:142 size:1075733064 collection:"collection1" file_count:9009 delete_count:48 deleted_byte_count:9912854 replica_placement:100 version:3 modified_at_second:1615598913 + volume id:143 size:1075011280 collection:"collection1" file_count:9608 delete_count:51 deleted_byte_count:37282460 replica_placement:100 version:3 modified_at_second:1615488584 + volume id:144 size:1074549720 collection:"collection1" file_count:8780 delete_count:50 deleted_byte_count:52475146 replica_placement:100 version:3 modified_at_second:1615573451 + volume id:145 size:1074394928 collection:"collection1" file_count:9255 delete_count:34 deleted_byte_count:38011392 replica_placement:100 version:3 modified_at_second:1615591825 + volume id:146 size:1076337576 collection:"collection1" file_count:10492 delete_count:50 deleted_byte_count:17071505 replica_placement:100 version:3 modified_at_second:1615632005 + volume id:147 size:1077130576 collection:"collection1" file_count:10451 delete_count:27 deleted_byte_count:8290907 replica_placement:100 version:3 modified_at_second:1615604115 + volume id:148 size:1076066568 collection:"collection1" file_count:9547 delete_count:33 deleted_byte_count:7034089 replica_placement:100 version:3 modified_at_second:1615586390 + volume id:149 size:1074989016 collection:"collection1" file_count:8352 delete_count:35 deleted_byte_count:7179742 replica_placement:100 version:3 modified_at_second:1615494494 + volume id:150 size:1076290328 collection:"collection1" file_count:9328 delete_count:33 deleted_byte_count:43417791 replica_placement:100 version:3 modified_at_second:1615611567 + volume id:152 size:1075941400 collection:"collection1" file_count:9951 delete_count:36 deleted_byte_count:25348335 replica_placement:100 version:3 modified_at_second:1615606614 + volume id:153 size:1078539784 collection:"collection1" file_count:10924 delete_count:34 deleted_byte_count:12603081 replica_placement:100 version:3 modified_at_second:1615606614 + volume id:154 size:1081244696 collection:"collection1" file_count:11002 delete_count:31 deleted_byte_count:8467560 replica_placement:100 version:3 modified_at_second:1615478469 + volume id:155 size:1075140688 collection:"collection1" file_count:10882 delete_count:32 deleted_byte_count:10076804 replica_placement:100 version:3 modified_at_second:1615606614 + volume id:156 size:1074975832 collection:"collection1" file_count:9535 delete_count:40 deleted_byte_count:11426621 replica_placement:100 version:3 modified_at_second:1615628341 + volume id:157 size:1076758536 collection:"collection1" file_count:10012 delete_count:19 deleted_byte_count:11688737 replica_placement:100 version:3 modified_at_second:1615597782 + volume id:158 size:1087251976 collection:"collection1" file_count:9972 delete_count:20 deleted_byte_count:10328429 replica_placement:100 version:3 modified_at_second:1615588879 + volume id:159 size:1074132368 collection:"collection1" file_count:9382 delete_count:27 deleted_byte_count:11474574 replica_placement:100 version:3 modified_at_second:1615593593 + volume id:160 size:1075680952 collection:"collection1" file_count:9772 delete_count:22 deleted_byte_count:4981968 replica_placement:100 version:3 modified_at_second:1615597780 + volume id:162 size:1074286880 collection:"collection1" file_count:11220 delete_count:17 deleted_byte_count:1815547 replica_placement:100 version:3 modified_at_second:1615478126 + volume id:163 size:1074457192 collection:"collection1" file_count:12524 delete_count:27 deleted_byte_count:6359619 replica_placement:100 version:3 modified_at_second:1615579313 + volume id:164 size:1074261248 collection:"collection1" file_count:11922 delete_count:25 deleted_byte_count:2923288 replica_placement:100 version:3 modified_at_second:1615620084 + volume id:165 size:1073891016 collection:"collection1" file_count:9152 delete_count:12 deleted_byte_count:19164659 replica_placement:100 version:3 modified_at_second:1615471907 + volume id:166 size:1075637536 collection:"collection1" file_count:14211 delete_count:24 deleted_byte_count:20415490 replica_placement:100 version:3 modified_at_second:1615491019 + volume id:168 size:1074718808 collection:"collection1" file_count:25702 delete_count:40 deleted_byte_count:4024775 replica_placement:100 version:3 modified_at_second:1615585664 + volume id:169 size:1073863128 collection:"collection1" file_count:25248 delete_count:43 deleted_byte_count:3013817 replica_placement:100 version:3 modified_at_second:1615569832 + volume id:170 size:1075747096 collection:"collection1" file_count:24596 delete_count:41 deleted_byte_count:3494711 replica_placement:100 version:3 modified_at_second:1615579204 + volume id:171 size:1081881312 collection:"collection1" file_count:24215 delete_count:36 deleted_byte_count:3191335 replica_placement:100 version:3 modified_at_second:1615596485 + volume id:172 size:1074787312 collection:"collection1" file_count:31236 delete_count:50 deleted_byte_count:3316482 replica_placement:100 version:3 modified_at_second:1615612385 + volume id:173 size:1074154648 collection:"collection1" file_count:30884 delete_count:34 deleted_byte_count:2430948 replica_placement:100 version:3 modified_at_second:1615591904 + volume id:175 size:1077742504 collection:"collection1" file_count:32353 delete_count:33 deleted_byte_count:1861403 replica_placement:100 version:3 modified_at_second:1615559515 + volume id:176 size:1073854800 collection:"collection1" file_count:30582 delete_count:34 deleted_byte_count:7701976 replica_placement:100 version:3 modified_at_second:1615626169 + volume id:177 size:1074120120 collection:"collection1" file_count:22293 delete_count:16 deleted_byte_count:3719562 replica_placement:100 version:3 modified_at_second:1615516891 + volume id:178 size:1087560112 collection:"collection1" file_count:23482 delete_count:22 deleted_byte_count:18810492 replica_placement:100 version:3 modified_at_second:1615541369 + volume id:180 size:1078438536 collection:"collection1" file_count:23614 delete_count:12 deleted_byte_count:4496474 replica_placement:100 version:3 modified_at_second:1614773242 + volume id:181 size:1074571768 collection:"collection1" file_count:22898 delete_count:19 deleted_byte_count:6628413 replica_placement:100 version:3 modified_at_second:1614745116 + volume id:182 size:1076131280 collection:"collection1" file_count:31987 delete_count:21 deleted_byte_count:1416142 replica_placement:100 version:3 modified_at_second:1615568922 + volume id:183 size:1076361448 collection:"collection1" file_count:31293 delete_count:16 deleted_byte_count:468841 replica_placement:100 version:3 modified_at_second:1615572982 + volume id:184 size:1074594160 collection:"collection1" file_count:31368 delete_count:22 deleted_byte_count:857453 replica_placement:100 version:3 modified_at_second:1615586578 + volume id:185 size:1074099624 collection:"collection1" file_count:30612 delete_count:17 deleted_byte_count:2610847 replica_placement:100 version:3 modified_at_second:1615506832 + volume id:186 size:1074220864 collection:"collection1" file_count:31450 delete_count:15 deleted_byte_count:391855 replica_placement:100 version:3 modified_at_second:1615614933 + volume id:187 size:1074395944 collection:"collection1" file_count:31853 delete_count:17 deleted_byte_count:454283 replica_placement:100 version:3 modified_at_second:1615590490 + volume id:188 size:1074732792 collection:"collection1" file_count:31867 delete_count:19 deleted_byte_count:393743 replica_placement:100 version:3 modified_at_second:1615487645 + volume id:189 size:1074847896 collection:"collection1" file_count:31450 delete_count:16 deleted_byte_count:1040552 replica_placement:100 version:3 modified_at_second:1615335661 + volume id:190 size:1074008912 collection:"collection1" file_count:31987 delete_count:11 deleted_byte_count:685125 replica_placement:100 version:3 modified_at_second:1615447161 + volume id:191 size:1075493024 collection:"collection1" file_count:31301 delete_count:19 deleted_byte_count:708401 replica_placement:100 version:3 modified_at_second:1615357456 + volume id:192 size:1075857400 collection:"collection1" file_count:31490 delete_count:25 deleted_byte_count:720617 replica_placement:100 version:3 modified_at_second:1615621632 + volume id:193 size:1076616768 collection:"collection1" file_count:31907 delete_count:16 deleted_byte_count:464900 replica_placement:100 version:3 modified_at_second:1615507875 + volume id:194 size:1073985624 collection:"collection1" file_count:31434 delete_count:18 deleted_byte_count:391432 replica_placement:100 version:3 modified_at_second:1615559499 + volume id:195 size:1074158312 collection:"collection1" file_count:31453 delete_count:15 deleted_byte_count:718266 replica_placement:100 version:3 modified_at_second:1615559331 + volume id:196 size:1074594784 collection:"collection1" file_count:31665 delete_count:18 deleted_byte_count:3468922 replica_placement:100 version:3 modified_at_second:1615501688 + volume id:197 size:1075423296 collection:"collection1" file_count:16473 delete_count:15 deleted_byte_count:12552442 replica_placement:100 version:3 modified_at_second:1615485253 + volume id:198 size:1075104712 collection:"collection1" file_count:16577 delete_count:18 deleted_byte_count:6583181 replica_placement:100 version:3 modified_at_second:1615623369 + volume id:199 size:1078117688 collection:"collection1" file_count:16497 delete_count:14 deleted_byte_count:1514286 replica_placement:100 version:3 modified_at_second:1615585984 + volume id:200 size:1075630536 collection:"collection1" file_count:16380 delete_count:18 deleted_byte_count:1103109 replica_placement:100 version:3 modified_at_second:1615485252 + volume id:201 size:1091460440 collection:"collection1" file_count:16684 delete_count:26 deleted_byte_count:5590335 replica_placement:100 version:3 modified_at_second:1615585987 + volume id:202 size:1077533160 collection:"collection1" file_count:2847 delete_count:67 deleted_byte_count:65172985 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615588497 + volume id:203 size:1027316272 collection:"collection1" file_count:3040 delete_count:11 deleted_byte_count:3993230 replica_placement:100 version:3 compact_revision:3 modified_at_second:1615631728 + volume id:204 size:1079766872 collection:"collection1" file_count:3233 delete_count:255 deleted_byte_count:104707641 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615565701 + volume id:205 size:1078485304 collection:"collection1" file_count:2869 delete_count:43 deleted_byte_count:18290259 replica_placement:100 version:3 compact_revision:2 modified_at_second:1615579314 + volume id:206 size:1082045848 collection:"collection1" file_count:2979 delete_count:225 deleted_byte_count:88220074 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630989 + volume id:207 size:1081939960 collection:"collection1" file_count:3010 delete_count:4 deleted_byte_count:692350 replica_placement:100 version:3 modified_at_second:1615269061 + volume id:208 size:1077863624 collection:"collection1" file_count:3147 delete_count:6 deleted_byte_count:858726 replica_placement:100 version:3 modified_at_second:1615495515 + volume id:210 size:1094311304 collection:"collection1" file_count:3468 delete_count:4 deleted_byte_count:466433 replica_placement:100 version:3 modified_at_second:1615495515 + volume id:212 size:1078293448 collection:"collection1" file_count:3106 delete_count:6 deleted_byte_count:2085755 replica_placement:100 version:3 modified_at_second:1615586387 + volume id:213 size:1093588072 collection:"collection1" file_count:3681 delete_count:12 deleted_byte_count:3138791 replica_placement:100 version:3 modified_at_second:1615586387 + volume id:214 size:1074486992 collection:"collection1" file_count:3217 delete_count:10 deleted_byte_count:6392871 replica_placement:100 version:3 modified_at_second:1615586383 + volume id:215 size:1074798704 collection:"collection1" file_count:2819 delete_count:31 deleted_byte_count:10873569 replica_placement:100 version:3 modified_at_second:1615586386 + volume id:217 size:1075381872 collection:"collection1" file_count:3331 delete_count:14 deleted_byte_count:2009141 replica_placement:100 version:3 modified_at_second:1615401638 + volume id:218 size:1081263944 collection:"collection1" file_count:3433 delete_count:14 deleted_byte_count:3454237 replica_placement:100 version:3 modified_at_second:1615603637 + volume id:219 size:1092298816 collection:"collection1" file_count:3193 delete_count:17 deleted_byte_count:2047576 replica_placement:100 version:3 modified_at_second:1615579316 + volume id:220 size:1081928312 collection:"collection1" file_count:3166 delete_count:13 deleted_byte_count:4127709 replica_placement:100 version:3 modified_at_second:1615579317 + volume id:221 size:1106545456 collection:"collection1" file_count:3153 delete_count:11 deleted_byte_count:1496835 replica_placement:100 version:3 modified_at_second:1615269138 + volume id:222 size:1106623104 collection:"collection1" file_count:3273 delete_count:11 deleted_byte_count:2114627 replica_placement:100 version:3 modified_at_second:1615586243 + volume id:223 size:1075233064 collection:"collection1" file_count:2966 delete_count:9 deleted_byte_count:744001 replica_placement:100 version:3 modified_at_second:1615586244 + volume id:224 size:1093691520 collection:"collection1" file_count:3463 delete_count:10 deleted_byte_count:1128328 replica_placement:100 version:3 modified_at_second:1615601870 + volume id:225 size:1080698928 collection:"collection1" file_count:3115 delete_count:7 deleted_byte_count:18170416 replica_placement:100 version:3 modified_at_second:1615434684 + volume id:226 size:1103504768 collection:"collection1" file_count:2965 delete_count:10 deleted_byte_count:2639254 replica_placement:100 version:3 modified_at_second:1615601867 + volume id:228 size:1109784072 collection:"collection1" file_count:2504 delete_count:24 deleted_byte_count:5458950 replica_placement:100 version:3 modified_at_second:1615610489 + volume id:230 size:1080722984 collection:"collection1" file_count:2898 delete_count:15 deleted_byte_count:3929261 replica_placement:100 version:3 modified_at_second:1615610537 + volume id:232 size:1073901520 collection:"collection1" file_count:3004 delete_count:54 deleted_byte_count:10273081 replica_placement:100 version:3 modified_at_second:1615611351 + volume id:234 size:1073835280 collection:"collection1" file_count:2965 delete_count:41 deleted_byte_count:4960354 replica_placement:100 version:3 modified_at_second:1615611351 + volume id:235 size:1075586104 collection:"collection1" file_count:2767 delete_count:33 deleted_byte_count:3216540 replica_placement:100 version:3 modified_at_second:1615611354 + volume id:236 size:1089476136 collection:"collection1" file_count:3231 delete_count:53 deleted_byte_count:11625921 replica_placement:100 version:3 modified_at_second:1615611351 + volume id:237 size:375722792 collection:"collection1" file_count:736 delete_count:16 deleted_byte_count:4464870 replica_placement:100 version:3 modified_at_second:1615631727 + volume id:238 size:354320000 collection:"collection1" file_count:701 delete_count:17 deleted_byte_count:5940420 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615632030 + volume id:239 size:426569024 collection:"collection1" file_count:693 delete_count:19 deleted_byte_count:13020783 replica_placement:100 version:3 compact_revision:1 modified_at_second:1615630841 + volume id:240 size:424791528 collection:"collection1" file_count:733 delete_count:13 deleted_byte_count:7515220 replica_placement:100 version:3 modified_at_second:1615631670 + volume id:241 size:380217424 collection:"collection1" file_count:633 delete_count:6 deleted_byte_count:1715768 replica_placement:100 version:3 modified_at_second:1615632006 + volume id:242 size:1075383392 collection:"collection2" file_count:10470 replica_placement:100 version:3 modified_at_second:1614852116 + volume id:243 size:1088174704 collection:"collection2" file_count:11109 delete_count:1 deleted_byte_count:938 replica_placement:100 version:3 modified_at_second:1614852203 + volume id:244 size:1080295352 collection:"collection2" file_count:10812 delete_count:1 deleted_byte_count:795 replica_placement:100 version:3 modified_at_second:1615628825 + volume id:246 size:1075998672 collection:"collection2" file_count:10365 delete_count:1 deleted_byte_count:13112 replica_placement:100 version:3 modified_at_second:1614852106 + volume id:247 size:1075859808 collection:"collection2" file_count:10443 delete_count:2 deleted_byte_count:564486 replica_placement:100 version:3 modified_at_second:1614856152 + volume id:248 size:1084301208 collection:"collection2" file_count:11217 delete_count:4 deleted_byte_count:746488 replica_placement:100 version:3 modified_at_second:1614856285 + volume id:250 size:1080572168 collection:"collection2" file_count:10220 replica_placement:100 version:3 modified_at_second:1614856129 + volume id:252 size:1075065264 collection:"collection2" file_count:14622 delete_count:2 deleted_byte_count:5228 replica_placement:100 version:3 modified_at_second:1614861200 + volume id:253 size:1087328880 collection:"collection2" file_count:14920 delete_count:3 deleted_byte_count:522994 replica_placement:100 version:3 modified_at_second:1614861258 + volume id:254 size:1074830736 collection:"collection2" file_count:14140 delete_count:2 deleted_byte_count:105892 replica_placement:100 version:3 modified_at_second:1614861115 + volume id:255 size:1079581640 collection:"collection2" file_count:14877 delete_count:3 deleted_byte_count:101223 replica_placement:100 version:3 modified_at_second:1614861233 + volume id:256 size:1074283592 collection:"collection2" file_count:14157 delete_count:1 deleted_byte_count:18156 replica_placement:100 version:3 modified_at_second:1614861100 + volume id:257 size:1082621720 collection:"collection2" file_count:18172 delete_count:2 deleted_byte_count:25125 replica_placement:100 version:3 modified_at_second:1614866402 + volume id:258 size:1075527216 collection:"collection2" file_count:18421 delete_count:4 deleted_byte_count:267833 replica_placement:100 version:3 modified_at_second:1614866420 + volume id:259 size:1075507848 collection:"collection2" file_count:18079 delete_count:2 deleted_byte_count:71992 replica_placement:100 version:3 modified_at_second:1614866381 + volume id:260 size:1075105664 collection:"collection2" file_count:17316 delete_count:4 deleted_byte_count:2015310 replica_placement:100 version:3 modified_at_second:1614866226 + volume id:261 size:1076628592 collection:"collection2" file_count:18355 delete_count:1 deleted_byte_count:1155 replica_placement:100 version:3 modified_at_second:1614866420 + volume id:262 size:1078492584 collection:"collection2" file_count:20390 delete_count:3 deleted_byte_count:287601 replica_placement:100 version:3 modified_at_second:1614871601 + volume id:264 size:1081624192 collection:"collection2" file_count:21151 replica_placement:100 version:3 modified_at_second:1614871629 + volume id:265 size:1076401104 collection:"collection2" file_count:19932 delete_count:2 deleted_byte_count:160823 replica_placement:100 version:3 modified_at_second:1614871543 + volume id:266 size:1075617552 collection:"collection2" file_count:20075 delete_count:1 deleted_byte_count:1039 replica_placement:100 version:3 modified_at_second:1614871526 + volume id:267 size:1075699376 collection:"collection2" file_count:21039 delete_count:3 deleted_byte_count:59956 replica_placement:100 version:3 modified_at_second:1614877294 + volume id:270 size:1076876424 collection:"collection2" file_count:22057 delete_count:1 deleted_byte_count:43916 replica_placement:100 version:3 modified_at_second:1614877469 + volume id:271 size:1076992704 collection:"collection2" file_count:22640 delete_count:1 deleted_byte_count:30645 replica_placement:100 version:3 modified_at_second:1614877504 + volume id:272 size:1076145912 collection:"collection2" file_count:21034 delete_count:2 deleted_byte_count:216564 replica_placement:100 version:3 modified_at_second:1614884139 + volume id:273 size:1074873432 collection:"collection2" file_count:20511 delete_count:3 deleted_byte_count:46076 replica_placement:100 version:3 modified_at_second:1614884046 + volume id:274 size:1075994184 collection:"collection2" file_count:20997 replica_placement:100 version:3 modified_at_second:1614884113 + volume id:275 size:1078349024 collection:"collection2" file_count:20808 delete_count:1 deleted_byte_count:1118 replica_placement:100 version:3 modified_at_second:1614884147 + volume id:276 size:1076899880 collection:"collection2" file_count:20190 delete_count:1 deleted_byte_count:8798 replica_placement:100 version:3 modified_at_second:1614884003 + volume id:278 size:1078798632 collection:"collection2" file_count:20597 delete_count:5 deleted_byte_count:400060 replica_placement:100 version:3 modified_at_second:1614890292 + volume id:280 size:1077432160 collection:"collection2" file_count:20286 delete_count:1 deleted_byte_count:879 replica_placement:100 version:3 modified_at_second:1614890262 + volume id:281 size:1077581064 collection:"collection2" file_count:20206 delete_count:3 deleted_byte_count:143964 replica_placement:100 version:3 modified_at_second:1614890237 + volume id:282 size:1075232184 collection:"collection2" file_count:22659 delete_count:4 deleted_byte_count:67915 replica_placement:100 version:3 modified_at_second:1614897304 + volume id:283 size:1080178880 collection:"collection2" file_count:19462 delete_count:7 deleted_byte_count:660407 replica_placement:100 version:3 modified_at_second:1614896623 + volume id:286 size:1077464816 collection:"collection2" file_count:23905 delete_count:6 deleted_byte_count:630577 replica_placement:100 version:3 modified_at_second:1614897401 + volume id:287 size:1074590536 collection:"collection2" file_count:28163 delete_count:5 deleted_byte_count:35727 replica_placement:100 version:3 modified_at_second:1614904875 + volume id:288 size:1075406920 collection:"collection2" file_count:27243 delete_count:2 deleted_byte_count:51519 replica_placement:100 version:3 modified_at_second:1614904738 + volume id:289 size:1075284312 collection:"collection2" file_count:29342 delete_count:5 deleted_byte_count:100454 replica_placement:100 version:3 modified_at_second:1614904977 + volume id:290 size:1074723800 collection:"collection2" file_count:28340 delete_count:4 deleted_byte_count:199064 replica_placement:100 version:3 modified_at_second:1614904924 + volume id:292 size:1092010672 collection:"collection2" file_count:26781 delete_count:5 deleted_byte_count:508910 replica_placement:100 version:3 modified_at_second:1614912325 + volume id:295 size:1074702320 collection:"collection2" file_count:24488 delete_count:3 deleted_byte_count:48555 replica_placement:100 version:3 modified_at_second:1614911929 + volume id:296 size:1077824056 collection:"collection2" file_count:26741 delete_count:4 deleted_byte_count:199906 replica_placement:100 version:3 modified_at_second:1614912301 + volume id:297 size:1080229176 collection:"collection2" file_count:23409 delete_count:5 deleted_byte_count:46268 replica_placement:100 version:3 modified_at_second:1614918481 + volume id:298 size:1075410024 collection:"collection2" file_count:23222 delete_count:2 deleted_byte_count:46110 replica_placement:100 version:3 modified_at_second:1614918474 + volume id:302 size:1077559640 collection:"collection2" file_count:23124 delete_count:7 deleted_byte_count:293111 replica_placement:100 version:3 modified_at_second:1614925500 + volume id:304 size:1081038944 collection:"collection2" file_count:24505 delete_count:2 deleted_byte_count:124447 replica_placement:100 version:3 modified_at_second:1614925569 + volume id:305 size:1074185376 collection:"collection2" file_count:22074 delete_count:5 deleted_byte_count:20221 replica_placement:100 version:3 modified_at_second:1614925312 + volume id:306 size:1074763952 collection:"collection2" file_count:22939 replica_placement:100 version:3 modified_at_second:1614925462 + volume id:307 size:1076567912 collection:"collection2" file_count:23377 delete_count:2 deleted_byte_count:25453 replica_placement:100 version:3 modified_at_second:1614931448 + volume id:308 size:1074022336 collection:"collection2" file_count:23086 delete_count:2 deleted_byte_count:2127 replica_placement:100 version:3 modified_at_second:1614931401 + volume id:311 size:1088248344 collection:"collection2" file_count:23553 delete_count:6 deleted_byte_count:191716 replica_placement:100 version:3 modified_at_second:1614931463 + volume id:312 size:1075037528 collection:"collection2" file_count:22524 replica_placement:100 version:3 modified_at_second:1614937831 + volume id:313 size:1074875960 collection:"collection2" file_count:22404 delete_count:4 deleted_byte_count:51728 replica_placement:100 version:3 modified_at_second:1614937755 + volume id:316 size:1077720776 collection:"collection2" file_count:22605 delete_count:1 deleted_byte_count:8503 replica_placement:100 version:3 modified_at_second:1614937838 + volume id:318 size:1075965168 collection:"collection2" file_count:22459 delete_count:2 deleted_byte_count:37778 replica_placement:100 version:3 modified_at_second:1614943862 + volume id:322 size:1078471536 collection:"collection2" file_count:21905 delete_count:3 deleted_byte_count:145002 replica_placement:100 version:3 modified_at_second:1614950572 + volume id:323 size:1074608056 collection:"collection2" file_count:21605 delete_count:4 deleted_byte_count:172090 replica_placement:100 version:3 modified_at_second:1614950526 + volume id:325 size:1080701232 collection:"collection2" file_count:21735 replica_placement:100 version:3 modified_at_second:1614950525 + volume id:326 size:1076059920 collection:"collection2" file_count:22564 delete_count:2 deleted_byte_count:192886 replica_placement:100 version:3 modified_at_second:1614950619 + volume id:327 size:1076121304 collection:"collection2" file_count:22007 delete_count:3 deleted_byte_count:60358 replica_placement:100 version:3 modified_at_second:1614956487 + volume id:328 size:1074767816 collection:"collection2" file_count:21720 delete_count:3 deleted_byte_count:56429 replica_placement:100 version:3 modified_at_second:1614956362 + volume id:329 size:1076691960 collection:"collection2" file_count:22411 delete_count:5 deleted_byte_count:214092 replica_placement:100 version:3 modified_at_second:1614956485 + volume id:330 size:1080825760 collection:"collection2" file_count:22464 delete_count:2 deleted_byte_count:15771 replica_placement:100 version:3 modified_at_second:1614956476 + volume id:331 size:1074957256 collection:"collection2" file_count:21230 delete_count:4 deleted_byte_count:62145 replica_placement:100 version:3 modified_at_second:1614956259 + volume id:332 size:1075569928 collection:"collection2" file_count:22097 delete_count:3 deleted_byte_count:98273 replica_placement:100 version:3 modified_at_second:1614962869 + volume id:333 size:1074270160 collection:"collection2" file_count:21271 delete_count:2 deleted_byte_count:168122 replica_placement:100 version:3 modified_at_second:1614962697 + volume id:334 size:1075607880 collection:"collection2" file_count:22546 delete_count:6 deleted_byte_count:101538 replica_placement:100 version:3 modified_at_second:1614962978 + volume id:335 size:1076235136 collection:"collection2" file_count:22391 delete_count:3 deleted_byte_count:8838 replica_placement:100 version:3 modified_at_second:1614962970 + volume id:337 size:1075646896 collection:"collection2" file_count:21934 delete_count:1 deleted_byte_count:3397 replica_placement:100 version:3 modified_at_second:1614969937 + volume id:339 size:1078402392 collection:"collection2" file_count:22309 replica_placement:100 version:3 modified_at_second:1614969995 + volume id:340 size:1079462152 collection:"collection2" file_count:22319 delete_count:4 deleted_byte_count:93620 replica_placement:100 version:3 modified_at_second:1614969977 + volume id:341 size:1074448360 collection:"collection2" file_count:21590 delete_count:5 deleted_byte_count:160085 replica_placement:100 version:3 modified_at_second:1614969858 + volume id:343 size:1075345072 collection:"collection2" file_count:21095 delete_count:2 deleted_byte_count:20581 replica_placement:100 version:3 modified_at_second:1614977148 + volume id:346 size:1076464112 collection:"collection2" file_count:22320 delete_count:4 deleted_byte_count:798258 replica_placement:100 version:3 modified_at_second:1614977511 + volume id:347 size:1075145248 collection:"collection2" file_count:22178 delete_count:1 deleted_byte_count:79392 replica_placement:100 version:3 modified_at_second:1614984727 + volume id:348 size:1080623544 collection:"collection2" file_count:21667 delete_count:1 deleted_byte_count:2443 replica_placement:100 version:3 modified_at_second:1614984604 + volume id:349 size:1075957672 collection:"collection2" file_count:22395 delete_count:2 deleted_byte_count:61565 replica_placement:100 version:3 modified_at_second:1614984748 + volume id:351 size:1078795120 collection:"collection2" file_count:23660 delete_count:3 deleted_byte_count:102141 replica_placement:100 version:3 modified_at_second:1614984816 + volume id:352 size:1077145936 collection:"collection2" file_count:22066 delete_count:1 deleted_byte_count:1018 replica_placement:100 version:3 modified_at_second:1614992130 + volume id:353 size:1074897496 collection:"collection2" file_count:21266 delete_count:2 deleted_byte_count:3105374 replica_placement:100 version:3 modified_at_second:1614991951 + volume id:354 size:1085214104 collection:"collection2" file_count:23150 delete_count:4 deleted_byte_count:82391 replica_placement:100 version:3 modified_at_second:1614992208 + volume id:357 size:1074276152 collection:"collection2" file_count:23137 delete_count:4 deleted_byte_count:188487 replica_placement:100 version:3 modified_at_second:1614998792 + volume id:359 size:1074211296 collection:"collection2" file_count:22437 delete_count:2 deleted_byte_count:187953 replica_placement:100 version:3 modified_at_second:1614998711 + volume id:360 size:1075532512 collection:"collection2" file_count:22574 delete_count:3 deleted_byte_count:1774776 replica_placement:100 version:3 modified_at_second:1614998770 + volume id:361 size:1075362744 collection:"collection2" file_count:22272 delete_count:1 deleted_byte_count:3497 replica_placement:100 version:3 modified_at_second:1614998668 + volume id:362 size:1074074176 collection:"collection2" file_count:20595 delete_count:1 deleted_byte_count:112145 replica_placement:100 version:3 modified_at_second:1615004407 + volume id:363 size:1078859640 collection:"collection2" file_count:23177 delete_count:4 deleted_byte_count:9601 replica_placement:100 version:3 modified_at_second:1615004823 + volume id:364 size:1081280880 collection:"collection2" file_count:22686 delete_count:1 deleted_byte_count:84375 replica_placement:100 version:3 modified_at_second:1615004813 + volume id:365 size:1075736632 collection:"collection2" file_count:22193 delete_count:5 deleted_byte_count:259033 replica_placement:100 version:3 modified_at_second:1615004776 + volume id:366 size:1075267272 collection:"collection2" file_count:21856 delete_count:5 deleted_byte_count:138363 replica_placement:100 version:3 modified_at_second:1615004703 + volume id:367 size:1076403648 collection:"collection2" file_count:22995 delete_count:2 deleted_byte_count:36955 replica_placement:100 version:3 modified_at_second:1615010985 + volume id:368 size:1074821960 collection:"collection2" file_count:22252 delete_count:4 deleted_byte_count:3291946 replica_placement:100 version:3 modified_at_second:1615010877 + volume id:369 size:1091472040 collection:"collection2" file_count:23709 delete_count:4 deleted_byte_count:400876 replica_placement:100 version:3 modified_at_second:1615011021 + volume id:370 size:1076040544 collection:"collection2" file_count:22092 delete_count:2 deleted_byte_count:115388 replica_placement:100 version:3 modified_at_second:1615010877 + volume id:371 size:1078806216 collection:"collection2" file_count:22685 delete_count:2 deleted_byte_count:68905 replica_placement:100 version:3 modified_at_second:1615010995 + volume id:372 size:1076193344 collection:"collection2" file_count:22774 delete_count:1 deleted_byte_count:3495 replica_placement:100 version:3 modified_at_second:1615016911 + volume id:373 size:1080928088 collection:"collection2" file_count:22617 delete_count:4 deleted_byte_count:91849 replica_placement:100 version:3 modified_at_second:1615016878 + volume id:374 size:1085011176 collection:"collection2" file_count:23054 delete_count:2 deleted_byte_count:89034 replica_placement:100 version:3 modified_at_second:1615016917 + volume id:376 size:1074845832 collection:"collection2" file_count:22908 delete_count:4 deleted_byte_count:432305 replica_placement:100 version:3 modified_at_second:1615016916 + volume id:377 size:957434264 collection:"collection2" file_count:14929 delete_count:1 deleted_byte_count:43099 replica_placement:100 version:3 modified_at_second:1615632323 + volume id:379 size:1014108528 collection:"collection2" file_count:15362 delete_count:6 deleted_byte_count:2481613 replica_placement:100 version:3 modified_at_second:1615632323 + Disk hdd total size:306912958016 file_count:4201794 deleted_file:15268 deleted_bytes:4779359660 + DataNode 192.168.1.5:8080 total size:306912958016 file_count:4201794 deleted_file:15268 deleted_bytes:4779359660 + Rack DefaultRack total size:306912958016 file_count:4201794 deleted_file:15268 deleted_bytes:4779359660 + DataCenter dc5 total size:306912958016 file_count:4201794 deleted_file:15268 deleted_bytes:4779359660 +total size:775256653592 file_count:10478712 deleted_file:33754 deleted_bytes:10839266043 ` From 2ae9705442b513af60e26c786c612867ea36015d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 1 Aug 2021 22:55:19 -0700 Subject: [PATCH 160/265] adjust text --- weed/shell/command_volume_balance.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/shell/command_volume_balance.go b/weed/shell/command_volume_balance.go index 06a5ebc92..6da128c68 100644 --- a/weed/shell/command_volume_balance.go +++ b/weed/shell/command_volume_balance.go @@ -120,7 +120,7 @@ func balanceVolumeServers(commandEnv *CommandEnv, diskTypes []types.DiskType, vo func balanceVolumeServersByDiskType(commandEnv *CommandEnv, diskType types.DiskType, volumeReplicas map[uint32][]*VolumeReplica, nodes []*Node, volumeSizeLimit uint64, collection string, applyBalancing bool) error { - // balance readable volumes + // balance read only volumes for _, n := range nodes { n.selectVolumes(func(v *master_pb.VolumeInformationMessage) bool { if collection != "ALL_COLLECTIONS" { From bdc7730fdb160ea59efa72ff946cd329d5e1c59f Mon Sep 17 00:00:00 2001 From: "byunghwa.yun" Date: Tue, 3 Aug 2021 00:25:44 +0900 Subject: [PATCH 161/265] Add autocomplete --- go.mod | 1 + go.sum | 4 ++ weed/command/autocomplete.go | 109 +++++++++++++++++++++++++++++++++++ weed/command/command.go | 2 + weed/weed.go | 5 ++ 5 files changed, 121 insertions(+) create mode 100644 weed/command/autocomplete.go diff --git a/go.mod b/go.mod index 53188faf2..8fdbf5f60 100644 --- a/go.mod +++ b/go.mod @@ -90,6 +90,7 @@ require ( gopkg.in/jcmturner/goidentity.v3 v3.0.0 // indirect gopkg.in/jcmturner/gokrb5.v7 v7.3.0 // indirect modernc.org/sqlite v1.10.7 + github.com/posener/complete v1.2.3 ) // replace github.com/seaweedfs/fuse => /Users/chris/go/src/github.com/seaweedfs/fuse diff --git a/go.sum b/go.sum index c96845979..f23ca0020 100644 --- a/go.sum +++ b/go.sum @@ -364,10 +364,12 @@ github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= @@ -571,6 +573,8 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= diff --git a/weed/command/autocomplete.go b/weed/command/autocomplete.go new file mode 100644 index 000000000..b98c16cf3 --- /dev/null +++ b/weed/command/autocomplete.go @@ -0,0 +1,109 @@ +package command + +import ( + "fmt" + flag "github.com/chrislusf/seaweedfs/weed/util/fla9" + "github.com/posener/complete" + completeinstall "github.com/posener/complete/cmd/install" + "runtime" +) + +func AutocompleteMain(commands []*Command) bool { + subCommands := make(map[string]complete.Command) + helpSubCommands := make(map[string]complete.Command) + for _, cmd := range commands { + flags := make(map[string]complete.Predictor) + cmd.Flag.VisitAll(func(flag *flag.Flag) { + flags["-"+flag.Name] = complete.PredictAnything + }) + + subCommands[cmd.Name()] = complete.Command{ + Flags: flags, + } + helpSubCommands[cmd.Name()] = complete.Command{} + } + subCommands["help"] = complete.Command{Sub: helpSubCommands} + + globalFlags := make(map[string]complete.Predictor) + flag.VisitAll(func(flag *flag.Flag) { + globalFlags["-"+flag.Name] = complete.PredictAnything + }) + + weedCmd := complete.Command{ + Sub: subCommands, + Flags: globalFlags, + GlobalFlags: complete.Flags{"-h": complete.PredictNothing}, + } + cmp := complete.New("weed", weedCmd) + + return cmp.Complete() +} + +func installAutoCompletion() bool { + if runtime.GOOS == "windows" { + fmt.Printf("windows is not supported") + return false + } + + err := completeinstall.Install("weed") + if err != nil { + fmt.Printf("install failed! %s\n", err) + return false + } + fmt.Printf("autocompletion is enabled. Please restart your shell.\n") + return true +} + +func uninstallAutoCompletion() bool { + if runtime.GOOS == "windows" { + fmt.Printf("windows is not supported") + return false + } + + err := completeinstall.Uninstall("weed") + if err != nil { + fmt.Printf("uninstall failed! %s\n", err) + return false + } + fmt.Printf("autocompletion is disable. Please restart your shell.\n") + return true +} + +var cmdAutocomplete = &Command{ + Run: runAutocomplete, + UsageLine: "autocomplete", + Short: "install autocomplete", + Long: `weed autocomplete is installed in the shell. + + Supported shells are bash, zsh, and fish. + Windows is not supported. + +`, +} + +func runAutocomplete(cmd *Command, args []string) bool { + if len(args) != 0 { + cmd.Usage() + } + + return installAutoCompletion() +} + +var cmdUnautocomplete = &Command{ + Run: runUnautocomplete, + UsageLine: "unautocomplete", + Short: "uninstall autocomplete", + Long: `weed autocomplete is uninstalled in the shell. + + Windows is not supported. + +`, +} + +func runUnautocomplete(cmd *Command, args []string) bool { + if len(args) != 0 { + cmd.Usage() + } + + return uninstallAutoCompletion() +} diff --git a/weed/command/command.go b/weed/command/command.go index 0bac56442..022aba194 100644 --- a/weed/command/command.go +++ b/weed/command/command.go @@ -36,6 +36,8 @@ var Commands = []*Command{ cmdVersion, cmdVolume, cmdWebDav, + cmdAutocomplete, + cmdUnautocomplete, } type Command struct { diff --git a/weed/weed.go b/weed/weed.go index 91c17d9ff..068d2077c 100644 --- a/weed/weed.go +++ b/weed/weed.go @@ -46,6 +46,11 @@ func main() { glog.MaxSize = 1024 * 1024 * 32 rand.Seed(time.Now().UnixNano()) flag.Usage = usage + + if command.AutocompleteMain(commands) { + return + } + flag.Parse() args := flag.Args() From fe60c6ef9a09f2190926a49aaf3c15ab29bf5812 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 2 Aug 2021 11:49:40 -0700 Subject: [PATCH 162/265] minor changes --- weed/command/autocomplete.go | 6 +++--- weed/command/command.go | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/weed/command/autocomplete.go b/weed/command/autocomplete.go index b98c16cf3..9a545a183 100644 --- a/weed/command/autocomplete.go +++ b/weed/command/autocomplete.go @@ -41,7 +41,7 @@ func AutocompleteMain(commands []*Command) bool { func installAutoCompletion() bool { if runtime.GOOS == "windows" { - fmt.Printf("windows is not supported") + fmt.Println("windows is not supported") return false } @@ -56,7 +56,7 @@ func installAutoCompletion() bool { func uninstallAutoCompletion() bool { if runtime.GOOS == "windows" { - fmt.Printf("windows is not supported") + fmt.Println("windows is not supported") return false } @@ -91,7 +91,7 @@ func runAutocomplete(cmd *Command, args []string) bool { var cmdUnautocomplete = &Command{ Run: runUnautocomplete, - UsageLine: "unautocomplete", + UsageLine: "autocomplete.uninstall", Short: "uninstall autocomplete", Long: `weed autocomplete is uninstalled in the shell. diff --git a/weed/command/command.go b/weed/command/command.go index 022aba194..9ae93fe61 100644 --- a/weed/command/command.go +++ b/weed/command/command.go @@ -8,6 +8,8 @@ import ( ) var Commands = []*Command{ + cmdAutocomplete, + cmdUnautocomplete, cmdBackup, cmdBenchmark, cmdCompact, @@ -36,8 +38,6 @@ var Commands = []*Command{ cmdVersion, cmdVolume, cmdWebDav, - cmdAutocomplete, - cmdUnautocomplete, } type Command struct { From 3afbf04007eb1e6c7d79e652545d24e7a8e7d509 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 3 Aug 2021 01:30:35 -0700 Subject: [PATCH 163/265] add TLS grpc support for filer meta clients --- weed/command/filer_backup.go | 4 ++-- weed/command/filer_meta_backup.go | 1 + weed/command/filer_meta_tail.go | 1 + weed/command/filer_sync.go | 1 + weed/command/iam.go | 1 + 5 files changed, 6 insertions(+), 2 deletions(-) diff --git a/weed/command/filer_backup.go b/weed/command/filer_backup.go index 888b46fe7..fc4dd8298 100644 --- a/weed/command/filer_backup.go +++ b/weed/command/filer_backup.go @@ -52,11 +52,11 @@ var cmdFilerBackup = &Command{ func runFilerBackup(cmd *Command, args []string) bool { - grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client") - util.LoadConfiguration("security", false) util.LoadConfiguration("replication", true) + grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client") + for { err := doFilerBackup(grpcDialOption, &filerBackupOptions) if err != nil { diff --git a/weed/command/filer_meta_backup.go b/weed/command/filer_meta_backup.go index ba0b44659..28bd367e7 100644 --- a/weed/command/filer_meta_backup.go +++ b/weed/command/filer_meta_backup.go @@ -53,6 +53,7 @@ The backup writes to another filer store specified in a backup_filer.toml. func runFilerMetaBackup(cmd *Command, args []string) bool { + util.LoadConfiguration("security", false) metaBackup.grpcDialOption = security.LoadClientTLS(util.GetViper(), "grpc.client") // load backup_filer.toml diff --git a/weed/command/filer_meta_tail.go b/weed/command/filer_meta_tail.go index 8451ffd78..76699bb5e 100644 --- a/weed/command/filer_meta_tail.go +++ b/weed/command/filer_meta_tail.go @@ -45,6 +45,7 @@ var ( func runFilerMetaTail(cmd *Command, args []string) bool { + util.LoadConfiguration("security", false) grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client") var filterFunc func(dir, fname string) bool diff --git a/weed/command/filer_sync.go b/weed/command/filer_sync.go index 211c34aea..7cfc8a7fe 100644 --- a/weed/command/filer_sync.go +++ b/weed/command/filer_sync.go @@ -89,6 +89,7 @@ var cmdFilerSynchronize = &Command{ func runFilerSynchronize(cmd *Command, args []string) bool { + util.LoadConfiguration("security", false) grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client") grace.SetupProfiling(*syncCpuProfile, *syncMemProfile) diff --git a/weed/command/iam.go b/weed/command/iam.go index 17d0832cb..ed4eea543 100644 --- a/weed/command/iam.go +++ b/weed/command/iam.go @@ -49,6 +49,7 @@ func (iamopt *IamOptions) startIamServer() bool { return false } + util.LoadConfiguration("security", false) grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client") for { err = pb.WithGrpcFilerClient(filerGrpcAddress, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { From d2ddf1dbdbc788cf807fd12ac9f7151bd2d625bb Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 3 Aug 2021 09:32:31 -0700 Subject: [PATCH 164/265] typo --- weed/command/upload.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/weed/command/upload.go b/weed/command/upload.go index ccdec561f..9ae1befab 100644 --- a/weed/command/upload.go +++ b/weed/command/upload.go @@ -71,13 +71,13 @@ func runUpload(cmd *Command, args []string) bool { util.LoadConfiguration("security", false) grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client") - defaultCollection, err := readMasterConfiguration(grpcDialOption, *upload.master) + defaultReplication, err := readMasterConfiguration(grpcDialOption, *upload.master) if err != nil { fmt.Printf("upload: %v", err) return false } if *upload.replication == "" { - *upload.replication = defaultCollection + *upload.replication = defaultReplication } if len(args) == 0 { From 8cf0c515bfb45c5d8e6c71f96c43f91cae30ea9d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 3 Aug 2021 09:32:55 -0700 Subject: [PATCH 165/265] shell: volume.fix.replication retries even when there is no error #2235 fix https://github.com/chrislusf/seaweedfs/issues/2235 --- weed/shell/command_volume_fix_replication.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/shell/command_volume_fix_replication.go b/weed/shell/command_volume_fix_replication.go index 9e6280788..7e7c0a93d 100644 --- a/weed/shell/command_volume_fix_replication.go +++ b/weed/shell/command_volume_fix_replication.go @@ -160,7 +160,7 @@ func (c *commandVolumeFixReplication) fixUnderReplicatedVolumes(commandEnv *Comm for _, vid := range underReplicatedVolumeIds { for i := 0; i < retryCount+1; i++ { if err = c.fixOneUnderReplicatedVolume(commandEnv, writer, takeAction, volumeReplicas, vid, allLocations); err == nil { - continue + break } } } From f6a9ad8001c439e5751fa5488fe6106b185ba8eb Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 4 Aug 2021 00:31:06 -0700 Subject: [PATCH 166/265] fix tests --- weed/filer/filer_remote_storage.go | 11 +++++------ weed/filer/filer_remote_storage_test.go | 6 +++++- weed/shell/command_remote_mount.go | 4 +--- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/weed/filer/filer_remote_storage.go b/weed/filer/filer_remote_storage.go index 0967de1a6..a859ad34b 100644 --- a/weed/filer/filer_remote_storage.go +++ b/weed/filer/filer_remote_storage.go @@ -87,19 +87,18 @@ func (rs *FilerRemoteStorage) FindMountDirectory(p util.FullPath) (mountDir util } func (rs *FilerRemoteStorage) FindRemoteStorageClient(p util.FullPath) (client remote_storage.RemoteStorageClient, remoteConf *filer_pb.RemoteConf, found bool) { - var storageLocation string + var storageLocation *filer_pb.RemoteStorageLocation rs.rules.MatchPrefix([]byte(p), func(key []byte, value interface{}) bool { - storageLocation = value.(string) + storageLocation = value.(*filer_pb.RemoteStorageLocation) return true }) - if storageLocation == "" { + if storageLocation == nil { + found = false return } - loc := remote_storage.ParseLocation(storageLocation) - - return rs.GetRemoteStorageClient(loc.Name) + return rs.GetRemoteStorageClient(storageLocation.Name) } func (rs *FilerRemoteStorage) GetRemoteStorageClient(storageName string) (client remote_storage.RemoteStorageClient, remoteConf *filer_pb.RemoteConf, found bool) { diff --git a/weed/filer/filer_remote_storage_test.go b/weed/filer/filer_remote_storage_test.go index e5996475e..427cd5a8a 100644 --- a/weed/filer/filer_remote_storage_test.go +++ b/weed/filer/filer_remote_storage_test.go @@ -14,7 +14,11 @@ func TestFilerRemoteStorage_FindRemoteStorageClient(t *testing.T) { rs := NewFilerRemoteStorage() rs.storageNameToConf[conf.Name] = conf - rs.mapDirectoryToRemoteStorage("/a/b/c", "s7") + rs.mapDirectoryToRemoteStorage("/a/b/c", &filer_pb.RemoteStorageLocation{ + Name: "s7", + Bucket: "some", + Path: "/dir", + }) _, _, found := rs.FindRemoteStorageClient("/a/b/c/d/e/f") assert.Equal(t, true, found, "find storage client") diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go index bd6b49050..55dfb42ca 100644 --- a/weed/shell/command_remote_mount.go +++ b/weed/shell/command_remote_mount.go @@ -130,17 +130,15 @@ func (c *commandRemoteMount) findRemoteStorageConfiguration(commandEnv *CommandE func (c *commandRemoteMount) pullMetadata(commandEnv *CommandEnv, writer io.Writer, dir string, nonEmpty bool, remoteConf *filer_pb.RemoteConf, remote *filer_pb.RemoteStorageLocation) error { // find existing directory, and ensure the directory is empty - var mountToDir *filer_pb.Entry err := commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { parent, name := util.FullPath(dir).DirAndName() - resp, lookupErr := client.LookupDirectoryEntry(context.Background(), &filer_pb.LookupDirectoryEntryRequest{ + _, lookupErr := client.LookupDirectoryEntry(context.Background(), &filer_pb.LookupDirectoryEntryRequest{ Directory: parent, Name: name, }) if lookupErr != nil { return fmt.Errorf("lookup %s: %v", dir, lookupErr) } - mountToDir = resp.Entry mountToDirIsEmpty := true listErr := filer_pb.SeaweedList(client, dir, "", func(entry *filer_pb.Entry, isLast bool) error { From d84c31169922d395074b1b256d05aa638462df50 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 4 Aug 2021 12:30:18 -0700 Subject: [PATCH 167/265] refactoring --- weed/command/shell.go | 1 + weed/remote_storage/mount_mapping.go | 26 ++++++++++++++++++++++++++ weed/server/master_server.go | 1 + weed/shell/command_remote_mount.go | 17 +++-------------- weed/shell/commands.go | 7 ++++--- 5 files changed, 35 insertions(+), 17 deletions(-) create mode 100644 weed/remote_storage/mount_mapping.go diff --git a/weed/command/shell.go b/weed/command/shell.go index c9976e809..4a9f4b027 100644 --- a/weed/command/shell.go +++ b/weed/command/shell.go @@ -55,6 +55,7 @@ func runShell(command *Command, args []string) bool { var err error shellOptions.FilerHost, shellOptions.FilerPort, err = util.ParseHostPort(*shellInitialFiler) + shellOptions.FilerAddress = *shellInitialFiler if err != nil { fmt.Printf("failed to parse filer %s: %v\n", *shellInitialFiler, err) return false diff --git a/weed/remote_storage/mount_mapping.go b/weed/remote_storage/mount_mapping.go new file mode 100644 index 000000000..65e7be362 --- /dev/null +++ b/weed/remote_storage/mount_mapping.go @@ -0,0 +1,26 @@ +package remote_storage + +import ( + "fmt" + "github.com/chrislusf/seaweedfs/weed/filer" + "github.com/chrislusf/seaweedfs/weed/pb" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "google.golang.org/grpc" +) + +func ReadMountMappings(grpcDialOption grpc.DialOption, filerAddress string) (mappings *filer_pb.RemoteStorageMapping, readErr error) { + var oldContent []byte + if readErr = pb.WithFilerClient(filerAddress, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { + oldContent, readErr = filer.ReadInsideFiler(client, filer.DirectoryEtcRemote, filer.REMOTE_STORAGE_MOUNT_FILE) + return readErr + }); readErr != nil { + return nil, readErr + } + + mappings, readErr = filer.UnmarshalRemoteStorageMappings(oldContent) + if readErr != nil { + return nil, fmt.Errorf("unmarshal mappings: %v", readErr) + } + + return +} diff --git a/weed/server/master_server.go b/weed/server/master_server.go index 9d222a342..a23ad0698 100644 --- a/weed/server/master_server.go +++ b/weed/server/master_server.go @@ -228,6 +228,7 @@ func (ms *MasterServer) startAdminScripts() { shellOptions.Masters = &masterAddress shellOptions.FilerHost, shellOptions.FilerPort, err = util.ParseHostPort(filerHostPort) + shellOptions.FilerAddress = filerHostPort shellOptions.Directory = "/" if err != nil { glog.V(0).Infof("failed to parse master.filer.default = %s : %v\n", filerHostPort, err) diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go index 55dfb42ca..5cd69f3b0 100644 --- a/weed/shell/command_remote_mount.go +++ b/weed/shell/command_remote_mount.go @@ -79,20 +79,9 @@ func (c *commandRemoteMount) Do(args []string, commandEnv *CommandEnv, writer io func (c *commandRemoteMount) listExistingRemoteStorageMounts(commandEnv *CommandEnv, writer io.Writer) (err error) { // read current mapping - var oldContent []byte - err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { - oldContent, err = filer.ReadInsideFiler(client, filer.DirectoryEtcRemote, filer.REMOTE_STORAGE_MOUNT_FILE) - return err - }) - if err != nil { - if err != filer_pb.ErrNotFound { - return fmt.Errorf("read existing mapping: %v", err) - } - } - - mappings, unmarshalErr := filer.UnmarshalRemoteStorageMappings(oldContent) - if unmarshalErr != nil { - return unmarshalErr + mappings, readErr := remote_storage.ReadMountMappings(commandEnv.option.GrpcDialOption, commandEnv.option.FilerAddress) + if readErr != nil { + return readErr } m := jsonpb.Marshaler{ diff --git a/weed/shell/commands.go b/weed/shell/commands.go index 0e285214b..5b78f1ff9 100644 --- a/weed/shell/commands.go +++ b/weed/shell/commands.go @@ -20,9 +20,10 @@ type ShellOptions struct { Masters *string GrpcDialOption grpc.DialOption // shell transient context - FilerHost string - FilerPort int64 - Directory string + FilerHost string + FilerPort int64 + FilerAddress string + Directory string } type CommandEnv struct { From b9ecf1e3a8685c62ccac80ed0fbc180ed34b48e2 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 4 Aug 2021 14:56:13 -0700 Subject: [PATCH 168/265] refacotring --- weed/remote_storage/mount_mapping.go | 20 ++++++++++++++++++++ weed/shell/command_remote_mount.go | 19 +------------------ 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/weed/remote_storage/mount_mapping.go b/weed/remote_storage/mount_mapping.go index 65e7be362..767de5bed 100644 --- a/weed/remote_storage/mount_mapping.go +++ b/weed/remote_storage/mount_mapping.go @@ -5,6 +5,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/pb" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/golang/protobuf/proto" "google.golang.org/grpc" ) @@ -24,3 +25,22 @@ func ReadMountMappings(grpcDialOption grpc.DialOption, filerAddress string) (map return } + +func ReadRemoteStorageConf(grpcDialOption grpc.DialOption, filerAddress string, storageName string) (conf *filer_pb.RemoteConf, readErr error) { + var oldContent []byte + if readErr = pb.WithFilerClient(filerAddress, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { + oldContent, readErr = filer.ReadInsideFiler(client, filer.DirectoryEtcRemote, storageName+filer.REMOTE_STORAGE_CONF_SUFFIX) + return readErr + }); readErr != nil { + return nil, readErr + } + + // unmarshal storage configuration + conf = &filer_pb.RemoteConf{} + if unMarshalErr := proto.Unmarshal(oldContent, conf); unMarshalErr != nil { + readErr = fmt.Errorf("unmarshal %s/%s: %v", filer.DirectoryEtcRemote, storageName+filer.REMOTE_STORAGE_CONF_SUFFIX, unMarshalErr) + return + } + + return +} diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go index 5cd69f3b0..35aad9498 100644 --- a/weed/shell/command_remote_mount.go +++ b/weed/shell/command_remote_mount.go @@ -95,25 +95,8 @@ func (c *commandRemoteMount) listExistingRemoteStorageMounts(commandEnv *Command func (c *commandRemoteMount) findRemoteStorageConfiguration(commandEnv *CommandEnv, writer io.Writer, remote *filer_pb.RemoteStorageLocation) (conf *filer_pb.RemoteConf, err error) { - // read storage configuration data - var confBytes []byte - err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { - confBytes, err = filer.ReadInsideFiler(client, filer.DirectoryEtcRemote, remote.Name+filer.REMOTE_STORAGE_CONF_SUFFIX) - return err - }) - if err != nil { - err = fmt.Errorf("no remote storage configuration for %s : %v", remote.Name, err) - return - } + return remote_storage.ReadRemoteStorageConf(commandEnv.option.GrpcDialOption, commandEnv.option.FilerAddress, remote.Name) - // unmarshal storage configuration - conf = &filer_pb.RemoteConf{} - if unMarshalErr := proto.Unmarshal(confBytes, conf); unMarshalErr != nil { - err = fmt.Errorf("unmarshal %s/%s: %v", filer.DirectoryEtcRemote, remote.Name, unMarshalErr) - return - } - - return } func (c *commandRemoteMount) pullMetadata(commandEnv *CommandEnv, writer io.Writer, dir string, nonEmpty bool, remoteConf *filer_pb.RemoteConf, remote *filer_pb.RemoteStorageLocation) error { From 6b743dbbf96f863e70ee80e4b32c0928f594891a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 4 Aug 2021 16:25:46 -0700 Subject: [PATCH 169/265] refactor client subscribe metadata --- .../load_test_meta_tail.go | 35 +------ weed/command/filer_backup.go | 51 ++-------- weed/command/filer_meta_backup.go | 50 ++-------- weed/command/filer_meta_tail.go | 36 ++----- weed/command/filer_sync.go | 49 ++-------- weed/filer/filer_remote_storage.go | 41 +++++++- .../meta_cache/meta_cache_subscribe.go | 41 +------- weed/pb/filer_pb_tail.go | 94 +++++++++++++++++++ weed/remote_storage/mount_mapping.go | 46 --------- weed/s3api/auth_credentials_subscribe.go | 41 +------- weed/shell/command_remote_mount.go | 5 +- 11 files changed, 175 insertions(+), 314 deletions(-) create mode 100644 weed/pb/filer_pb_tail.go delete mode 100644 weed/remote_storage/mount_mapping.go diff --git a/unmaintained/load_test/load_test_meta_tail/load_test_meta_tail.go b/unmaintained/load_test/load_test_meta_tail/load_test_meta_tail.go index 53cb2f912..c521ce33e 100644 --- a/unmaintained/load_test/load_test_meta_tail/load_test_meta_tail.go +++ b/unmaintained/load_test/load_test_meta_tail/load_test_meta_tail.go @@ -1,14 +1,12 @@ package main import ( - "context" "flag" "fmt" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "google.golang.org/grpc" - "io" "strconv" "time" ) @@ -74,38 +72,9 @@ func startGenerateMetadata() { func startSubscribeMetadata(eachEntryFunc func(event *filer_pb.SubscribeMetadataResponse) error) { - lastTsNs := int64(0) + tailErr := pb.FollowMetadata(*tailFiler, grpc.WithInsecure(), "tail", + *dir, 0, 0, eachEntryFunc, false) - tailErr := pb.WithFilerClient(*tailFiler, grpc.WithInsecure(), func(client filer_pb.SeaweedFilerClient) error { - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - stream, err := client.SubscribeMetadata(ctx, &filer_pb.SubscribeMetadataRequest{ - ClientName: "tail", - PathPrefix: *dir, - SinceNs: lastTsNs, - }) - if err != nil { - return fmt.Errorf("listen: %v", err) - } - - for { - resp, listenErr := stream.Recv() - if listenErr == io.EOF { - return nil - } - if listenErr != nil { - return listenErr - } - if err = eachEntryFunc(resp); err != nil { - glog.V(0).Infof("tail last record:%+v", time.Unix(0, lastTsNs)) - return err - } - lastTsNs = resp.TsNs - } - - }) if tailErr != nil { fmt.Printf("tail %s: %v\n", *tailFiler, tailErr) } diff --git a/weed/command/filer_backup.go b/weed/command/filer_backup.go index fc4dd8298..2828ccb39 100644 --- a/weed/command/filer_backup.go +++ b/weed/command/filer_backup.go @@ -1,16 +1,13 @@ package command import ( - "context" "fmt" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb" - "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/replication/source" "github.com/chrislusf/seaweedfs/weed/security" "github.com/chrislusf/seaweedfs/weed/util" "google.golang.org/grpc" - "io" "time" ) @@ -110,48 +107,12 @@ func doFilerBackup(grpcDialOption grpc.DialOption, backupOption *FilerBackupOpti processEventFn := genProcessFunction(sourcePath, targetPath, dataSink, debug) - return pb.WithFilerClient(sourceFiler, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - stream, err := client.SubscribeMetadata(ctx, &filer_pb.SubscribeMetadataRequest{ - ClientName: "backup_" + dataSink.GetName(), - PathPrefix: sourcePath, - SinceNs: startFrom.UnixNano(), - }) - if err != nil { - return fmt.Errorf("listen: %v", err) - } - - var counter int64 - var lastWriteTime time.Time - for { - resp, listenErr := stream.Recv() - - if listenErr == io.EOF { - return nil - } - if listenErr != nil { - return listenErr - } - - if err := processEventFn(resp); err != nil { - return fmt.Errorf("processEventFn: %v", err) - } - - counter++ - if lastWriteTime.Add(3 * time.Second).Before(time.Now()) { - glog.V(0).Infof("backup %s progressed to %v %0.2f/sec", sourceFiler, time.Unix(0, resp.TsNs), float64(counter)/float64(3)) - counter = 0 - lastWriteTime = time.Now() - if err := setOffset(grpcDialOption, sourceFiler, BackupKeyPrefix, int32(sinkId), resp.TsNs); err != nil { - return fmt.Errorf("setOffset: %v", err) - } - } - - } - + processEventFnWithOffset := pb.AddOffsetFunc(processEventFn, 3 * time.Second, func(counter int64, lastTsNs int64) error { + glog.V(0).Infof("backup %s progressed to %v %0.2f/sec", sourceFiler, time.Unix(0, lastTsNs), float64(counter)/float64(3)) + return setOffset(grpcDialOption, sourceFiler, BackupKeyPrefix, int32(sinkId), lastTsNs) }) + return pb.FollowMetadata(sourceFiler, grpcDialOption, "backup_" + dataSink.GetName(), + sourcePath, startFrom.UnixNano(), 0, processEventFnWithOffset, false) + } diff --git a/weed/command/filer_meta_backup.go b/weed/command/filer_meta_backup.go index 28bd367e7..108e76566 100644 --- a/weed/command/filer_meta_backup.go +++ b/weed/command/filer_meta_backup.go @@ -7,7 +7,6 @@ import ( "github.com/chrislusf/seaweedfs/weed/glog" "github.com/spf13/viper" "google.golang.org/grpc" - "io" "reflect" "time" @@ -190,48 +189,15 @@ func (metaBackup *FilerMetaBackupOptions) streamMetadataBackup() error { return nil } - tailErr := pb.WithFilerClient(*metaBackup.filerAddress, metaBackup.grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - stream, err := client.SubscribeMetadata(ctx, &filer_pb.SubscribeMetadataRequest{ - ClientName: "meta_backup", - PathPrefix: *metaBackup.filerDirectory, - SinceNs: startTime.UnixNano(), - }) - if err != nil { - return fmt.Errorf("listen: %v", err) - } - - var counter int64 - var lastWriteTime time.Time - for { - resp, listenErr := stream.Recv() - if listenErr == io.EOF { - return nil - } - if listenErr != nil { - return listenErr - } - if err = eachEntryFunc(resp); err != nil { - return err - } - - counter++ - if lastWriteTime.Add(3 * time.Second).Before(time.Now()) { - glog.V(0).Infof("meta backup %s progressed to %v %0.2f/sec", *metaBackup.filerAddress, time.Unix(0, resp.TsNs), float64(counter)/float64(3)) - counter = 0 - lastWriteTime = time.Now() - if err2 := metaBackup.setOffset(lastWriteTime); err2 != nil { - return err2 - } - } - - } - + processEventFnWithOffset := pb.AddOffsetFunc(eachEntryFunc, 3 * time.Second, func(counter int64, lastTsNs int64) error { + lastTime := time.Unix(0, lastTsNs) + glog.V(0).Infof("meta backup %s progressed to %v %0.2f/sec", *metaBackup.filerAddress, lastTime, float64(counter)/float64(3)) + return metaBackup.setOffset(lastTime) }) - return tailErr + + return pb.FollowMetadata(*metaBackup.filerAddress, metaBackup.grpcDialOption, "meta_backup", + *metaBackup.filerDirectory, startTime.UnixNano(), 0, processEventFnWithOffset, false) + } func (metaBackup *FilerMetaBackupOptions) getOffset() (lastWriteTime time.Time, err error) { diff --git a/weed/command/filer_meta_tail.go b/weed/command/filer_meta_tail.go index 76699bb5e..28c0db99b 100644 --- a/weed/command/filer_meta_tail.go +++ b/weed/command/filer_meta_tail.go @@ -3,16 +3,15 @@ package command import ( "context" "fmt" + "github.com/chrislusf/seaweedfs/weed/pb" "github.com/golang/protobuf/jsonpb" jsoniter "github.com/json-iterator/go" "github.com/olivere/elastic/v7" - "io" "os" "path/filepath" "strings" "time" - "github.com/chrislusf/seaweedfs/weed/pb" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/security" "github.com/chrislusf/seaweedfs/weed/util" @@ -104,37 +103,18 @@ func runFilerMetaTail(cmd *Command, args []string) bool { } } - tailErr := pb.WithFilerClient(*tailFiler, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - stream, err := client.SubscribeMetadata(ctx, &filer_pb.SubscribeMetadataRequest{ - ClientName: "tail", - PathPrefix: *tailTarget, - SinceNs: time.Now().Add(-*tailStart).UnixNano(), - }) - if err != nil { - return fmt.Errorf("listen: %v", err) - } - - for { - resp, listenErr := stream.Recv() - if listenErr == io.EOF { + tailErr := pb.FollowMetadata(*tailFiler, grpcDialOption, "tail", + *tailTarget, time.Now().Add(-*tailStart).UnixNano(), 0, + func(resp *filer_pb.SubscribeMetadataResponse) error { + if !shouldPrint(resp) { return nil } - if listenErr != nil { - return listenErr - } - if !shouldPrint(resp) { - continue - } - if err = eachEntryFunc(resp); err != nil { + if err := eachEntryFunc(resp); err != nil { return err } - } + return nil + }, false) - }) if tailErr != nil { fmt.Printf("tail %s: %v\n", *tailFiler, tailErr) } diff --git a/weed/command/filer_sync.go b/weed/command/filer_sync.go index 7cfc8a7fe..a20f17201 100644 --- a/weed/command/filer_sync.go +++ b/weed/command/filer_sync.go @@ -15,7 +15,6 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" "github.com/chrislusf/seaweedfs/weed/util/grace" "google.golang.org/grpc" - "io" "strings" "time" ) @@ -166,50 +165,14 @@ func doSubscribeFilerMetaChanges(grpcDialOption grpc.DialOption, sourceFiler, so return persistEventFn(resp) } - return pb.WithFilerClient(sourceFiler, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - stream, err := client.SubscribeMetadata(ctx, &filer_pb.SubscribeMetadataRequest{ - ClientName: "syncTo_" + targetFiler, - PathPrefix: sourcePath, - SinceNs: sourceFilerOffsetTsNs, - Signature: targetFilerSignature, - }) - if err != nil { - return fmt.Errorf("listen: %v", err) - } - - var counter int64 - var lastWriteTime time.Time - for { - resp, listenErr := stream.Recv() - if listenErr == io.EOF { - return nil - } - if listenErr != nil { - return listenErr - } - - if err := processEventFn(resp); err != nil { - return err - } - - counter++ - if lastWriteTime.Add(3 * time.Second).Before(time.Now()) { - glog.V(0).Infof("sync %s to %s progressed to %v %0.2f/sec", sourceFiler, targetFiler, time.Unix(0, resp.TsNs), float64(counter)/float64(3)) - counter = 0 - lastWriteTime = time.Now() - if err := setOffset(grpcDialOption, targetFiler, SyncKeyPrefix, sourceFilerSignature, resp.TsNs); err != nil { - return err - } - } - - } - + processEventFnWithOffset := pb.AddOffsetFunc(processEventFn, 3 * time.Second, func(counter int64, lastTsNs int64) error { + glog.V(0).Infof("sync %s to %s progressed to %v %0.2f/sec", sourceFiler, targetFiler, time.Unix(0, lastTsNs), float64(counter)/float64(3)) + return setOffset(grpcDialOption, targetFiler, SyncKeyPrefix, sourceFilerSignature, lastTsNs) }) + return pb.FollowMetadata(sourceFiler, grpcDialOption, "syncTo_" + targetFiler, + sourcePath, sourceFilerOffsetTsNs, targetFilerSignature, processEventFnWithOffset, false) + } const ( diff --git a/weed/filer/filer_remote_storage.go b/weed/filer/filer_remote_storage.go index a859ad34b..b1ee96a42 100644 --- a/weed/filer/filer_remote_storage.go +++ b/weed/filer/filer_remote_storage.go @@ -3,10 +3,12 @@ package filer import ( "context" "fmt" + "github.com/chrislusf/seaweedfs/weed/pb" "github.com/chrislusf/seaweedfs/weed/remote_storage" _ "github.com/chrislusf/seaweedfs/weed/remote_storage/s3" "github.com/chrislusf/seaweedfs/weed/util" "github.com/golang/protobuf/proto" + "google.golang.org/grpc" "math" "strings" @@ -141,4 +143,41 @@ func AddRemoteStorageMapping(oldContent []byte, dir string, storageLocation *fil } return -} \ No newline at end of file +} + + +func ReadMountMappings(grpcDialOption grpc.DialOption, filerAddress string) (mappings *filer_pb.RemoteStorageMapping, readErr error) { + var oldContent []byte + if readErr = pb.WithFilerClient(filerAddress, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { + oldContent, readErr = ReadInsideFiler(client, DirectoryEtcRemote, REMOTE_STORAGE_MOUNT_FILE) + return readErr + }); readErr != nil { + return nil, readErr + } + + mappings, readErr = UnmarshalRemoteStorageMappings(oldContent) + if readErr != nil { + return nil, fmt.Errorf("unmarshal mappings: %v", readErr) + } + + return +} + +func ReadRemoteStorageConf(grpcDialOption grpc.DialOption, filerAddress string, storageName string) (conf *filer_pb.RemoteConf, readErr error) { + var oldContent []byte + if readErr = pb.WithFilerClient(filerAddress, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { + oldContent, readErr = ReadInsideFiler(client, DirectoryEtcRemote, storageName+REMOTE_STORAGE_CONF_SUFFIX) + return readErr + }); readErr != nil { + return nil, readErr + } + + // unmarshal storage configuration + conf = &filer_pb.RemoteConf{} + if unMarshalErr := proto.Unmarshal(oldContent, conf); unMarshalErr != nil { + readErr = fmt.Errorf("unmarshal %s/%s: %v", DirectoryEtcRemote, storageName+REMOTE_STORAGE_CONF_SUFFIX, unMarshalErr) + return + } + + return +} diff --git a/weed/filesys/meta_cache/meta_cache_subscribe.go b/weed/filesys/meta_cache/meta_cache_subscribe.go index 747ac3cb9..c650b8024 100644 --- a/weed/filesys/meta_cache/meta_cache_subscribe.go +++ b/weed/filesys/meta_cache/meta_cache_subscribe.go @@ -2,12 +2,9 @@ package meta_cache import ( "context" - "fmt" - "io" - "time" - "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/pb" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/util" ) @@ -62,38 +59,8 @@ func SubscribeMetaEvents(mc *MetaCache, selfSignature int32, client filer_pb.Fil } - for { - err := client.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - stream, err := client.SubscribeMetadata(ctx, &filer_pb.SubscribeMetadataRequest{ - ClientName: "mount", - PathPrefix: dir, - SinceNs: lastTsNs, - Signature: selfSignature, - }) - if err != nil { - return fmt.Errorf("subscribe: %v", err) - } + return util.Retry("followMetaUpdates", func() error { + return pb.WithFilerClientFollowMetadata(client, "mount", dir, lastTsNs, selfSignature, processEventFn, true) + }) - for { - resp, listenErr := stream.Recv() - if listenErr == io.EOF { - return nil - } - if listenErr != nil { - return listenErr - } - - if err := processEventFn(resp); err != nil { - glog.Fatalf("process %v: %v", resp, err) - } - lastTsNs = resp.TsNs - } - }) - if err != nil { - glog.Errorf("subscribing filer meta change: %v", err) - } - time.Sleep(time.Second) - } } diff --git a/weed/pb/filer_pb_tail.go b/weed/pb/filer_pb_tail.go new file mode 100644 index 000000000..31fb62fb3 --- /dev/null +++ b/weed/pb/filer_pb_tail.go @@ -0,0 +1,94 @@ +package pb + +import ( + "context" + "fmt" + "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "google.golang.org/grpc" + "io" + "time" +) + +type ProcessMetadataFunc func(resp *filer_pb.SubscribeMetadataResponse) error + +func FollowMetadata(filerAddress string, grpcDialOption grpc.DialOption, + clientName string, pathPrefix string, lastTsNs int64, selfSignature int32, + processEventFn ProcessMetadataFunc, fatalOnError bool) error { + + err := WithFilerClient(filerAddress, grpcDialOption, makeFunc( + clientName, pathPrefix, lastTsNs, selfSignature, processEventFn, fatalOnError)) + if err != nil { + return fmt.Errorf("subscribing filer meta change: %v", err) + } + return err +} + +func WithFilerClientFollowMetadata(filerClient filer_pb.FilerClient, + clientName string, pathPrefix string, lastTsNs int64, selfSignature int32, + processEventFn ProcessMetadataFunc, fatalOnError bool) error { + + err := filerClient.WithFilerClient(makeFunc( + clientName, pathPrefix, lastTsNs, selfSignature, processEventFn, fatalOnError)) + if err != nil { + return fmt.Errorf("subscribing filer meta change: %v", err) + } + + return nil +} + +func makeFunc(clientName string, pathPrefix string, lastTsNs int64, selfSignature int32, + processEventFn ProcessMetadataFunc, fatalOnError bool) func(client filer_pb.SeaweedFilerClient) error { + return func(client filer_pb.SeaweedFilerClient) error { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + stream, err := client.SubscribeMetadata(ctx, &filer_pb.SubscribeMetadataRequest{ + ClientName: clientName, + PathPrefix: pathPrefix, + SinceNs: lastTsNs, + Signature: selfSignature, + }) + if err != nil { + return fmt.Errorf("subscribe: %v", err) + } + + for { + resp, listenErr := stream.Recv() + if listenErr == io.EOF { + return nil + } + if listenErr != nil { + return listenErr + } + + if err := processEventFn(resp); err != nil { + if fatalOnError { + glog.Fatalf("process %v: %v", resp, err) + } else { + glog.Errorf("process %v: %v", resp, err) + } + } + lastTsNs = resp.TsNs + } + } +} + +func AddOffsetFunc(processEventFn ProcessMetadataFunc, offsetInterval time.Duration, offsetFunc func(counter int64, offset int64) error) ProcessMetadataFunc { + var counter int64 + var lastWriteTime time.Time + return func(resp *filer_pb.SubscribeMetadataResponse) error { + if err := processEventFn(resp); err != nil { + return err + } + counter++ + if lastWriteTime.Add(offsetInterval).Before(time.Now()) { + counter = 0 + lastWriteTime = time.Now() + if err := offsetFunc(counter, resp.TsNs); err != nil { + return err + } + } + return nil + } + +} diff --git a/weed/remote_storage/mount_mapping.go b/weed/remote_storage/mount_mapping.go deleted file mode 100644 index 767de5bed..000000000 --- a/weed/remote_storage/mount_mapping.go +++ /dev/null @@ -1,46 +0,0 @@ -package remote_storage - -import ( - "fmt" - "github.com/chrislusf/seaweedfs/weed/filer" - "github.com/chrislusf/seaweedfs/weed/pb" - "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" - "github.com/golang/protobuf/proto" - "google.golang.org/grpc" -) - -func ReadMountMappings(grpcDialOption grpc.DialOption, filerAddress string) (mappings *filer_pb.RemoteStorageMapping, readErr error) { - var oldContent []byte - if readErr = pb.WithFilerClient(filerAddress, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { - oldContent, readErr = filer.ReadInsideFiler(client, filer.DirectoryEtcRemote, filer.REMOTE_STORAGE_MOUNT_FILE) - return readErr - }); readErr != nil { - return nil, readErr - } - - mappings, readErr = filer.UnmarshalRemoteStorageMappings(oldContent) - if readErr != nil { - return nil, fmt.Errorf("unmarshal mappings: %v", readErr) - } - - return -} - -func ReadRemoteStorageConf(grpcDialOption grpc.DialOption, filerAddress string, storageName string) (conf *filer_pb.RemoteConf, readErr error) { - var oldContent []byte - if readErr = pb.WithFilerClient(filerAddress, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { - oldContent, readErr = filer.ReadInsideFiler(client, filer.DirectoryEtcRemote, storageName+filer.REMOTE_STORAGE_CONF_SUFFIX) - return readErr - }); readErr != nil { - return nil, readErr - } - - // unmarshal storage configuration - conf = &filer_pb.RemoteConf{} - if unMarshalErr := proto.Unmarshal(oldContent, conf); unMarshalErr != nil { - readErr = fmt.Errorf("unmarshal %s/%s: %v", filer.DirectoryEtcRemote, storageName+filer.REMOTE_STORAGE_CONF_SUFFIX, unMarshalErr) - return - } - - return -} diff --git a/weed/s3api/auth_credentials_subscribe.go b/weed/s3api/auth_credentials_subscribe.go index ea4b69550..05cce632a 100644 --- a/weed/s3api/auth_credentials_subscribe.go +++ b/weed/s3api/auth_credentials_subscribe.go @@ -1,13 +1,11 @@ package s3api import ( - "context" - "fmt" "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/pb" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" - "io" - "time" + "github.com/chrislusf/seaweedfs/weed/util" ) func (s3a *S3ApiServer) subscribeMetaEvents(clientName string, prefix string, lastTsNs int64) error { @@ -34,37 +32,8 @@ func (s3a *S3ApiServer) subscribeMetaEvents(clientName string, prefix string, la return nil } - for { - err := s3a.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - stream, err := client.SubscribeMetadata(ctx, &filer_pb.SubscribeMetadataRequest{ - ClientName: clientName, - PathPrefix: prefix, - SinceNs: lastTsNs, - }) - if err != nil { - return fmt.Errorf("subscribe: %v", err) - } + return util.Retry("followIamChanges", func() error { + return pb.WithFilerClientFollowMetadata(s3a, clientName, prefix, lastTsNs, 0, processEventFn, true) + }) - for { - resp, listenErr := stream.Recv() - if listenErr == io.EOF { - return nil - } - if listenErr != nil { - return listenErr - } - - if err := processEventFn(resp); err != nil { - glog.Fatalf("process %v: %v", resp, err) - } - lastTsNs = resp.TsNs - } - }) - if err != nil { - glog.Errorf("subscribing filer meta change: %v", err) - } - time.Sleep(time.Second) - } } diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go index 35aad9498..73a5119d5 100644 --- a/weed/shell/command_remote_mount.go +++ b/weed/shell/command_remote_mount.go @@ -9,7 +9,6 @@ import ( "github.com/chrislusf/seaweedfs/weed/remote_storage" "github.com/chrislusf/seaweedfs/weed/util" "github.com/golang/protobuf/jsonpb" - "github.com/golang/protobuf/proto" "io" ) @@ -79,7 +78,7 @@ func (c *commandRemoteMount) Do(args []string, commandEnv *CommandEnv, writer io func (c *commandRemoteMount) listExistingRemoteStorageMounts(commandEnv *CommandEnv, writer io.Writer) (err error) { // read current mapping - mappings, readErr := remote_storage.ReadMountMappings(commandEnv.option.GrpcDialOption, commandEnv.option.FilerAddress) + mappings, readErr := filer.ReadMountMappings(commandEnv.option.GrpcDialOption, commandEnv.option.FilerAddress) if readErr != nil { return readErr } @@ -95,7 +94,7 @@ func (c *commandRemoteMount) listExistingRemoteStorageMounts(commandEnv *Command func (c *commandRemoteMount) findRemoteStorageConfiguration(commandEnv *CommandEnv, writer io.Writer, remote *filer_pb.RemoteStorageLocation) (conf *filer_pb.RemoteConf, err error) { - return remote_storage.ReadRemoteStorageConf(commandEnv.option.GrpcDialOption, commandEnv.option.FilerAddress, remote.Name) + return filer.ReadRemoteStorageConf(commandEnv.option.GrpcDialOption, commandEnv.option.FilerAddress, remote.Name) } From 1a5d29520c3f587558dbd68262a0f6aef8e06946 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 5 Aug 2021 14:49:24 -0700 Subject: [PATCH 170/265] add tests --- weed/shell/command_volume_balance_test.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/weed/shell/command_volume_balance_test.go b/weed/shell/command_volume_balance_test.go index b77811f51..d6624bbcc 100644 --- a/weed/shell/command_volume_balance_test.go +++ b/weed/shell/command_volume_balance_test.go @@ -1,6 +1,8 @@ package shell import ( + "github.com/chrislusf/seaweedfs/weed/storage/types" + "github.com/stretchr/testify/assert" "testing" "github.com/chrislusf/seaweedfs/weed/pb/master_pb" @@ -181,3 +183,14 @@ func TestBalance(t *testing.T) { } } + +func TestVolumeSelection(t *testing.T) { + topologyInfo := parseOutput(topoData) + + vids, err := collectVolumeIdsForTierChange(nil, topologyInfo, 1000, types.ToDiskType("hdd"), "", 20.0, 0); + if err != nil { + t.Errorf("collectVolumeIdsForTierChange: %v", err) + } + assert.Equal(t, 378, len(vids)) + +} From e84fad9acfe02e7634355749fffcad62364063cb Mon Sep 17 00:00:00 2001 From: "byunghwa.yun" Date: Fri, 6 Aug 2021 12:13:37 +0900 Subject: [PATCH 171/265] Add crtime and mtime --- weed/shell/command_fs_mkdir.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/weed/shell/command_fs_mkdir.go b/weed/shell/command_fs_mkdir.go index 71a9daece..11b663eec 100644 --- a/weed/shell/command_fs_mkdir.go +++ b/weed/shell/command_fs_mkdir.go @@ -6,6 +6,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" "io" "os" + "time" ) func init() { @@ -43,6 +44,8 @@ func (c *commandFsMkdir) Do(args []string, commandEnv *CommandEnv, writer io.Wri Name: name, IsDirectory: true, Attributes: &filer_pb.FuseAttributes{ + Mtime: time.Now().Unix(), + Crtime: time.Now().Unix(), FileMode: uint32(0777 | os.ModeDir), }, }, From f3dc909b21c2d4cc2f310b4205e56f1795713d77 Mon Sep 17 00:00:00 2001 From: "byunghwa.yun" Date: Fri, 6 Aug 2021 12:24:35 +0900 Subject: [PATCH 172/265] Change default permissions --- weed/filer/filer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/filer/filer.go b/weed/filer/filer.go index d4c0b4eef..862f98496 100644 --- a/weed/filer/filer.go +++ b/weed/filer/filer.go @@ -207,7 +207,7 @@ func (f *Filer) ensureParentDirecotryEntry(ctx context.Context, entry *Entry, di Attr: Attr{ Mtime: now, Crtime: now, - Mode: os.ModeDir | entry.Mode | 0110, + Mode: os.ModeDir | entry.Mode | 0111, Uid: entry.Uid, Gid: entry.Gid, Collection: entry.Collection, From 1e22166939f3e5ef7b7ff439e724f69f4a923f89 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 5 Aug 2021 21:06:55 -0700 Subject: [PATCH 173/265] adjust error message --- weed/shell/commands.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/shell/commands.go b/weed/shell/commands.go index 0e285214b..697c68ae3 100644 --- a/weed/shell/commands.go +++ b/weed/shell/commands.go @@ -75,7 +75,7 @@ func (ce *CommandEnv) confirmIsLocked() error { return nil } - return fmt.Errorf("need to lock to continue") + return fmt.Errorf("need to run \"lock\" first to continue") } From 8828f485c0193017307de67492681277062be0b8 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 6 Aug 2021 19:30:22 -0700 Subject: [PATCH 174/265] print volume deletion error --- weed/shell/command_volume_tier_move.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/shell/command_volume_tier_move.go b/weed/shell/command_volume_tier_move.go index 9e38c936d..a3d7f2756 100644 --- a/weed/shell/command_volume_tier_move.go +++ b/weed/shell/command_volume_tier_move.go @@ -136,7 +136,7 @@ func doVolumeTierMove(commandEnv *CommandEnv, writer io.Writer, vid needle.Volum for _, loc := range locations { if loc.Url != dst.dataNode.Id { if err = deleteVolume(commandEnv.option.GrpcDialOption, vid, loc.Url); err != nil { - fmt.Fprintf(writer, "failed to delete volume %d on %s\n", vid, loc.Url) + fmt.Fprintf(writer, "failed to delete volume %d on %s: %v\n", vid, loc.Url, err) } } } From 0c0f77e2ae45e1f905d33bf9cf129667665121ab Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 6 Aug 2021 19:35:47 -0700 Subject: [PATCH 175/265] skip not found error on deletion --- weed/shell/command_volume_tier_move.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/weed/shell/command_volume_tier_move.go b/weed/shell/command_volume_tier_move.go index a3d7f2756..19a515dab 100644 --- a/weed/shell/command_volume_tier_move.go +++ b/weed/shell/command_volume_tier_move.go @@ -8,6 +8,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/wdclient" "io" "path/filepath" + "strings" "time" "github.com/chrislusf/seaweedfs/weed/storage/needle" @@ -136,7 +137,9 @@ func doVolumeTierMove(commandEnv *CommandEnv, writer io.Writer, vid needle.Volum for _, loc := range locations { if loc.Url != dst.dataNode.Id { if err = deleteVolume(commandEnv.option.GrpcDialOption, vid, loc.Url); err != nil { - fmt.Fprintf(writer, "failed to delete volume %d on %s: %v\n", vid, loc.Url, err) + if !strings.Contains(err.Error(), "not found") { + fmt.Fprintf(writer, "failed to delete volume %d on %s: %v\n", vid, loc.Url, err) + } } } } From 270770d7d7bc78b46813d43a0b7ef34c601c8aa3 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 7 Aug 2021 14:18:53 -0700 Subject: [PATCH 176/265] refactor --- weed/pb/volume_server.proto | 43 +- weed/pb/volume_server_pb/volume_server.pb.go | 4868 +++++++++--------- weed/server/volume_grpc_read_write.go | 38 - weed/server/volume_grpc_remote.go | 49 + 4 files changed, 2509 insertions(+), 2489 deletions(-) create mode 100644 weed/server/volume_grpc_remote.go diff --git a/weed/pb/volume_server.proto b/weed/pb/volume_server.proto index dd263ae38..b1f2487ba 100644 --- a/weed/pb/volume_server.proto +++ b/weed/pb/volume_server.proto @@ -56,8 +56,6 @@ service VolumeServer { } rpc WriteNeedleBlob (WriteNeedleBlobRequest) returns (WriteNeedleBlobResponse) { } - rpc FetchAndWriteNeedle (FetchAndWriteNeedleRequest) returns (FetchAndWriteNeedleResponse) { - } rpc VolumeTailSender (VolumeTailSenderRequest) returns (stream VolumeTailSenderResponse) { } @@ -95,6 +93,10 @@ service VolumeServer { rpc VolumeServerLeave (VolumeServerLeaveRequest) returns (VolumeServerLeaveResponse) { } + // remote storage + rpc FetchAndWriteNeedle (FetchAndWriteNeedleRequest) returns (FetchAndWriteNeedleResponse) { + } + // query rpc Query (QueryRequest) returns (stream QueriedStripe) { } @@ -278,23 +280,6 @@ message WriteNeedleBlobRequest { } message WriteNeedleBlobResponse { } -message FetchAndWriteNeedleRequest { - uint32 volume_id = 1; - uint64 needle_id = 2; - int64 offset = 3; - int64 size = 4; - // remote info - string remote_type = 5; - string remote_name = 6; - string s3_access_key = 8; - string s3_secret_key = 9; - string s3_region = 10; - string s3_endpoint = 11; - string remote_bucket = 12; - string remote_key = 13; -} -message FetchAndWriteNeedleResponse { -} message VolumeTailSenderRequest { uint32 volume_id = 1; @@ -445,6 +430,7 @@ message VolumeInfo { string replication = 3; } +// tiered storage message VolumeTierMoveDatToRemoteRequest { uint32 volume_id = 1; string collection = 2; @@ -479,6 +465,25 @@ message VolumeServerLeaveRequest { message VolumeServerLeaveResponse { } +// remote storage +message FetchAndWriteNeedleRequest { + uint32 volume_id = 1; + uint64 needle_id = 2; + int64 offset = 3; + int64 size = 4; + // remote conf + string remote_type = 5; + string remote_name = 6; + string s3_access_key = 8; + string s3_secret_key = 9; + string s3_region = 10; + string s3_endpoint = 11; + string remote_bucket = 12; + string remote_key = 13; +} +message FetchAndWriteNeedleResponse { +} + // select on volume servers message QueryRequest { repeated string selections = 1; diff --git a/weed/pb/volume_server_pb/volume_server.pb.go b/weed/pb/volume_server_pb/volume_server.pb.go index 730751d84..b360349e4 100644 --- a/weed/pb/volume_server_pb/volume_server.pb.go +++ b/weed/pb/volume_server_pb/volume_server.pb.go @@ -2200,6 +2200,2122 @@ func (*WriteNeedleBlobResponse) Descriptor() ([]byte, []int) { return file_volume_server_proto_rawDescGZIP(), []int{41} } +type VolumeTailSenderRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + SinceNs uint64 `protobuf:"varint,2,opt,name=since_ns,json=sinceNs,proto3" json:"since_ns,omitempty"` + IdleTimeoutSeconds uint32 `protobuf:"varint,3,opt,name=idle_timeout_seconds,json=idleTimeoutSeconds,proto3" json:"idle_timeout_seconds,omitempty"` +} + +func (x *VolumeTailSenderRequest) Reset() { + *x = VolumeTailSenderRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeTailSenderRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeTailSenderRequest) ProtoMessage() {} + +func (x *VolumeTailSenderRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[42] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeTailSenderRequest.ProtoReflect.Descriptor instead. +func (*VolumeTailSenderRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{42} +} + +func (x *VolumeTailSenderRequest) GetVolumeId() uint32 { + if x != nil { + return x.VolumeId + } + return 0 +} + +func (x *VolumeTailSenderRequest) GetSinceNs() uint64 { + if x != nil { + return x.SinceNs + } + return 0 +} + +func (x *VolumeTailSenderRequest) GetIdleTimeoutSeconds() uint32 { + if x != nil { + return x.IdleTimeoutSeconds + } + return 0 +} + +type VolumeTailSenderResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NeedleHeader []byte `protobuf:"bytes,1,opt,name=needle_header,json=needleHeader,proto3" json:"needle_header,omitempty"` + NeedleBody []byte `protobuf:"bytes,2,opt,name=needle_body,json=needleBody,proto3" json:"needle_body,omitempty"` + IsLastChunk bool `protobuf:"varint,3,opt,name=is_last_chunk,json=isLastChunk,proto3" json:"is_last_chunk,omitempty"` +} + +func (x *VolumeTailSenderResponse) Reset() { + *x = VolumeTailSenderResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeTailSenderResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeTailSenderResponse) ProtoMessage() {} + +func (x *VolumeTailSenderResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeTailSenderResponse.ProtoReflect.Descriptor instead. +func (*VolumeTailSenderResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{43} +} + +func (x *VolumeTailSenderResponse) GetNeedleHeader() []byte { + if x != nil { + return x.NeedleHeader + } + return nil +} + +func (x *VolumeTailSenderResponse) GetNeedleBody() []byte { + if x != nil { + return x.NeedleBody + } + return nil +} + +func (x *VolumeTailSenderResponse) GetIsLastChunk() bool { + if x != nil { + return x.IsLastChunk + } + return false +} + +type VolumeTailReceiverRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + SinceNs uint64 `protobuf:"varint,2,opt,name=since_ns,json=sinceNs,proto3" json:"since_ns,omitempty"` + IdleTimeoutSeconds uint32 `protobuf:"varint,3,opt,name=idle_timeout_seconds,json=idleTimeoutSeconds,proto3" json:"idle_timeout_seconds,omitempty"` + SourceVolumeServer string `protobuf:"bytes,4,opt,name=source_volume_server,json=sourceVolumeServer,proto3" json:"source_volume_server,omitempty"` +} + +func (x *VolumeTailReceiverRequest) Reset() { + *x = VolumeTailReceiverRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeTailReceiverRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeTailReceiverRequest) ProtoMessage() {} + +func (x *VolumeTailReceiverRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[44] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeTailReceiverRequest.ProtoReflect.Descriptor instead. +func (*VolumeTailReceiverRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{44} +} + +func (x *VolumeTailReceiverRequest) GetVolumeId() uint32 { + if x != nil { + return x.VolumeId + } + return 0 +} + +func (x *VolumeTailReceiverRequest) GetSinceNs() uint64 { + if x != nil { + return x.SinceNs + } + return 0 +} + +func (x *VolumeTailReceiverRequest) GetIdleTimeoutSeconds() uint32 { + if x != nil { + return x.IdleTimeoutSeconds + } + return 0 +} + +func (x *VolumeTailReceiverRequest) GetSourceVolumeServer() string { + if x != nil { + return x.SourceVolumeServer + } + return "" +} + +type VolumeTailReceiverResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *VolumeTailReceiverResponse) Reset() { + *x = VolumeTailReceiverResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeTailReceiverResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeTailReceiverResponse) ProtoMessage() {} + +func (x *VolumeTailReceiverResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[45] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeTailReceiverResponse.ProtoReflect.Descriptor instead. +func (*VolumeTailReceiverResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{45} +} + +type VolumeEcShardsGenerateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` +} + +func (x *VolumeEcShardsGenerateRequest) Reset() { + *x = VolumeEcShardsGenerateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeEcShardsGenerateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeEcShardsGenerateRequest) ProtoMessage() {} + +func (x *VolumeEcShardsGenerateRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[46] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeEcShardsGenerateRequest.ProtoReflect.Descriptor instead. +func (*VolumeEcShardsGenerateRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{46} +} + +func (x *VolumeEcShardsGenerateRequest) GetVolumeId() uint32 { + if x != nil { + return x.VolumeId + } + return 0 +} + +func (x *VolumeEcShardsGenerateRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +type VolumeEcShardsGenerateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *VolumeEcShardsGenerateResponse) Reset() { + *x = VolumeEcShardsGenerateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeEcShardsGenerateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeEcShardsGenerateResponse) ProtoMessage() {} + +func (x *VolumeEcShardsGenerateResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[47] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeEcShardsGenerateResponse.ProtoReflect.Descriptor instead. +func (*VolumeEcShardsGenerateResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{47} +} + +type VolumeEcShardsRebuildRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` +} + +func (x *VolumeEcShardsRebuildRequest) Reset() { + *x = VolumeEcShardsRebuildRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeEcShardsRebuildRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeEcShardsRebuildRequest) ProtoMessage() {} + +func (x *VolumeEcShardsRebuildRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[48] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeEcShardsRebuildRequest.ProtoReflect.Descriptor instead. +func (*VolumeEcShardsRebuildRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{48} +} + +func (x *VolumeEcShardsRebuildRequest) GetVolumeId() uint32 { + if x != nil { + return x.VolumeId + } + return 0 +} + +func (x *VolumeEcShardsRebuildRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +type VolumeEcShardsRebuildResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RebuiltShardIds []uint32 `protobuf:"varint,1,rep,packed,name=rebuilt_shard_ids,json=rebuiltShardIds,proto3" json:"rebuilt_shard_ids,omitempty"` +} + +func (x *VolumeEcShardsRebuildResponse) Reset() { + *x = VolumeEcShardsRebuildResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeEcShardsRebuildResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeEcShardsRebuildResponse) ProtoMessage() {} + +func (x *VolumeEcShardsRebuildResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[49] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeEcShardsRebuildResponse.ProtoReflect.Descriptor instead. +func (*VolumeEcShardsRebuildResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{49} +} + +func (x *VolumeEcShardsRebuildResponse) GetRebuiltShardIds() []uint32 { + if x != nil { + return x.RebuiltShardIds + } + return nil +} + +type VolumeEcShardsCopyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` + ShardIds []uint32 `protobuf:"varint,3,rep,packed,name=shard_ids,json=shardIds,proto3" json:"shard_ids,omitempty"` + CopyEcxFile bool `protobuf:"varint,4,opt,name=copy_ecx_file,json=copyEcxFile,proto3" json:"copy_ecx_file,omitempty"` + SourceDataNode string `protobuf:"bytes,5,opt,name=source_data_node,json=sourceDataNode,proto3" json:"source_data_node,omitempty"` + CopyEcjFile bool `protobuf:"varint,6,opt,name=copy_ecj_file,json=copyEcjFile,proto3" json:"copy_ecj_file,omitempty"` + CopyVifFile bool `protobuf:"varint,7,opt,name=copy_vif_file,json=copyVifFile,proto3" json:"copy_vif_file,omitempty"` +} + +func (x *VolumeEcShardsCopyRequest) Reset() { + *x = VolumeEcShardsCopyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeEcShardsCopyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeEcShardsCopyRequest) ProtoMessage() {} + +func (x *VolumeEcShardsCopyRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[50] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeEcShardsCopyRequest.ProtoReflect.Descriptor instead. +func (*VolumeEcShardsCopyRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{50} +} + +func (x *VolumeEcShardsCopyRequest) GetVolumeId() uint32 { + if x != nil { + return x.VolumeId + } + return 0 +} + +func (x *VolumeEcShardsCopyRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *VolumeEcShardsCopyRequest) GetShardIds() []uint32 { + if x != nil { + return x.ShardIds + } + return nil +} + +func (x *VolumeEcShardsCopyRequest) GetCopyEcxFile() bool { + if x != nil { + return x.CopyEcxFile + } + return false +} + +func (x *VolumeEcShardsCopyRequest) GetSourceDataNode() string { + if x != nil { + return x.SourceDataNode + } + return "" +} + +func (x *VolumeEcShardsCopyRequest) GetCopyEcjFile() bool { + if x != nil { + return x.CopyEcjFile + } + return false +} + +func (x *VolumeEcShardsCopyRequest) GetCopyVifFile() bool { + if x != nil { + return x.CopyVifFile + } + return false +} + +type VolumeEcShardsCopyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *VolumeEcShardsCopyResponse) Reset() { + *x = VolumeEcShardsCopyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeEcShardsCopyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeEcShardsCopyResponse) ProtoMessage() {} + +func (x *VolumeEcShardsCopyResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[51] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeEcShardsCopyResponse.ProtoReflect.Descriptor instead. +func (*VolumeEcShardsCopyResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{51} +} + +type VolumeEcShardsDeleteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` + ShardIds []uint32 `protobuf:"varint,3,rep,packed,name=shard_ids,json=shardIds,proto3" json:"shard_ids,omitempty"` +} + +func (x *VolumeEcShardsDeleteRequest) Reset() { + *x = VolumeEcShardsDeleteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeEcShardsDeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeEcShardsDeleteRequest) ProtoMessage() {} + +func (x *VolumeEcShardsDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[52] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeEcShardsDeleteRequest.ProtoReflect.Descriptor instead. +func (*VolumeEcShardsDeleteRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{52} +} + +func (x *VolumeEcShardsDeleteRequest) GetVolumeId() uint32 { + if x != nil { + return x.VolumeId + } + return 0 +} + +func (x *VolumeEcShardsDeleteRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *VolumeEcShardsDeleteRequest) GetShardIds() []uint32 { + if x != nil { + return x.ShardIds + } + return nil +} + +type VolumeEcShardsDeleteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *VolumeEcShardsDeleteResponse) Reset() { + *x = VolumeEcShardsDeleteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeEcShardsDeleteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeEcShardsDeleteResponse) ProtoMessage() {} + +func (x *VolumeEcShardsDeleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[53] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeEcShardsDeleteResponse.ProtoReflect.Descriptor instead. +func (*VolumeEcShardsDeleteResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{53} +} + +type VolumeEcShardsMountRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` + ShardIds []uint32 `protobuf:"varint,3,rep,packed,name=shard_ids,json=shardIds,proto3" json:"shard_ids,omitempty"` +} + +func (x *VolumeEcShardsMountRequest) Reset() { + *x = VolumeEcShardsMountRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeEcShardsMountRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeEcShardsMountRequest) ProtoMessage() {} + +func (x *VolumeEcShardsMountRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[54] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeEcShardsMountRequest.ProtoReflect.Descriptor instead. +func (*VolumeEcShardsMountRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{54} +} + +func (x *VolumeEcShardsMountRequest) GetVolumeId() uint32 { + if x != nil { + return x.VolumeId + } + return 0 +} + +func (x *VolumeEcShardsMountRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *VolumeEcShardsMountRequest) GetShardIds() []uint32 { + if x != nil { + return x.ShardIds + } + return nil +} + +type VolumeEcShardsMountResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *VolumeEcShardsMountResponse) Reset() { + *x = VolumeEcShardsMountResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeEcShardsMountResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeEcShardsMountResponse) ProtoMessage() {} + +func (x *VolumeEcShardsMountResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[55] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeEcShardsMountResponse.ProtoReflect.Descriptor instead. +func (*VolumeEcShardsMountResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{55} +} + +type VolumeEcShardsUnmountRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + ShardIds []uint32 `protobuf:"varint,3,rep,packed,name=shard_ids,json=shardIds,proto3" json:"shard_ids,omitempty"` +} + +func (x *VolumeEcShardsUnmountRequest) Reset() { + *x = VolumeEcShardsUnmountRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeEcShardsUnmountRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeEcShardsUnmountRequest) ProtoMessage() {} + +func (x *VolumeEcShardsUnmountRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[56] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeEcShardsUnmountRequest.ProtoReflect.Descriptor instead. +func (*VolumeEcShardsUnmountRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{56} +} + +func (x *VolumeEcShardsUnmountRequest) GetVolumeId() uint32 { + if x != nil { + return x.VolumeId + } + return 0 +} + +func (x *VolumeEcShardsUnmountRequest) GetShardIds() []uint32 { + if x != nil { + return x.ShardIds + } + return nil +} + +type VolumeEcShardsUnmountResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *VolumeEcShardsUnmountResponse) Reset() { + *x = VolumeEcShardsUnmountResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeEcShardsUnmountResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeEcShardsUnmountResponse) ProtoMessage() {} + +func (x *VolumeEcShardsUnmountResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[57] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeEcShardsUnmountResponse.ProtoReflect.Descriptor instead. +func (*VolumeEcShardsUnmountResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{57} +} + +type VolumeEcShardReadRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + ShardId uint32 `protobuf:"varint,2,opt,name=shard_id,json=shardId,proto3" json:"shard_id,omitempty"` + Offset int64 `protobuf:"varint,3,opt,name=offset,proto3" json:"offset,omitempty"` + Size int64 `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"` + FileKey uint64 `protobuf:"varint,5,opt,name=file_key,json=fileKey,proto3" json:"file_key,omitempty"` +} + +func (x *VolumeEcShardReadRequest) Reset() { + *x = VolumeEcShardReadRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeEcShardReadRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeEcShardReadRequest) ProtoMessage() {} + +func (x *VolumeEcShardReadRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[58] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeEcShardReadRequest.ProtoReflect.Descriptor instead. +func (*VolumeEcShardReadRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{58} +} + +func (x *VolumeEcShardReadRequest) GetVolumeId() uint32 { + if x != nil { + return x.VolumeId + } + return 0 +} + +func (x *VolumeEcShardReadRequest) GetShardId() uint32 { + if x != nil { + return x.ShardId + } + return 0 +} + +func (x *VolumeEcShardReadRequest) GetOffset() int64 { + if x != nil { + return x.Offset + } + return 0 +} + +func (x *VolumeEcShardReadRequest) GetSize() int64 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *VolumeEcShardReadRequest) GetFileKey() uint64 { + if x != nil { + return x.FileKey + } + return 0 +} + +type VolumeEcShardReadResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + IsDeleted bool `protobuf:"varint,2,opt,name=is_deleted,json=isDeleted,proto3" json:"is_deleted,omitempty"` +} + +func (x *VolumeEcShardReadResponse) Reset() { + *x = VolumeEcShardReadResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeEcShardReadResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeEcShardReadResponse) ProtoMessage() {} + +func (x *VolumeEcShardReadResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[59] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeEcShardReadResponse.ProtoReflect.Descriptor instead. +func (*VolumeEcShardReadResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{59} +} + +func (x *VolumeEcShardReadResponse) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *VolumeEcShardReadResponse) GetIsDeleted() bool { + if x != nil { + return x.IsDeleted + } + return false +} + +type VolumeEcBlobDeleteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` + FileKey uint64 `protobuf:"varint,3,opt,name=file_key,json=fileKey,proto3" json:"file_key,omitempty"` + Version uint32 `protobuf:"varint,4,opt,name=version,proto3" json:"version,omitempty"` +} + +func (x *VolumeEcBlobDeleteRequest) Reset() { + *x = VolumeEcBlobDeleteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeEcBlobDeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeEcBlobDeleteRequest) ProtoMessage() {} + +func (x *VolumeEcBlobDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[60] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeEcBlobDeleteRequest.ProtoReflect.Descriptor instead. +func (*VolumeEcBlobDeleteRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{60} +} + +func (x *VolumeEcBlobDeleteRequest) GetVolumeId() uint32 { + if x != nil { + return x.VolumeId + } + return 0 +} + +func (x *VolumeEcBlobDeleteRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *VolumeEcBlobDeleteRequest) GetFileKey() uint64 { + if x != nil { + return x.FileKey + } + return 0 +} + +func (x *VolumeEcBlobDeleteRequest) GetVersion() uint32 { + if x != nil { + return x.Version + } + return 0 +} + +type VolumeEcBlobDeleteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *VolumeEcBlobDeleteResponse) Reset() { + *x = VolumeEcBlobDeleteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeEcBlobDeleteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeEcBlobDeleteResponse) ProtoMessage() {} + +func (x *VolumeEcBlobDeleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[61] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeEcBlobDeleteResponse.ProtoReflect.Descriptor instead. +func (*VolumeEcBlobDeleteResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{61} +} + +type VolumeEcShardsToVolumeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` +} + +func (x *VolumeEcShardsToVolumeRequest) Reset() { + *x = VolumeEcShardsToVolumeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeEcShardsToVolumeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeEcShardsToVolumeRequest) ProtoMessage() {} + +func (x *VolumeEcShardsToVolumeRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[62] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeEcShardsToVolumeRequest.ProtoReflect.Descriptor instead. +func (*VolumeEcShardsToVolumeRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{62} +} + +func (x *VolumeEcShardsToVolumeRequest) GetVolumeId() uint32 { + if x != nil { + return x.VolumeId + } + return 0 +} + +func (x *VolumeEcShardsToVolumeRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +type VolumeEcShardsToVolumeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *VolumeEcShardsToVolumeResponse) Reset() { + *x = VolumeEcShardsToVolumeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeEcShardsToVolumeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeEcShardsToVolumeResponse) ProtoMessage() {} + +func (x *VolumeEcShardsToVolumeResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[63] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeEcShardsToVolumeResponse.ProtoReflect.Descriptor instead. +func (*VolumeEcShardsToVolumeResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{63} +} + +type ReadVolumeFileStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` +} + +func (x *ReadVolumeFileStatusRequest) Reset() { + *x = ReadVolumeFileStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReadVolumeFileStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReadVolumeFileStatusRequest) ProtoMessage() {} + +func (x *ReadVolumeFileStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[64] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReadVolumeFileStatusRequest.ProtoReflect.Descriptor instead. +func (*ReadVolumeFileStatusRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{64} +} + +func (x *ReadVolumeFileStatusRequest) GetVolumeId() uint32 { + if x != nil { + return x.VolumeId + } + return 0 +} + +type ReadVolumeFileStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + IdxFileTimestampSeconds uint64 `protobuf:"varint,2,opt,name=idx_file_timestamp_seconds,json=idxFileTimestampSeconds,proto3" json:"idx_file_timestamp_seconds,omitempty"` + IdxFileSize uint64 `protobuf:"varint,3,opt,name=idx_file_size,json=idxFileSize,proto3" json:"idx_file_size,omitempty"` + DatFileTimestampSeconds uint64 `protobuf:"varint,4,opt,name=dat_file_timestamp_seconds,json=datFileTimestampSeconds,proto3" json:"dat_file_timestamp_seconds,omitempty"` + DatFileSize uint64 `protobuf:"varint,5,opt,name=dat_file_size,json=datFileSize,proto3" json:"dat_file_size,omitempty"` + FileCount uint64 `protobuf:"varint,6,opt,name=file_count,json=fileCount,proto3" json:"file_count,omitempty"` + CompactionRevision uint32 `protobuf:"varint,7,opt,name=compaction_revision,json=compactionRevision,proto3" json:"compaction_revision,omitempty"` + Collection string `protobuf:"bytes,8,opt,name=collection,proto3" json:"collection,omitempty"` + DiskType string `protobuf:"bytes,9,opt,name=disk_type,json=diskType,proto3" json:"disk_type,omitempty"` +} + +func (x *ReadVolumeFileStatusResponse) Reset() { + *x = ReadVolumeFileStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReadVolumeFileStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReadVolumeFileStatusResponse) ProtoMessage() {} + +func (x *ReadVolumeFileStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[65] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReadVolumeFileStatusResponse.ProtoReflect.Descriptor instead. +func (*ReadVolumeFileStatusResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{65} +} + +func (x *ReadVolumeFileStatusResponse) GetVolumeId() uint32 { + if x != nil { + return x.VolumeId + } + return 0 +} + +func (x *ReadVolumeFileStatusResponse) GetIdxFileTimestampSeconds() uint64 { + if x != nil { + return x.IdxFileTimestampSeconds + } + return 0 +} + +func (x *ReadVolumeFileStatusResponse) GetIdxFileSize() uint64 { + if x != nil { + return x.IdxFileSize + } + return 0 +} + +func (x *ReadVolumeFileStatusResponse) GetDatFileTimestampSeconds() uint64 { + if x != nil { + return x.DatFileTimestampSeconds + } + return 0 +} + +func (x *ReadVolumeFileStatusResponse) GetDatFileSize() uint64 { + if x != nil { + return x.DatFileSize + } + return 0 +} + +func (x *ReadVolumeFileStatusResponse) GetFileCount() uint64 { + if x != nil { + return x.FileCount + } + return 0 +} + +func (x *ReadVolumeFileStatusResponse) GetCompactionRevision() uint32 { + if x != nil { + return x.CompactionRevision + } + return 0 +} + +func (x *ReadVolumeFileStatusResponse) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *ReadVolumeFileStatusResponse) GetDiskType() string { + if x != nil { + return x.DiskType + } + return "" +} + +type DiskStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Dir string `protobuf:"bytes,1,opt,name=dir,proto3" json:"dir,omitempty"` + All uint64 `protobuf:"varint,2,opt,name=all,proto3" json:"all,omitempty"` + Used uint64 `protobuf:"varint,3,opt,name=used,proto3" json:"used,omitempty"` + Free uint64 `protobuf:"varint,4,opt,name=free,proto3" json:"free,omitempty"` + PercentFree float32 `protobuf:"fixed32,5,opt,name=percent_free,json=percentFree,proto3" json:"percent_free,omitempty"` + PercentUsed float32 `protobuf:"fixed32,6,opt,name=percent_used,json=percentUsed,proto3" json:"percent_used,omitempty"` + DiskType string `protobuf:"bytes,7,opt,name=disk_type,json=diskType,proto3" json:"disk_type,omitempty"` +} + +func (x *DiskStatus) Reset() { + *x = DiskStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DiskStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DiskStatus) ProtoMessage() {} + +func (x *DiskStatus) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[66] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DiskStatus.ProtoReflect.Descriptor instead. +func (*DiskStatus) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{66} +} + +func (x *DiskStatus) GetDir() string { + if x != nil { + return x.Dir + } + return "" +} + +func (x *DiskStatus) GetAll() uint64 { + if x != nil { + return x.All + } + return 0 +} + +func (x *DiskStatus) GetUsed() uint64 { + if x != nil { + return x.Used + } + return 0 +} + +func (x *DiskStatus) GetFree() uint64 { + if x != nil { + return x.Free + } + return 0 +} + +func (x *DiskStatus) GetPercentFree() float32 { + if x != nil { + return x.PercentFree + } + return 0 +} + +func (x *DiskStatus) GetPercentUsed() float32 { + if x != nil { + return x.PercentUsed + } + return 0 +} + +func (x *DiskStatus) GetDiskType() string { + if x != nil { + return x.DiskType + } + return "" +} + +type MemStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Goroutines int32 `protobuf:"varint,1,opt,name=goroutines,proto3" json:"goroutines,omitempty"` + All uint64 `protobuf:"varint,2,opt,name=all,proto3" json:"all,omitempty"` + Used uint64 `protobuf:"varint,3,opt,name=used,proto3" json:"used,omitempty"` + Free uint64 `protobuf:"varint,4,opt,name=free,proto3" json:"free,omitempty"` + Self uint64 `protobuf:"varint,5,opt,name=self,proto3" json:"self,omitempty"` + Heap uint64 `protobuf:"varint,6,opt,name=heap,proto3" json:"heap,omitempty"` + Stack uint64 `protobuf:"varint,7,opt,name=stack,proto3" json:"stack,omitempty"` +} + +func (x *MemStatus) Reset() { + *x = MemStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[67] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MemStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MemStatus) ProtoMessage() {} + +func (x *MemStatus) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[67] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MemStatus.ProtoReflect.Descriptor instead. +func (*MemStatus) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{67} +} + +func (x *MemStatus) GetGoroutines() int32 { + if x != nil { + return x.Goroutines + } + return 0 +} + +func (x *MemStatus) GetAll() uint64 { + if x != nil { + return x.All + } + return 0 +} + +func (x *MemStatus) GetUsed() uint64 { + if x != nil { + return x.Used + } + return 0 +} + +func (x *MemStatus) GetFree() uint64 { + if x != nil { + return x.Free + } + return 0 +} + +func (x *MemStatus) GetSelf() uint64 { + if x != nil { + return x.Self + } + return 0 +} + +func (x *MemStatus) GetHeap() uint64 { + if x != nil { + return x.Heap + } + return 0 +} + +func (x *MemStatus) GetStack() uint64 { + if x != nil { + return x.Stack + } + return 0 +} + +// tired storage on volume servers +type RemoteFile struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BackendType string `protobuf:"bytes,1,opt,name=backend_type,json=backendType,proto3" json:"backend_type,omitempty"` + BackendId string `protobuf:"bytes,2,opt,name=backend_id,json=backendId,proto3" json:"backend_id,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + Offset uint64 `protobuf:"varint,4,opt,name=offset,proto3" json:"offset,omitempty"` + FileSize uint64 `protobuf:"varint,5,opt,name=file_size,json=fileSize,proto3" json:"file_size,omitempty"` + ModifiedTime uint64 `protobuf:"varint,6,opt,name=modified_time,json=modifiedTime,proto3" json:"modified_time,omitempty"` + Extension string `protobuf:"bytes,7,opt,name=extension,proto3" json:"extension,omitempty"` +} + +func (x *RemoteFile) Reset() { + *x = RemoteFile{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[68] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoteFile) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoteFile) ProtoMessage() {} + +func (x *RemoteFile) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[68] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoteFile.ProtoReflect.Descriptor instead. +func (*RemoteFile) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{68} +} + +func (x *RemoteFile) GetBackendType() string { + if x != nil { + return x.BackendType + } + return "" +} + +func (x *RemoteFile) GetBackendId() string { + if x != nil { + return x.BackendId + } + return "" +} + +func (x *RemoteFile) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *RemoteFile) GetOffset() uint64 { + if x != nil { + return x.Offset + } + return 0 +} + +func (x *RemoteFile) GetFileSize() uint64 { + if x != nil { + return x.FileSize + } + return 0 +} + +func (x *RemoteFile) GetModifiedTime() uint64 { + if x != nil { + return x.ModifiedTime + } + return 0 +} + +func (x *RemoteFile) GetExtension() string { + if x != nil { + return x.Extension + } + return "" +} + +type VolumeInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Files []*RemoteFile `protobuf:"bytes,1,rep,name=files,proto3" json:"files,omitempty"` + Version uint32 `protobuf:"varint,2,opt,name=version,proto3" json:"version,omitempty"` + Replication string `protobuf:"bytes,3,opt,name=replication,proto3" json:"replication,omitempty"` +} + +func (x *VolumeInfo) Reset() { + *x = VolumeInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[69] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeInfo) ProtoMessage() {} + +func (x *VolumeInfo) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[69] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeInfo.ProtoReflect.Descriptor instead. +func (*VolumeInfo) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{69} +} + +func (x *VolumeInfo) GetFiles() []*RemoteFile { + if x != nil { + return x.Files + } + return nil +} + +func (x *VolumeInfo) GetVersion() uint32 { + if x != nil { + return x.Version + } + return 0 +} + +func (x *VolumeInfo) GetReplication() string { + if x != nil { + return x.Replication + } + return "" +} + +// tiered storage +type VolumeTierMoveDatToRemoteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` + DestinationBackendName string `protobuf:"bytes,3,opt,name=destination_backend_name,json=destinationBackendName,proto3" json:"destination_backend_name,omitempty"` + KeepLocalDatFile bool `protobuf:"varint,4,opt,name=keep_local_dat_file,json=keepLocalDatFile,proto3" json:"keep_local_dat_file,omitempty"` +} + +func (x *VolumeTierMoveDatToRemoteRequest) Reset() { + *x = VolumeTierMoveDatToRemoteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[70] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeTierMoveDatToRemoteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeTierMoveDatToRemoteRequest) ProtoMessage() {} + +func (x *VolumeTierMoveDatToRemoteRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[70] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeTierMoveDatToRemoteRequest.ProtoReflect.Descriptor instead. +func (*VolumeTierMoveDatToRemoteRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{70} +} + +func (x *VolumeTierMoveDatToRemoteRequest) GetVolumeId() uint32 { + if x != nil { + return x.VolumeId + } + return 0 +} + +func (x *VolumeTierMoveDatToRemoteRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *VolumeTierMoveDatToRemoteRequest) GetDestinationBackendName() string { + if x != nil { + return x.DestinationBackendName + } + return "" +} + +func (x *VolumeTierMoveDatToRemoteRequest) GetKeepLocalDatFile() bool { + if x != nil { + return x.KeepLocalDatFile + } + return false +} + +type VolumeTierMoveDatToRemoteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Processed int64 `protobuf:"varint,1,opt,name=processed,proto3" json:"processed,omitempty"` + ProcessedPercentage float32 `protobuf:"fixed32,2,opt,name=processedPercentage,proto3" json:"processedPercentage,omitempty"` +} + +func (x *VolumeTierMoveDatToRemoteResponse) Reset() { + *x = VolumeTierMoveDatToRemoteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[71] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeTierMoveDatToRemoteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeTierMoveDatToRemoteResponse) ProtoMessage() {} + +func (x *VolumeTierMoveDatToRemoteResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[71] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeTierMoveDatToRemoteResponse.ProtoReflect.Descriptor instead. +func (*VolumeTierMoveDatToRemoteResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{71} +} + +func (x *VolumeTierMoveDatToRemoteResponse) GetProcessed() int64 { + if x != nil { + return x.Processed + } + return 0 +} + +func (x *VolumeTierMoveDatToRemoteResponse) GetProcessedPercentage() float32 { + if x != nil { + return x.ProcessedPercentage + } + return 0 +} + +type VolumeTierMoveDatFromRemoteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` + KeepRemoteDatFile bool `protobuf:"varint,3,opt,name=keep_remote_dat_file,json=keepRemoteDatFile,proto3" json:"keep_remote_dat_file,omitempty"` +} + +func (x *VolumeTierMoveDatFromRemoteRequest) Reset() { + *x = VolumeTierMoveDatFromRemoteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[72] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeTierMoveDatFromRemoteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeTierMoveDatFromRemoteRequest) ProtoMessage() {} + +func (x *VolumeTierMoveDatFromRemoteRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[72] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeTierMoveDatFromRemoteRequest.ProtoReflect.Descriptor instead. +func (*VolumeTierMoveDatFromRemoteRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{72} +} + +func (x *VolumeTierMoveDatFromRemoteRequest) GetVolumeId() uint32 { + if x != nil { + return x.VolumeId + } + return 0 +} + +func (x *VolumeTierMoveDatFromRemoteRequest) GetCollection() string { + if x != nil { + return x.Collection + } + return "" +} + +func (x *VolumeTierMoveDatFromRemoteRequest) GetKeepRemoteDatFile() bool { + if x != nil { + return x.KeepRemoteDatFile + } + return false +} + +type VolumeTierMoveDatFromRemoteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Processed int64 `protobuf:"varint,1,opt,name=processed,proto3" json:"processed,omitempty"` + ProcessedPercentage float32 `protobuf:"fixed32,2,opt,name=processedPercentage,proto3" json:"processedPercentage,omitempty"` +} + +func (x *VolumeTierMoveDatFromRemoteResponse) Reset() { + *x = VolumeTierMoveDatFromRemoteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[73] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeTierMoveDatFromRemoteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeTierMoveDatFromRemoteResponse) ProtoMessage() {} + +func (x *VolumeTierMoveDatFromRemoteResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[73] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeTierMoveDatFromRemoteResponse.ProtoReflect.Descriptor instead. +func (*VolumeTierMoveDatFromRemoteResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{73} +} + +func (x *VolumeTierMoveDatFromRemoteResponse) GetProcessed() int64 { + if x != nil { + return x.Processed + } + return 0 +} + +func (x *VolumeTierMoveDatFromRemoteResponse) GetProcessedPercentage() float32 { + if x != nil { + return x.ProcessedPercentage + } + return 0 +} + +type VolumeServerStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *VolumeServerStatusRequest) Reset() { + *x = VolumeServerStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[74] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeServerStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeServerStatusRequest) ProtoMessage() {} + +func (x *VolumeServerStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[74] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeServerStatusRequest.ProtoReflect.Descriptor instead. +func (*VolumeServerStatusRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{74} +} + +type VolumeServerStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DiskStatuses []*DiskStatus `protobuf:"bytes,1,rep,name=disk_statuses,json=diskStatuses,proto3" json:"disk_statuses,omitempty"` + MemoryStatus *MemStatus `protobuf:"bytes,2,opt,name=memory_status,json=memoryStatus,proto3" json:"memory_status,omitempty"` +} + +func (x *VolumeServerStatusResponse) Reset() { + *x = VolumeServerStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[75] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeServerStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeServerStatusResponse) ProtoMessage() {} + +func (x *VolumeServerStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[75] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeServerStatusResponse.ProtoReflect.Descriptor instead. +func (*VolumeServerStatusResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{75} +} + +func (x *VolumeServerStatusResponse) GetDiskStatuses() []*DiskStatus { + if x != nil { + return x.DiskStatuses + } + return nil +} + +func (x *VolumeServerStatusResponse) GetMemoryStatus() *MemStatus { + if x != nil { + return x.MemoryStatus + } + return nil +} + +type VolumeServerLeaveRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *VolumeServerLeaveRequest) Reset() { + *x = VolumeServerLeaveRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[76] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeServerLeaveRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeServerLeaveRequest) ProtoMessage() {} + +func (x *VolumeServerLeaveRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[76] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeServerLeaveRequest.ProtoReflect.Descriptor instead. +func (*VolumeServerLeaveRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{76} +} + +type VolumeServerLeaveResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *VolumeServerLeaveResponse) Reset() { + *x = VolumeServerLeaveResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[77] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VolumeServerLeaveResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VolumeServerLeaveResponse) ProtoMessage() {} + +func (x *VolumeServerLeaveResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[77] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VolumeServerLeaveResponse.ProtoReflect.Descriptor instead. +func (*VolumeServerLeaveResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{77} +} + +// remote storage type FetchAndWriteNeedleRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2209,7 +4325,7 @@ type FetchAndWriteNeedleRequest struct { NeedleId uint64 `protobuf:"varint,2,opt,name=needle_id,json=needleId,proto3" json:"needle_id,omitempty"` Offset int64 `protobuf:"varint,3,opt,name=offset,proto3" json:"offset,omitempty"` Size int64 `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"` - // remote info + // remote conf RemoteType string `protobuf:"bytes,5,opt,name=remote_type,json=remoteType,proto3" json:"remote_type,omitempty"` RemoteName string `protobuf:"bytes,6,opt,name=remote_name,json=remoteName,proto3" json:"remote_name,omitempty"` S3AccessKey string `protobuf:"bytes,8,opt,name=s3_access_key,json=s3AccessKey,proto3" json:"s3_access_key,omitempty"` @@ -2223,7 +4339,7 @@ type FetchAndWriteNeedleRequest struct { func (x *FetchAndWriteNeedleRequest) Reset() { *x = FetchAndWriteNeedleRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[42] + mi := &file_volume_server_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2236,7 +4352,7 @@ func (x *FetchAndWriteNeedleRequest) String() string { func (*FetchAndWriteNeedleRequest) ProtoMessage() {} func (x *FetchAndWriteNeedleRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[42] + mi := &file_volume_server_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2249,7 +4365,7 @@ func (x *FetchAndWriteNeedleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchAndWriteNeedleRequest.ProtoReflect.Descriptor instead. func (*FetchAndWriteNeedleRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{42} + return file_volume_server_proto_rawDescGZIP(), []int{78} } func (x *FetchAndWriteNeedleRequest) GetVolumeId() uint32 { @@ -2345,7 +4461,7 @@ type FetchAndWriteNeedleResponse struct { func (x *FetchAndWriteNeedleResponse) Reset() { *x = FetchAndWriteNeedleResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[43] + mi := &file_volume_server_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2358,7 +4474,7 @@ func (x *FetchAndWriteNeedleResponse) String() string { func (*FetchAndWriteNeedleResponse) ProtoMessage() {} func (x *FetchAndWriteNeedleResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[43] + mi := &file_volume_server_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2371,2120 +4487,6 @@ func (x *FetchAndWriteNeedleResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchAndWriteNeedleResponse.ProtoReflect.Descriptor instead. func (*FetchAndWriteNeedleResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{43} -} - -type VolumeTailSenderRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` - SinceNs uint64 `protobuf:"varint,2,opt,name=since_ns,json=sinceNs,proto3" json:"since_ns,omitempty"` - IdleTimeoutSeconds uint32 `protobuf:"varint,3,opt,name=idle_timeout_seconds,json=idleTimeoutSeconds,proto3" json:"idle_timeout_seconds,omitempty"` -} - -func (x *VolumeTailSenderRequest) Reset() { - *x = VolumeTailSenderRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[44] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeTailSenderRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeTailSenderRequest) ProtoMessage() {} - -func (x *VolumeTailSenderRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[44] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeTailSenderRequest.ProtoReflect.Descriptor instead. -func (*VolumeTailSenderRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{44} -} - -func (x *VolumeTailSenderRequest) GetVolumeId() uint32 { - if x != nil { - return x.VolumeId - } - return 0 -} - -func (x *VolumeTailSenderRequest) GetSinceNs() uint64 { - if x != nil { - return x.SinceNs - } - return 0 -} - -func (x *VolumeTailSenderRequest) GetIdleTimeoutSeconds() uint32 { - if x != nil { - return x.IdleTimeoutSeconds - } - return 0 -} - -type VolumeTailSenderResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NeedleHeader []byte `protobuf:"bytes,1,opt,name=needle_header,json=needleHeader,proto3" json:"needle_header,omitempty"` - NeedleBody []byte `protobuf:"bytes,2,opt,name=needle_body,json=needleBody,proto3" json:"needle_body,omitempty"` - IsLastChunk bool `protobuf:"varint,3,opt,name=is_last_chunk,json=isLastChunk,proto3" json:"is_last_chunk,omitempty"` -} - -func (x *VolumeTailSenderResponse) Reset() { - *x = VolumeTailSenderResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[45] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeTailSenderResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeTailSenderResponse) ProtoMessage() {} - -func (x *VolumeTailSenderResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[45] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeTailSenderResponse.ProtoReflect.Descriptor instead. -func (*VolumeTailSenderResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{45} -} - -func (x *VolumeTailSenderResponse) GetNeedleHeader() []byte { - if x != nil { - return x.NeedleHeader - } - return nil -} - -func (x *VolumeTailSenderResponse) GetNeedleBody() []byte { - if x != nil { - return x.NeedleBody - } - return nil -} - -func (x *VolumeTailSenderResponse) GetIsLastChunk() bool { - if x != nil { - return x.IsLastChunk - } - return false -} - -type VolumeTailReceiverRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` - SinceNs uint64 `protobuf:"varint,2,opt,name=since_ns,json=sinceNs,proto3" json:"since_ns,omitempty"` - IdleTimeoutSeconds uint32 `protobuf:"varint,3,opt,name=idle_timeout_seconds,json=idleTimeoutSeconds,proto3" json:"idle_timeout_seconds,omitempty"` - SourceVolumeServer string `protobuf:"bytes,4,opt,name=source_volume_server,json=sourceVolumeServer,proto3" json:"source_volume_server,omitempty"` -} - -func (x *VolumeTailReceiverRequest) Reset() { - *x = VolumeTailReceiverRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[46] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeTailReceiverRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeTailReceiverRequest) ProtoMessage() {} - -func (x *VolumeTailReceiverRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[46] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeTailReceiverRequest.ProtoReflect.Descriptor instead. -func (*VolumeTailReceiverRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{46} -} - -func (x *VolumeTailReceiverRequest) GetVolumeId() uint32 { - if x != nil { - return x.VolumeId - } - return 0 -} - -func (x *VolumeTailReceiverRequest) GetSinceNs() uint64 { - if x != nil { - return x.SinceNs - } - return 0 -} - -func (x *VolumeTailReceiverRequest) GetIdleTimeoutSeconds() uint32 { - if x != nil { - return x.IdleTimeoutSeconds - } - return 0 -} - -func (x *VolumeTailReceiverRequest) GetSourceVolumeServer() string { - if x != nil { - return x.SourceVolumeServer - } - return "" -} - -type VolumeTailReceiverResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *VolumeTailReceiverResponse) Reset() { - *x = VolumeTailReceiverResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[47] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeTailReceiverResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeTailReceiverResponse) ProtoMessage() {} - -func (x *VolumeTailReceiverResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[47] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeTailReceiverResponse.ProtoReflect.Descriptor instead. -func (*VolumeTailReceiverResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{47} -} - -type VolumeEcShardsGenerateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` - Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` -} - -func (x *VolumeEcShardsGenerateRequest) Reset() { - *x = VolumeEcShardsGenerateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[48] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeEcShardsGenerateRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeEcShardsGenerateRequest) ProtoMessage() {} - -func (x *VolumeEcShardsGenerateRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[48] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeEcShardsGenerateRequest.ProtoReflect.Descriptor instead. -func (*VolumeEcShardsGenerateRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{48} -} - -func (x *VolumeEcShardsGenerateRequest) GetVolumeId() uint32 { - if x != nil { - return x.VolumeId - } - return 0 -} - -func (x *VolumeEcShardsGenerateRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -type VolumeEcShardsGenerateResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *VolumeEcShardsGenerateResponse) Reset() { - *x = VolumeEcShardsGenerateResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[49] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeEcShardsGenerateResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeEcShardsGenerateResponse) ProtoMessage() {} - -func (x *VolumeEcShardsGenerateResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[49] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeEcShardsGenerateResponse.ProtoReflect.Descriptor instead. -func (*VolumeEcShardsGenerateResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{49} -} - -type VolumeEcShardsRebuildRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` - Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` -} - -func (x *VolumeEcShardsRebuildRequest) Reset() { - *x = VolumeEcShardsRebuildRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[50] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeEcShardsRebuildRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeEcShardsRebuildRequest) ProtoMessage() {} - -func (x *VolumeEcShardsRebuildRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[50] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeEcShardsRebuildRequest.ProtoReflect.Descriptor instead. -func (*VolumeEcShardsRebuildRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{50} -} - -func (x *VolumeEcShardsRebuildRequest) GetVolumeId() uint32 { - if x != nil { - return x.VolumeId - } - return 0 -} - -func (x *VolumeEcShardsRebuildRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -type VolumeEcShardsRebuildResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RebuiltShardIds []uint32 `protobuf:"varint,1,rep,packed,name=rebuilt_shard_ids,json=rebuiltShardIds,proto3" json:"rebuilt_shard_ids,omitempty"` -} - -func (x *VolumeEcShardsRebuildResponse) Reset() { - *x = VolumeEcShardsRebuildResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[51] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeEcShardsRebuildResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeEcShardsRebuildResponse) ProtoMessage() {} - -func (x *VolumeEcShardsRebuildResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[51] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeEcShardsRebuildResponse.ProtoReflect.Descriptor instead. -func (*VolumeEcShardsRebuildResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{51} -} - -func (x *VolumeEcShardsRebuildResponse) GetRebuiltShardIds() []uint32 { - if x != nil { - return x.RebuiltShardIds - } - return nil -} - -type VolumeEcShardsCopyRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` - Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` - ShardIds []uint32 `protobuf:"varint,3,rep,packed,name=shard_ids,json=shardIds,proto3" json:"shard_ids,omitempty"` - CopyEcxFile bool `protobuf:"varint,4,opt,name=copy_ecx_file,json=copyEcxFile,proto3" json:"copy_ecx_file,omitempty"` - SourceDataNode string `protobuf:"bytes,5,opt,name=source_data_node,json=sourceDataNode,proto3" json:"source_data_node,omitempty"` - CopyEcjFile bool `protobuf:"varint,6,opt,name=copy_ecj_file,json=copyEcjFile,proto3" json:"copy_ecj_file,omitempty"` - CopyVifFile bool `protobuf:"varint,7,opt,name=copy_vif_file,json=copyVifFile,proto3" json:"copy_vif_file,omitempty"` -} - -func (x *VolumeEcShardsCopyRequest) Reset() { - *x = VolumeEcShardsCopyRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[52] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeEcShardsCopyRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeEcShardsCopyRequest) ProtoMessage() {} - -func (x *VolumeEcShardsCopyRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[52] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeEcShardsCopyRequest.ProtoReflect.Descriptor instead. -func (*VolumeEcShardsCopyRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{52} -} - -func (x *VolumeEcShardsCopyRequest) GetVolumeId() uint32 { - if x != nil { - return x.VolumeId - } - return 0 -} - -func (x *VolumeEcShardsCopyRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *VolumeEcShardsCopyRequest) GetShardIds() []uint32 { - if x != nil { - return x.ShardIds - } - return nil -} - -func (x *VolumeEcShardsCopyRequest) GetCopyEcxFile() bool { - if x != nil { - return x.CopyEcxFile - } - return false -} - -func (x *VolumeEcShardsCopyRequest) GetSourceDataNode() string { - if x != nil { - return x.SourceDataNode - } - return "" -} - -func (x *VolumeEcShardsCopyRequest) GetCopyEcjFile() bool { - if x != nil { - return x.CopyEcjFile - } - return false -} - -func (x *VolumeEcShardsCopyRequest) GetCopyVifFile() bool { - if x != nil { - return x.CopyVifFile - } - return false -} - -type VolumeEcShardsCopyResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *VolumeEcShardsCopyResponse) Reset() { - *x = VolumeEcShardsCopyResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[53] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeEcShardsCopyResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeEcShardsCopyResponse) ProtoMessage() {} - -func (x *VolumeEcShardsCopyResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[53] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeEcShardsCopyResponse.ProtoReflect.Descriptor instead. -func (*VolumeEcShardsCopyResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{53} -} - -type VolumeEcShardsDeleteRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` - Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` - ShardIds []uint32 `protobuf:"varint,3,rep,packed,name=shard_ids,json=shardIds,proto3" json:"shard_ids,omitempty"` -} - -func (x *VolumeEcShardsDeleteRequest) Reset() { - *x = VolumeEcShardsDeleteRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[54] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeEcShardsDeleteRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeEcShardsDeleteRequest) ProtoMessage() {} - -func (x *VolumeEcShardsDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[54] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeEcShardsDeleteRequest.ProtoReflect.Descriptor instead. -func (*VolumeEcShardsDeleteRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{54} -} - -func (x *VolumeEcShardsDeleteRequest) GetVolumeId() uint32 { - if x != nil { - return x.VolumeId - } - return 0 -} - -func (x *VolumeEcShardsDeleteRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *VolumeEcShardsDeleteRequest) GetShardIds() []uint32 { - if x != nil { - return x.ShardIds - } - return nil -} - -type VolumeEcShardsDeleteResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *VolumeEcShardsDeleteResponse) Reset() { - *x = VolumeEcShardsDeleteResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[55] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeEcShardsDeleteResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeEcShardsDeleteResponse) ProtoMessage() {} - -func (x *VolumeEcShardsDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[55] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeEcShardsDeleteResponse.ProtoReflect.Descriptor instead. -func (*VolumeEcShardsDeleteResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{55} -} - -type VolumeEcShardsMountRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` - Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` - ShardIds []uint32 `protobuf:"varint,3,rep,packed,name=shard_ids,json=shardIds,proto3" json:"shard_ids,omitempty"` -} - -func (x *VolumeEcShardsMountRequest) Reset() { - *x = VolumeEcShardsMountRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[56] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeEcShardsMountRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeEcShardsMountRequest) ProtoMessage() {} - -func (x *VolumeEcShardsMountRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[56] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeEcShardsMountRequest.ProtoReflect.Descriptor instead. -func (*VolumeEcShardsMountRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{56} -} - -func (x *VolumeEcShardsMountRequest) GetVolumeId() uint32 { - if x != nil { - return x.VolumeId - } - return 0 -} - -func (x *VolumeEcShardsMountRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *VolumeEcShardsMountRequest) GetShardIds() []uint32 { - if x != nil { - return x.ShardIds - } - return nil -} - -type VolumeEcShardsMountResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *VolumeEcShardsMountResponse) Reset() { - *x = VolumeEcShardsMountResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[57] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeEcShardsMountResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeEcShardsMountResponse) ProtoMessage() {} - -func (x *VolumeEcShardsMountResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[57] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeEcShardsMountResponse.ProtoReflect.Descriptor instead. -func (*VolumeEcShardsMountResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{57} -} - -type VolumeEcShardsUnmountRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` - ShardIds []uint32 `protobuf:"varint,3,rep,packed,name=shard_ids,json=shardIds,proto3" json:"shard_ids,omitempty"` -} - -func (x *VolumeEcShardsUnmountRequest) Reset() { - *x = VolumeEcShardsUnmountRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[58] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeEcShardsUnmountRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeEcShardsUnmountRequest) ProtoMessage() {} - -func (x *VolumeEcShardsUnmountRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[58] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeEcShardsUnmountRequest.ProtoReflect.Descriptor instead. -func (*VolumeEcShardsUnmountRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{58} -} - -func (x *VolumeEcShardsUnmountRequest) GetVolumeId() uint32 { - if x != nil { - return x.VolumeId - } - return 0 -} - -func (x *VolumeEcShardsUnmountRequest) GetShardIds() []uint32 { - if x != nil { - return x.ShardIds - } - return nil -} - -type VolumeEcShardsUnmountResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *VolumeEcShardsUnmountResponse) Reset() { - *x = VolumeEcShardsUnmountResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[59] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeEcShardsUnmountResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeEcShardsUnmountResponse) ProtoMessage() {} - -func (x *VolumeEcShardsUnmountResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[59] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeEcShardsUnmountResponse.ProtoReflect.Descriptor instead. -func (*VolumeEcShardsUnmountResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{59} -} - -type VolumeEcShardReadRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` - ShardId uint32 `protobuf:"varint,2,opt,name=shard_id,json=shardId,proto3" json:"shard_id,omitempty"` - Offset int64 `protobuf:"varint,3,opt,name=offset,proto3" json:"offset,omitempty"` - Size int64 `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"` - FileKey uint64 `protobuf:"varint,5,opt,name=file_key,json=fileKey,proto3" json:"file_key,omitempty"` -} - -func (x *VolumeEcShardReadRequest) Reset() { - *x = VolumeEcShardReadRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[60] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeEcShardReadRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeEcShardReadRequest) ProtoMessage() {} - -func (x *VolumeEcShardReadRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[60] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeEcShardReadRequest.ProtoReflect.Descriptor instead. -func (*VolumeEcShardReadRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{60} -} - -func (x *VolumeEcShardReadRequest) GetVolumeId() uint32 { - if x != nil { - return x.VolumeId - } - return 0 -} - -func (x *VolumeEcShardReadRequest) GetShardId() uint32 { - if x != nil { - return x.ShardId - } - return 0 -} - -func (x *VolumeEcShardReadRequest) GetOffset() int64 { - if x != nil { - return x.Offset - } - return 0 -} - -func (x *VolumeEcShardReadRequest) GetSize() int64 { - if x != nil { - return x.Size - } - return 0 -} - -func (x *VolumeEcShardReadRequest) GetFileKey() uint64 { - if x != nil { - return x.FileKey - } - return 0 -} - -type VolumeEcShardReadResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` - IsDeleted bool `protobuf:"varint,2,opt,name=is_deleted,json=isDeleted,proto3" json:"is_deleted,omitempty"` -} - -func (x *VolumeEcShardReadResponse) Reset() { - *x = VolumeEcShardReadResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[61] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeEcShardReadResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeEcShardReadResponse) ProtoMessage() {} - -func (x *VolumeEcShardReadResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[61] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeEcShardReadResponse.ProtoReflect.Descriptor instead. -func (*VolumeEcShardReadResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{61} -} - -func (x *VolumeEcShardReadResponse) GetData() []byte { - if x != nil { - return x.Data - } - return nil -} - -func (x *VolumeEcShardReadResponse) GetIsDeleted() bool { - if x != nil { - return x.IsDeleted - } - return false -} - -type VolumeEcBlobDeleteRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` - Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` - FileKey uint64 `protobuf:"varint,3,opt,name=file_key,json=fileKey,proto3" json:"file_key,omitempty"` - Version uint32 `protobuf:"varint,4,opt,name=version,proto3" json:"version,omitempty"` -} - -func (x *VolumeEcBlobDeleteRequest) Reset() { - *x = VolumeEcBlobDeleteRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[62] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeEcBlobDeleteRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeEcBlobDeleteRequest) ProtoMessage() {} - -func (x *VolumeEcBlobDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[62] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeEcBlobDeleteRequest.ProtoReflect.Descriptor instead. -func (*VolumeEcBlobDeleteRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{62} -} - -func (x *VolumeEcBlobDeleteRequest) GetVolumeId() uint32 { - if x != nil { - return x.VolumeId - } - return 0 -} - -func (x *VolumeEcBlobDeleteRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *VolumeEcBlobDeleteRequest) GetFileKey() uint64 { - if x != nil { - return x.FileKey - } - return 0 -} - -func (x *VolumeEcBlobDeleteRequest) GetVersion() uint32 { - if x != nil { - return x.Version - } - return 0 -} - -type VolumeEcBlobDeleteResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *VolumeEcBlobDeleteResponse) Reset() { - *x = VolumeEcBlobDeleteResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[63] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeEcBlobDeleteResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeEcBlobDeleteResponse) ProtoMessage() {} - -func (x *VolumeEcBlobDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[63] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeEcBlobDeleteResponse.ProtoReflect.Descriptor instead. -func (*VolumeEcBlobDeleteResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{63} -} - -type VolumeEcShardsToVolumeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` - Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` -} - -func (x *VolumeEcShardsToVolumeRequest) Reset() { - *x = VolumeEcShardsToVolumeRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[64] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeEcShardsToVolumeRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeEcShardsToVolumeRequest) ProtoMessage() {} - -func (x *VolumeEcShardsToVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[64] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeEcShardsToVolumeRequest.ProtoReflect.Descriptor instead. -func (*VolumeEcShardsToVolumeRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{64} -} - -func (x *VolumeEcShardsToVolumeRequest) GetVolumeId() uint32 { - if x != nil { - return x.VolumeId - } - return 0 -} - -func (x *VolumeEcShardsToVolumeRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -type VolumeEcShardsToVolumeResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *VolumeEcShardsToVolumeResponse) Reset() { - *x = VolumeEcShardsToVolumeResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[65] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeEcShardsToVolumeResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeEcShardsToVolumeResponse) ProtoMessage() {} - -func (x *VolumeEcShardsToVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[65] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeEcShardsToVolumeResponse.ProtoReflect.Descriptor instead. -func (*VolumeEcShardsToVolumeResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{65} -} - -type ReadVolumeFileStatusRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` -} - -func (x *ReadVolumeFileStatusRequest) Reset() { - *x = ReadVolumeFileStatusRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[66] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ReadVolumeFileStatusRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ReadVolumeFileStatusRequest) ProtoMessage() {} - -func (x *ReadVolumeFileStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[66] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ReadVolumeFileStatusRequest.ProtoReflect.Descriptor instead. -func (*ReadVolumeFileStatusRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{66} -} - -func (x *ReadVolumeFileStatusRequest) GetVolumeId() uint32 { - if x != nil { - return x.VolumeId - } - return 0 -} - -type ReadVolumeFileStatusResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` - IdxFileTimestampSeconds uint64 `protobuf:"varint,2,opt,name=idx_file_timestamp_seconds,json=idxFileTimestampSeconds,proto3" json:"idx_file_timestamp_seconds,omitempty"` - IdxFileSize uint64 `protobuf:"varint,3,opt,name=idx_file_size,json=idxFileSize,proto3" json:"idx_file_size,omitempty"` - DatFileTimestampSeconds uint64 `protobuf:"varint,4,opt,name=dat_file_timestamp_seconds,json=datFileTimestampSeconds,proto3" json:"dat_file_timestamp_seconds,omitempty"` - DatFileSize uint64 `protobuf:"varint,5,opt,name=dat_file_size,json=datFileSize,proto3" json:"dat_file_size,omitempty"` - FileCount uint64 `protobuf:"varint,6,opt,name=file_count,json=fileCount,proto3" json:"file_count,omitempty"` - CompactionRevision uint32 `protobuf:"varint,7,opt,name=compaction_revision,json=compactionRevision,proto3" json:"compaction_revision,omitempty"` - Collection string `protobuf:"bytes,8,opt,name=collection,proto3" json:"collection,omitempty"` - DiskType string `protobuf:"bytes,9,opt,name=disk_type,json=diskType,proto3" json:"disk_type,omitempty"` -} - -func (x *ReadVolumeFileStatusResponse) Reset() { - *x = ReadVolumeFileStatusResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[67] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ReadVolumeFileStatusResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ReadVolumeFileStatusResponse) ProtoMessage() {} - -func (x *ReadVolumeFileStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[67] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ReadVolumeFileStatusResponse.ProtoReflect.Descriptor instead. -func (*ReadVolumeFileStatusResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{67} -} - -func (x *ReadVolumeFileStatusResponse) GetVolumeId() uint32 { - if x != nil { - return x.VolumeId - } - return 0 -} - -func (x *ReadVolumeFileStatusResponse) GetIdxFileTimestampSeconds() uint64 { - if x != nil { - return x.IdxFileTimestampSeconds - } - return 0 -} - -func (x *ReadVolumeFileStatusResponse) GetIdxFileSize() uint64 { - if x != nil { - return x.IdxFileSize - } - return 0 -} - -func (x *ReadVolumeFileStatusResponse) GetDatFileTimestampSeconds() uint64 { - if x != nil { - return x.DatFileTimestampSeconds - } - return 0 -} - -func (x *ReadVolumeFileStatusResponse) GetDatFileSize() uint64 { - if x != nil { - return x.DatFileSize - } - return 0 -} - -func (x *ReadVolumeFileStatusResponse) GetFileCount() uint64 { - if x != nil { - return x.FileCount - } - return 0 -} - -func (x *ReadVolumeFileStatusResponse) GetCompactionRevision() uint32 { - if x != nil { - return x.CompactionRevision - } - return 0 -} - -func (x *ReadVolumeFileStatusResponse) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *ReadVolumeFileStatusResponse) GetDiskType() string { - if x != nil { - return x.DiskType - } - return "" -} - -type DiskStatus struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Dir string `protobuf:"bytes,1,opt,name=dir,proto3" json:"dir,omitempty"` - All uint64 `protobuf:"varint,2,opt,name=all,proto3" json:"all,omitempty"` - Used uint64 `protobuf:"varint,3,opt,name=used,proto3" json:"used,omitempty"` - Free uint64 `protobuf:"varint,4,opt,name=free,proto3" json:"free,omitempty"` - PercentFree float32 `protobuf:"fixed32,5,opt,name=percent_free,json=percentFree,proto3" json:"percent_free,omitempty"` - PercentUsed float32 `protobuf:"fixed32,6,opt,name=percent_used,json=percentUsed,proto3" json:"percent_used,omitempty"` - DiskType string `protobuf:"bytes,7,opt,name=disk_type,json=diskType,proto3" json:"disk_type,omitempty"` -} - -func (x *DiskStatus) Reset() { - *x = DiskStatus{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[68] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DiskStatus) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DiskStatus) ProtoMessage() {} - -func (x *DiskStatus) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[68] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DiskStatus.ProtoReflect.Descriptor instead. -func (*DiskStatus) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{68} -} - -func (x *DiskStatus) GetDir() string { - if x != nil { - return x.Dir - } - return "" -} - -func (x *DiskStatus) GetAll() uint64 { - if x != nil { - return x.All - } - return 0 -} - -func (x *DiskStatus) GetUsed() uint64 { - if x != nil { - return x.Used - } - return 0 -} - -func (x *DiskStatus) GetFree() uint64 { - if x != nil { - return x.Free - } - return 0 -} - -func (x *DiskStatus) GetPercentFree() float32 { - if x != nil { - return x.PercentFree - } - return 0 -} - -func (x *DiskStatus) GetPercentUsed() float32 { - if x != nil { - return x.PercentUsed - } - return 0 -} - -func (x *DiskStatus) GetDiskType() string { - if x != nil { - return x.DiskType - } - return "" -} - -type MemStatus struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Goroutines int32 `protobuf:"varint,1,opt,name=goroutines,proto3" json:"goroutines,omitempty"` - All uint64 `protobuf:"varint,2,opt,name=all,proto3" json:"all,omitempty"` - Used uint64 `protobuf:"varint,3,opt,name=used,proto3" json:"used,omitempty"` - Free uint64 `protobuf:"varint,4,opt,name=free,proto3" json:"free,omitempty"` - Self uint64 `protobuf:"varint,5,opt,name=self,proto3" json:"self,omitempty"` - Heap uint64 `protobuf:"varint,6,opt,name=heap,proto3" json:"heap,omitempty"` - Stack uint64 `protobuf:"varint,7,opt,name=stack,proto3" json:"stack,omitempty"` -} - -func (x *MemStatus) Reset() { - *x = MemStatus{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[69] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MemStatus) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MemStatus) ProtoMessage() {} - -func (x *MemStatus) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[69] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MemStatus.ProtoReflect.Descriptor instead. -func (*MemStatus) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{69} -} - -func (x *MemStatus) GetGoroutines() int32 { - if x != nil { - return x.Goroutines - } - return 0 -} - -func (x *MemStatus) GetAll() uint64 { - if x != nil { - return x.All - } - return 0 -} - -func (x *MemStatus) GetUsed() uint64 { - if x != nil { - return x.Used - } - return 0 -} - -func (x *MemStatus) GetFree() uint64 { - if x != nil { - return x.Free - } - return 0 -} - -func (x *MemStatus) GetSelf() uint64 { - if x != nil { - return x.Self - } - return 0 -} - -func (x *MemStatus) GetHeap() uint64 { - if x != nil { - return x.Heap - } - return 0 -} - -func (x *MemStatus) GetStack() uint64 { - if x != nil { - return x.Stack - } - return 0 -} - -// tired storage on volume servers -type RemoteFile struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - BackendType string `protobuf:"bytes,1,opt,name=backend_type,json=backendType,proto3" json:"backend_type,omitempty"` - BackendId string `protobuf:"bytes,2,opt,name=backend_id,json=backendId,proto3" json:"backend_id,omitempty"` - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - Offset uint64 `protobuf:"varint,4,opt,name=offset,proto3" json:"offset,omitempty"` - FileSize uint64 `protobuf:"varint,5,opt,name=file_size,json=fileSize,proto3" json:"file_size,omitempty"` - ModifiedTime uint64 `protobuf:"varint,6,opt,name=modified_time,json=modifiedTime,proto3" json:"modified_time,omitempty"` - Extension string `protobuf:"bytes,7,opt,name=extension,proto3" json:"extension,omitempty"` -} - -func (x *RemoteFile) Reset() { - *x = RemoteFile{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[70] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RemoteFile) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RemoteFile) ProtoMessage() {} - -func (x *RemoteFile) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[70] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RemoteFile.ProtoReflect.Descriptor instead. -func (*RemoteFile) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{70} -} - -func (x *RemoteFile) GetBackendType() string { - if x != nil { - return x.BackendType - } - return "" -} - -func (x *RemoteFile) GetBackendId() string { - if x != nil { - return x.BackendId - } - return "" -} - -func (x *RemoteFile) GetKey() string { - if x != nil { - return x.Key - } - return "" -} - -func (x *RemoteFile) GetOffset() uint64 { - if x != nil { - return x.Offset - } - return 0 -} - -func (x *RemoteFile) GetFileSize() uint64 { - if x != nil { - return x.FileSize - } - return 0 -} - -func (x *RemoteFile) GetModifiedTime() uint64 { - if x != nil { - return x.ModifiedTime - } - return 0 -} - -func (x *RemoteFile) GetExtension() string { - if x != nil { - return x.Extension - } - return "" -} - -type VolumeInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Files []*RemoteFile `protobuf:"bytes,1,rep,name=files,proto3" json:"files,omitempty"` - Version uint32 `protobuf:"varint,2,opt,name=version,proto3" json:"version,omitempty"` - Replication string `protobuf:"bytes,3,opt,name=replication,proto3" json:"replication,omitempty"` -} - -func (x *VolumeInfo) Reset() { - *x = VolumeInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[71] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeInfo) ProtoMessage() {} - -func (x *VolumeInfo) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[71] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeInfo.ProtoReflect.Descriptor instead. -func (*VolumeInfo) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{71} -} - -func (x *VolumeInfo) GetFiles() []*RemoteFile { - if x != nil { - return x.Files - } - return nil -} - -func (x *VolumeInfo) GetVersion() uint32 { - if x != nil { - return x.Version - } - return 0 -} - -func (x *VolumeInfo) GetReplication() string { - if x != nil { - return x.Replication - } - return "" -} - -type VolumeTierMoveDatToRemoteRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` - Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` - DestinationBackendName string `protobuf:"bytes,3,opt,name=destination_backend_name,json=destinationBackendName,proto3" json:"destination_backend_name,omitempty"` - KeepLocalDatFile bool `protobuf:"varint,4,opt,name=keep_local_dat_file,json=keepLocalDatFile,proto3" json:"keep_local_dat_file,omitempty"` -} - -func (x *VolumeTierMoveDatToRemoteRequest) Reset() { - *x = VolumeTierMoveDatToRemoteRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[72] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeTierMoveDatToRemoteRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeTierMoveDatToRemoteRequest) ProtoMessage() {} - -func (x *VolumeTierMoveDatToRemoteRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[72] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeTierMoveDatToRemoteRequest.ProtoReflect.Descriptor instead. -func (*VolumeTierMoveDatToRemoteRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{72} -} - -func (x *VolumeTierMoveDatToRemoteRequest) GetVolumeId() uint32 { - if x != nil { - return x.VolumeId - } - return 0 -} - -func (x *VolumeTierMoveDatToRemoteRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *VolumeTierMoveDatToRemoteRequest) GetDestinationBackendName() string { - if x != nil { - return x.DestinationBackendName - } - return "" -} - -func (x *VolumeTierMoveDatToRemoteRequest) GetKeepLocalDatFile() bool { - if x != nil { - return x.KeepLocalDatFile - } - return false -} - -type VolumeTierMoveDatToRemoteResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Processed int64 `protobuf:"varint,1,opt,name=processed,proto3" json:"processed,omitempty"` - ProcessedPercentage float32 `protobuf:"fixed32,2,opt,name=processedPercentage,proto3" json:"processedPercentage,omitempty"` -} - -func (x *VolumeTierMoveDatToRemoteResponse) Reset() { - *x = VolumeTierMoveDatToRemoteResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[73] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeTierMoveDatToRemoteResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeTierMoveDatToRemoteResponse) ProtoMessage() {} - -func (x *VolumeTierMoveDatToRemoteResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[73] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeTierMoveDatToRemoteResponse.ProtoReflect.Descriptor instead. -func (*VolumeTierMoveDatToRemoteResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{73} -} - -func (x *VolumeTierMoveDatToRemoteResponse) GetProcessed() int64 { - if x != nil { - return x.Processed - } - return 0 -} - -func (x *VolumeTierMoveDatToRemoteResponse) GetProcessedPercentage() float32 { - if x != nil { - return x.ProcessedPercentage - } - return 0 -} - -type VolumeTierMoveDatFromRemoteRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` - Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` - KeepRemoteDatFile bool `protobuf:"varint,3,opt,name=keep_remote_dat_file,json=keepRemoteDatFile,proto3" json:"keep_remote_dat_file,omitempty"` -} - -func (x *VolumeTierMoveDatFromRemoteRequest) Reset() { - *x = VolumeTierMoveDatFromRemoteRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[74] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeTierMoveDatFromRemoteRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeTierMoveDatFromRemoteRequest) ProtoMessage() {} - -func (x *VolumeTierMoveDatFromRemoteRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[74] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeTierMoveDatFromRemoteRequest.ProtoReflect.Descriptor instead. -func (*VolumeTierMoveDatFromRemoteRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{74} -} - -func (x *VolumeTierMoveDatFromRemoteRequest) GetVolumeId() uint32 { - if x != nil { - return x.VolumeId - } - return 0 -} - -func (x *VolumeTierMoveDatFromRemoteRequest) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *VolumeTierMoveDatFromRemoteRequest) GetKeepRemoteDatFile() bool { - if x != nil { - return x.KeepRemoteDatFile - } - return false -} - -type VolumeTierMoveDatFromRemoteResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Processed int64 `protobuf:"varint,1,opt,name=processed,proto3" json:"processed,omitempty"` - ProcessedPercentage float32 `protobuf:"fixed32,2,opt,name=processedPercentage,proto3" json:"processedPercentage,omitempty"` -} - -func (x *VolumeTierMoveDatFromRemoteResponse) Reset() { - *x = VolumeTierMoveDatFromRemoteResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[75] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeTierMoveDatFromRemoteResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeTierMoveDatFromRemoteResponse) ProtoMessage() {} - -func (x *VolumeTierMoveDatFromRemoteResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[75] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeTierMoveDatFromRemoteResponse.ProtoReflect.Descriptor instead. -func (*VolumeTierMoveDatFromRemoteResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{75} -} - -func (x *VolumeTierMoveDatFromRemoteResponse) GetProcessed() int64 { - if x != nil { - return x.Processed - } - return 0 -} - -func (x *VolumeTierMoveDatFromRemoteResponse) GetProcessedPercentage() float32 { - if x != nil { - return x.ProcessedPercentage - } - return 0 -} - -type VolumeServerStatusRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *VolumeServerStatusRequest) Reset() { - *x = VolumeServerStatusRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[76] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeServerStatusRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeServerStatusRequest) ProtoMessage() {} - -func (x *VolumeServerStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[76] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeServerStatusRequest.ProtoReflect.Descriptor instead. -func (*VolumeServerStatusRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{76} -} - -type VolumeServerStatusResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DiskStatuses []*DiskStatus `protobuf:"bytes,1,rep,name=disk_statuses,json=diskStatuses,proto3" json:"disk_statuses,omitempty"` - MemoryStatus *MemStatus `protobuf:"bytes,2,opt,name=memory_status,json=memoryStatus,proto3" json:"memory_status,omitempty"` -} - -func (x *VolumeServerStatusResponse) Reset() { - *x = VolumeServerStatusResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[77] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeServerStatusResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeServerStatusResponse) ProtoMessage() {} - -func (x *VolumeServerStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[77] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeServerStatusResponse.ProtoReflect.Descriptor instead. -func (*VolumeServerStatusResponse) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{77} -} - -func (x *VolumeServerStatusResponse) GetDiskStatuses() []*DiskStatus { - if x != nil { - return x.DiskStatuses - } - return nil -} - -func (x *VolumeServerStatusResponse) GetMemoryStatus() *MemStatus { - if x != nil { - return x.MemoryStatus - } - return nil -} - -type VolumeServerLeaveRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *VolumeServerLeaveRequest) Reset() { - *x = VolumeServerLeaveRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[78] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeServerLeaveRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeServerLeaveRequest) ProtoMessage() {} - -func (x *VolumeServerLeaveRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[78] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeServerLeaveRequest.ProtoReflect.Descriptor instead. -func (*VolumeServerLeaveRequest) Descriptor() ([]byte, []int) { - return file_volume_server_proto_rawDescGZIP(), []int{78} -} - -type VolumeServerLeaveResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *VolumeServerLeaveResponse) Reset() { - *x = VolumeServerLeaveResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[79] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VolumeServerLeaveResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VolumeServerLeaveResponse) ProtoMessage() {} - -func (x *VolumeServerLeaveResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[79] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VolumeServerLeaveResponse.ProtoReflect.Descriptor instead. -func (*VolumeServerLeaveResponse) Descriptor() ([]byte, []int) { return file_volume_server_proto_rawDescGZIP(), []int{79} } @@ -5460,33 +5462,6 @@ var file_volume_server_proto_rawDesc = []byte{ 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x22, 0x19, 0x0a, 0x17, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8e, 0x03, 0x0a, 0x1a, 0x46, 0x65, 0x74, - 0x63, 0x68, 0x41, 0x6e, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x22, 0x0a, 0x0d, 0x73, 0x33, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x33, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x33, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x33, 0x53, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x72, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x33, 0x52, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x33, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x33, 0x45, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, - 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x22, 0x1d, 0x0a, 0x1b, 0x46, 0x65, 0x74, - 0x63, 0x68, 0x41, 0x6e, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x83, 0x01, 0x0a, 0x17, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, @@ -5740,6 +5715,33 @@ var file_volume_server_proto_rawDesc = []byte{ 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x1b, 0x0a, 0x19, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8e, 0x03, 0x0a, 0x1a, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x6e, + 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x08, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x73, + 0x33, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x73, 0x33, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, + 0x22, 0x0a, 0x0d, 0x73, 0x33, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x33, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x4b, 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x33, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x33, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x33, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x4b, 0x65, 0x79, 0x22, 0x1d, 0x0a, 0x1b, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x6e, + 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf8, 0x0c, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x6c, 0x65, 0x63, @@ -6004,127 +6006,127 @@ var file_volume_server_proto_rawDesc = []byte{ 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x74, 0x0a, 0x13, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x12, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, - 0x6e, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x10, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, - 0x61, 0x69, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, + 0x6d, 0x0a, 0x10, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, + 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, + 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x71, + 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x72, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, - 0x69, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, - 0x69, 0x6c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x16, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x12, 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, - 0x2e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, 0x70, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, - 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, 0x70, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x14, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, - 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2d, 0x2e, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x76, + 0x69, 0x6c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x7d, 0x0a, 0x16, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x2e, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, - 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, - 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, - 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x73, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x2e, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x55, - 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x55, - 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x70, 0x0a, 0x11, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x61, 0x64, 0x12, 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, - 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x42, 0x6c, - 0x6f, 0x62, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x45, 0x63, 0x42, 0x6c, 0x6f, 0x62, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, - 0x63, 0x42, 0x6c, 0x6f, 0x62, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x16, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, - 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x54, 0x6f, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, - 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x7a, 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x73, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x2e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x12, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, + 0x70, 0x79, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, 0x70, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x54, 0x6f, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x30, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x73, 0x54, 0x6f, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x88, 0x01, 0x0a, 0x19, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, - 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x12, 0x32, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, - 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x73, 0x43, 0x6f, 0x70, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x77, 0x0a, 0x14, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x54, 0x6f, 0x52, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x8e, 0x01, 0x0a, 0x1b, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, - 0x76, 0x65, 0x44, 0x61, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, - 0x34, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x4d, + 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, + 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, + 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x11, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x61, 0x64, 0x12, + 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x61, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x71, 0x0a, 0x12, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x42, 0x6c, 0x6f, 0x62, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x42, 0x6c, + 0x6f, 0x62, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x42, 0x6c, 0x6f, 0x62, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x7d, 0x0a, 0x16, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x54, 0x6f, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x54, 0x6f, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x54, 0x6f, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x88, + 0x01, 0x0a, 0x19, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, + 0x65, 0x44, 0x61, 0x74, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x32, 0x2e, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, + 0x74, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x33, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, + 0x76, 0x65, 0x44, 0x61, 0x74, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x8e, 0x01, 0x0a, 0x1b, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x46, + 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x34, 0x2e, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x46, 0x72, + 0x6f, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x35, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, - 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x11, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, + 0x11, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, 0x65, 0x61, + 0x76, 0x65, 0x12, 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, + 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, 0x65, + 0x61, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, + 0x13, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, + 0x65, 0x64, 0x6c, 0x65, 0x12, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, @@ -6200,44 +6202,44 @@ var file_volume_server_proto_goTypes = []interface{}{ (*ReadNeedleBlobResponse)(nil), // 39: volume_server_pb.ReadNeedleBlobResponse (*WriteNeedleBlobRequest)(nil), // 40: volume_server_pb.WriteNeedleBlobRequest (*WriteNeedleBlobResponse)(nil), // 41: volume_server_pb.WriteNeedleBlobResponse - (*FetchAndWriteNeedleRequest)(nil), // 42: volume_server_pb.FetchAndWriteNeedleRequest - (*FetchAndWriteNeedleResponse)(nil), // 43: volume_server_pb.FetchAndWriteNeedleResponse - (*VolumeTailSenderRequest)(nil), // 44: volume_server_pb.VolumeTailSenderRequest - (*VolumeTailSenderResponse)(nil), // 45: volume_server_pb.VolumeTailSenderResponse - (*VolumeTailReceiverRequest)(nil), // 46: volume_server_pb.VolumeTailReceiverRequest - (*VolumeTailReceiverResponse)(nil), // 47: volume_server_pb.VolumeTailReceiverResponse - (*VolumeEcShardsGenerateRequest)(nil), // 48: volume_server_pb.VolumeEcShardsGenerateRequest - (*VolumeEcShardsGenerateResponse)(nil), // 49: volume_server_pb.VolumeEcShardsGenerateResponse - (*VolumeEcShardsRebuildRequest)(nil), // 50: volume_server_pb.VolumeEcShardsRebuildRequest - (*VolumeEcShardsRebuildResponse)(nil), // 51: volume_server_pb.VolumeEcShardsRebuildResponse - (*VolumeEcShardsCopyRequest)(nil), // 52: volume_server_pb.VolumeEcShardsCopyRequest - (*VolumeEcShardsCopyResponse)(nil), // 53: volume_server_pb.VolumeEcShardsCopyResponse - (*VolumeEcShardsDeleteRequest)(nil), // 54: volume_server_pb.VolumeEcShardsDeleteRequest - (*VolumeEcShardsDeleteResponse)(nil), // 55: volume_server_pb.VolumeEcShardsDeleteResponse - (*VolumeEcShardsMountRequest)(nil), // 56: volume_server_pb.VolumeEcShardsMountRequest - (*VolumeEcShardsMountResponse)(nil), // 57: volume_server_pb.VolumeEcShardsMountResponse - (*VolumeEcShardsUnmountRequest)(nil), // 58: volume_server_pb.VolumeEcShardsUnmountRequest - (*VolumeEcShardsUnmountResponse)(nil), // 59: volume_server_pb.VolumeEcShardsUnmountResponse - (*VolumeEcShardReadRequest)(nil), // 60: volume_server_pb.VolumeEcShardReadRequest - (*VolumeEcShardReadResponse)(nil), // 61: volume_server_pb.VolumeEcShardReadResponse - (*VolumeEcBlobDeleteRequest)(nil), // 62: volume_server_pb.VolumeEcBlobDeleteRequest - (*VolumeEcBlobDeleteResponse)(nil), // 63: volume_server_pb.VolumeEcBlobDeleteResponse - (*VolumeEcShardsToVolumeRequest)(nil), // 64: volume_server_pb.VolumeEcShardsToVolumeRequest - (*VolumeEcShardsToVolumeResponse)(nil), // 65: volume_server_pb.VolumeEcShardsToVolumeResponse - (*ReadVolumeFileStatusRequest)(nil), // 66: volume_server_pb.ReadVolumeFileStatusRequest - (*ReadVolumeFileStatusResponse)(nil), // 67: volume_server_pb.ReadVolumeFileStatusResponse - (*DiskStatus)(nil), // 68: volume_server_pb.DiskStatus - (*MemStatus)(nil), // 69: volume_server_pb.MemStatus - (*RemoteFile)(nil), // 70: volume_server_pb.RemoteFile - (*VolumeInfo)(nil), // 71: volume_server_pb.VolumeInfo - (*VolumeTierMoveDatToRemoteRequest)(nil), // 72: volume_server_pb.VolumeTierMoveDatToRemoteRequest - (*VolumeTierMoveDatToRemoteResponse)(nil), // 73: volume_server_pb.VolumeTierMoveDatToRemoteResponse - (*VolumeTierMoveDatFromRemoteRequest)(nil), // 74: volume_server_pb.VolumeTierMoveDatFromRemoteRequest - (*VolumeTierMoveDatFromRemoteResponse)(nil), // 75: volume_server_pb.VolumeTierMoveDatFromRemoteResponse - (*VolumeServerStatusRequest)(nil), // 76: volume_server_pb.VolumeServerStatusRequest - (*VolumeServerStatusResponse)(nil), // 77: volume_server_pb.VolumeServerStatusResponse - (*VolumeServerLeaveRequest)(nil), // 78: volume_server_pb.VolumeServerLeaveRequest - (*VolumeServerLeaveResponse)(nil), // 79: volume_server_pb.VolumeServerLeaveResponse + (*VolumeTailSenderRequest)(nil), // 42: volume_server_pb.VolumeTailSenderRequest + (*VolumeTailSenderResponse)(nil), // 43: volume_server_pb.VolumeTailSenderResponse + (*VolumeTailReceiverRequest)(nil), // 44: volume_server_pb.VolumeTailReceiverRequest + (*VolumeTailReceiverResponse)(nil), // 45: volume_server_pb.VolumeTailReceiverResponse + (*VolumeEcShardsGenerateRequest)(nil), // 46: volume_server_pb.VolumeEcShardsGenerateRequest + (*VolumeEcShardsGenerateResponse)(nil), // 47: volume_server_pb.VolumeEcShardsGenerateResponse + (*VolumeEcShardsRebuildRequest)(nil), // 48: volume_server_pb.VolumeEcShardsRebuildRequest + (*VolumeEcShardsRebuildResponse)(nil), // 49: volume_server_pb.VolumeEcShardsRebuildResponse + (*VolumeEcShardsCopyRequest)(nil), // 50: volume_server_pb.VolumeEcShardsCopyRequest + (*VolumeEcShardsCopyResponse)(nil), // 51: volume_server_pb.VolumeEcShardsCopyResponse + (*VolumeEcShardsDeleteRequest)(nil), // 52: volume_server_pb.VolumeEcShardsDeleteRequest + (*VolumeEcShardsDeleteResponse)(nil), // 53: volume_server_pb.VolumeEcShardsDeleteResponse + (*VolumeEcShardsMountRequest)(nil), // 54: volume_server_pb.VolumeEcShardsMountRequest + (*VolumeEcShardsMountResponse)(nil), // 55: volume_server_pb.VolumeEcShardsMountResponse + (*VolumeEcShardsUnmountRequest)(nil), // 56: volume_server_pb.VolumeEcShardsUnmountRequest + (*VolumeEcShardsUnmountResponse)(nil), // 57: volume_server_pb.VolumeEcShardsUnmountResponse + (*VolumeEcShardReadRequest)(nil), // 58: volume_server_pb.VolumeEcShardReadRequest + (*VolumeEcShardReadResponse)(nil), // 59: volume_server_pb.VolumeEcShardReadResponse + (*VolumeEcBlobDeleteRequest)(nil), // 60: volume_server_pb.VolumeEcBlobDeleteRequest + (*VolumeEcBlobDeleteResponse)(nil), // 61: volume_server_pb.VolumeEcBlobDeleteResponse + (*VolumeEcShardsToVolumeRequest)(nil), // 62: volume_server_pb.VolumeEcShardsToVolumeRequest + (*VolumeEcShardsToVolumeResponse)(nil), // 63: volume_server_pb.VolumeEcShardsToVolumeResponse + (*ReadVolumeFileStatusRequest)(nil), // 64: volume_server_pb.ReadVolumeFileStatusRequest + (*ReadVolumeFileStatusResponse)(nil), // 65: volume_server_pb.ReadVolumeFileStatusResponse + (*DiskStatus)(nil), // 66: volume_server_pb.DiskStatus + (*MemStatus)(nil), // 67: volume_server_pb.MemStatus + (*RemoteFile)(nil), // 68: volume_server_pb.RemoteFile + (*VolumeInfo)(nil), // 69: volume_server_pb.VolumeInfo + (*VolumeTierMoveDatToRemoteRequest)(nil), // 70: volume_server_pb.VolumeTierMoveDatToRemoteRequest + (*VolumeTierMoveDatToRemoteResponse)(nil), // 71: volume_server_pb.VolumeTierMoveDatToRemoteResponse + (*VolumeTierMoveDatFromRemoteRequest)(nil), // 72: volume_server_pb.VolumeTierMoveDatFromRemoteRequest + (*VolumeTierMoveDatFromRemoteResponse)(nil), // 73: volume_server_pb.VolumeTierMoveDatFromRemoteResponse + (*VolumeServerStatusRequest)(nil), // 74: volume_server_pb.VolumeServerStatusRequest + (*VolumeServerStatusResponse)(nil), // 75: volume_server_pb.VolumeServerStatusResponse + (*VolumeServerLeaveRequest)(nil), // 76: volume_server_pb.VolumeServerLeaveRequest + (*VolumeServerLeaveResponse)(nil), // 77: volume_server_pb.VolumeServerLeaveResponse + (*FetchAndWriteNeedleRequest)(nil), // 78: volume_server_pb.FetchAndWriteNeedleRequest + (*FetchAndWriteNeedleResponse)(nil), // 79: volume_server_pb.FetchAndWriteNeedleResponse (*QueryRequest)(nil), // 80: volume_server_pb.QueryRequest (*QueriedStripe)(nil), // 81: volume_server_pb.QueriedStripe (*VolumeNeedleStatusRequest)(nil), // 82: volume_server_pb.VolumeNeedleStatusRequest @@ -6253,9 +6255,9 @@ var file_volume_server_proto_goTypes = []interface{}{ } var file_volume_server_proto_depIdxs = []int32{ 2, // 0: volume_server_pb.BatchDeleteResponse.results:type_name -> volume_server_pb.DeleteResult - 70, // 1: volume_server_pb.VolumeInfo.files:type_name -> volume_server_pb.RemoteFile - 68, // 2: volume_server_pb.VolumeServerStatusResponse.disk_statuses:type_name -> volume_server_pb.DiskStatus - 69, // 3: volume_server_pb.VolumeServerStatusResponse.memory_status:type_name -> volume_server_pb.MemStatus + 68, // 1: volume_server_pb.VolumeInfo.files:type_name -> volume_server_pb.RemoteFile + 66, // 2: volume_server_pb.VolumeServerStatusResponse.disk_statuses:type_name -> volume_server_pb.DiskStatus + 67, // 3: volume_server_pb.VolumeServerStatusResponse.memory_status:type_name -> volume_server_pb.MemStatus 84, // 4: volume_server_pb.QueryRequest.filter:type_name -> volume_server_pb.QueryRequest.Filter 85, // 5: volume_server_pb.QueryRequest.input_serialization:type_name -> volume_server_pb.QueryRequest.InputSerialization 86, // 6: volume_server_pb.QueryRequest.output_serialization:type_name -> volume_server_pb.QueryRequest.OutputSerialization @@ -6281,26 +6283,26 @@ var file_volume_server_proto_depIdxs = []int32{ 30, // 26: volume_server_pb.VolumeServer.VolumeConfigure:input_type -> volume_server_pb.VolumeConfigureRequest 32, // 27: volume_server_pb.VolumeServer.VolumeStatus:input_type -> volume_server_pb.VolumeStatusRequest 34, // 28: volume_server_pb.VolumeServer.VolumeCopy:input_type -> volume_server_pb.VolumeCopyRequest - 66, // 29: volume_server_pb.VolumeServer.ReadVolumeFileStatus:input_type -> volume_server_pb.ReadVolumeFileStatusRequest + 64, // 29: volume_server_pb.VolumeServer.ReadVolumeFileStatus:input_type -> volume_server_pb.ReadVolumeFileStatusRequest 36, // 30: volume_server_pb.VolumeServer.CopyFile:input_type -> volume_server_pb.CopyFileRequest 38, // 31: volume_server_pb.VolumeServer.ReadNeedleBlob:input_type -> volume_server_pb.ReadNeedleBlobRequest 40, // 32: volume_server_pb.VolumeServer.WriteNeedleBlob:input_type -> volume_server_pb.WriteNeedleBlobRequest - 42, // 33: volume_server_pb.VolumeServer.FetchAndWriteNeedle:input_type -> volume_server_pb.FetchAndWriteNeedleRequest - 44, // 34: volume_server_pb.VolumeServer.VolumeTailSender:input_type -> volume_server_pb.VolumeTailSenderRequest - 46, // 35: volume_server_pb.VolumeServer.VolumeTailReceiver:input_type -> volume_server_pb.VolumeTailReceiverRequest - 48, // 36: volume_server_pb.VolumeServer.VolumeEcShardsGenerate:input_type -> volume_server_pb.VolumeEcShardsGenerateRequest - 50, // 37: volume_server_pb.VolumeServer.VolumeEcShardsRebuild:input_type -> volume_server_pb.VolumeEcShardsRebuildRequest - 52, // 38: volume_server_pb.VolumeServer.VolumeEcShardsCopy:input_type -> volume_server_pb.VolumeEcShardsCopyRequest - 54, // 39: volume_server_pb.VolumeServer.VolumeEcShardsDelete:input_type -> volume_server_pb.VolumeEcShardsDeleteRequest - 56, // 40: volume_server_pb.VolumeServer.VolumeEcShardsMount:input_type -> volume_server_pb.VolumeEcShardsMountRequest - 58, // 41: volume_server_pb.VolumeServer.VolumeEcShardsUnmount:input_type -> volume_server_pb.VolumeEcShardsUnmountRequest - 60, // 42: volume_server_pb.VolumeServer.VolumeEcShardRead:input_type -> volume_server_pb.VolumeEcShardReadRequest - 62, // 43: volume_server_pb.VolumeServer.VolumeEcBlobDelete:input_type -> volume_server_pb.VolumeEcBlobDeleteRequest - 64, // 44: volume_server_pb.VolumeServer.VolumeEcShardsToVolume:input_type -> volume_server_pb.VolumeEcShardsToVolumeRequest - 72, // 45: volume_server_pb.VolumeServer.VolumeTierMoveDatToRemote:input_type -> volume_server_pb.VolumeTierMoveDatToRemoteRequest - 74, // 46: volume_server_pb.VolumeServer.VolumeTierMoveDatFromRemote:input_type -> volume_server_pb.VolumeTierMoveDatFromRemoteRequest - 76, // 47: volume_server_pb.VolumeServer.VolumeServerStatus:input_type -> volume_server_pb.VolumeServerStatusRequest - 78, // 48: volume_server_pb.VolumeServer.VolumeServerLeave:input_type -> volume_server_pb.VolumeServerLeaveRequest + 42, // 33: volume_server_pb.VolumeServer.VolumeTailSender:input_type -> volume_server_pb.VolumeTailSenderRequest + 44, // 34: volume_server_pb.VolumeServer.VolumeTailReceiver:input_type -> volume_server_pb.VolumeTailReceiverRequest + 46, // 35: volume_server_pb.VolumeServer.VolumeEcShardsGenerate:input_type -> volume_server_pb.VolumeEcShardsGenerateRequest + 48, // 36: volume_server_pb.VolumeServer.VolumeEcShardsRebuild:input_type -> volume_server_pb.VolumeEcShardsRebuildRequest + 50, // 37: volume_server_pb.VolumeServer.VolumeEcShardsCopy:input_type -> volume_server_pb.VolumeEcShardsCopyRequest + 52, // 38: volume_server_pb.VolumeServer.VolumeEcShardsDelete:input_type -> volume_server_pb.VolumeEcShardsDeleteRequest + 54, // 39: volume_server_pb.VolumeServer.VolumeEcShardsMount:input_type -> volume_server_pb.VolumeEcShardsMountRequest + 56, // 40: volume_server_pb.VolumeServer.VolumeEcShardsUnmount:input_type -> volume_server_pb.VolumeEcShardsUnmountRequest + 58, // 41: volume_server_pb.VolumeServer.VolumeEcShardRead:input_type -> volume_server_pb.VolumeEcShardReadRequest + 60, // 42: volume_server_pb.VolumeServer.VolumeEcBlobDelete:input_type -> volume_server_pb.VolumeEcBlobDeleteRequest + 62, // 43: volume_server_pb.VolumeServer.VolumeEcShardsToVolume:input_type -> volume_server_pb.VolumeEcShardsToVolumeRequest + 70, // 44: volume_server_pb.VolumeServer.VolumeTierMoveDatToRemote:input_type -> volume_server_pb.VolumeTierMoveDatToRemoteRequest + 72, // 45: volume_server_pb.VolumeServer.VolumeTierMoveDatFromRemote:input_type -> volume_server_pb.VolumeTierMoveDatFromRemoteRequest + 74, // 46: volume_server_pb.VolumeServer.VolumeServerStatus:input_type -> volume_server_pb.VolumeServerStatusRequest + 76, // 47: volume_server_pb.VolumeServer.VolumeServerLeave:input_type -> volume_server_pb.VolumeServerLeaveRequest + 78, // 48: volume_server_pb.VolumeServer.FetchAndWriteNeedle:input_type -> volume_server_pb.FetchAndWriteNeedleRequest 80, // 49: volume_server_pb.VolumeServer.Query:input_type -> volume_server_pb.QueryRequest 82, // 50: volume_server_pb.VolumeServer.VolumeNeedleStatus:input_type -> volume_server_pb.VolumeNeedleStatusRequest 1, // 51: volume_server_pb.VolumeServer.BatchDelete:output_type -> volume_server_pb.BatchDeleteResponse @@ -6320,26 +6322,26 @@ var file_volume_server_proto_depIdxs = []int32{ 31, // 65: volume_server_pb.VolumeServer.VolumeConfigure:output_type -> volume_server_pb.VolumeConfigureResponse 33, // 66: volume_server_pb.VolumeServer.VolumeStatus:output_type -> volume_server_pb.VolumeStatusResponse 35, // 67: volume_server_pb.VolumeServer.VolumeCopy:output_type -> volume_server_pb.VolumeCopyResponse - 67, // 68: volume_server_pb.VolumeServer.ReadVolumeFileStatus:output_type -> volume_server_pb.ReadVolumeFileStatusResponse + 65, // 68: volume_server_pb.VolumeServer.ReadVolumeFileStatus:output_type -> volume_server_pb.ReadVolumeFileStatusResponse 37, // 69: volume_server_pb.VolumeServer.CopyFile:output_type -> volume_server_pb.CopyFileResponse 39, // 70: volume_server_pb.VolumeServer.ReadNeedleBlob:output_type -> volume_server_pb.ReadNeedleBlobResponse 41, // 71: volume_server_pb.VolumeServer.WriteNeedleBlob:output_type -> volume_server_pb.WriteNeedleBlobResponse - 43, // 72: volume_server_pb.VolumeServer.FetchAndWriteNeedle:output_type -> volume_server_pb.FetchAndWriteNeedleResponse - 45, // 73: volume_server_pb.VolumeServer.VolumeTailSender:output_type -> volume_server_pb.VolumeTailSenderResponse - 47, // 74: volume_server_pb.VolumeServer.VolumeTailReceiver:output_type -> volume_server_pb.VolumeTailReceiverResponse - 49, // 75: volume_server_pb.VolumeServer.VolumeEcShardsGenerate:output_type -> volume_server_pb.VolumeEcShardsGenerateResponse - 51, // 76: volume_server_pb.VolumeServer.VolumeEcShardsRebuild:output_type -> volume_server_pb.VolumeEcShardsRebuildResponse - 53, // 77: volume_server_pb.VolumeServer.VolumeEcShardsCopy:output_type -> volume_server_pb.VolumeEcShardsCopyResponse - 55, // 78: volume_server_pb.VolumeServer.VolumeEcShardsDelete:output_type -> volume_server_pb.VolumeEcShardsDeleteResponse - 57, // 79: volume_server_pb.VolumeServer.VolumeEcShardsMount:output_type -> volume_server_pb.VolumeEcShardsMountResponse - 59, // 80: volume_server_pb.VolumeServer.VolumeEcShardsUnmount:output_type -> volume_server_pb.VolumeEcShardsUnmountResponse - 61, // 81: volume_server_pb.VolumeServer.VolumeEcShardRead:output_type -> volume_server_pb.VolumeEcShardReadResponse - 63, // 82: volume_server_pb.VolumeServer.VolumeEcBlobDelete:output_type -> volume_server_pb.VolumeEcBlobDeleteResponse - 65, // 83: volume_server_pb.VolumeServer.VolumeEcShardsToVolume:output_type -> volume_server_pb.VolumeEcShardsToVolumeResponse - 73, // 84: volume_server_pb.VolumeServer.VolumeTierMoveDatToRemote:output_type -> volume_server_pb.VolumeTierMoveDatToRemoteResponse - 75, // 85: volume_server_pb.VolumeServer.VolumeTierMoveDatFromRemote:output_type -> volume_server_pb.VolumeTierMoveDatFromRemoteResponse - 77, // 86: volume_server_pb.VolumeServer.VolumeServerStatus:output_type -> volume_server_pb.VolumeServerStatusResponse - 79, // 87: volume_server_pb.VolumeServer.VolumeServerLeave:output_type -> volume_server_pb.VolumeServerLeaveResponse + 43, // 72: volume_server_pb.VolumeServer.VolumeTailSender:output_type -> volume_server_pb.VolumeTailSenderResponse + 45, // 73: volume_server_pb.VolumeServer.VolumeTailReceiver:output_type -> volume_server_pb.VolumeTailReceiverResponse + 47, // 74: volume_server_pb.VolumeServer.VolumeEcShardsGenerate:output_type -> volume_server_pb.VolumeEcShardsGenerateResponse + 49, // 75: volume_server_pb.VolumeServer.VolumeEcShardsRebuild:output_type -> volume_server_pb.VolumeEcShardsRebuildResponse + 51, // 76: volume_server_pb.VolumeServer.VolumeEcShardsCopy:output_type -> volume_server_pb.VolumeEcShardsCopyResponse + 53, // 77: volume_server_pb.VolumeServer.VolumeEcShardsDelete:output_type -> volume_server_pb.VolumeEcShardsDeleteResponse + 55, // 78: volume_server_pb.VolumeServer.VolumeEcShardsMount:output_type -> volume_server_pb.VolumeEcShardsMountResponse + 57, // 79: volume_server_pb.VolumeServer.VolumeEcShardsUnmount:output_type -> volume_server_pb.VolumeEcShardsUnmountResponse + 59, // 80: volume_server_pb.VolumeServer.VolumeEcShardRead:output_type -> volume_server_pb.VolumeEcShardReadResponse + 61, // 81: volume_server_pb.VolumeServer.VolumeEcBlobDelete:output_type -> volume_server_pb.VolumeEcBlobDeleteResponse + 63, // 82: volume_server_pb.VolumeServer.VolumeEcShardsToVolume:output_type -> volume_server_pb.VolumeEcShardsToVolumeResponse + 71, // 83: volume_server_pb.VolumeServer.VolumeTierMoveDatToRemote:output_type -> volume_server_pb.VolumeTierMoveDatToRemoteResponse + 73, // 84: volume_server_pb.VolumeServer.VolumeTierMoveDatFromRemote:output_type -> volume_server_pb.VolumeTierMoveDatFromRemoteResponse + 75, // 85: volume_server_pb.VolumeServer.VolumeServerStatus:output_type -> volume_server_pb.VolumeServerStatusResponse + 77, // 86: volume_server_pb.VolumeServer.VolumeServerLeave:output_type -> volume_server_pb.VolumeServerLeaveResponse + 79, // 87: volume_server_pb.VolumeServer.FetchAndWriteNeedle:output_type -> volume_server_pb.FetchAndWriteNeedleResponse 81, // 88: volume_server_pb.VolumeServer.Query:output_type -> volume_server_pb.QueriedStripe 83, // 89: volume_server_pb.VolumeServer.VolumeNeedleStatus:output_type -> volume_server_pb.VolumeNeedleStatusResponse 51, // [51:90] is the sub-list for method output_type @@ -6860,30 +6862,6 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FetchAndWriteNeedleRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_volume_server_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FetchAndWriteNeedleResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_volume_server_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeTailSenderRequest); i { case 0: return &v.state @@ -6895,7 +6873,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeTailSenderResponse); i { case 0: return &v.state @@ -6907,7 +6885,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeTailReceiverRequest); i { case 0: return &v.state @@ -6919,7 +6897,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeTailReceiverResponse); i { case 0: return &v.state @@ -6931,7 +6909,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeEcShardsGenerateRequest); i { case 0: return &v.state @@ -6943,7 +6921,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeEcShardsGenerateResponse); i { case 0: return &v.state @@ -6955,7 +6933,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeEcShardsRebuildRequest); i { case 0: return &v.state @@ -6967,7 +6945,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeEcShardsRebuildResponse); i { case 0: return &v.state @@ -6979,7 +6957,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeEcShardsCopyRequest); i { case 0: return &v.state @@ -6991,7 +6969,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeEcShardsCopyResponse); i { case 0: return &v.state @@ -7003,7 +6981,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeEcShardsDeleteRequest); i { case 0: return &v.state @@ -7015,7 +6993,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeEcShardsDeleteResponse); i { case 0: return &v.state @@ -7027,7 +7005,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeEcShardsMountRequest); i { case 0: return &v.state @@ -7039,7 +7017,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeEcShardsMountResponse); i { case 0: return &v.state @@ -7051,7 +7029,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeEcShardsUnmountRequest); i { case 0: return &v.state @@ -7063,7 +7041,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeEcShardsUnmountResponse); i { case 0: return &v.state @@ -7075,7 +7053,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeEcShardReadRequest); i { case 0: return &v.state @@ -7087,7 +7065,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeEcShardReadResponse); i { case 0: return &v.state @@ -7099,7 +7077,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeEcBlobDeleteRequest); i { case 0: return &v.state @@ -7111,7 +7089,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeEcBlobDeleteResponse); i { case 0: return &v.state @@ -7123,7 +7101,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeEcShardsToVolumeRequest); i { case 0: return &v.state @@ -7135,7 +7113,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeEcShardsToVolumeResponse); i { case 0: return &v.state @@ -7147,7 +7125,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReadVolumeFileStatusRequest); i { case 0: return &v.state @@ -7159,7 +7137,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReadVolumeFileStatusResponse); i { case 0: return &v.state @@ -7171,7 +7149,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DiskStatus); i { case 0: return &v.state @@ -7183,7 +7161,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MemStatus); i { case 0: return &v.state @@ -7195,7 +7173,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoteFile); i { case 0: return &v.state @@ -7207,7 +7185,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeInfo); i { case 0: return &v.state @@ -7219,7 +7197,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeTierMoveDatToRemoteRequest); i { case 0: return &v.state @@ -7231,7 +7209,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeTierMoveDatToRemoteResponse); i { case 0: return &v.state @@ -7243,7 +7221,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeTierMoveDatFromRemoteRequest); i { case 0: return &v.state @@ -7255,7 +7233,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeTierMoveDatFromRemoteResponse); i { case 0: return &v.state @@ -7267,7 +7245,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeServerStatusRequest); i { case 0: return &v.state @@ -7279,7 +7257,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeServerStatusResponse); i { case 0: return &v.state @@ -7291,7 +7269,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeServerLeaveRequest); i { case 0: return &v.state @@ -7303,7 +7281,7 @@ func file_volume_server_proto_init() { return nil } } - file_volume_server_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_volume_server_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeServerLeaveResponse); i { case 0: return &v.state @@ -7315,6 +7293,30 @@ func file_volume_server_proto_init() { return nil } } + file_volume_server_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FetchAndWriteNeedleRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_volume_server_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FetchAndWriteNeedleResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } file_volume_server_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryRequest); i { case 0: @@ -7515,7 +7517,6 @@ type VolumeServerClient interface { CopyFile(ctx context.Context, in *CopyFileRequest, opts ...grpc.CallOption) (VolumeServer_CopyFileClient, error) ReadNeedleBlob(ctx context.Context, in *ReadNeedleBlobRequest, opts ...grpc.CallOption) (*ReadNeedleBlobResponse, error) WriteNeedleBlob(ctx context.Context, in *WriteNeedleBlobRequest, opts ...grpc.CallOption) (*WriteNeedleBlobResponse, error) - FetchAndWriteNeedle(ctx context.Context, in *FetchAndWriteNeedleRequest, opts ...grpc.CallOption) (*FetchAndWriteNeedleResponse, error) VolumeTailSender(ctx context.Context, in *VolumeTailSenderRequest, opts ...grpc.CallOption) (VolumeServer_VolumeTailSenderClient, error) VolumeTailReceiver(ctx context.Context, in *VolumeTailReceiverRequest, opts ...grpc.CallOption) (*VolumeTailReceiverResponse, error) // erasure coding @@ -7533,6 +7534,8 @@ type VolumeServerClient interface { VolumeTierMoveDatFromRemote(ctx context.Context, in *VolumeTierMoveDatFromRemoteRequest, opts ...grpc.CallOption) (VolumeServer_VolumeTierMoveDatFromRemoteClient, error) VolumeServerStatus(ctx context.Context, in *VolumeServerStatusRequest, opts ...grpc.CallOption) (*VolumeServerStatusResponse, error) VolumeServerLeave(ctx context.Context, in *VolumeServerLeaveRequest, opts ...grpc.CallOption) (*VolumeServerLeaveResponse, error) + // remote storage + FetchAndWriteNeedle(ctx context.Context, in *FetchAndWriteNeedleRequest, opts ...grpc.CallOption) (*FetchAndWriteNeedleResponse, error) // query Query(ctx context.Context, in *QueryRequest, opts ...grpc.CallOption) (VolumeServer_QueryClient, error) VolumeNeedleStatus(ctx context.Context, in *VolumeNeedleStatusRequest, opts ...grpc.CallOption) (*VolumeNeedleStatusResponse, error) @@ -7781,15 +7784,6 @@ func (c *volumeServerClient) WriteNeedleBlob(ctx context.Context, in *WriteNeedl return out, nil } -func (c *volumeServerClient) FetchAndWriteNeedle(ctx context.Context, in *FetchAndWriteNeedleRequest, opts ...grpc.CallOption) (*FetchAndWriteNeedleResponse, error) { - out := new(FetchAndWriteNeedleResponse) - err := c.cc.Invoke(ctx, "/volume_server_pb.VolumeServer/FetchAndWriteNeedle", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *volumeServerClient) VolumeTailSender(ctx context.Context, in *VolumeTailSenderRequest, opts ...grpc.CallOption) (VolumeServer_VolumeTailSenderClient, error) { stream, err := c.cc.NewStream(ctx, &_VolumeServer_serviceDesc.Streams[2], "/volume_server_pb.VolumeServer/VolumeTailSender", opts...) if err != nil { @@ -8017,6 +8011,15 @@ func (c *volumeServerClient) VolumeServerLeave(ctx context.Context, in *VolumeSe return out, nil } +func (c *volumeServerClient) FetchAndWriteNeedle(ctx context.Context, in *FetchAndWriteNeedleRequest, opts ...grpc.CallOption) (*FetchAndWriteNeedleResponse, error) { + out := new(FetchAndWriteNeedleResponse) + err := c.cc.Invoke(ctx, "/volume_server_pb.VolumeServer/FetchAndWriteNeedle", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *volumeServerClient) Query(ctx context.Context, in *QueryRequest, opts ...grpc.CallOption) (VolumeServer_QueryClient, error) { stream, err := c.cc.NewStream(ctx, &_VolumeServer_serviceDesc.Streams[6], "/volume_server_pb.VolumeServer/Query", opts...) if err != nil { @@ -8083,7 +8086,6 @@ type VolumeServerServer interface { CopyFile(*CopyFileRequest, VolumeServer_CopyFileServer) error ReadNeedleBlob(context.Context, *ReadNeedleBlobRequest) (*ReadNeedleBlobResponse, error) WriteNeedleBlob(context.Context, *WriteNeedleBlobRequest) (*WriteNeedleBlobResponse, error) - FetchAndWriteNeedle(context.Context, *FetchAndWriteNeedleRequest) (*FetchAndWriteNeedleResponse, error) VolumeTailSender(*VolumeTailSenderRequest, VolumeServer_VolumeTailSenderServer) error VolumeTailReceiver(context.Context, *VolumeTailReceiverRequest) (*VolumeTailReceiverResponse, error) // erasure coding @@ -8101,6 +8103,8 @@ type VolumeServerServer interface { VolumeTierMoveDatFromRemote(*VolumeTierMoveDatFromRemoteRequest, VolumeServer_VolumeTierMoveDatFromRemoteServer) error VolumeServerStatus(context.Context, *VolumeServerStatusRequest) (*VolumeServerStatusResponse, error) VolumeServerLeave(context.Context, *VolumeServerLeaveRequest) (*VolumeServerLeaveResponse, error) + // remote storage + FetchAndWriteNeedle(context.Context, *FetchAndWriteNeedleRequest) (*FetchAndWriteNeedleResponse, error) // query Query(*QueryRequest, VolumeServer_QueryServer) error VolumeNeedleStatus(context.Context, *VolumeNeedleStatusRequest) (*VolumeNeedleStatusResponse, error) @@ -8173,9 +8177,6 @@ func (*UnimplementedVolumeServerServer) ReadNeedleBlob(context.Context, *ReadNee func (*UnimplementedVolumeServerServer) WriteNeedleBlob(context.Context, *WriteNeedleBlobRequest) (*WriteNeedleBlobResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method WriteNeedleBlob not implemented") } -func (*UnimplementedVolumeServerServer) FetchAndWriteNeedle(context.Context, *FetchAndWriteNeedleRequest) (*FetchAndWriteNeedleResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method FetchAndWriteNeedle not implemented") -} func (*UnimplementedVolumeServerServer) VolumeTailSender(*VolumeTailSenderRequest, VolumeServer_VolumeTailSenderServer) error { return status.Errorf(codes.Unimplemented, "method VolumeTailSender not implemented") } @@ -8221,6 +8222,9 @@ func (*UnimplementedVolumeServerServer) VolumeServerStatus(context.Context, *Vol func (*UnimplementedVolumeServerServer) VolumeServerLeave(context.Context, *VolumeServerLeaveRequest) (*VolumeServerLeaveResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method VolumeServerLeave not implemented") } +func (*UnimplementedVolumeServerServer) FetchAndWriteNeedle(context.Context, *FetchAndWriteNeedleRequest) (*FetchAndWriteNeedleResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method FetchAndWriteNeedle not implemented") +} func (*UnimplementedVolumeServerServer) Query(*QueryRequest, VolumeServer_QueryServer) error { return status.Errorf(codes.Unimplemented, "method Query not implemented") } @@ -8616,24 +8620,6 @@ func _VolumeServer_WriteNeedleBlob_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } -func _VolumeServer_FetchAndWriteNeedle_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(FetchAndWriteNeedleRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(VolumeServerServer).FetchAndWriteNeedle(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/volume_server_pb.VolumeServer/FetchAndWriteNeedle", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(VolumeServerServer).FetchAndWriteNeedle(ctx, req.(*FetchAndWriteNeedleRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _VolumeServer_VolumeTailSender_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(VolumeTailSenderRequest) if err := stream.RecvMsg(m); err != nil { @@ -8916,6 +8902,24 @@ func _VolumeServer_VolumeServerLeave_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } +func _VolumeServer_FetchAndWriteNeedle_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(FetchAndWriteNeedleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VolumeServerServer).FetchAndWriteNeedle(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/volume_server_pb.VolumeServer/FetchAndWriteNeedle", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VolumeServerServer).FetchAndWriteNeedle(ctx, req.(*FetchAndWriteNeedleRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _VolumeServer_Query_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(QueryRequest) if err := stream.RecvMsg(m); err != nil { @@ -9035,10 +9039,6 @@ var _VolumeServer_serviceDesc = grpc.ServiceDesc{ MethodName: "WriteNeedleBlob", Handler: _VolumeServer_WriteNeedleBlob_Handler, }, - { - MethodName: "FetchAndWriteNeedle", - Handler: _VolumeServer_FetchAndWriteNeedle_Handler, - }, { MethodName: "VolumeTailReceiver", Handler: _VolumeServer_VolumeTailReceiver_Handler, @@ -9083,6 +9083,10 @@ var _VolumeServer_serviceDesc = grpc.ServiceDesc{ MethodName: "VolumeServerLeave", Handler: _VolumeServer_VolumeServerLeave_Handler, }, + { + MethodName: "FetchAndWriteNeedle", + Handler: _VolumeServer_FetchAndWriteNeedle_Handler, + }, { MethodName: "VolumeNeedleStatus", Handler: _VolumeServer_VolumeNeedleStatus_Handler, diff --git a/weed/server/volume_grpc_read_write.go b/weed/server/volume_grpc_read_write.go index 42941250d..607fd3926 100644 --- a/weed/server/volume_grpc_read_write.go +++ b/weed/server/volume_grpc_read_write.go @@ -38,41 +38,3 @@ func (vs *VolumeServer) WriteNeedleBlob(ctx context.Context, req *volume_server_ return resp, nil } - -func (vs *VolumeServer) FetchAndWriteNeedle(ctx context.Context, req *volume_server_pb.FetchAndWriteNeedleRequest) (resp *volume_server_pb.FetchAndWriteNeedleResponse, err error) { - resp = &volume_server_pb.FetchAndWriteNeedleResponse{} - v := vs.store.GetVolume(needle.VolumeId(req.VolumeId)) - if v == nil { - return nil, fmt.Errorf("not found volume id %d", req.VolumeId) - } - - remoteConf := &filer_pb.RemoteConf{ - Type: req.RemoteType, - Name: req.RemoteName, - S3AccessKey: req.S3AccessKey, - S3SecretKey: req.S3SecretKey, - S3Region: req.S3Region, - S3Endpoint: req.S3Endpoint, - } - - client, getClientErr := remote_storage.GetRemoteStorage(remoteConf) - if getClientErr != nil { - return nil, fmt.Errorf("get remote client: %v", getClientErr) - } - - remoteStorageLocation := &filer_pb.RemoteStorageLocation{ - Name: req.RemoteName, - Bucket: req.RemoteBucket, - Path: req.RemoteKey, - } - data, ReadRemoteErr := client.ReadFile(remoteStorageLocation, req.Offset, req.Size) - if ReadRemoteErr != nil { - return nil, fmt.Errorf("read from remote %+v: %v", remoteStorageLocation, ReadRemoteErr) - } - - if err = v.WriteNeedleBlob(types.NeedleId(req.NeedleId), data, types.Size(req.Size)); err != nil { - return nil, fmt.Errorf("write blob needle %d size %d: %v", req.NeedleId, req.Size, err) - } - - return resp, nil -} diff --git a/weed/server/volume_grpc_remote.go b/weed/server/volume_grpc_remote.go new file mode 100644 index 000000000..0b6cd465b --- /dev/null +++ b/weed/server/volume_grpc_remote.go @@ -0,0 +1,49 @@ +package weed_server + +import ( + "context" + "fmt" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/chrislusf/seaweedfs/weed/pb/volume_server_pb" + "github.com/chrislusf/seaweedfs/weed/remote_storage" + "github.com/chrislusf/seaweedfs/weed/storage/needle" + "github.com/chrislusf/seaweedfs/weed/storage/types" +) + +func (vs *VolumeServer) FetchAndWriteNeedle(ctx context.Context, req *volume_server_pb.FetchAndWriteNeedleRequest) (resp *volume_server_pb.FetchAndWriteNeedleResponse, err error) { + resp = &volume_server_pb.FetchAndWriteNeedleResponse{} + v := vs.store.GetVolume(needle.VolumeId(req.VolumeId)) + if v == nil { + return nil, fmt.Errorf("not found volume id %d", req.VolumeId) + } + + remoteConf := &filer_pb.RemoteConf{ + Type: req.RemoteType, + Name: req.RemoteName, + S3AccessKey: req.S3AccessKey, + S3SecretKey: req.S3SecretKey, + S3Region: req.S3Region, + S3Endpoint: req.S3Endpoint, + } + + client, getClientErr := remote_storage.GetRemoteStorage(remoteConf) + if getClientErr != nil { + return nil, fmt.Errorf("get remote client: %v", getClientErr) + } + + remoteStorageLocation := &filer_pb.RemoteStorageLocation{ + Name: req.RemoteName, + Bucket: req.RemoteBucket, + Path: req.RemoteKey, + } + data, ReadRemoteErr := client.ReadFile(remoteStorageLocation, req.Offset, req.Size) + if ReadRemoteErr != nil { + return nil, fmt.Errorf("read from remote %+v: %v", remoteStorageLocation, ReadRemoteErr) + } + + if err = v.WriteNeedleBlob(types.NeedleId(req.NeedleId), data, types.Size(req.Size)); err != nil { + return nil, fmt.Errorf("write blob needle %d size %d: %v", req.NeedleId, req.Size, err) + } + + return resp, nil +} From ecb234f75aadfcaf64638fdd9532e3bc95d0e4ce Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 7 Aug 2021 14:46:23 -0700 Subject: [PATCH 177/265] refactor --- weed/filer/stream.go | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/weed/filer/stream.go b/weed/filer/stream.go index 70a278ca5..197b87ab8 100644 --- a/weed/filer/stream.go +++ b/weed/filer/stream.go @@ -89,6 +89,7 @@ func ReadAll(masterClient *wdclient.MasterClient, chunks []*filer_pb.FileChunk) // ---------------- ChunkStreamReader ---------------------------------- type ChunkStreamReader struct { chunkViews []*ChunkView + totalSize int64 logicOffset int64 buffer []byte bufferOffset int64 @@ -107,9 +108,15 @@ func NewChunkStreamReaderFromFiler(masterClient *wdclient.MasterClient, chunks [ chunkViews := ViewFromChunks(lookupFileIdFn, chunks, 0, math.MaxInt64) + var totalSize int64 + for _, chunk := range chunkViews { + totalSize += int64(chunk.Size) + } + return &ChunkStreamReader{ chunkViews: chunkViews, lookupFileId: lookupFileIdFn, + totalSize: totalSize, } } @@ -119,9 +126,15 @@ func NewChunkStreamReader(filerClient filer_pb.FilerClient, chunks []*filer_pb.F chunkViews := ViewFromChunks(lookupFileIdFn, chunks, 0, math.MaxInt64) + var totalSize int64 + for _, chunk := range chunkViews { + totalSize += int64(chunk.Size) + } + return &ChunkStreamReader{ chunkViews: chunkViews, lookupFileId: lookupFileIdFn, + totalSize: totalSize, } } @@ -148,20 +161,15 @@ func (c *ChunkStreamReader) isBufferEmpty() bool { func (c *ChunkStreamReader) Seek(offset int64, whence int) (int64, error) { - var totalSize int64 - for _, chunk := range c.chunkViews { - totalSize += int64(chunk.Size) - } - var err error switch whence { case io.SeekStart: case io.SeekCurrent: offset += c.bufferOffset + int64(c.bufferPos) case io.SeekEnd: - offset = totalSize + offset + offset = c.totalSize + offset } - if offset > totalSize { + if offset > c.totalSize { err = io.ErrUnexpectedEOF } From d2b3416d1c7c1a75d1f535658a65337109aa24f8 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 7 Aug 2021 14:54:00 -0700 Subject: [PATCH 178/265] java: use empty value as replication default --- .../src/main/java/seaweedfs/client/SeaweedOutputStream.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/other/java/client/src/main/java/seaweedfs/client/SeaweedOutputStream.java b/other/java/client/src/main/java/seaweedfs/client/SeaweedOutputStream.java index 3bec05796..7a94acbd0 100644 --- a/other/java/client/src/main/java/seaweedfs/client/SeaweedOutputStream.java +++ b/other/java/client/src/main/java/seaweedfs/client/SeaweedOutputStream.java @@ -32,10 +32,10 @@ public class SeaweedOutputStream extends OutputStream { private long lastTotalAppendOffset = 0; private ByteBuffer buffer; private long outputIndex; - private String replication = "000"; + private String replication = ""; public SeaweedOutputStream(FilerClient filerClient, final String fullpath) { - this(filerClient, fullpath, "000"); + this(filerClient, fullpath, ""); } public SeaweedOutputStream(FilerClient filerClient, final String fullpath, final String replication) { From 59732a052996d57692d2179525d7b89387130ba7 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 7 Aug 2021 15:35:27 -0700 Subject: [PATCH 179/265] refactoring --- weed/filer/stream.go | 100 ++++++++++++++++++++++++------------------- 1 file changed, 57 insertions(+), 43 deletions(-) diff --git a/weed/filer/stream.go b/weed/filer/stream.go index 197b87ab8..2ea8ce493 100644 --- a/weed/filer/stream.go +++ b/weed/filer/stream.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "math" + "sort" "strings" "time" @@ -88,65 +89,61 @@ func ReadAll(masterClient *wdclient.MasterClient, chunks []*filer_pb.FileChunk) // ---------------- ChunkStreamReader ---------------------------------- type ChunkStreamReader struct { - chunkViews []*ChunkView - totalSize int64 - logicOffset int64 - buffer []byte - bufferOffset int64 - bufferPos int - chunkIndex int - lookupFileId wdclient.LookupFileIdFunctionType + chunkViews []*ChunkView + totalSize int64 + buffer []byte + bufferOffset int64 + bufferPos int + nextChunkViewIndex int + lookupFileId wdclient.LookupFileIdFunctionType } var _ = io.ReadSeeker(&ChunkStreamReader{}) +func doNewChunkStreamReader(lookupFileIdFn wdclient.LookupFileIdFunctionType, chunks []*filer_pb.FileChunk) *ChunkStreamReader { + + chunkViews := ViewFromChunks(lookupFileIdFn, chunks, 0, math.MaxInt64) + sort.Slice(chunkViews, func(i, j int) bool { + return chunkViews[i].LogicOffset < chunkViews[j].LogicOffset + }) + + var totalSize int64 + for _, chunk := range chunkViews { + totalSize += int64(chunk.Size) + } + + return &ChunkStreamReader{ + chunkViews: chunkViews, + lookupFileId: lookupFileIdFn, + totalSize: totalSize, + } +} + func NewChunkStreamReaderFromFiler(masterClient *wdclient.MasterClient, chunks []*filer_pb.FileChunk) *ChunkStreamReader { lookupFileIdFn := func(fileId string) (targetUrl []string, err error) { return masterClient.LookupFileId(fileId) } - chunkViews := ViewFromChunks(lookupFileIdFn, chunks, 0, math.MaxInt64) - - var totalSize int64 - for _, chunk := range chunkViews { - totalSize += int64(chunk.Size) - } - - return &ChunkStreamReader{ - chunkViews: chunkViews, - lookupFileId: lookupFileIdFn, - totalSize: totalSize, - } + return doNewChunkStreamReader(lookupFileIdFn, chunks) } func NewChunkStreamReader(filerClient filer_pb.FilerClient, chunks []*filer_pb.FileChunk) *ChunkStreamReader { lookupFileIdFn := LookupFn(filerClient) - chunkViews := ViewFromChunks(lookupFileIdFn, chunks, 0, math.MaxInt64) - - var totalSize int64 - for _, chunk := range chunkViews { - totalSize += int64(chunk.Size) - } - - return &ChunkStreamReader{ - chunkViews: chunkViews, - lookupFileId: lookupFileIdFn, - totalSize: totalSize, - } + return doNewChunkStreamReader(lookupFileIdFn, chunks) } func (c *ChunkStreamReader) Read(p []byte) (n int, err error) { for n < len(p) { if c.isBufferEmpty() { - if c.chunkIndex >= len(c.chunkViews) { + if c.nextChunkViewIndex >= len(c.chunkViews) { return n, io.EOF } - chunkView := c.chunkViews[c.chunkIndex] + chunkView := c.chunkViews[c.nextChunkViewIndex] c.fetchChunkToBuffer(chunkView) - c.chunkIndex++ + c.nextChunkViewIndex++ } t := copy(p[n:], c.buffer[c.bufferPos:]) c.bufferPos += t @@ -173,16 +170,33 @@ func (c *ChunkStreamReader) Seek(offset int64, whence int) (int64, error) { err = io.ErrUnexpectedEOF } - for i, chunk := range c.chunkViews { - if chunk.LogicOffset <= offset && offset < chunk.LogicOffset+int64(chunk.Size) { - if c.isBufferEmpty() || c.bufferOffset != chunk.LogicOffset { - c.fetchChunkToBuffer(chunk) - c.chunkIndex = i + 1 - break - } + // stay in the same chunk + if !c.isBufferEmpty() { + if c.bufferOffset <= offset && offset < c.bufferOffset+int64(len(c.buffer)) { + c.bufferPos = int(offset - c.bufferOffset) + return offset, nil } } - c.bufferPos = int(offset - c.bufferOffset) + + // need to seek to a different chunk + currentChunkIndex := sort.Search(len(c.chunkViews), func(i int) bool { + return c.chunkViews[i].LogicOffset <= offset + }) + if currentChunkIndex == len(c.chunkViews) { + return 0, io.EOF + } + + // positioning within the new chunk + chunk := c.chunkViews[currentChunkIndex] + if chunk.LogicOffset <= offset && offset < chunk.LogicOffset+int64(chunk.Size) { + if c.isBufferEmpty() || c.bufferOffset != chunk.LogicOffset { + c.fetchChunkToBuffer(chunk) + c.nextChunkViewIndex = currentChunkIndex + 1 + } + c.bufferPos = int(offset - c.bufferOffset) + } else { + return 0, io.ErrUnexpectedEOF + } return offset, err From de730b079da4d9e046c4816a4f74a19c4ddf6712 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 7 Aug 2021 15:41:07 -0700 Subject: [PATCH 180/265] ChunkStreamReader implenents io.ReaderAt --- weed/filer/stream.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/weed/filer/stream.go b/weed/filer/stream.go index 2ea8ce493..3859f9a67 100644 --- a/weed/filer/stream.go +++ b/weed/filer/stream.go @@ -99,6 +99,7 @@ type ChunkStreamReader struct { } var _ = io.ReadSeeker(&ChunkStreamReader{}) +var _ = io.ReaderAt(&ChunkStreamReader{}) func doNewChunkStreamReader(lookupFileIdFn wdclient.LookupFileIdFunctionType, chunks []*filer_pb.FileChunk) *ChunkStreamReader { @@ -135,6 +136,14 @@ func NewChunkStreamReader(filerClient filer_pb.FilerClient, chunks []*filer_pb.F return doNewChunkStreamReader(lookupFileIdFn, chunks) } +func (c *ChunkStreamReader) ReadAt(p []byte, off int64) (n int, err error) { + _, err = c.Seek(off, io.SeekStart) + if err != nil { + return + } + return c.Read(p) +} + func (c *ChunkStreamReader) Read(p []byte) (n int, err error) { for n < len(p) { if c.isBufferEmpty() { From 8f5170c1389f2d0bac75ca2f95a676a05283317b Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 7 Aug 2021 16:20:17 -0700 Subject: [PATCH 181/265] remove imports --- weed/server/volume_grpc_read_write.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/weed/server/volume_grpc_read_write.go b/weed/server/volume_grpc_read_write.go index 607fd3926..988e9e145 100644 --- a/weed/server/volume_grpc_read_write.go +++ b/weed/server/volume_grpc_read_write.go @@ -3,9 +3,7 @@ package weed_server import ( "context" "fmt" - "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/pb/volume_server_pb" - "github.com/chrislusf/seaweedfs/weed/remote_storage" "github.com/chrislusf/seaweedfs/weed/storage/needle" "github.com/chrislusf/seaweedfs/weed/storage/types" ) From 13e45e16054d16e8d8161a8ddb02fde3cd4cde8f Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 8 Aug 2021 01:21:42 -0700 Subject: [PATCH 182/265] filer.remote.sync can work now --- weed/Makefile | 4 + weed/command/command.go | 1 + weed/command/filer.go | 1 - weed/command/filer_remote_sync.go | 219 ++++++++++++++++++++ weed/command/filer_replication.go | 6 - weed/command/imports.go | 31 +++ weed/filer/filer_remote_storage.go | 1 - weed/filer/stream.go | 32 +-- weed/remote_storage/remote_storage.go | 6 +- weed/remote_storage/s3/s3_storage_client.go | 94 ++++++++- weed/shell/command_remote_configure.go | 11 +- weed/shell/command_remote_mount.go | 5 +- 12 files changed, 381 insertions(+), 30 deletions(-) create mode 100644 weed/command/filer_remote_sync.go create mode 100644 weed/command/imports.go diff --git a/weed/Makefile b/weed/Makefile index c82735a0e..ad1f0b6f9 100644 --- a/weed/Makefile +++ b/weed/Makefile @@ -37,3 +37,7 @@ debug_s3: debug_filer_copy: go build -gcflags="all=-N -l" dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec weed -- -v=4 filer.backup -filer=localhost:8888 -filerProxy -timeAgo=10h + +debug_filer_remote_sync: + go build -gcflags="all=-N -l" + dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec weed -- -v=4 filer.remote.sync -filer="localhost:8888" -dir=/buckets/b2 -timeAgo=10000h diff --git a/weed/command/command.go b/weed/command/command.go index 9ae93fe61..02de2bd35 100644 --- a/weed/command/command.go +++ b/weed/command/command.go @@ -21,6 +21,7 @@ var Commands = []*Command{ cmdFilerCopy, cmdFilerMetaBackup, cmdFilerMetaTail, + cmdFilerRemoteSynchronize, cmdFilerReplicate, cmdFilerSynchronize, cmdFix, diff --git a/weed/command/filer.go b/weed/command/filer.go index 4fd2f9c72..ddee0852c 100644 --- a/weed/command/filer.go +++ b/weed/command/filer.go @@ -3,7 +3,6 @@ package command import ( "fmt" "net/http" - _ "net/http/pprof" "os" "strconv" "strings" diff --git a/weed/command/filer_remote_sync.go b/weed/command/filer_remote_sync.go new file mode 100644 index 000000000..8d176ce2a --- /dev/null +++ b/weed/command/filer_remote_sync.go @@ -0,0 +1,219 @@ +package command + +import ( + "fmt" + "github.com/chrislusf/seaweedfs/weed/filer" + "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/pb" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/chrislusf/seaweedfs/weed/remote_storage" + "github.com/chrislusf/seaweedfs/weed/replication/source" + "github.com/chrislusf/seaweedfs/weed/security" + "github.com/chrislusf/seaweedfs/weed/util" + "github.com/golang/protobuf/proto" + "google.golang.org/grpc" + "strings" + "time" +) + +type RemoteSyncOptions struct { + filerAddress *string + grpcDialOption grpc.DialOption + readChunkFromFiler *bool + debug *bool + timeAgo *time.Duration + dir *string +} + +const ( + RemoteSyncKeyPrefix = "remote.sync." +) + +var _ = filer_pb.FilerClient(&RemoteSyncOptions{}) + +func (option *RemoteSyncOptions) WithFilerClient(fn func(filer_pb.SeaweedFilerClient) error) error { + return pb.WithFilerClient(*option.filerAddress, option.grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { + return fn(client) + }) +} +func (option *RemoteSyncOptions) AdjustedUrl(location *filer_pb.Location) string { + return location.Url +} + +var ( + remoteSyncOptions RemoteSyncOptions +) + +func init() { + cmdFilerRemoteSynchronize.Run = runFilerRemoteSynchronize // break init cycle + remoteSyncOptions.filerAddress = cmdFilerRemoteSynchronize.Flag.String("filer", "localhost:8888", "filer of the SeaweedFS cluster") + remoteSyncOptions.dir = cmdFilerRemoteSynchronize.Flag.String("dir", "/", "a mounted directory on filer") + remoteSyncOptions.readChunkFromFiler = cmdFilerRemoteSynchronize.Flag.Bool("filerProxy", false, "read file chunks from filer instead of volume servers") + remoteSyncOptions.debug = cmdFilerRemoteSynchronize.Flag.Bool("debug", false, "debug mode to print out filer updated remote files") + remoteSyncOptions.timeAgo = cmdFilerRemoteSynchronize.Flag.Duration("timeAgo", 0, "start time before now. \"300ms\", \"1.5h\" or \"2h45m\". Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\"") +} + +var cmdFilerRemoteSynchronize = &Command{ + UsageLine: "filer.remote.sync -filer=: -dir=/mount/s3_on_cloud", + Short: "resumeable continuously write back updates to remote storage if the directory is mounted to the remote storage", + Long: `resumeable continuously write back updates to remote storage if the directory is mounted to the remote storage + + filer.remote.sync listens on filer update events. + If any mounted remote file is updated, it will fetch the updated content, + and write to the remote storage. +`, +} + +func runFilerRemoteSynchronize(cmd *Command, args []string) bool { + + util.LoadConfiguration("security", false) + grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client") + remoteSyncOptions.grpcDialOption = grpcDialOption + + // read filer remote storage mount mappings + mappings, readErr := filer.ReadMountMappings(grpcDialOption, *remoteSyncOptions.filerAddress) + if readErr != nil { + fmt.Printf("read mount mapping: %v", readErr) + return false + } + + filerSource := &source.FilerSource{} + filerSource.DoInitialize( + *remoteSyncOptions.filerAddress, + pb.ServerToGrpcAddress(*remoteSyncOptions.filerAddress), + "/", // does not matter + *remoteSyncOptions.readChunkFromFiler, + ) + + var found bool + for dir, remoteStorageMountLocation := range mappings.Mappings { + if *remoteSyncOptions.dir == dir { + found = true + storageConf, readErr := filer.ReadRemoteStorageConf(grpcDialOption, *remoteSyncOptions.filerAddress, remoteStorageMountLocation.Name) + if readErr != nil { + fmt.Printf("read remote storage configuration for %s: %v", dir, readErr) + continue + } + fmt.Printf("synchronize %s to remote storage...\n", *remoteSyncOptions.dir) + if err := util.Retry("filer.remote.sync "+dir, func() error { + return followUpdatesAndUploadToRemote(&remoteSyncOptions, filerSource, dir, storageConf, remoteStorageMountLocation) + }); err != nil { + fmt.Printf("synchronize %s: %v\n", *remoteSyncOptions.dir, err) + } + break + } + } + if !found { + fmt.Printf("directory %s is not mounted to any remote storage\n", *remoteSyncOptions.dir) + return false + } + + return true +} + +func followUpdatesAndUploadToRemote(option *RemoteSyncOptions, filerSource *source.FilerSource, mountedDir string, remoteStorage *filer_pb.RemoteConf, remoteStorageMountLocation *filer_pb.RemoteStorageLocation) error { + + dirHash := util.HashStringToLong(mountedDir) + + // 1. specified by timeAgo + // 2. last offset timestamp for this directory + // 3. directory creation time + var lastOffsetTs time.Time + if *option.timeAgo == 0 { + mountedDirEntry, err := filer_pb.GetEntry(option, util.FullPath(mountedDir)) + if err != nil { + return fmt.Errorf("lookup %s: %v", mountedDir, err) + } + + lastOffsetTsNs, err := getOffset(option.grpcDialOption, *option.filerAddress, RemoteSyncKeyPrefix, int32(dirHash)) + if err == nil && mountedDirEntry.Attributes.Crtime < lastOffsetTsNs/1000000 { + lastOffsetTs = time.Unix(0, lastOffsetTsNs) + glog.V(0).Infof("resume from %v", lastOffsetTs) + } else { + lastOffsetTs = time.Unix(mountedDirEntry.Attributes.Crtime, 0) + } + } else { + lastOffsetTs = time.Now().Add(-*option.timeAgo) + } + + client, err := remote_storage.GetRemoteStorage(remoteStorage) + if err != nil { + return err + } + + eachEntryFunc := func(resp *filer_pb.SubscribeMetadataResponse) error { + message := resp.EventNotification + if message.OldEntry == nil && message.NewEntry == nil { + return nil + } + if message.OldEntry == nil && message.NewEntry != nil { + if len(message.NewEntry.Chunks) == 0 { + return nil + } + fmt.Printf("create: %+v\n", resp) + dest := toRemoteStorageLocation(util.FullPath(mountedDir), util.NewFullPath(message.NewParentPath, message.NewEntry.Name), remoteStorageMountLocation) + reader := filer.NewChunkStreamReader(filerSource, message.NewEntry.Chunks) + return client.WriteFile(dest, message.NewEntry, reader) + } + if message.OldEntry != nil && message.NewEntry == nil { + fmt.Printf("delete: %+v\n", resp) + dest := toRemoteStorageLocation(util.FullPath(mountedDir), util.NewFullPath(resp.Directory, message.OldEntry.Name), remoteStorageMountLocation) + return client.DeleteFile(dest) + } + if message.OldEntry != nil && message.NewEntry != nil { + oldDest := toRemoteStorageLocation(util.FullPath(mountedDir), util.NewFullPath(resp.Directory, message.OldEntry.Name), remoteStorageMountLocation) + dest := toRemoteStorageLocation(util.FullPath(mountedDir), util.NewFullPath(message.NewParentPath, message.NewEntry.Name), remoteStorageMountLocation) + if resp.Directory == message.NewParentPath && message.OldEntry.Name == message.NewEntry.Name { + if isSameChunks(message.OldEntry.Chunks, message.NewEntry.Chunks) { + fmt.Printf("update meta: %+v\n", resp) + return client.UpdateFileMetadata(dest, message.NewEntry) + } + } + fmt.Printf("update: %+v\n", resp) + if err := client.DeleteFile(oldDest); err != nil { + return err + } + reader := filer.NewChunkStreamReader(filerSource, message.NewEntry.Chunks) + return client.WriteFile(dest, message.NewEntry, reader) + } + + return nil + } + + processEventFnWithOffset := pb.AddOffsetFunc(eachEntryFunc, 3*time.Second, func(counter int64, lastTsNs int64) error { + lastTime := time.Unix(0, lastTsNs) + glog.V(0).Infof("remote sync %s progressed to %v %0.2f/sec", *option.filerAddress, lastTime, float64(counter)/float64(3)) + return setOffset(option.grpcDialOption, *option.filerAddress, RemoteSyncKeyPrefix, int32(dirHash), lastTsNs) + }) + + return pb.FollowMetadata(*option.filerAddress, option.grpcDialOption, + "filer.remote.sync", mountedDir, lastOffsetTs.UnixNano(), 0, processEventFnWithOffset, false) +} + +func toRemoteStorageLocation(mountDir, sourcePath util.FullPath, remoteMountLocation *filer_pb.RemoteStorageLocation) *filer_pb.RemoteStorageLocation { + var dest string + source := string(sourcePath[len(mountDir):]) + if strings.HasSuffix(remoteMountLocation.Path, "/") { + dest = remoteMountLocation.Path + source[1:] + } else { + dest = remoteMountLocation.Path + source + } + return &filer_pb.RemoteStorageLocation{ + Name: remoteMountLocation.Name, + Bucket: remoteMountLocation.Bucket, + Path: dest, + } +} + +func isSameChunks(a, b []*filer_pb.FileChunk) bool { + if len(a) != len(b) { + return false + } + for i := 0; i < len(a); i++ { + x, y := a[i], b[i] + if !proto.Equal(x, y) { + return false + } + } + return true +} diff --git a/weed/command/filer_replication.go b/weed/command/filer_replication.go index 885c95540..bf0a3e140 100644 --- a/weed/command/filer_replication.go +++ b/weed/command/filer_replication.go @@ -7,12 +7,6 @@ import ( "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/replication" "github.com/chrislusf/seaweedfs/weed/replication/sink" - _ "github.com/chrislusf/seaweedfs/weed/replication/sink/azuresink" - _ "github.com/chrislusf/seaweedfs/weed/replication/sink/b2sink" - _ "github.com/chrislusf/seaweedfs/weed/replication/sink/filersink" - _ "github.com/chrislusf/seaweedfs/weed/replication/sink/gcssink" - _ "github.com/chrislusf/seaweedfs/weed/replication/sink/localsink" - _ "github.com/chrislusf/seaweedfs/weed/replication/sink/s3sink" "github.com/chrislusf/seaweedfs/weed/replication/sub" "github.com/chrislusf/seaweedfs/weed/util" ) diff --git a/weed/command/imports.go b/weed/command/imports.go new file mode 100644 index 000000000..d7ade1379 --- /dev/null +++ b/weed/command/imports.go @@ -0,0 +1,31 @@ +package command + +import ( + _ "net/http/pprof" + + _ "github.com/chrislusf/seaweedfs/weed/remote_storage/s3" + + _ "github.com/chrislusf/seaweedfs/weed/replication/sink/azuresink" + _ "github.com/chrislusf/seaweedfs/weed/replication/sink/b2sink" + _ "github.com/chrislusf/seaweedfs/weed/replication/sink/filersink" + _ "github.com/chrislusf/seaweedfs/weed/replication/sink/gcssink" + _ "github.com/chrislusf/seaweedfs/weed/replication/sink/localsink" + _ "github.com/chrislusf/seaweedfs/weed/replication/sink/s3sink" + + _ "github.com/chrislusf/seaweedfs/weed/filer/cassandra" + _ "github.com/chrislusf/seaweedfs/weed/filer/elastic/v7" + _ "github.com/chrislusf/seaweedfs/weed/filer/etcd" + _ "github.com/chrislusf/seaweedfs/weed/filer/hbase" + _ "github.com/chrislusf/seaweedfs/weed/filer/leveldb" + _ "github.com/chrislusf/seaweedfs/weed/filer/leveldb2" + _ "github.com/chrislusf/seaweedfs/weed/filer/leveldb3" + _ "github.com/chrislusf/seaweedfs/weed/filer/mongodb" + _ "github.com/chrislusf/seaweedfs/weed/filer/mysql" + _ "github.com/chrislusf/seaweedfs/weed/filer/mysql2" + _ "github.com/chrislusf/seaweedfs/weed/filer/postgres" + _ "github.com/chrislusf/seaweedfs/weed/filer/postgres2" + _ "github.com/chrislusf/seaweedfs/weed/filer/redis" + _ "github.com/chrislusf/seaweedfs/weed/filer/redis2" + _ "github.com/chrislusf/seaweedfs/weed/filer/sqlite" + +) \ No newline at end of file diff --git a/weed/filer/filer_remote_storage.go b/weed/filer/filer_remote_storage.go index b1ee96a42..573dcf3e7 100644 --- a/weed/filer/filer_remote_storage.go +++ b/weed/filer/filer_remote_storage.go @@ -5,7 +5,6 @@ import ( "fmt" "github.com/chrislusf/seaweedfs/weed/pb" "github.com/chrislusf/seaweedfs/weed/remote_storage" - _ "github.com/chrislusf/seaweedfs/weed/remote_storage/s3" "github.com/chrislusf/seaweedfs/weed/util" "github.com/golang/protobuf/proto" "google.golang.org/grpc" diff --git a/weed/filer/stream.go b/weed/filer/stream.go index 3859f9a67..503e6b23f 100644 --- a/weed/filer/stream.go +++ b/weed/filer/stream.go @@ -91,6 +91,7 @@ func ReadAll(masterClient *wdclient.MasterClient, chunks []*filer_pb.FileChunk) type ChunkStreamReader struct { chunkViews []*ChunkView totalSize int64 + logicOffset int64 buffer []byte bufferOffset int64 bufferPos int @@ -137,8 +138,7 @@ func NewChunkStreamReader(filerClient filer_pb.FilerClient, chunks []*filer_pb.F } func (c *ChunkStreamReader) ReadAt(p []byte, off int64) (n int, err error) { - _, err = c.Seek(off, io.SeekStart) - if err != nil { + if err = c.prepareBufferFor(c.logicOffset); err != nil { return } return c.Read(p) @@ -151,12 +151,15 @@ func (c *ChunkStreamReader) Read(p []byte) (n int, err error) { return n, io.EOF } chunkView := c.chunkViews[c.nextChunkViewIndex] - c.fetchChunkToBuffer(chunkView) + if err = c.fetchChunkToBuffer(chunkView); err != nil { + return + } c.nextChunkViewIndex++ } t := copy(p[n:], c.buffer[c.bufferPos:]) c.bufferPos += t n += t + c.logicOffset += int64(t) } return } @@ -171,19 +174,26 @@ func (c *ChunkStreamReader) Seek(offset int64, whence int) (int64, error) { switch whence { case io.SeekStart: case io.SeekCurrent: - offset += c.bufferOffset + int64(c.bufferPos) + offset += c.logicOffset case io.SeekEnd: offset = c.totalSize + offset } if offset > c.totalSize { err = io.ErrUnexpectedEOF + } else { + c.logicOffset = offset } + return offset, err + +} + +func (c *ChunkStreamReader) prepareBufferFor(offset int64) (err error) { // stay in the same chunk if !c.isBufferEmpty() { if c.bufferOffset <= offset && offset < c.bufferOffset+int64(len(c.buffer)) { c.bufferPos = int(offset - c.bufferOffset) - return offset, nil + return nil } } @@ -192,23 +202,21 @@ func (c *ChunkStreamReader) Seek(offset int64, whence int) (int64, error) { return c.chunkViews[i].LogicOffset <= offset }) if currentChunkIndex == len(c.chunkViews) { - return 0, io.EOF + return io.EOF } // positioning within the new chunk chunk := c.chunkViews[currentChunkIndex] if chunk.LogicOffset <= offset && offset < chunk.LogicOffset+int64(chunk.Size) { if c.isBufferEmpty() || c.bufferOffset != chunk.LogicOffset { - c.fetchChunkToBuffer(chunk) + if err = c.fetchChunkToBuffer(chunk); err != nil { + return + } c.nextChunkViewIndex = currentChunkIndex + 1 } c.bufferPos = int(offset - c.bufferOffset) - } else { - return 0, io.ErrUnexpectedEOF } - - return offset, err - + return } func (c *ChunkStreamReader) fetchChunkToBuffer(chunkView *ChunkView) error { diff --git a/weed/remote_storage/remote_storage.go b/weed/remote_storage/remote_storage.go index 06c089d7a..608d158ad 100644 --- a/weed/remote_storage/remote_storage.go +++ b/weed/remote_storage/remote_storage.go @@ -3,6 +3,7 @@ package remote_storage import ( "fmt" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "io" "strings" "sync" ) @@ -30,7 +31,10 @@ type VisitFunc func(dir string, name string, isDirectory bool, remoteEntry *file type RemoteStorageClient interface { Traverse(loc *filer_pb.RemoteStorageLocation, visitFn VisitFunc) error - ReadFile(loc *filer_pb.RemoteStorageLocation, offset int64, size int64) (data[]byte, err error) + ReadFile(loc *filer_pb.RemoteStorageLocation, offset int64, size int64) (data []byte, err error) + WriteFile(loc *filer_pb.RemoteStorageLocation, entry *filer_pb.Entry, reader io.Reader) (err error) + UpdateFileMetadata(loc *filer_pb.RemoteStorageLocation, entry *filer_pb.Entry) (err error) + DeleteFile(loc *filer_pb.RemoteStorageLocation) (err error) } type RemoteStorageClientMaker interface { diff --git a/weed/remote_storage/s3/s3_storage_client.go b/weed/remote_storage/s3/s3_storage_client.go index 2263054f3..316751227 100644 --- a/weed/remote_storage/s3/s3_storage_client.go +++ b/weed/remote_storage/s3/s3_storage_client.go @@ -8,9 +8,11 @@ import ( "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/service/s3/s3iface" "github.com/aws/aws-sdk-go/service/s3/s3manager" + "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/remote_storage" "github.com/chrislusf/seaweedfs/weed/util" + "io" ) func init() { @@ -45,7 +47,9 @@ type s3RemoteStorageClient struct { conn s3iface.S3API } -func (s s3RemoteStorageClient) Traverse(remote *filer_pb.RemoteStorageLocation, visitFn remote_storage.VisitFunc) (err error) { +var _ = remote_storage.RemoteStorageClient(&s3RemoteStorageClient{}) + +func (s *s3RemoteStorageClient) Traverse(remote *filer_pb.RemoteStorageLocation, visitFn remote_storage.VisitFunc) (err error) { pathKey := remote.Path[1:] @@ -91,19 +95,19 @@ func (s s3RemoteStorageClient) Traverse(remote *filer_pb.RemoteStorageLocation, } return } -func (s s3RemoteStorageClient) ReadFile(loc *filer_pb.RemoteStorageLocation, offset int64, size int64) (data[]byte, err error) { +func (s *s3RemoteStorageClient) ReadFile(loc *filer_pb.RemoteStorageLocation, offset int64, size int64) (data []byte, err error) { downloader := s3manager.NewDownloaderWithClient(s.conn, func(u *s3manager.Downloader) { u.PartSize = int64(4 * 1024 * 1024) u.Concurrency = 1 }) - + dataSlice := make([]byte, int(size)) writerAt := aws.NewWriteAtBuffer(dataSlice) _, err = downloader.Download(writerAt, &s3.GetObjectInput{ - Bucket: aws.String(loc.Bucket), - Key: aws.String(loc.Path[1:]), - Range: aws.String(fmt.Sprintf("bytes=%d-%d", offset, offset+size-1)), + Bucket: aws.String(loc.Bucket), + Key: aws.String(loc.Path[1:]), + Range: aws.String(fmt.Sprintf("bytes=%d-%d", offset, offset+size-1)), }) if err != nil { return nil, fmt.Errorf("failed to download file %s%s: %v", loc.Bucket, loc.Path, err) @@ -111,3 +115,81 @@ func (s s3RemoteStorageClient) ReadFile(loc *filer_pb.RemoteStorageLocation, off return writerAt.Bytes(), nil } + +func (s *s3RemoteStorageClient) WriteFile(loc *filer_pb.RemoteStorageLocation, entry *filer_pb.Entry, reader io.Reader) (err error) { + + fileSize := int64(filer.FileSize(entry)) + + partSize := int64(8 * 1024 * 1024) // The minimum/default allowed part size is 5MB + for partSize*1000 < fileSize { + partSize *= 4 + } + + // Create an uploader with the session and custom options + uploader := s3manager.NewUploaderWithClient(s.conn, func(u *s3manager.Uploader) { + u.PartSize = partSize + u.Concurrency = 5 + }) + + // process tagging + tags := "" + for k, v := range entry.Extended { + if len(tags) > 0 { + tags = tags + "&" + } + tags = tags + k + "=" + string(v) + } + + // Upload the file to S3. + _, err = uploader.Upload(&s3manager.UploadInput{ + Bucket: aws.String(loc.Bucket), + Key: aws.String(loc.Path[1:]), + Body: reader, + ACL: aws.String("private"), + ServerSideEncryption: aws.String("AES256"), + StorageClass: aws.String("STANDARD_IA"), + Tagging: aws.String(tags), + }) + + //in case it fails to upload + if err != nil { + return fmt.Errorf("upload to s3 %s/%s%s: %v", loc.Name, loc.Bucket, loc.Path, err) + } + + return nil +} + +func toTagging(attributes map[string][]byte) *s3.Tagging { + tagging := &s3.Tagging{} + for k, v := range attributes { + tagging.TagSet = append(tagging.TagSet, &s3.Tag{ + Key: aws.String(k), + Value: aws.String(string(v)), + }) + } + return tagging +} + +func (s *s3RemoteStorageClient) UpdateFileMetadata(loc *filer_pb.RemoteStorageLocation, entry *filer_pb.Entry) (err error) { + tagging := toTagging(entry.Extended) + if len(tagging.TagSet) > 0 { + _, err = s.conn.PutObjectTagging(&s3.PutObjectTaggingInput{ + Bucket: aws.String(loc.Bucket), + Key: aws.String(loc.Path[1:]), + Tagging: toTagging(entry.Extended), + }) + } else { + _, err = s.conn.DeleteObjectTagging(&s3.DeleteObjectTaggingInput{ + Bucket: aws.String(loc.Bucket), + Key: aws.String(loc.Path[1:]), + }) + } + return +} +func (s *s3RemoteStorageClient) DeleteFile(loc *filer_pb.RemoteStorageLocation) (err error) { + _, err = s.conn.DeleteObject(&s3.DeleteObjectInput{ + Bucket: aws.String(loc.Bucket), + Key: aws.String(loc.Path[1:]), + }) + return +} diff --git a/weed/shell/command_remote_configure.go b/weed/shell/command_remote_configure.go index 20ded5f5b..7a9ad1f65 100644 --- a/weed/shell/command_remote_configure.go +++ b/weed/shell/command_remote_configure.go @@ -7,6 +7,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/util" + "github.com/golang/protobuf/jsonpb" "github.com/golang/protobuf/proto" "io" "regexp" @@ -96,9 +97,15 @@ func (c *commandRemoteConfigure) listExistingRemoteStorages(commandEnv *CommandE conf.S3SecretKey = "" - fmt.Fprintf(writer, "%+v\n", conf) + m := jsonpb.Marshaler{ + EmitDefaults: false, + Indent: " ", + } - return nil + err := m.Marshal(writer, conf) + fmt.Fprintln(writer) + + return err }) } diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go index 73a5119d5..37b235a55 100644 --- a/weed/shell/command_remote_mount.go +++ b/weed/shell/command_remote_mount.go @@ -88,7 +88,10 @@ func (c *commandRemoteMount) listExistingRemoteStorageMounts(commandEnv *Command Indent: " ", } - return m.Marshal(writer, mappings) + err = m.Marshal(writer, mappings) + fmt.Fprintln(writer) + + return } From 26c222f59684d438b13042398f69952b006dafe9 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 8 Aug 2021 15:12:39 -0700 Subject: [PATCH 183/265] shell: volume.tier.move avoid moving all volumes to one destination --- weed/shell/command_volume_fix_replication.go | 2 ++ weed/shell/command_volume_tier_move.go | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/weed/shell/command_volume_fix_replication.go b/weed/shell/command_volume_fix_replication.go index 7e7c0a93d..326cb2a40 100644 --- a/weed/shell/command_volume_fix_replication.go +++ b/weed/shell/command_volume_fix_replication.go @@ -195,6 +195,8 @@ func (c *commandVolumeFixReplication) fixOneUnderReplicatedVolume(commandEnv *Co fmt.Fprintf(writer, "replicating volume %d %s from %s to dataNode %s ...\n", replica.info.Id, replicaPlacement, replica.location.dataNode.Id, dst.dataNode.Id) if !takeAction { + // adjust free volume count + dst.dataNode.DiskInfos[replica.info.DiskType].FreeVolumeCount-- break } diff --git a/weed/shell/command_volume_tier_move.go b/weed/shell/command_volume_tier_move.go index 19a515dab..355063ded 100644 --- a/weed/shell/command_volume_tier_move.go +++ b/weed/shell/command_volume_tier_move.go @@ -122,6 +122,8 @@ func doVolumeTierMove(commandEnv *CommandEnv, writer io.Writer, vid needle.Volum hasFoundTarget = true if !applyChanges { + // adjust volume count + dst.dataNode.DiskInfos[string(toDiskType)].VolumeCount++ break } @@ -133,6 +135,9 @@ func doVolumeTierMove(commandEnv *CommandEnv, writer io.Writer, vid needle.Volum return fmt.Errorf("move volume %d %s => %s : %v", vid, locations[0].Url, dst.dataNode.Id, err) } + // adjust volume count + dst.dataNode.DiskInfos[string(toDiskType)].VolumeCount++ + // remove the remaining replicas for _, loc := range locations { if loc.Url != dst.dataNode.Id { From 4370a4db634f2268526911842a804d9dee97aadc Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 8 Aug 2021 15:19:39 -0700 Subject: [PATCH 184/265] use int64 for volume count in case of negative overflow --- weed/pb/master.proto | 10 +++++----- weed/pb/master_pb/master.pb.go | 30 +++++++++++++++--------------- weed/topology/disk.go | 20 ++++++++++---------- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/weed/pb/master.proto b/weed/pb/master.proto index cdb49d1e3..6ef27fb4d 100644 --- a/weed/pb/master.proto +++ b/weed/pb/master.proto @@ -215,13 +215,13 @@ message CollectionDeleteResponse { // message DiskInfo { string type = 1; - uint64 volume_count = 2; - uint64 max_volume_count = 3; - uint64 free_volume_count = 4; - uint64 active_volume_count = 5; + int64 volume_count = 2; + int64 max_volume_count = 3; + int64 free_volume_count = 4; + int64 active_volume_count = 5; repeated VolumeInformationMessage volume_infos = 6; repeated VolumeEcShardInformationMessage ec_shard_infos = 7; - uint64 remote_volume_count = 8; + int64 remote_volume_count = 8; } message DataNodeInfo { string id = 1; diff --git a/weed/pb/master_pb/master.pb.go b/weed/pb/master_pb/master.pb.go index 29d8499f8..75e165ed6 100644 --- a/weed/pb/master_pb/master.pb.go +++ b/weed/pb/master_pb/master.pb.go @@ -1628,13 +1628,13 @@ type DiskInfo struct { unknownFields protoimpl.UnknownFields Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - VolumeCount uint64 `protobuf:"varint,2,opt,name=volume_count,json=volumeCount,proto3" json:"volume_count,omitempty"` - MaxVolumeCount uint64 `protobuf:"varint,3,opt,name=max_volume_count,json=maxVolumeCount,proto3" json:"max_volume_count,omitempty"` - FreeVolumeCount uint64 `protobuf:"varint,4,opt,name=free_volume_count,json=freeVolumeCount,proto3" json:"free_volume_count,omitempty"` - ActiveVolumeCount uint64 `protobuf:"varint,5,opt,name=active_volume_count,json=activeVolumeCount,proto3" json:"active_volume_count,omitempty"` + VolumeCount int64 `protobuf:"varint,2,opt,name=volume_count,json=volumeCount,proto3" json:"volume_count,omitempty"` + MaxVolumeCount int64 `protobuf:"varint,3,opt,name=max_volume_count,json=maxVolumeCount,proto3" json:"max_volume_count,omitempty"` + FreeVolumeCount int64 `protobuf:"varint,4,opt,name=free_volume_count,json=freeVolumeCount,proto3" json:"free_volume_count,omitempty"` + ActiveVolumeCount int64 `protobuf:"varint,5,opt,name=active_volume_count,json=activeVolumeCount,proto3" json:"active_volume_count,omitempty"` VolumeInfos []*VolumeInformationMessage `protobuf:"bytes,6,rep,name=volume_infos,json=volumeInfos,proto3" json:"volume_infos,omitempty"` EcShardInfos []*VolumeEcShardInformationMessage `protobuf:"bytes,7,rep,name=ec_shard_infos,json=ecShardInfos,proto3" json:"ec_shard_infos,omitempty"` - RemoteVolumeCount uint64 `protobuf:"varint,8,opt,name=remote_volume_count,json=remoteVolumeCount,proto3" json:"remote_volume_count,omitempty"` + RemoteVolumeCount int64 `protobuf:"varint,8,opt,name=remote_volume_count,json=remoteVolumeCount,proto3" json:"remote_volume_count,omitempty"` } func (x *DiskInfo) Reset() { @@ -1676,28 +1676,28 @@ func (x *DiskInfo) GetType() string { return "" } -func (x *DiskInfo) GetVolumeCount() uint64 { +func (x *DiskInfo) GetVolumeCount() int64 { if x != nil { return x.VolumeCount } return 0 } -func (x *DiskInfo) GetMaxVolumeCount() uint64 { +func (x *DiskInfo) GetMaxVolumeCount() int64 { if x != nil { return x.MaxVolumeCount } return 0 } -func (x *DiskInfo) GetFreeVolumeCount() uint64 { +func (x *DiskInfo) GetFreeVolumeCount() int64 { if x != nil { return x.FreeVolumeCount } return 0 } -func (x *DiskInfo) GetActiveVolumeCount() uint64 { +func (x *DiskInfo) GetActiveVolumeCount() int64 { if x != nil { return x.ActiveVolumeCount } @@ -1718,7 +1718,7 @@ func (x *DiskInfo) GetEcShardInfos() []*VolumeEcShardInformationMessage { return nil } -func (x *DiskInfo) GetRemoteVolumeCount() uint64 { +func (x *DiskInfo) GetRemoteVolumeCount() int64 { if x != nil { return x.RemoteVolumeCount } @@ -3134,15 +3134,15 @@ var file_master_proto_rawDesc = []byte{ 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x91, 0x03, 0x0a, 0x08, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0f, 0x66, 0x72, 0x65, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, + 0x03, 0x52, 0x0f, 0x66, 0x72, 0x65, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x46, 0x0a, 0x0c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, @@ -3155,7 +3155,7 @@ var file_master_proto_rawDesc = []byte{ 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0c, 0x65, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb7, 0x01, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x44, 0x0a, diff --git a/weed/topology/disk.go b/weed/topology/disk.go index a085f8dff..4e7d18f08 100644 --- a/weed/topology/disk.go +++ b/weed/topology/disk.go @@ -62,11 +62,11 @@ func (d *DiskUsages) ToDiskInfo() map[string]*master_pb.DiskInfo { ret := make(map[string]*master_pb.DiskInfo) for diskType, diskUsageCounts := range d.usages { m := &master_pb.DiskInfo{ - VolumeCount: uint64(diskUsageCounts.volumeCount), - MaxVolumeCount: uint64(diskUsageCounts.maxVolumeCount), - FreeVolumeCount: uint64(diskUsageCounts.maxVolumeCount - diskUsageCounts.volumeCount), - ActiveVolumeCount: uint64(diskUsageCounts.activeVolumeCount), - RemoteVolumeCount: uint64(diskUsageCounts.remoteVolumeCount), + VolumeCount: diskUsageCounts.volumeCount, + MaxVolumeCount: diskUsageCounts.maxVolumeCount, + FreeVolumeCount: diskUsageCounts.maxVolumeCount - diskUsageCounts.volumeCount, + ActiveVolumeCount: diskUsageCounts.activeVolumeCount, + RemoteVolumeCount: diskUsageCounts.remoteVolumeCount, } ret[string(diskType)] = m } @@ -241,11 +241,11 @@ func (d *Disk) ToDiskInfo() *master_pb.DiskInfo { diskUsage := d.diskUsages.getOrCreateDisk(types.ToDiskType(string(d.Id()))) m := &master_pb.DiskInfo{ Type: string(d.Id()), - VolumeCount: uint64(diskUsage.volumeCount), - MaxVolumeCount: uint64(diskUsage.maxVolumeCount), - FreeVolumeCount: uint64(diskUsage.maxVolumeCount - diskUsage.volumeCount), - ActiveVolumeCount: uint64(diskUsage.activeVolumeCount), - RemoteVolumeCount: uint64(diskUsage.remoteVolumeCount), + VolumeCount: diskUsage.volumeCount, + MaxVolumeCount: diskUsage.maxVolumeCount, + FreeVolumeCount: diskUsage.maxVolumeCount - diskUsage.volumeCount, + ActiveVolumeCount: diskUsage.activeVolumeCount, + RemoteVolumeCount: diskUsage.remoteVolumeCount, } for _, v := range d.GetVolumes() { m.VolumeInfos = append(m.VolumeInfos, v.ToVolumeInformationMessage()) From dcf614a8c39d85bd10884d7feaa6aac8217c2946 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 8 Aug 2021 15:58:10 -0700 Subject: [PATCH 185/265] skip if the remote entry update is because of internal managerial operations --- weed/command/filer_remote_sync.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/weed/command/filer_remote_sync.go b/weed/command/filer_remote_sync.go index 8d176ce2a..be8d3faff 100644 --- a/weed/command/filer_remote_sync.go +++ b/weed/command/filer_remote_sync.go @@ -151,6 +151,10 @@ func followUpdatesAndUploadToRemote(option *RemoteSyncOptions, filerSource *sour return nil } fmt.Printf("create: %+v\n", resp) + if !shouldSendToRemote(message.NewEntry) { + fmt.Printf("skipping creating: %+v\n", resp) + return nil + } dest := toRemoteStorageLocation(util.FullPath(mountedDir), util.NewFullPath(message.NewParentPath, message.NewEntry.Name), remoteStorageMountLocation) reader := filer.NewChunkStreamReader(filerSource, message.NewEntry.Chunks) return client.WriteFile(dest, message.NewEntry, reader) @@ -163,6 +167,10 @@ func followUpdatesAndUploadToRemote(option *RemoteSyncOptions, filerSource *sour if message.OldEntry != nil && message.NewEntry != nil { oldDest := toRemoteStorageLocation(util.FullPath(mountedDir), util.NewFullPath(resp.Directory, message.OldEntry.Name), remoteStorageMountLocation) dest := toRemoteStorageLocation(util.FullPath(mountedDir), util.NewFullPath(message.NewParentPath, message.NewEntry.Name), remoteStorageMountLocation) + if !shouldSendToRemote(message.NewEntry) { + fmt.Printf("skipping updating: %+v\n", resp) + return nil + } if resp.Directory == message.NewParentPath && message.OldEntry.Name == message.NewEntry.Name { if isSameChunks(message.OldEntry.Chunks, message.NewEntry.Chunks) { fmt.Printf("update meta: %+v\n", resp) @@ -217,3 +225,16 @@ func isSameChunks(a, b []*filer_pb.FileChunk) bool { } return true } + +func shouldSendToRemote(entry *filer_pb.Entry) bool { + if entry.RemoteEntry == nil { + return true + } + if entry.RemoteEntry.Size != int64(filer.FileSize(entry)) { + return true + } + if entry.RemoteEntry.LastModifiedAt < entry.Attributes.Mtime { + return true + } + return false +} From 7412ccdf88d5096e0d0d9475a77322188f9c8a5d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 8 Aug 2021 17:55:03 -0700 Subject: [PATCH 186/265] write back remote entry to local entry after uploading to remote --- weed/command/filer_remote_sync.go | 24 +++++++++++++++++-- weed/remote_storage/remote_storage.go | 2 +- weed/remote_storage/s3/s3_storage_client.go | 26 ++++++++++++++++++--- 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/weed/command/filer_remote_sync.go b/weed/command/filer_remote_sync.go index be8d3faff..4afb7c091 100644 --- a/weed/command/filer_remote_sync.go +++ b/weed/command/filer_remote_sync.go @@ -1,6 +1,7 @@ package command import ( + "context" "fmt" "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/glog" @@ -157,7 +158,11 @@ func followUpdatesAndUploadToRemote(option *RemoteSyncOptions, filerSource *sour } dest := toRemoteStorageLocation(util.FullPath(mountedDir), util.NewFullPath(message.NewParentPath, message.NewEntry.Name), remoteStorageMountLocation) reader := filer.NewChunkStreamReader(filerSource, message.NewEntry.Chunks) - return client.WriteFile(dest, message.NewEntry, reader) + remoteEntry, writeErr := client.WriteFile(dest, message.NewEntry, reader) + if writeErr != nil { + return writeErr + } + return updateLocalEntry(&remoteSyncOptions, message.NewParentPath, message.NewEntry, remoteEntry) } if message.OldEntry != nil && message.NewEntry == nil { fmt.Printf("delete: %+v\n", resp) @@ -182,7 +187,11 @@ func followUpdatesAndUploadToRemote(option *RemoteSyncOptions, filerSource *sour return err } reader := filer.NewChunkStreamReader(filerSource, message.NewEntry.Chunks) - return client.WriteFile(dest, message.NewEntry, reader) + remoteEntry, writeErr := client.WriteFile(dest, message.NewEntry, reader) + if writeErr != nil { + return writeErr + } + return updateLocalEntry(&remoteSyncOptions, message.NewParentPath, message.NewEntry, remoteEntry) } return nil @@ -238,3 +247,14 @@ func shouldSendToRemote(entry *filer_pb.Entry) bool { } return false } + +func updateLocalEntry(filerClient filer_pb.FilerClient, dir string, entry *filer_pb.Entry, remoteEntry *filer_pb.RemoteEntry) error { + entry.RemoteEntry = remoteEntry + return filerClient.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + _, err := client.UpdateEntry(context.Background(), &filer_pb.UpdateEntryRequest{ + Directory: dir, + Entry: entry, + }) + return err + }) +} \ No newline at end of file diff --git a/weed/remote_storage/remote_storage.go b/weed/remote_storage/remote_storage.go index 608d158ad..c94260ac0 100644 --- a/weed/remote_storage/remote_storage.go +++ b/weed/remote_storage/remote_storage.go @@ -32,7 +32,7 @@ type VisitFunc func(dir string, name string, isDirectory bool, remoteEntry *file type RemoteStorageClient interface { Traverse(loc *filer_pb.RemoteStorageLocation, visitFn VisitFunc) error ReadFile(loc *filer_pb.RemoteStorageLocation, offset int64, size int64) (data []byte, err error) - WriteFile(loc *filer_pb.RemoteStorageLocation, entry *filer_pb.Entry, reader io.Reader) (err error) + WriteFile(loc *filer_pb.RemoteStorageLocation, entry *filer_pb.Entry, reader io.Reader) (remoteEntry *filer_pb.RemoteEntry, err error) UpdateFileMetadata(loc *filer_pb.RemoteStorageLocation, entry *filer_pb.Entry) (err error) DeleteFile(loc *filer_pb.RemoteStorageLocation) (err error) } diff --git a/weed/remote_storage/s3/s3_storage_client.go b/weed/remote_storage/s3/s3_storage_client.go index 316751227..5be64406e 100644 --- a/weed/remote_storage/s3/s3_storage_client.go +++ b/weed/remote_storage/s3/s3_storage_client.go @@ -116,7 +116,7 @@ func (s *s3RemoteStorageClient) ReadFile(loc *filer_pb.RemoteStorageLocation, of return writerAt.Bytes(), nil } -func (s *s3RemoteStorageClient) WriteFile(loc *filer_pb.RemoteStorageLocation, entry *filer_pb.Entry, reader io.Reader) (err error) { +func (s *s3RemoteStorageClient) WriteFile(loc *filer_pb.RemoteStorageLocation, entry *filer_pb.Entry, reader io.Reader) (remoteEntry *filer_pb.RemoteEntry, err error) { fileSize := int64(filer.FileSize(entry)) @@ -153,10 +153,12 @@ func (s *s3RemoteStorageClient) WriteFile(loc *filer_pb.RemoteStorageLocation, e //in case it fails to upload if err != nil { - return fmt.Errorf("upload to s3 %s/%s%s: %v", loc.Name, loc.Bucket, loc.Path, err) + return nil, fmt.Errorf("upload to s3 %s/%s%s: %v", loc.Name, loc.Bucket, loc.Path, err) } - return nil + // read back the remote entry + return s.readFileRemoteEntry(loc) + } func toTagging(attributes map[string][]byte) *s3.Tagging { @@ -170,6 +172,24 @@ func toTagging(attributes map[string][]byte) *s3.Tagging { return tagging } +func (s *s3RemoteStorageClient) readFileRemoteEntry(loc *filer_pb.RemoteStorageLocation) (*filer_pb.RemoteEntry, error) { + resp, err := s.conn.HeadObject(&s3.HeadObjectInput{ + Bucket: aws.String(loc.Bucket), + Key: aws.String(loc.Path[1:]), + }) + if err != nil { + return nil, err + } + + return &filer_pb.RemoteEntry{ + LastModifiedAt: resp.LastModified.Unix(), + Size: *resp.ContentLength, + ETag: *resp.ETag, + StorageName: s.conf.Name, + }, nil + +} + func (s *s3RemoteStorageClient) UpdateFileMetadata(loc *filer_pb.RemoteStorageLocation, entry *filer_pb.Entry) (err error) { tagging := toTagging(entry.Extended) if len(tagging.TagSet) > 0 { From 882a93dacd2ca8549af50b80a8a98a861fdee0ed Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 8 Aug 2021 17:56:26 -0700 Subject: [PATCH 187/265] fix tests --- weed/shell/command_volume_list_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/shell/command_volume_list_test.go b/weed/shell/command_volume_list_test.go index 72c76f242..379cf4943 100644 --- a/weed/shell/command_volume_list_test.go +++ b/weed/shell/command_volume_list_test.go @@ -68,7 +68,7 @@ func parseOutput(output string) *master_pb.TopologyInfo { maxVolumeCount, _ := strconv.Atoi(maxVolumeCountStr) disk = &master_pb.DiskInfo{ Type: diskType, - MaxVolumeCount: uint64(maxVolumeCount), + MaxVolumeCount: int64(maxVolumeCount), } dn.DiskInfos[types.ToDiskType(diskType).String()] = disk } else { From c0b12da4efbeb272d015c8cd51c1751d4f9abde7 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 8 Aug 2021 22:26:37 -0700 Subject: [PATCH 188/265] shell: add filer.remote.unmount --- weed/filer/filer_remote_storage.go | 17 ++++ weed/pb/filer_pb/filer_client.go | 115 +++++++++++---------- weed/shell/command_remote_mount.go | 25 +++-- weed/shell/command_remote_unmount.go | 146 +++++++++++++++++++++++++++ 4 files changed, 239 insertions(+), 64 deletions(-) create mode 100644 weed/shell/command_remote_unmount.go diff --git a/weed/filer/filer_remote_storage.go b/weed/filer/filer_remote_storage.go index 573dcf3e7..bb5a3604a 100644 --- a/weed/filer/filer_remote_storage.go +++ b/weed/filer/filer_remote_storage.go @@ -144,6 +144,23 @@ func AddRemoteStorageMapping(oldContent []byte, dir string, storageLocation *fil return } +func RemoveRemoteStorageMapping(oldContent []byte, dir string) (newContent []byte, err error) { + mappings, unmarshalErr := UnmarshalRemoteStorageMappings(oldContent) + if unmarshalErr != nil { + return nil, unmarshalErr + } + + // set the new mapping + delete(mappings.Mappings, dir) + + if newContent, err = proto.Marshal(mappings); err != nil { + return oldContent, fmt.Errorf("marshal mappings: %v", err) + } + + return +} + + func ReadMountMappings(grpcDialOption grpc.DialOption, filerAddress string) (mappings *filer_pb.RemoteStorageMapping, readErr error) { var oldContent []byte diff --git a/weed/pb/filer_pb/filer_client.go b/weed/pb/filer_pb/filer_client.go index 12f918137..b34bcabb8 100644 --- a/weed/pb/filer_pb/filer_client.go +++ b/weed/pb/filer_pb/filer_client.go @@ -204,38 +204,41 @@ func Touch(filerClient FilerClient, parentDirectoryPath string, entryName string func Mkdir(filerClient FilerClient, parentDirectoryPath string, dirName string, fn func(entry *Entry)) error { return filerClient.WithFilerClient(func(client SeaweedFilerClient) error { - - entry := &Entry{ - Name: dirName, - IsDirectory: true, - Attributes: &FuseAttributes{ - Mtime: time.Now().Unix(), - Crtime: time.Now().Unix(), - FileMode: uint32(0777 | os.ModeDir), - Uid: OS_UID, - Gid: OS_GID, - }, - } - - if fn != nil { - fn(entry) - } - - request := &CreateEntryRequest{ - Directory: parentDirectoryPath, - Entry: entry, - } - - glog.V(1).Infof("mkdir: %v", request) - if err := CreateEntry(client, request); err != nil { - glog.V(0).Infof("mkdir %v: %v", request, err) - return fmt.Errorf("mkdir %s/%s: %v", parentDirectoryPath, dirName, err) - } - - return nil + return DoMkdir(client, parentDirectoryPath, dirName, fn) }) } +func DoMkdir(client SeaweedFilerClient, parentDirectoryPath string, dirName string, fn func(entry *Entry)) error { + entry := &Entry{ + Name: dirName, + IsDirectory: true, + Attributes: &FuseAttributes{ + Mtime: time.Now().Unix(), + Crtime: time.Now().Unix(), + FileMode: uint32(0777 | os.ModeDir), + Uid: OS_UID, + Gid: OS_GID, + }, + } + + if fn != nil { + fn(entry) + } + + request := &CreateEntryRequest{ + Directory: parentDirectoryPath, + Entry: entry, + } + + glog.V(1).Infof("mkdir: %v", request) + if err := CreateEntry(client, request); err != nil { + glog.V(0).Infof("mkdir %v: %v", request, err) + return fmt.Errorf("mkdir %s/%s: %v", parentDirectoryPath, dirName, err) + } + + return nil +} + func MkFile(filerClient FilerClient, parentDirectoryPath string, fileName string, chunks []*FileChunk, fn func(entry *Entry)) error { return filerClient.WithFilerClient(func(client SeaweedFilerClient) error { @@ -273,31 +276,33 @@ func MkFile(filerClient FilerClient, parentDirectoryPath string, fileName string func Remove(filerClient FilerClient, parentDirectoryPath, name string, isDeleteData, isRecursive, ignoreRecursiveErr, isFromOtherCluster bool, signatures []int32) error { return filerClient.WithFilerClient(func(client SeaweedFilerClient) error { - - deleteEntryRequest := &DeleteEntryRequest{ - Directory: parentDirectoryPath, - Name: name, - IsDeleteData: isDeleteData, - IsRecursive: isRecursive, - IgnoreRecursiveError: ignoreRecursiveErr, - IsFromOtherCluster: isFromOtherCluster, - Signatures: signatures, - } - if resp, err := client.DeleteEntry(context.Background(), deleteEntryRequest); err != nil { - if strings.Contains(err.Error(), ErrNotFound.Error()) { - return nil - } - return err - } else { - if resp.Error != "" { - if strings.Contains(resp.Error, ErrNotFound.Error()) { - return nil - } - return errors.New(resp.Error) - } - } - - return nil - + return DoRemove(client, parentDirectoryPath, name, isDeleteData, isRecursive, ignoreRecursiveErr, isFromOtherCluster, signatures) }) } + +func DoRemove(client SeaweedFilerClient, parentDirectoryPath string, name string, isDeleteData bool, isRecursive bool, ignoreRecursiveErr bool, isFromOtherCluster bool, signatures []int32) error { + deleteEntryRequest := &DeleteEntryRequest{ + Directory: parentDirectoryPath, + Name: name, + IsDeleteData: isDeleteData, + IsRecursive: isRecursive, + IgnoreRecursiveError: ignoreRecursiveErr, + IsFromOtherCluster: isFromOtherCluster, + Signatures: signatures, + } + if resp, err := client.DeleteEntry(context.Background(), deleteEntryRequest); err != nil { + if strings.Contains(err.Error(), ErrNotFound.Error()) { + return nil + } + return err + } else { + if resp.Error != "" { + if strings.Contains(resp.Error, ErrNotFound.Error()) { + return nil + } + return errors.New(resp.Error) + } + } + + return nil +} diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go index 37b235a55..91f8de2e2 100644 --- a/weed/shell/command_remote_mount.go +++ b/weed/shell/command_remote_mount.go @@ -9,6 +9,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/remote_storage" "github.com/chrislusf/seaweedfs/weed/util" "github.com/golang/protobuf/jsonpb" + "github.com/golang/protobuf/proto" "io" ) @@ -50,7 +51,8 @@ func (c *commandRemoteMount) Do(args []string, commandEnv *CommandEnv, writer io } if *dir == "" { - return c.listExistingRemoteStorageMounts(commandEnv, writer) + _, err = listExistingRemoteStorageMounts(commandEnv, writer) + return err } remoteStorageLocation := remote_storage.ParseLocation(*remote) @@ -75,24 +77,29 @@ func (c *commandRemoteMount) Do(args []string, commandEnv *CommandEnv, writer io return nil } -func (c *commandRemoteMount) listExistingRemoteStorageMounts(commandEnv *CommandEnv, writer io.Writer) (err error) { +func listExistingRemoteStorageMounts(commandEnv *CommandEnv, writer io.Writer) (mappings *filer_pb.RemoteStorageMapping, err error) { // read current mapping - mappings, readErr := filer.ReadMountMappings(commandEnv.option.GrpcDialOption, commandEnv.option.FilerAddress) - if readErr != nil { - return readErr + mappings, err = filer.ReadMountMappings(commandEnv.option.GrpcDialOption, commandEnv.option.FilerAddress) + if err != nil { + return mappings, err } + jsonPrintln(writer, mappings) + + return + +} + +func jsonPrintln(writer io.Writer, message proto.Message) error { m := jsonpb.Marshaler{ EmitDefaults: false, Indent: " ", } - err = m.Marshal(writer, mappings) + err := m.Marshal(writer, message) fmt.Fprintln(writer) - - return - + return err } func (c *commandRemoteMount) findRemoteStorageConfiguration(commandEnv *CommandEnv, writer io.Writer, remote *filer_pb.RemoteStorageLocation) (conf *filer_pb.RemoteConf, err error) { diff --git a/weed/shell/command_remote_unmount.go b/weed/shell/command_remote_unmount.go new file mode 100644 index 000000000..b16da44f1 --- /dev/null +++ b/weed/shell/command_remote_unmount.go @@ -0,0 +1,146 @@ +package shell + +import ( + "context" + "flag" + "fmt" + "github.com/chrislusf/seaweedfs/weed/filer" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/chrislusf/seaweedfs/weed/util" + "io" +) + +func init() { + Commands = append(Commands, &commandRemoteUnmount{}) +} + +type commandRemoteUnmount struct { +} + +func (c *commandRemoteUnmount) Name() string { + return "remote.unmount" +} + +func (c *commandRemoteUnmount) Help() string { + return `unmount remote storage + + # assume a remote storage is configured to name "s3_1" + remote.configure -name=s3_1 -type=s3 -access_key=xxx -secret_key=yyy + # mount and pull one bucket + remote.mount -dir=xxx -remote=s3_1/bucket + + # unmount the mounted directory and remove its cache + remote.unmount -dir=xxx + +` +} + +func (c *commandRemoteUnmount) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { + + remoteMountCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) + + dir := remoteMountCommand.String("dir", "", "a directory in filer") + + if err = remoteMountCommand.Parse(args); err != nil { + return nil + } + + mappings, listErr := filer.ReadMountMappings(commandEnv.option.GrpcDialOption, commandEnv.option.FilerAddress) + if listErr != nil { + return listErr + } + if *dir == "" { + return jsonPrintln(writer, mappings) + } + + _, found := mappings.Mappings[*dir] + if !found { + return fmt.Errorf("directory %s is not mounted", *dir) + } + + // purge mounted data + if err = c.purgeMountedData(commandEnv, *dir); err != nil { + return fmt.Errorf("purge mounted data: %v", err) + } + + // store a mount configuration in filer + if err = c.deleteMountMapping(commandEnv, *dir); err != nil { + return fmt.Errorf("delete mount mapping: %v", err) + } + + return nil +} + +func (c *commandRemoteUnmount) findRemoteStorageConfiguration(commandEnv *CommandEnv, writer io.Writer, remote *filer_pb.RemoteStorageLocation) (conf *filer_pb.RemoteConf, err error) { + + return filer.ReadRemoteStorageConf(commandEnv.option.GrpcDialOption, commandEnv.option.FilerAddress, remote.Name) + +} + +func (c *commandRemoteUnmount) purgeMountedData(commandEnv *CommandEnv, dir string) error { + + // find existing directory, and ensure the directory is empty + err := commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + parent, name := util.FullPath(dir).DirAndName() + lookupResp, lookupErr := client.LookupDirectoryEntry(context.Background(), &filer_pb.LookupDirectoryEntryRequest{ + Directory: parent, + Name: name, + }) + if lookupErr != nil { + return fmt.Errorf("lookup %s: %v", dir, lookupErr) + } + + oldEntry := lookupResp.Entry + + deleteError := filer_pb.DoRemove(client, parent, name, true, true, true, false, nil) + if deleteError != nil { + return fmt.Errorf("delete %s: %v", dir, deleteError) + } + + mkdirErr := filer_pb.DoMkdir(client, parent, name, func(entry *filer_pb.Entry) { + entry.Attributes = oldEntry.Attributes + entry.Extended = oldEntry.Extended + }) + if mkdirErr != nil { + return fmt.Errorf("mkdir %s: %v", dir, mkdirErr) + } + + return nil + }) + if err != nil { + return err + } + + return nil +} + +func (c *commandRemoteUnmount) deleteMountMapping(commandEnv *CommandEnv, dir string) (err error) { + + // read current mapping + var oldContent, newContent []byte + err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + oldContent, err = filer.ReadInsideFiler(client, filer.DirectoryEtcRemote, filer.REMOTE_STORAGE_MOUNT_FILE) + return err + }) + if err != nil { + if err != filer_pb.ErrNotFound { + return fmt.Errorf("read existing mapping: %v", err) + } + } + + // add new mapping + newContent, err = filer.RemoveRemoteStorageMapping(oldContent, dir) + if err != nil { + return fmt.Errorf("delete mount %s: %v", dir, err) + } + + // save back + err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + return filer.SaveInsideFiler(client, filer.DirectoryEtcRemote, filer.REMOTE_STORAGE_MOUNT_FILE, newContent) + }) + if err != nil { + return fmt.Errorf("save mapping: %v", err) + } + + return nil +} From df85f7a1ebf81e1f8fe8bed5089bf5be71d7c76f Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 8 Aug 2021 22:30:12 -0700 Subject: [PATCH 189/265] adjust help message --- weed/command/filer_remote_sync.go | 4 ++-- weed/command/filer_sync.go | 4 ++-- weed/shell/command_remote_mount.go | 3 +++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/weed/command/filer_remote_sync.go b/weed/command/filer_remote_sync.go index 4afb7c091..dbc102c9d 100644 --- a/weed/command/filer_remote_sync.go +++ b/weed/command/filer_remote_sync.go @@ -56,8 +56,8 @@ func init() { var cmdFilerRemoteSynchronize = &Command{ UsageLine: "filer.remote.sync -filer=: -dir=/mount/s3_on_cloud", - Short: "resumeable continuously write back updates to remote storage if the directory is mounted to the remote storage", - Long: `resumeable continuously write back updates to remote storage if the directory is mounted to the remote storage + Short: "resumable continuously write back updates to remote storage if the directory is mounted to the remote storage", + Long: `resumable continuously write back updates to remote storage if the directory is mounted to the remote storage filer.remote.sync listens on filer update events. If any mounted remote file is updated, it will fetch the updated content, diff --git a/weed/command/filer_sync.go b/weed/command/filer_sync.go index a20f17201..a08238b56 100644 --- a/weed/command/filer_sync.go +++ b/weed/command/filer_sync.go @@ -70,8 +70,8 @@ func init() { var cmdFilerSynchronize = &Command{ UsageLine: "filer.sync -a=: -b=:", - Short: "resumeable continuous synchronization between two active-active or active-passive SeaweedFS clusters", - Long: `resumeable continuous synchronization for file changes between two active-active or active-passive filers + Short: "resumable continuous synchronization between two active-active or active-passive SeaweedFS clusters", + Long: `resumable continuous synchronization for file changes between two active-active or active-passive filers filer.sync listens on filer notifications. If any file is updated, it will fetch the updated content, and write to the other destination. Different from filer.replicate: diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go index 91f8de2e2..f7869e221 100644 --- a/weed/shell/command_remote_mount.go +++ b/weed/shell/command_remote_mount.go @@ -35,6 +35,9 @@ func (c *commandRemoteMount) Help() string { # mount and pull one directory in the bucket remote.mount -dir=xxx -remote=s3_1/bucket/dir1 + # after mount, start a separate process to write updates to remote storage + weed filer.remote.sync -filer=: -dir=xxx + ` } From c5f38c365d7d5cd4dc74e5cafefc0c461a0d478e Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 8 Aug 2021 22:30:36 -0700 Subject: [PATCH 190/265] go fmt --- weed/command/filer_backup.go | 4 ++-- weed/command/filer_meta_backup.go | 2 +- weed/command/filer_remote_sync.go | 6 +++--- weed/command/filer_sync.go | 4 ++-- weed/command/imports.go | 3 +-- weed/filer/filer_remote_storage.go | 2 -- weed/filer/filer_remote_storage_test.go | 2 +- weed/filer/read_remote.go | 2 +- weed/remote_storage/s3/s3_storage_client.go | 10 +++++----- weed/server/master_server.go | 4 ++-- weed/server/volume_grpc_remote.go | 10 +++++----- weed/shell/command_volume_balance_test.go | 2 +- 12 files changed, 24 insertions(+), 27 deletions(-) diff --git a/weed/command/filer_backup.go b/weed/command/filer_backup.go index 2828ccb39..0c450181b 100644 --- a/weed/command/filer_backup.go +++ b/weed/command/filer_backup.go @@ -107,12 +107,12 @@ func doFilerBackup(grpcDialOption grpc.DialOption, backupOption *FilerBackupOpti processEventFn := genProcessFunction(sourcePath, targetPath, dataSink, debug) - processEventFnWithOffset := pb.AddOffsetFunc(processEventFn, 3 * time.Second, func(counter int64, lastTsNs int64) error { + processEventFnWithOffset := pb.AddOffsetFunc(processEventFn, 3*time.Second, func(counter int64, lastTsNs int64) error { glog.V(0).Infof("backup %s progressed to %v %0.2f/sec", sourceFiler, time.Unix(0, lastTsNs), float64(counter)/float64(3)) return setOffset(grpcDialOption, sourceFiler, BackupKeyPrefix, int32(sinkId), lastTsNs) }) - return pb.FollowMetadata(sourceFiler, grpcDialOption, "backup_" + dataSink.GetName(), + return pb.FollowMetadata(sourceFiler, grpcDialOption, "backup_"+dataSink.GetName(), sourcePath, startFrom.UnixNano(), 0, processEventFnWithOffset, false) } diff --git a/weed/command/filer_meta_backup.go b/weed/command/filer_meta_backup.go index 108e76566..6fe323fba 100644 --- a/weed/command/filer_meta_backup.go +++ b/weed/command/filer_meta_backup.go @@ -189,7 +189,7 @@ func (metaBackup *FilerMetaBackupOptions) streamMetadataBackup() error { return nil } - processEventFnWithOffset := pb.AddOffsetFunc(eachEntryFunc, 3 * time.Second, func(counter int64, lastTsNs int64) error { + processEventFnWithOffset := pb.AddOffsetFunc(eachEntryFunc, 3*time.Second, func(counter int64, lastTsNs int64) error { lastTime := time.Unix(0, lastTsNs) glog.V(0).Infof("meta backup %s progressed to %v %0.2f/sec", *metaBackup.filerAddress, lastTime, float64(counter)/float64(3)) return metaBackup.setOffset(lastTime) diff --git a/weed/command/filer_remote_sync.go b/weed/command/filer_remote_sync.go index dbc102c9d..5caea112f 100644 --- a/weed/command/filer_remote_sync.go +++ b/weed/command/filer_remote_sync.go @@ -252,9 +252,9 @@ func updateLocalEntry(filerClient filer_pb.FilerClient, dir string, entry *filer entry.RemoteEntry = remoteEntry return filerClient.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { _, err := client.UpdateEntry(context.Background(), &filer_pb.UpdateEntryRequest{ - Directory: dir, - Entry: entry, + Directory: dir, + Entry: entry, }) return err }) -} \ No newline at end of file +} diff --git a/weed/command/filer_sync.go b/weed/command/filer_sync.go index a08238b56..5440811dd 100644 --- a/weed/command/filer_sync.go +++ b/weed/command/filer_sync.go @@ -165,12 +165,12 @@ func doSubscribeFilerMetaChanges(grpcDialOption grpc.DialOption, sourceFiler, so return persistEventFn(resp) } - processEventFnWithOffset := pb.AddOffsetFunc(processEventFn, 3 * time.Second, func(counter int64, lastTsNs int64) error { + processEventFnWithOffset := pb.AddOffsetFunc(processEventFn, 3*time.Second, func(counter int64, lastTsNs int64) error { glog.V(0).Infof("sync %s to %s progressed to %v %0.2f/sec", sourceFiler, targetFiler, time.Unix(0, lastTsNs), float64(counter)/float64(3)) return setOffset(grpcDialOption, targetFiler, SyncKeyPrefix, sourceFilerSignature, lastTsNs) }) - return pb.FollowMetadata(sourceFiler, grpcDialOption, "syncTo_" + targetFiler, + return pb.FollowMetadata(sourceFiler, grpcDialOption, "syncTo_"+targetFiler, sourcePath, sourceFilerOffsetTsNs, targetFilerSignature, processEventFnWithOffset, false) } diff --git a/weed/command/imports.go b/weed/command/imports.go index d7ade1379..ce0bf0e10 100644 --- a/weed/command/imports.go +++ b/weed/command/imports.go @@ -27,5 +27,4 @@ import ( _ "github.com/chrislusf/seaweedfs/weed/filer/redis" _ "github.com/chrislusf/seaweedfs/weed/filer/redis2" _ "github.com/chrislusf/seaweedfs/weed/filer/sqlite" - -) \ No newline at end of file +) diff --git a/weed/filer/filer_remote_storage.go b/weed/filer/filer_remote_storage.go index bb5a3604a..f09658015 100644 --- a/weed/filer/filer_remote_storage.go +++ b/weed/filer/filer_remote_storage.go @@ -160,8 +160,6 @@ func RemoveRemoteStorageMapping(oldContent []byte, dir string) (newContent []byt return } - - func ReadMountMappings(grpcDialOption grpc.DialOption, filerAddress string) (mappings *filer_pb.RemoteStorageMapping, readErr error) { var oldContent []byte if readErr = pb.WithFilerClient(filerAddress, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { diff --git a/weed/filer/filer_remote_storage_test.go b/weed/filer/filer_remote_storage_test.go index 427cd5a8a..35ffc7538 100644 --- a/weed/filer/filer_remote_storage_test.go +++ b/weed/filer/filer_remote_storage_test.go @@ -31,4 +31,4 @@ func TestFilerRemoteStorage_FindRemoteStorageClient(t *testing.T) { _, _, found4 := rs.FindRemoteStorageClient("/a/b/cc") assert.Equal(t, false, found4, "should not find storage client") -} \ No newline at end of file +} diff --git a/weed/filer/read_remote.go b/weed/filer/read_remote.go index d9423ceda..8636a5c20 100644 --- a/weed/filer/read_remote.go +++ b/weed/filer/read_remote.go @@ -9,7 +9,7 @@ func (entry *Entry) IsInRemoteOnly() bool { return len(entry.Chunks) == 0 && entry.Remote != nil && entry.Remote.Size > 0 } -func (f *Filer) ReadRemote(entry *Entry, offset int64, size int64) (data[]byte, err error) { +func (f *Filer) ReadRemote(entry *Entry, offset int64, size int64) (data []byte, err error) { client, _, found := f.RemoteStorage.GetRemoteStorageClient(entry.Remote.StorageName) if !found { return nil, fmt.Errorf("remote storage %v not found", entry.Remote.StorageName) diff --git a/weed/remote_storage/s3/s3_storage_client.go b/weed/remote_storage/s3/s3_storage_client.go index 5be64406e..5292f4bc4 100644 --- a/weed/remote_storage/s3/s3_storage_client.go +++ b/weed/remote_storage/s3/s3_storage_client.go @@ -174,13 +174,13 @@ func toTagging(attributes map[string][]byte) *s3.Tagging { func (s *s3RemoteStorageClient) readFileRemoteEntry(loc *filer_pb.RemoteStorageLocation) (*filer_pb.RemoteEntry, error) { resp, err := s.conn.HeadObject(&s3.HeadObjectInput{ - Bucket: aws.String(loc.Bucket), - Key: aws.String(loc.Path[1:]), + Bucket: aws.String(loc.Bucket), + Key: aws.String(loc.Path[1:]), }) if err != nil { return nil, err } - + return &filer_pb.RemoteEntry{ LastModifiedAt: resp.LastModified.Unix(), Size: *resp.ContentLength, @@ -200,8 +200,8 @@ func (s *s3RemoteStorageClient) UpdateFileMetadata(loc *filer_pb.RemoteStorageLo }) } else { _, err = s.conn.DeleteObjectTagging(&s3.DeleteObjectTaggingInput{ - Bucket: aws.String(loc.Bucket), - Key: aws.String(loc.Path[1:]), + Bucket: aws.String(loc.Bucket), + Key: aws.String(loc.Path[1:]), }) } return diff --git a/weed/server/master_server.go b/weed/server/master_server.go index a23ad0698..eab41524c 100644 --- a/weed/server/master_server.go +++ b/weed/server/master_server.go @@ -26,8 +26,8 @@ import ( ) const ( - SequencerType = "master.sequencer.type" - SequencerEtcdUrls = "master.sequencer.sequencer_etcd_urls" + SequencerType = "master.sequencer.type" + SequencerEtcdUrls = "master.sequencer.sequencer_etcd_urls" SequencerSnowflakeId = "master.sequencer.sequencer_snowflake_id" ) diff --git a/weed/server/volume_grpc_remote.go b/weed/server/volume_grpc_remote.go index 0b6cd465b..69e7276c9 100644 --- a/weed/server/volume_grpc_remote.go +++ b/weed/server/volume_grpc_remote.go @@ -18,16 +18,16 @@ func (vs *VolumeServer) FetchAndWriteNeedle(ctx context.Context, req *volume_ser } remoteConf := &filer_pb.RemoteConf{ - Type: req.RemoteType, - Name: req.RemoteName, + Type: req.RemoteType, + Name: req.RemoteName, S3AccessKey: req.S3AccessKey, S3SecretKey: req.S3SecretKey, - S3Region: req.S3Region, - S3Endpoint: req.S3Endpoint, + S3Region: req.S3Region, + S3Endpoint: req.S3Endpoint, } client, getClientErr := remote_storage.GetRemoteStorage(remoteConf) - if getClientErr != nil { + if getClientErr != nil { return nil, fmt.Errorf("get remote client: %v", getClientErr) } diff --git a/weed/shell/command_volume_balance_test.go b/weed/shell/command_volume_balance_test.go index d6624bbcc..9732e9bb7 100644 --- a/weed/shell/command_volume_balance_test.go +++ b/weed/shell/command_volume_balance_test.go @@ -187,7 +187,7 @@ func TestBalance(t *testing.T) { func TestVolumeSelection(t *testing.T) { topologyInfo := parseOutput(topoData) - vids, err := collectVolumeIdsForTierChange(nil, topologyInfo, 1000, types.ToDiskType("hdd"), "", 20.0, 0); + vids, err := collectVolumeIdsForTierChange(nil, topologyInfo, 1000, types.ToDiskType("hdd"), "", 20.0, 0) if err != nil { t.Errorf("collectVolumeIdsForTierChange: %v", err) } From 96ce85f5ae6281c14a4a190dcf5f527321c50472 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 8 Aug 2021 22:33:31 -0700 Subject: [PATCH 191/265] rename --- weed/server/volume_server.go | 30 +++++++++++++-------------- weed/server/volume_server_handlers.go | 16 +++++++------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/weed/server/volume_server.go b/weed/server/volume_server.go index 3bf740dc0..a0f32700b 100644 --- a/weed/server/volume_server.go +++ b/weed/server/volume_server.go @@ -17,9 +17,9 @@ import ( ) type VolumeServer struct { - inFlightDataSize int64 - concurrentUploadLimit int64 - inFlightDataLimitCond *sync.Cond + inFlightUploadDataSize int64 + concurrentUploadLimit int64 + inFlightUploadDataLimitCond *sync.Cond SeedMasterNodes []string currentMaster string @@ -68,18 +68,18 @@ func NewVolumeServer(adminMux, publicMux *http.ServeMux, ip string, vs := &VolumeServer{ pulseSeconds: pulseSeconds, - dataCenter: dataCenter, - rack: rack, - needleMapKind: needleMapKind, - FixJpgOrientation: fixJpgOrientation, - ReadMode: readMode, - grpcDialOption: security.LoadClientTLS(util.GetViper(), "grpc.volume"), - compactionBytePerSecond: int64(compactionMBPerSecond) * 1024 * 1024, - fileSizeLimitBytes: int64(fileSizeLimitMB) * 1024 * 1024, - isHeartbeating: true, - stopChan: make(chan bool), - inFlightDataLimitCond: sync.NewCond(new(sync.Mutex)), - concurrentUploadLimit: concurrentUploadLimit, + dataCenter: dataCenter, + rack: rack, + needleMapKind: needleMapKind, + FixJpgOrientation: fixJpgOrientation, + ReadMode: readMode, + grpcDialOption: security.LoadClientTLS(util.GetViper(), "grpc.volume"), + compactionBytePerSecond: int64(compactionMBPerSecond) * 1024 * 1024, + fileSizeLimitBytes: int64(fileSizeLimitMB) * 1024 * 1024, + isHeartbeating: true, + stopChan: make(chan bool), + inFlightUploadDataLimitCond: sync.NewCond(new(sync.Mutex)), + concurrentUploadLimit: concurrentUploadLimit, } vs.SeedMasterNodes = masterNodes diff --git a/weed/server/volume_server_handlers.go b/weed/server/volume_server_handlers.go index 8ac3c0d90..917c7cd25 100644 --- a/weed/server/volume_server_handlers.go +++ b/weed/server/volume_server_handlers.go @@ -45,16 +45,16 @@ func (vs *VolumeServer) privateStoreHandler(w http.ResponseWriter, r *http.Reque // wait until in flight data is less than the limit contentLength := getContentLength(r) - vs.inFlightDataLimitCond.L.Lock() - for vs.concurrentUploadLimit != 0 && atomic.LoadInt64(&vs.inFlightDataSize) > vs.concurrentUploadLimit { - glog.V(4).Infof("wait because inflight data %d > %d", vs.inFlightDataSize, vs.concurrentUploadLimit) - vs.inFlightDataLimitCond.Wait() + vs.inFlightUploadDataLimitCond.L.Lock() + for vs.concurrentUploadLimit != 0 && atomic.LoadInt64(&vs.inFlightUploadDataSize) > vs.concurrentUploadLimit { + glog.V(4).Infof("wait because inflight data %d > %d", vs.inFlightUploadDataSize, vs.concurrentUploadLimit) + vs.inFlightUploadDataLimitCond.Wait() } - atomic.AddInt64(&vs.inFlightDataSize, contentLength) - vs.inFlightDataLimitCond.L.Unlock() + atomic.AddInt64(&vs.inFlightUploadDataSize, contentLength) + vs.inFlightUploadDataLimitCond.L.Unlock() defer func() { - atomic.AddInt64(&vs.inFlightDataSize, -contentLength) - vs.inFlightDataLimitCond.Signal() + atomic.AddInt64(&vs.inFlightUploadDataSize, -contentLength) + vs.inFlightUploadDataLimitCond.Signal() }() // processs uploads From 734c980040b77d19750cf4f00bb9a39312093d91 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 8 Aug 2021 23:25:16 -0700 Subject: [PATCH 192/265] volume: support concurrent download data size limit --- weed/command/server.go | 1 + weed/command/volume.go | 55 +++++++++++---------- weed/server/volume_grpc_admin.go | 4 +- weed/server/volume_grpc_batch_delete.go | 2 +- weed/server/volume_grpc_query.go | 2 +- weed/server/volume_server.go | 38 ++++++++------ weed/server/volume_server_handlers.go | 7 ++- weed/server/volume_server_handlers_read.go | 21 ++++++-- weed/server/volume_server_handlers_write.go | 2 +- weed/storage/store.go | 4 +- weed/storage/store_ec.go | 6 ++- weed/storage/store_ec_delete.go | 2 +- weed/storage/volume_read.go | 5 +- weed/storage/volume_vacuum_test.go | 2 +- 14 files changed, 93 insertions(+), 58 deletions(-) diff --git a/weed/command/server.go b/weed/command/server.go index 9bac2be97..fe10b24f7 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -116,6 +116,7 @@ func init() { serverOptions.v.compactionMBPerSecond = cmdServer.Flag.Int("volume.compactionMBps", 0, "limit compaction speed in mega bytes per second") serverOptions.v.fileSizeLimitMB = cmdServer.Flag.Int("volume.fileSizeLimitMB", 256, "limit file size to avoid out of memory") serverOptions.v.concurrentUploadLimitMB = cmdServer.Flag.Int("volume.concurrentUploadLimitMB", 64, "limit total concurrent upload size") + serverOptions.v.concurrentDownloadLimitMB = cmdServer.Flag.Int("volume.concurrentDownloadLimitMB", 64, "limit total concurrent download size") serverOptions.v.publicUrl = cmdServer.Flag.String("volume.publicUrl", "", "publicly accessible address") serverOptions.v.preStopSeconds = cmdServer.Flag.Int("volume.preStopSeconds", 10, "number of seconds between stop send heartbeats and stop volume server") serverOptions.v.pprof = cmdServer.Flag.Bool("volume.pprof", false, "enable pprof http handlers. precludes --memprofile and --cpuprofile") diff --git a/weed/command/volume.go b/weed/command/volume.go index 712fa0dce..235eff11b 100644 --- a/weed/command/volume.go +++ b/weed/command/volume.go @@ -35,31 +35,32 @@ var ( ) type VolumeServerOptions struct { - port *int - publicPort *int - folders []string - folderMaxLimits []int - idxFolder *string - ip *string - publicUrl *string - bindIp *string - masters *string - idleConnectionTimeout *int - dataCenter *string - rack *string - whiteList []string - indexType *string - diskType *string - fixJpgOrientation *bool - readMode *string - cpuProfile *string - memProfile *string - compactionMBPerSecond *int - fileSizeLimitMB *int - concurrentUploadLimitMB *int - pprof *bool - preStopSeconds *int - metricsHttpPort *int + port *int + publicPort *int + folders []string + folderMaxLimits []int + idxFolder *string + ip *string + publicUrl *string + bindIp *string + masters *string + idleConnectionTimeout *int + dataCenter *string + rack *string + whiteList []string + indexType *string + diskType *string + fixJpgOrientation *bool + readMode *string + cpuProfile *string + memProfile *string + compactionMBPerSecond *int + fileSizeLimitMB *int + concurrentUploadLimitMB *int + concurrentDownloadLimitMB *int + pprof *bool + preStopSeconds *int + metricsHttpPort *int // pulseSeconds *int enableTcp *bool } @@ -85,7 +86,8 @@ func init() { v.memProfile = cmdVolume.Flag.String("memprofile", "", "memory profile output file") v.compactionMBPerSecond = cmdVolume.Flag.Int("compactionMBps", 0, "limit background compaction or copying speed in mega bytes per second") v.fileSizeLimitMB = cmdVolume.Flag.Int("fileSizeLimitMB", 256, "limit file size to avoid out of memory") - v.concurrentUploadLimitMB = cmdVolume.Flag.Int("concurrentUploadLimitMB", 128, "limit total concurrent upload size") + v.concurrentUploadLimitMB = cmdVolume.Flag.Int("concurrentUploadLimitMB", 256, "limit total concurrent upload size") + v.concurrentDownloadLimitMB = cmdVolume.Flag.Int("concurrentDownloadLimitMB", 256, "limit total concurrent download size") v.pprof = cmdVolume.Flag.Bool("pprof", false, "enable pprof http handlers. precludes --memprofile and --cpuprofile") v.metricsHttpPort = cmdVolume.Flag.Int("metricsPort", 0, "Prometheus metrics listen port") v.idxFolder = cmdVolume.Flag.String("dir.idx", "", "directory to store .idx files") @@ -232,6 +234,7 @@ func (v VolumeServerOptions) startVolumeServer(volumeFolders, maxVolumeCounts, v *v.compactionMBPerSecond, *v.fileSizeLimitMB, int64(*v.concurrentUploadLimitMB)*1024*1024, + int64(*v.concurrentDownloadLimitMB)*1024*1024, ) // starting grpc server grpcS := v.startGrpcService(volumeServer) diff --git a/weed/server/volume_grpc_admin.go b/weed/server/volume_grpc_admin.go index 2bc108a23..898c3da12 100644 --- a/weed/server/volume_grpc_admin.go +++ b/weed/server/volume_grpc_admin.go @@ -225,9 +225,9 @@ func (vs *VolumeServer) VolumeNeedleStatus(ctx context.Context, req *volume_serv if !hasEcVolume { return nil, fmt.Errorf("volume not found %d", req.VolumeId) } - count, err = vs.store.ReadEcShardNeedle(volumeId, n) + count, err = vs.store.ReadEcShardNeedle(volumeId, n, nil) } else { - count, err = vs.store.ReadVolumeNeedle(volumeId, n, nil) + count, err = vs.store.ReadVolumeNeedle(volumeId, n, nil, nil) } if err != nil { return nil, err diff --git a/weed/server/volume_grpc_batch_delete.go b/weed/server/volume_grpc_batch_delete.go index 2c445f996..3645ad9c9 100644 --- a/weed/server/volume_grpc_batch_delete.go +++ b/weed/server/volume_grpc_batch_delete.go @@ -40,7 +40,7 @@ func (vs *VolumeServer) BatchDelete(ctx context.Context, req *volume_server_pb.B } else { n.ParsePath(id_cookie) cookie := n.Cookie - if _, err := vs.store.ReadVolumeNeedle(volumeId, n, nil); err != nil { + if _, err := vs.store.ReadVolumeNeedle(volumeId, n, nil, nil); err != nil { resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ FileId: fid, Status: http.StatusNotFound, diff --git a/weed/server/volume_grpc_query.go b/weed/server/volume_grpc_query.go index 2f4fab96a..349d10097 100644 --- a/weed/server/volume_grpc_query.go +++ b/weed/server/volume_grpc_query.go @@ -24,7 +24,7 @@ func (vs *VolumeServer) Query(req *volume_server_pb.QueryRequest, stream volume_ n.ParsePath(id_cookie) cookie := n.Cookie - if _, err := vs.store.ReadVolumeNeedle(volumeId, n, nil); err != nil { + if _, err := vs.store.ReadVolumeNeedle(volumeId, n, nil, nil); err != nil { glog.V(0).Infof("volume query failed to read fid %s: %v", fid, err) return err } diff --git a/weed/server/volume_server.go b/weed/server/volume_server.go index a0f32700b..034521b4b 100644 --- a/weed/server/volume_server.go +++ b/weed/server/volume_server.go @@ -17,9 +17,12 @@ import ( ) type VolumeServer struct { - inFlightUploadDataSize int64 - concurrentUploadLimit int64 - inFlightUploadDataLimitCond *sync.Cond + inFlightUploadDataSize int64 + inFlightDownloadDataSize int64 + concurrentUploadLimit int64 + concurrentDownloadLimit int64 + inFlightUploadDataLimitCond *sync.Cond + inFlightDownloadDataLimitCond *sync.Cond SeedMasterNodes []string currentMaster string @@ -54,6 +57,7 @@ func NewVolumeServer(adminMux, publicMux *http.ServeMux, ip string, compactionMBPerSecond int, fileSizeLimitMB int, concurrentUploadLimit int64, + concurrentDownloadLimit int64, ) *VolumeServer { v := util.GetViper() @@ -67,19 +71,21 @@ func NewVolumeServer(adminMux, publicMux *http.ServeMux, ip string, readExpiresAfterSec := v.GetInt("jwt.signing.read.expires_after_seconds") vs := &VolumeServer{ - pulseSeconds: pulseSeconds, - dataCenter: dataCenter, - rack: rack, - needleMapKind: needleMapKind, - FixJpgOrientation: fixJpgOrientation, - ReadMode: readMode, - grpcDialOption: security.LoadClientTLS(util.GetViper(), "grpc.volume"), - compactionBytePerSecond: int64(compactionMBPerSecond) * 1024 * 1024, - fileSizeLimitBytes: int64(fileSizeLimitMB) * 1024 * 1024, - isHeartbeating: true, - stopChan: make(chan bool), - inFlightUploadDataLimitCond: sync.NewCond(new(sync.Mutex)), - concurrentUploadLimit: concurrentUploadLimit, + pulseSeconds: pulseSeconds, + dataCenter: dataCenter, + rack: rack, + needleMapKind: needleMapKind, + FixJpgOrientation: fixJpgOrientation, + ReadMode: readMode, + grpcDialOption: security.LoadClientTLS(util.GetViper(), "grpc.volume"), + compactionBytePerSecond: int64(compactionMBPerSecond) * 1024 * 1024, + fileSizeLimitBytes: int64(fileSizeLimitMB) * 1024 * 1024, + isHeartbeating: true, + stopChan: make(chan bool), + inFlightUploadDataLimitCond: sync.NewCond(new(sync.Mutex)), + inFlightDownloadDataLimitCond: sync.NewCond(new(sync.Mutex)), + concurrentUploadLimit: concurrentUploadLimit, + concurrentDownloadLimit: concurrentDownloadLimit, } vs.SeedMasterNodes = masterNodes diff --git a/weed/server/volume_server_handlers.go b/weed/server/volume_server_handlers.go index 917c7cd25..ed7807bb8 100644 --- a/weed/server/volume_server_handlers.go +++ b/weed/server/volume_server_handlers.go @@ -37,6 +37,11 @@ func (vs *VolumeServer) privateStoreHandler(w http.ResponseWriter, r *http.Reque switch r.Method { case "GET", "HEAD": stats.ReadRequest() + vs.inFlightDownloadDataLimitCond.L.Lock() + for vs.concurrentDownloadLimit != 0 && atomic.LoadInt64(&vs.inFlightDownloadDataSize) > vs.concurrentDownloadLimit { + glog.V(4).Infof("wait because inflight download data %d > %d", vs.inFlightDownloadDataSize, vs.concurrentDownloadLimit) + vs.inFlightDownloadDataLimitCond.Wait() + } vs.GetOrHeadHandler(w, r) case "DELETE": stats.DeleteRequest() @@ -47,7 +52,7 @@ func (vs *VolumeServer) privateStoreHandler(w http.ResponseWriter, r *http.Reque contentLength := getContentLength(r) vs.inFlightUploadDataLimitCond.L.Lock() for vs.concurrentUploadLimit != 0 && atomic.LoadInt64(&vs.inFlightUploadDataSize) > vs.concurrentUploadLimit { - glog.V(4).Infof("wait because inflight data %d > %d", vs.inFlightUploadDataSize, vs.concurrentUploadLimit) + glog.V(4).Infof("wait because inflight upload data %d > %d", vs.inFlightUploadDataSize, vs.concurrentUploadLimit) vs.inFlightUploadDataLimitCond.Wait() } atomic.AddInt64(&vs.inFlightUploadDataSize, contentLength) diff --git a/weed/server/volume_server_handlers_read.go b/weed/server/volume_server_handlers_read.go index cbad9c770..ae3c0b53f 100644 --- a/weed/server/volume_server_handlers_read.go +++ b/weed/server/volume_server_handlers_read.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/chrislusf/seaweedfs/weed/storage/types" "io" "mime" "net/http" @@ -12,6 +13,7 @@ import ( "path/filepath" "strconv" "strings" + "sync/atomic" "time" "github.com/chrislusf/seaweedfs/weed/glog" @@ -123,11 +125,22 @@ func (vs *VolumeServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) } var count int - if hasVolume { - count, err = vs.store.ReadVolumeNeedle(volumeId, n, readOption) - } else if hasEcVolume { - count, err = vs.store.ReadEcShardNeedle(volumeId, n) + var needleSize types.Size + onReadSizeFn := func(size types.Size) { + needleSize = size + atomic.AddInt64(&vs.inFlightDownloadDataSize, int64(needleSize)) + vs.inFlightDownloadDataLimitCond.L.Unlock() } + if hasVolume { + count, err = vs.store.ReadVolumeNeedle(volumeId, n, readOption, onReadSizeFn) + } else if hasEcVolume { + count, err = vs.store.ReadEcShardNeedle(volumeId, n, onReadSizeFn) + } + defer func() { + atomic.AddInt64(&vs.inFlightDownloadDataSize, -int64(needleSize)) + vs.inFlightDownloadDataLimitCond.Signal() + }() + if err != nil && err != storage.ErrorDeleted && r.FormValue("type") != "replicate" && hasVolume { glog.V(4).Infof("read needle: %v", err) // start to fix it from other replicas, if not deleted and hasVolume and is not a replicated request diff --git a/weed/server/volume_server_handlers_write.go b/weed/server/volume_server_handlers_write.go index 58212e8ff..aeb7d6e65 100644 --- a/weed/server/volume_server_handlers_write.go +++ b/weed/server/volume_server_handlers_write.go @@ -108,7 +108,7 @@ func (vs *VolumeServer) DeleteHandler(w http.ResponseWriter, r *http.Request) { return } - _, ok := vs.store.ReadVolumeNeedle(volumeId, n, nil) + _, ok := vs.store.ReadVolumeNeedle(volumeId, n, nil, nil) if ok != nil { m := make(map[string]uint32) m["size"] = 0 diff --git a/weed/storage/store.go b/weed/storage/store.go index cda1e196b..c407a6081 100644 --- a/weed/storage/store.go +++ b/weed/storage/store.go @@ -356,9 +356,9 @@ func (s *Store) DeleteVolumeNeedle(i needle.VolumeId, n *needle.Needle) (Size, e return 0, fmt.Errorf("volume %d not found on %s:%d", i, s.Ip, s.Port) } -func (s *Store) ReadVolumeNeedle(i needle.VolumeId, n *needle.Needle, readOption *ReadOption) (int, error) { +func (s *Store) ReadVolumeNeedle(i needle.VolumeId, n *needle.Needle, readOption *ReadOption, onReadSizeFn func(size Size)) (int, error) { if v := s.findVolume(i); v != nil { - return v.readNeedle(n, readOption) + return v.readNeedle(n, readOption, onReadSizeFn) } return 0, fmt.Errorf("volume %d not found", i) } diff --git a/weed/storage/store_ec.go b/weed/storage/store_ec.go index 9702fdd50..6ba7237e2 100644 --- a/weed/storage/store_ec.go +++ b/weed/storage/store_ec.go @@ -121,7 +121,7 @@ func (s *Store) DestroyEcVolume(vid needle.VolumeId) { } } -func (s *Store) ReadEcShardNeedle(vid needle.VolumeId, n *needle.Needle) (int, error) { +func (s *Store) ReadEcShardNeedle(vid needle.VolumeId, n *needle.Needle, onReadSizeFn func(size types.Size)) (int, error) { for _, location := range s.Locations { if localEcVolume, found := location.FindEcVolume(vid); found { @@ -133,6 +133,10 @@ func (s *Store) ReadEcShardNeedle(vid needle.VolumeId, n *needle.Needle) (int, e return 0, ErrorDeleted } + if onReadSizeFn != nil { + onReadSizeFn(size) + } + glog.V(3).Infof("read ec volume %d offset %d size %d intervals:%+v", vid, offset.ToActualOffset(), size, intervals) if len(intervals) > 1 { diff --git a/weed/storage/store_ec_delete.go b/weed/storage/store_ec_delete.go index 4a75fb20b..6c10af3c5 100644 --- a/weed/storage/store_ec_delete.go +++ b/weed/storage/store_ec_delete.go @@ -14,7 +14,7 @@ import ( func (s *Store) DeleteEcShardNeedle(ecVolume *erasure_coding.EcVolume, n *needle.Needle, cookie types.Cookie) (int64, error) { - count, err := s.ReadEcShardNeedle(ecVolume.VolumeId, n) + count, err := s.ReadEcShardNeedle(ecVolume.VolumeId, n, nil) if err != nil { return 0, err diff --git a/weed/storage/volume_read.go b/weed/storage/volume_read.go index f689eeec0..9751b56ae 100644 --- a/weed/storage/volume_read.go +++ b/weed/storage/volume_read.go @@ -13,7 +13,7 @@ import ( ) // read fills in Needle content by looking up n.Id from NeedleMapper -func (v *Volume) readNeedle(n *needle.Needle, readOption *ReadOption) (int, error) { +func (v *Volume) readNeedle(n *needle.Needle, readOption *ReadOption, onReadSizeFn func(size Size)) (int, error) { v.dataFileAccessLock.RLock() defer v.dataFileAccessLock.RUnlock() @@ -33,6 +33,9 @@ func (v *Volume) readNeedle(n *needle.Needle, readOption *ReadOption) (int, erro if readSize == 0 { return 0, nil } + if onReadSizeFn != nil { + onReadSizeFn(readSize) + } err := n.ReadData(v.DataBackend, nv.Offset.ToActualOffset(), readSize, v.Version()) if err == needle.ErrorSizeMismatch && OffsetSize == 4 { err = n.ReadData(v.DataBackend, nv.Offset.ToActualOffset()+int64(MaxPossibleVolumeSize), readSize, v.Version()) diff --git a/weed/storage/volume_vacuum_test.go b/weed/storage/volume_vacuum_test.go index cd5a4f430..89fff4b2b 100644 --- a/weed/storage/volume_vacuum_test.go +++ b/weed/storage/volume_vacuum_test.go @@ -113,7 +113,7 @@ func TestCompaction(t *testing.T) { } n := newEmptyNeedle(uint64(i)) - size, err := v.readNeedle(n, nil) + size, err := v.readNeedle(n, nil, nil) if err != nil { t.Fatalf("read file %d: %v", i, err) } From 8cfd4876084432e393a30dadf0b8f466177183be Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 8 Aug 2021 23:33:12 -0700 Subject: [PATCH 193/265] 2.62 --- k8s/seaweedfs/Chart.yaml | 4 ++-- weed/util/constants.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/k8s/seaweedfs/Chart.yaml b/k8s/seaweedfs/Chart.yaml index 83b0148e7..a1302456f 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.61" -version: "2.61" +appVersion: "2.62" +version: "2.62" diff --git a/weed/util/constants.go b/weed/util/constants.go index 108dfb2e4..c16df39fc 100644 --- a/weed/util/constants.go +++ b/weed/util/constants.go @@ -5,7 +5,7 @@ import ( ) var ( - VERSION = fmt.Sprintf("%s %.02f", sizeLimit, 2.61) + VERSION = fmt.Sprintf("%s %.02f", sizeLimit, 2.62) COMMIT = "" ) From 713c035a6e5c71bbccdb0e1cc5856e1a84fbe122 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 9 Aug 2021 14:35:18 -0700 Subject: [PATCH 194/265] shell: remote.cache remote.uncache --- other/java/client/src/main/proto/filer.proto | 18 +- weed/command/filer_remote_sync.go | 21 +- weed/filer/entry.go | 17 + weed/filer/read_remote.go | 32 +- weed/pb/filer.proto | 18 +- weed/pb/filer_pb/filer.pb.go | 1397 ++++++++++-------- weed/pb/volume_server.proto | 11 +- weed/pb/volume_server_pb/volume_server.pb.go | 834 +++++------ weed/remote_storage/remote_storage.go | 1 + weed/remote_storage/s3/s3_storage_client.go | 20 +- weed/server/filer_grpc_server_remote.go | 161 ++ weed/server/volume_grpc_remote.go | 13 +- weed/shell/command_remote_cache.go | 151 ++ weed/shell/command_remote_mount.go | 29 +- weed/shell/command_remote_uncache.go | 98 ++ 15 files changed, 1752 insertions(+), 1069 deletions(-) create mode 100644 weed/server/filer_grpc_server_remote.go create mode 100644 weed/shell/command_remote_cache.go create mode 100644 weed/shell/command_remote_uncache.go diff --git a/other/java/client/src/main/proto/filer.proto b/other/java/client/src/main/proto/filer.proto index 1a5cfe79b..c9257ddca 100644 --- a/other/java/client/src/main/proto/filer.proto +++ b/other/java/client/src/main/proto/filer.proto @@ -67,6 +67,8 @@ service SeaweedFiler { rpc KvPut (KvPutRequest) returns (KvPutResponse) { } + rpc DownloadToLocal (DownloadToLocalRequest) returns (DownloadToLocalResponse) { + } } ////////////////////////////////////////////////// @@ -93,10 +95,11 @@ message ListEntriesResponse { } message RemoteEntry { - int64 last_modified_at = 1; - int64 size = 2; - string e_tag = 3; - string storage_name = 4; + string storage_name = 1; + int64 local_mtime = 2; + string remote_e_tag = 3; + int64 remote_mtime = 4; + int64 remote_size = 5; } message Entry { string name = 1; @@ -400,3 +403,10 @@ message RemoteStorageLocation { string bucket = 2; string path = 3; } +message DownloadToLocalRequest { + string directory = 1; + string name = 2; +} +message DownloadToLocalResponse { + Entry entry = 1; +} diff --git a/weed/command/filer_remote_sync.go b/weed/command/filer_remote_sync.go index 5caea112f..b7e90b3e7 100644 --- a/weed/command/filer_remote_sync.go +++ b/weed/command/filer_remote_sync.go @@ -13,7 +13,6 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" "github.com/golang/protobuf/proto" "google.golang.org/grpc" - "strings" "time" ) @@ -157,6 +156,9 @@ func followUpdatesAndUploadToRemote(option *RemoteSyncOptions, filerSource *sour return nil } dest := toRemoteStorageLocation(util.FullPath(mountedDir), util.NewFullPath(message.NewParentPath, message.NewEntry.Name), remoteStorageMountLocation) + if message.NewEntry.IsDirectory { + return client.WriteDirectory(dest, message.NewEntry) + } reader := filer.NewChunkStreamReader(filerSource, message.NewEntry.Chunks) remoteEntry, writeErr := client.WriteFile(dest, message.NewEntry, reader) if writeErr != nil { @@ -176,6 +178,9 @@ func followUpdatesAndUploadToRemote(option *RemoteSyncOptions, filerSource *sour fmt.Printf("skipping updating: %+v\n", resp) return nil } + if message.NewEntry.IsDirectory { + return client.WriteDirectory(dest, message.NewEntry) + } if resp.Directory == message.NewParentPath && message.OldEntry.Name == message.NewEntry.Name { if isSameChunks(message.OldEntry.Chunks, message.NewEntry.Chunks) { fmt.Printf("update meta: %+v\n", resp) @@ -208,17 +213,12 @@ func followUpdatesAndUploadToRemote(option *RemoteSyncOptions, filerSource *sour } func toRemoteStorageLocation(mountDir, sourcePath util.FullPath, remoteMountLocation *filer_pb.RemoteStorageLocation) *filer_pb.RemoteStorageLocation { - var dest string source := string(sourcePath[len(mountDir):]) - if strings.HasSuffix(remoteMountLocation.Path, "/") { - dest = remoteMountLocation.Path + source[1:] - } else { - dest = remoteMountLocation.Path + source - } + dest := util.FullPath(remoteMountLocation.Path).Child(source) return &filer_pb.RemoteStorageLocation{ Name: remoteMountLocation.Name, Bucket: remoteMountLocation.Bucket, - Path: dest, + Path: string(dest), } } @@ -239,10 +239,7 @@ func shouldSendToRemote(entry *filer_pb.Entry) bool { if entry.RemoteEntry == nil { return true } - if entry.RemoteEntry.Size != int64(filer.FileSize(entry)) { - return true - } - if entry.RemoteEntry.LastModifiedAt < entry.Attributes.Mtime { + if entry.RemoteEntry.LocalMtime < entry.Attributes.Mtime { return true } return false diff --git a/weed/filer/entry.go b/weed/filer/entry.go index 7673365fb..8fa75fe6b 100644 --- a/weed/filer/entry.go +++ b/weed/filer/entry.go @@ -57,6 +57,23 @@ func (entry *Entry) Timestamp() time.Time { } } +func (entry *Entry) ShallowClone() *Entry { + if entry == nil { + return nil + } + newEntry := &Entry{} + newEntry.FullPath = entry.FullPath + newEntry.Attr = entry.Attr + newEntry.Chunks = entry.Chunks + newEntry.Extended = entry.Extended + newEntry.HardLinkId = entry.HardLinkId + newEntry.HardLinkCounter = entry.HardLinkCounter + newEntry.Content = entry.Content + newEntry.Remote = entry.Remote + + return newEntry +} + func (entry *Entry) ToProtoEntry() *filer_pb.Entry { if entry == nil { return nil diff --git a/weed/filer/read_remote.go b/weed/filer/read_remote.go index 8636a5c20..77ca81f15 100644 --- a/weed/filer/read_remote.go +++ b/weed/filer/read_remote.go @@ -1,12 +1,14 @@ package filer import ( + "context" "fmt" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/chrislusf/seaweedfs/weed/util" ) func (entry *Entry) IsInRemoteOnly() bool { - return len(entry.Chunks) == 0 && entry.Remote != nil && entry.Remote.Size > 0 + return len(entry.Chunks) == 0 && entry.Remote != nil && entry.Remote.RemoteSize > 0 } func (f *Filer) ReadRemote(entry *Entry, offset int64, size int64) (data []byte, err error) { @@ -17,13 +19,27 @@ func (f *Filer) ReadRemote(entry *Entry, offset int64, size int64) (data []byte, mountDir, remoteLoation := f.RemoteStorage.FindMountDirectory(entry.FullPath) - remoteFullPath := remoteLoation.Path + string(entry.FullPath[len(mountDir):]) - - sourceLoc := &filer_pb.RemoteStorageLocation{ - Name: remoteLoation.Name, - Bucket: remoteLoation.Bucket, - Path: remoteFullPath, - } + sourceLoc := MapFullPathToRemoteStorageLocation(mountDir, remoteLoation, entry.FullPath) return client.ReadFile(sourceLoc, offset, size) } + +func MapFullPathToRemoteStorageLocation(localMountedDir util.FullPath, remoteMountedLocation *filer_pb.RemoteStorageLocation, fp util.FullPath) *filer_pb.RemoteStorageLocation { + remoteLocation := &filer_pb.RemoteStorageLocation{ + Name: remoteMountedLocation.Name, + Bucket: remoteMountedLocation.Bucket, + Path: remoteMountedLocation.Path, + } + remoteLocation.Path += string(fp)[len(localMountedDir):] + return remoteLocation +} + +func DownloadToLocal(filerClient filer_pb.FilerClient, remoteConf *filer_pb.RemoteConf, remoteLocation *filer_pb.RemoteStorageLocation, parent util.FullPath, entry *filer_pb.Entry) error { + return filerClient.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + _, err := client.DownloadToLocal(context.Background(), &filer_pb.DownloadToLocalRequest{ + Directory: string(parent), + Name: entry.Name, + }) + return err + }) +} diff --git a/weed/pb/filer.proto b/weed/pb/filer.proto index 1a5cfe79b..c9257ddca 100644 --- a/weed/pb/filer.proto +++ b/weed/pb/filer.proto @@ -67,6 +67,8 @@ service SeaweedFiler { rpc KvPut (KvPutRequest) returns (KvPutResponse) { } + rpc DownloadToLocal (DownloadToLocalRequest) returns (DownloadToLocalResponse) { + } } ////////////////////////////////////////////////// @@ -93,10 +95,11 @@ message ListEntriesResponse { } message RemoteEntry { - int64 last_modified_at = 1; - int64 size = 2; - string e_tag = 3; - string storage_name = 4; + string storage_name = 1; + int64 local_mtime = 2; + string remote_e_tag = 3; + int64 remote_mtime = 4; + int64 remote_size = 5; } message Entry { string name = 1; @@ -400,3 +403,10 @@ message RemoteStorageLocation { string bucket = 2; string path = 3; } +message DownloadToLocalRequest { + string directory = 1; + string name = 2; +} +message DownloadToLocalResponse { + Entry entry = 1; +} diff --git a/weed/pb/filer_pb/filer.pb.go b/weed/pb/filer_pb/filer.pb.go index 495afb21a..1f2cdafcd 100644 --- a/weed/pb/filer_pb/filer.pb.go +++ b/weed/pb/filer_pb/filer.pb.go @@ -262,10 +262,11 @@ type RemoteEntry struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - LastModifiedAt int64 `protobuf:"varint,1,opt,name=last_modified_at,json=lastModifiedAt,proto3" json:"last_modified_at,omitempty"` - Size int64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` - ETag string `protobuf:"bytes,3,opt,name=e_tag,json=eTag,proto3" json:"e_tag,omitempty"` - StorageName string `protobuf:"bytes,4,opt,name=storage_name,json=storageName,proto3" json:"storage_name,omitempty"` + StorageName string `protobuf:"bytes,1,opt,name=storage_name,json=storageName,proto3" json:"storage_name,omitempty"` + LocalMtime int64 `protobuf:"varint,2,opt,name=local_mtime,json=localMtime,proto3" json:"local_mtime,omitempty"` + RemoteETag string `protobuf:"bytes,3,opt,name=remote_e_tag,json=remoteETag,proto3" json:"remote_e_tag,omitempty"` + RemoteMtime int64 `protobuf:"varint,4,opt,name=remote_mtime,json=remoteMtime,proto3" json:"remote_mtime,omitempty"` + RemoteSize int64 `protobuf:"varint,5,opt,name=remote_size,json=remoteSize,proto3" json:"remote_size,omitempty"` } func (x *RemoteEntry) Reset() { @@ -300,27 +301,6 @@ func (*RemoteEntry) Descriptor() ([]byte, []int) { return file_filer_proto_rawDescGZIP(), []int{4} } -func (x *RemoteEntry) GetLastModifiedAt() int64 { - if x != nil { - return x.LastModifiedAt - } - return 0 -} - -func (x *RemoteEntry) GetSize() int64 { - if x != nil { - return x.Size - } - return 0 -} - -func (x *RemoteEntry) GetETag() string { - if x != nil { - return x.ETag - } - return "" -} - func (x *RemoteEntry) GetStorageName() string { if x != nil { return x.StorageName @@ -328,6 +308,34 @@ func (x *RemoteEntry) GetStorageName() string { return "" } +func (x *RemoteEntry) GetLocalMtime() int64 { + if x != nil { + return x.LocalMtime + } + return 0 +} + +func (x *RemoteEntry) GetRemoteETag() string { + if x != nil { + return x.RemoteETag + } + return "" +} + +func (x *RemoteEntry) GetRemoteMtime() int64 { + if x != nil { + return x.RemoteMtime + } + return 0 +} + +func (x *RemoteEntry) GetRemoteSize() int64 { + if x != nil { + return x.RemoteSize + } + return 0 +} + type Entry struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3365,6 +3373,108 @@ func (x *RemoteStorageLocation) GetPath() string { return "" } +type DownloadToLocalRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Directory string `protobuf:"bytes,1,opt,name=directory,proto3" json:"directory,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *DownloadToLocalRequest) Reset() { + *x = DownloadToLocalRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_filer_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DownloadToLocalRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DownloadToLocalRequest) ProtoMessage() {} + +func (x *DownloadToLocalRequest) ProtoReflect() protoreflect.Message { + mi := &file_filer_proto_msgTypes[52] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DownloadToLocalRequest.ProtoReflect.Descriptor instead. +func (*DownloadToLocalRequest) Descriptor() ([]byte, []int) { + return file_filer_proto_rawDescGZIP(), []int{52} +} + +func (x *DownloadToLocalRequest) GetDirectory() string { + if x != nil { + return x.Directory + } + return "" +} + +func (x *DownloadToLocalRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type DownloadToLocalResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Entry *Entry `protobuf:"bytes,1,opt,name=entry,proto3" json:"entry,omitempty"` +} + +func (x *DownloadToLocalResponse) Reset() { + *x = DownloadToLocalResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_filer_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DownloadToLocalResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DownloadToLocalResponse) ProtoMessage() {} + +func (x *DownloadToLocalResponse) ProtoReflect() protoreflect.Message { + mi := &file_filer_proto_msgTypes[53] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DownloadToLocalResponse.ProtoReflect.Descriptor instead. +func (*DownloadToLocalResponse) Descriptor() ([]byte, []int) { + return file_filer_proto_rawDescGZIP(), []int{53} +} + +func (x *DownloadToLocalResponse) GetEntry() *Entry { + if x != nil { + return x.Entry + } + return nil +} + // if found, send the exact address // if not found, send the full list of existing brokers type LocateBrokerResponse_Resource struct { @@ -3379,7 +3489,7 @@ type LocateBrokerResponse_Resource struct { func (x *LocateBrokerResponse_Resource) Reset() { *x = LocateBrokerResponse_Resource{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[54] + mi := &file_filer_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3392,7 +3502,7 @@ func (x *LocateBrokerResponse_Resource) String() string { func (*LocateBrokerResponse_Resource) ProtoMessage() {} func (x *LocateBrokerResponse_Resource) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[54] + mi := &file_filer_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3440,7 +3550,7 @@ type FilerConf_PathConf struct { func (x *FilerConf_PathConf) Reset() { *x = FilerConf_PathConf{} if protoimpl.UnsafeEnabled { - mi := &file_filer_proto_msgTypes[55] + mi := &file_filer_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3453,7 +3563,7 @@ func (x *FilerConf_PathConf) String() string { func (*FilerConf_PathConf) ProtoMessage() {} func (x *FilerConf_PathConf) ProtoReflect() protoreflect.Message { - mi := &file_filer_proto_msgTypes[55] + mi := &file_filer_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3554,529 +3664,547 @@ var file_filer_proto_rawDesc = []byte{ 0x22, 0x3c, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x83, - 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x28, - 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x41, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x13, 0x0a, 0x05, - 0x65, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x54, 0x61, - 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xbf, 0x03, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x44, 0x69, 0x72, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x73, 0x12, 0x38, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x46, 0x75, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, - 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x08, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x68, 0x61, 0x72, 0x64, 0x5f, - 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x68, - 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x68, 0x61, 0x72, - 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x68, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x38, 0x0a, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x72, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x1a, 0x3b, 0x0a, 0x0d, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x64, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x44, 0x0a, 0x09, 0x46, 0x75, 0x6c, 0x6c, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x64, 0x69, 0x72, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x8f, 0x02, 0x0a, - 0x11, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x09, 0x6f, 0x6c, 0x64, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6f, 0x6c, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x2c, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x23, - 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, - 0x77, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x31, 0x0a, 0x15, 0x69, - 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, - 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, - 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0xe6, - 0x02, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x17, 0x0a, 0x07, - 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, - 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x65, 0x5f, 0x74, 0x61, 0x67, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x54, 0x61, 0x67, 0x12, 0x24, 0x0a, 0x0e, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, - 0x49, 0x64, 0x12, 0x22, 0x0a, 0x03, 0x66, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, - 0x64, 0x52, 0x03, 0x66, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x66, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x09, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, - 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x63, 0x69, 0x70, - 0x68, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, - 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x69, - 0x73, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, - 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x22, 0x40, 0x0a, 0x11, 0x46, 0x69, 0x6c, 0x65, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x06, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x52, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x58, 0x0a, 0x06, 0x46, 0x69, 0x6c, - 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, - 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, - 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x07, 0x52, 0x06, 0x63, 0x6f, 0x6f, - 0x6b, 0x69, 0x65, 0x22, 0x9d, 0x03, 0x0a, 0x0e, 0x46, 0x75, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, - 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, - 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x72, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x63, 0x72, 0x74, 0x69, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6d, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x74, 0x6c, 0x5f, - 0x73, 0x65, 0x63, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x74, 0x74, 0x6c, 0x53, 0x65, - 0x63, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, - 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, - 0x0e, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x64, 0x35, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x03, 0x6d, 0x64, 0x35, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, - 0x79, 0x70, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, + 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0xb7, + 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x21, + 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x6d, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x74, 0x69, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x5f, 0x74, + 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x45, 0x54, 0x61, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x6d, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x4d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xbf, 0x03, 0x0a, 0x05, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, + 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x12, 0x38, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x75, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x73, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x12, 0x39, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x68, + 0x61, 0x72, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0a, 0x68, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x2a, 0x0a, + 0x11, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x68, 0x61, 0x72, 0x64, 0x4c, 0x69, + 0x6e, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0b, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x1a, 0x3b, 0x0a, + 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x44, 0x0a, 0x09, 0x46, 0x75, + 0x6c, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x72, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x22, 0x8f, 0x02, 0x0a, 0x11, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x09, 0x6f, 0x6c, 0x64, 0x5f, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6f, 0x6c, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x15, 0x0a, 0x06, 0x6f, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x6f, 0x45, 0x78, 0x63, 0x6c, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, - 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, - 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x13, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xac, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x25, 0x0a, 0x05, 0x65, - 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, - 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x80, 0x01, 0x0a, - 0x14, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, - 0x17, 0x0a, 0x15, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x98, 0x02, 0x0a, 0x12, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x72, 0x65, - 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, - 0x73, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x67, - 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x67, 0x6e, 0x6f, - 0x72, 0x65, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, - 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x22, 0xba, 0x01, 0x0a, 0x18, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, - 0x0d, 0x6f, 0x6c, 0x64, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, + 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, + 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, + 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, + 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x22, 0xe6, 0x02, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x65, + 0x5f, 0x74, 0x61, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x54, 0x61, 0x67, + 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x03, 0x66, 0x69, 0x64, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, + 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x03, 0x66, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x0a, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, + 0x52, 0x09, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, + 0x69, 0x70, 0x68, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x09, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, + 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x69, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, + 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x6d, 0x61, 0x6e, 0x69, + 0x66, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x22, 0x40, 0x0a, 0x11, 0x46, + 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, + 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x58, 0x0a, + 0x06, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x12, + 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x07, 0x52, + 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x22, 0x9d, 0x03, 0x0a, 0x0e, 0x46, 0x75, 0x73, 0x65, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, + 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, + 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, + 0x67, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x63, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, + 0x63, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x69, 0x6d, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x74, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x74, + 0x74, 0x6c, 0x53, 0x65, 0x63, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x79, 0x6d, 0x6c, 0x69, + 0x6e, 0x6b, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x64, 0x35, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6d, 0x64, 0x35, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, + 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x25, 0x0a, 0x05, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x6f, 0x45, 0x78, 0x63, 0x6c, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, + 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, + 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x1b, 0x0a, - 0x19, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xec, 0x01, 0x0a, 0x13, 0x41, - 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x74, - 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x74, 0x74, 0x6c, - 0x53, 0x65, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x43, 0x65, - 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x63, 0x6b, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, - 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0xe2, 0x01, 0x0a, 0x14, 0x41, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, - 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, - 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x34, - 0x0a, 0x13, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x49, 0x64, 0x73, 0x22, 0x3d, 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x3b, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, + 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x2b, 0x0a, + 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xac, 0x01, 0x0a, 0x12, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, + 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, + 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, + 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x80, 0x01, 0x0a, 0x14, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x98, 0x02, 0x0a, + 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, + 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x69, + 0x73, 0x5f, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x69, 0x73, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x34, + 0x0a, 0x16, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, + 0x76, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, + 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, + 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0xba, 0x01, 0x0a, 0x18, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x6c, 0x64, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x6c, 0x64, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x22, 0x1b, 0x0a, 0x19, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xec, + 0x01, 0x0a, 0x13, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x74, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x74, 0x74, 0x6c, 0x53, 0x65, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, + 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x61, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x61, 0x63, 0x6b, + 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0xe2, 0x01, + 0x0a, 0x14, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x72, 0x6c, - 0x22, 0xc3, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x30, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, - 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x61, 0x70, - 0x1a, 0x54, 0x0a, 0x11, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x61, 0x70, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x20, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7b, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6e, 0x6f, 0x72, - 0x6d, 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x5f, 0x65, 0x63, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x45, 0x63, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x22, 0x50, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x36, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x39, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x84, - 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, - 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0x6f, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, - 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, - 0x65, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x66, 0x69, 0x6c, - 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1e, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xde, 0x02, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x62, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x61, 0x78, 0x4d, 0x62, 0x12, 0x1f, 0x0a, 0x0b, 0x64, - 0x69, 0x72, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x64, 0x69, 0x72, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x63, 0x69, - 0x70, 0x68, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, - 0x73, 0x65, 0x63, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x12, 0x18, 0x0a, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x95, 0x01, 0x0a, 0x18, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x74, 0x68, - 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, - 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x4e, - 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, - 0x9a, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x4a, 0x0a, 0x12, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x73, 0x5f, 0x6e, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, 0x73, 0x22, 0x61, 0x0a, 0x08, - 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x73, 0x5f, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, 0x73, 0x12, 0x2c, 0x0a, - 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x68, - 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, - 0x65, 0x0a, 0x14, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x67, - 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x67, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x22, 0xcd, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, - 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, - 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, - 0x64, 0x12, 0x45, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x1a, 0x58, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x72, - 0x70, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x22, 0x20, 0x0a, 0x0c, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x22, 0x3b, 0x0a, 0x0d, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x22, 0x36, 0x0a, 0x0c, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4b, 0x76, 0x50, - 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x22, 0xeb, 0x02, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x18, - 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, - 0x2e, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x87, 0x02, 0x0a, 0x08, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, - 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x72, 0x6c, + 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, - 0x74, 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, - 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, - 0x73, 0x79, 0x6e, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x73, 0x79, 0x6e, - 0x63, 0x12, 0x2e, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x77, - 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0xba, - 0x01, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x12, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x33, 0x5f, 0x61, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x33, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x33, 0x5f, - 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x73, 0x33, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1b, 0x0a, - 0x09, 0x73, 0x33, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x73, 0x33, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x33, - 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x73, 0x33, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0xbe, 0x01, 0x0a, 0x14, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4d, 0x61, 0x70, - 0x70, 0x69, 0x6e, 0x67, 0x12, 0x48, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4d, - 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x5c, - 0x0a, 0x0d, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x57, 0x0a, 0x15, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0x34, 0x0a, 0x13, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x73, 0x22, 0x3d, 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3b, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, + 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x55, 0x72, 0x6c, 0x22, 0xc3, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, + 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x61, + 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x4d, 0x61, 0x70, 0x1a, 0x54, 0x0a, 0x11, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x20, 0x0a, 0x0a, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7b, 0x0a, 0x15, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x65, 0x63, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x22, 0x50, 0x0a, 0x16, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x39, 0x0a, 0x17, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, + 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, + 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0x6f, 0x0a, 0x12, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1b, + 0x0a, 0x09, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x08, 0x75, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x66, + 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x09, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1e, 0x0a, 0x1c, 0x47, 0x65, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xde, 0x02, 0x0a, 0x1d, 0x47, + 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x5f, + 0x6d, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x61, 0x78, 0x4d, 0x62, 0x12, + 0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x72, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69, 0x72, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, + 0x12, 0x16, 0x0a, 0x06, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x30, 0x0a, 0x14, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, + 0x63, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x95, 0x01, 0x0a, 0x18, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x74, + 0x68, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x70, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, + 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x69, + 0x6e, 0x63, 0x65, 0x4e, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, + 0x4a, 0x0a, 0x12, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x05, 0x74, + 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, 0x73, + 0x22, 0x61, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x13, 0x0a, 0x05, + 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, + 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, + 0x65, 0x79, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, + 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x22, 0x65, 0x0a, 0x14, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x08, 0x67, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x4b, 0x65, + 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, + 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xcd, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x63, 0x61, 0x74, + 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x1a, 0x58, 0x0a, 0x08, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, 0x70, 0x63, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x67, 0x72, 0x70, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, + 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x0a, 0x0c, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x3b, 0x0a, 0x0d, 0x4b, 0x76, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x36, 0x0a, 0x0c, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, + 0x0d, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0xeb, 0x02, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x09, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x09, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x87, 0x02, 0x0a, 0x08, 0x50, 0x61, 0x74, + 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1e, + 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, + 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, + 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x66, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x66, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x2e, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, + 0x6c, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, + 0x6c, 0x79, 0x22, 0xba, 0x01, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x33, 0x5f, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x73, 0x33, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, + 0x0d, 0x73, 0x33, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x33, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, + 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x33, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1f, + 0x0a, 0x0b, 0x73, 0x33, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x33, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, + 0xbe, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x48, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x73, 0x1a, 0x5c, 0x0a, 0x0d, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x32, 0xdc, 0x0c, 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, - 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, - 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, - 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x57, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x4a, 0x0a, 0x16, 0x44, 0x6f, 0x77, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x40, 0x0a, 0x17, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x32, 0xb6, 0x0d, 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x77, + 0x65, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, - 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0d, 0x41, - 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x4c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, - 0x11, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, - 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, - 0x0c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, - 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, - 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6a, - 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x16, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, - 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, - 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x50, 0x75, - 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, - 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, - 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, - 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, + 0x0d, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1e, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, + 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, + 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x4f, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, + 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, + 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x6a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, + 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4f, 0x0a, + 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x12, 0x1d, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, + 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, + 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, + 0x0a, 0x05, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, + 0x50, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, + 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0f, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, + 0x61, 0x64, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x6f, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x54, + 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, + 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, + 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4091,7 +4219,7 @@ func file_filer_proto_rawDescGZIP() []byte { return file_filer_proto_rawDescData } -var file_filer_proto_msgTypes = make([]protoimpl.MessageInfo, 57) +var file_filer_proto_msgTypes = make([]protoimpl.MessageInfo, 59) var file_filer_proto_goTypes = []interface{}{ (*LookupDirectoryEntryRequest)(nil), // 0: filer_pb.LookupDirectoryEntryRequest (*LookupDirectoryEntryResponse)(nil), // 1: filer_pb.LookupDirectoryEntryResponse @@ -4145,18 +4273,20 @@ var file_filer_proto_goTypes = []interface{}{ (*RemoteConf)(nil), // 49: filer_pb.RemoteConf (*RemoteStorageMapping)(nil), // 50: filer_pb.RemoteStorageMapping (*RemoteStorageLocation)(nil), // 51: filer_pb.RemoteStorageLocation - nil, // 52: filer_pb.Entry.ExtendedEntry - nil, // 53: filer_pb.LookupVolumeResponse.LocationsMapEntry - (*LocateBrokerResponse_Resource)(nil), // 54: filer_pb.LocateBrokerResponse.Resource - (*FilerConf_PathConf)(nil), // 55: filer_pb.FilerConf.PathConf - nil, // 56: filer_pb.RemoteStorageMapping.MappingsEntry + (*DownloadToLocalRequest)(nil), // 52: filer_pb.DownloadToLocalRequest + (*DownloadToLocalResponse)(nil), // 53: filer_pb.DownloadToLocalResponse + nil, // 54: filer_pb.Entry.ExtendedEntry + nil, // 55: filer_pb.LookupVolumeResponse.LocationsMapEntry + (*LocateBrokerResponse_Resource)(nil), // 56: filer_pb.LocateBrokerResponse.Resource + (*FilerConf_PathConf)(nil), // 57: filer_pb.FilerConf.PathConf + nil, // 58: filer_pb.RemoteStorageMapping.MappingsEntry } var file_filer_proto_depIdxs = []int32{ 5, // 0: filer_pb.LookupDirectoryEntryResponse.entry:type_name -> filer_pb.Entry 5, // 1: filer_pb.ListEntriesResponse.entry:type_name -> filer_pb.Entry 8, // 2: filer_pb.Entry.chunks:type_name -> filer_pb.FileChunk 11, // 3: filer_pb.Entry.attributes:type_name -> filer_pb.FuseAttributes - 52, // 4: filer_pb.Entry.extended:type_name -> filer_pb.Entry.ExtendedEntry + 54, // 4: filer_pb.Entry.extended:type_name -> filer_pb.Entry.ExtendedEntry 4, // 5: filer_pb.Entry.remote_entry:type_name -> filer_pb.RemoteEntry 5, // 6: filer_pb.FullEntry.entry:type_name -> filer_pb.Entry 5, // 7: filer_pb.EventNotification.old_entry:type_name -> filer_pb.Entry @@ -4168,57 +4298,60 @@ var file_filer_proto_depIdxs = []int32{ 5, // 13: filer_pb.UpdateEntryRequest.entry:type_name -> filer_pb.Entry 8, // 14: filer_pb.AppendToEntryRequest.chunks:type_name -> filer_pb.FileChunk 26, // 15: filer_pb.Locations.locations:type_name -> filer_pb.Location - 53, // 16: filer_pb.LookupVolumeResponse.locations_map:type_name -> filer_pb.LookupVolumeResponse.LocationsMapEntry + 55, // 16: filer_pb.LookupVolumeResponse.locations_map:type_name -> filer_pb.LookupVolumeResponse.LocationsMapEntry 28, // 17: filer_pb.CollectionListResponse.collections:type_name -> filer_pb.Collection 7, // 18: filer_pb.SubscribeMetadataResponse.event_notification:type_name -> filer_pb.EventNotification - 54, // 19: filer_pb.LocateBrokerResponse.resources:type_name -> filer_pb.LocateBrokerResponse.Resource - 55, // 20: filer_pb.FilerConf.locations:type_name -> filer_pb.FilerConf.PathConf - 56, // 21: filer_pb.RemoteStorageMapping.mappings:type_name -> filer_pb.RemoteStorageMapping.MappingsEntry - 25, // 22: filer_pb.LookupVolumeResponse.LocationsMapEntry.value:type_name -> filer_pb.Locations - 51, // 23: filer_pb.RemoteStorageMapping.MappingsEntry.value:type_name -> filer_pb.RemoteStorageLocation - 0, // 24: filer_pb.SeaweedFiler.LookupDirectoryEntry:input_type -> filer_pb.LookupDirectoryEntryRequest - 2, // 25: filer_pb.SeaweedFiler.ListEntries:input_type -> filer_pb.ListEntriesRequest - 12, // 26: filer_pb.SeaweedFiler.CreateEntry:input_type -> filer_pb.CreateEntryRequest - 14, // 27: filer_pb.SeaweedFiler.UpdateEntry:input_type -> filer_pb.UpdateEntryRequest - 16, // 28: filer_pb.SeaweedFiler.AppendToEntry:input_type -> filer_pb.AppendToEntryRequest - 18, // 29: filer_pb.SeaweedFiler.DeleteEntry:input_type -> filer_pb.DeleteEntryRequest - 20, // 30: filer_pb.SeaweedFiler.AtomicRenameEntry:input_type -> filer_pb.AtomicRenameEntryRequest - 22, // 31: filer_pb.SeaweedFiler.AssignVolume:input_type -> filer_pb.AssignVolumeRequest - 24, // 32: filer_pb.SeaweedFiler.LookupVolume:input_type -> filer_pb.LookupVolumeRequest - 29, // 33: filer_pb.SeaweedFiler.CollectionList:input_type -> filer_pb.CollectionListRequest - 31, // 34: filer_pb.SeaweedFiler.DeleteCollection:input_type -> filer_pb.DeleteCollectionRequest - 33, // 35: filer_pb.SeaweedFiler.Statistics:input_type -> filer_pb.StatisticsRequest - 35, // 36: filer_pb.SeaweedFiler.GetFilerConfiguration:input_type -> filer_pb.GetFilerConfigurationRequest - 37, // 37: filer_pb.SeaweedFiler.SubscribeMetadata:input_type -> filer_pb.SubscribeMetadataRequest - 37, // 38: filer_pb.SeaweedFiler.SubscribeLocalMetadata:input_type -> filer_pb.SubscribeMetadataRequest - 40, // 39: filer_pb.SeaweedFiler.KeepConnected:input_type -> filer_pb.KeepConnectedRequest - 42, // 40: filer_pb.SeaweedFiler.LocateBroker:input_type -> filer_pb.LocateBrokerRequest - 44, // 41: filer_pb.SeaweedFiler.KvGet:input_type -> filer_pb.KvGetRequest - 46, // 42: filer_pb.SeaweedFiler.KvPut:input_type -> filer_pb.KvPutRequest - 1, // 43: filer_pb.SeaweedFiler.LookupDirectoryEntry:output_type -> filer_pb.LookupDirectoryEntryResponse - 3, // 44: filer_pb.SeaweedFiler.ListEntries:output_type -> filer_pb.ListEntriesResponse - 13, // 45: filer_pb.SeaweedFiler.CreateEntry:output_type -> filer_pb.CreateEntryResponse - 15, // 46: filer_pb.SeaweedFiler.UpdateEntry:output_type -> filer_pb.UpdateEntryResponse - 17, // 47: filer_pb.SeaweedFiler.AppendToEntry:output_type -> filer_pb.AppendToEntryResponse - 19, // 48: filer_pb.SeaweedFiler.DeleteEntry:output_type -> filer_pb.DeleteEntryResponse - 21, // 49: filer_pb.SeaweedFiler.AtomicRenameEntry:output_type -> filer_pb.AtomicRenameEntryResponse - 23, // 50: filer_pb.SeaweedFiler.AssignVolume:output_type -> filer_pb.AssignVolumeResponse - 27, // 51: filer_pb.SeaweedFiler.LookupVolume:output_type -> filer_pb.LookupVolumeResponse - 30, // 52: filer_pb.SeaweedFiler.CollectionList:output_type -> filer_pb.CollectionListResponse - 32, // 53: filer_pb.SeaweedFiler.DeleteCollection:output_type -> filer_pb.DeleteCollectionResponse - 34, // 54: filer_pb.SeaweedFiler.Statistics:output_type -> filer_pb.StatisticsResponse - 36, // 55: filer_pb.SeaweedFiler.GetFilerConfiguration:output_type -> filer_pb.GetFilerConfigurationResponse - 38, // 56: filer_pb.SeaweedFiler.SubscribeMetadata:output_type -> filer_pb.SubscribeMetadataResponse - 38, // 57: filer_pb.SeaweedFiler.SubscribeLocalMetadata:output_type -> filer_pb.SubscribeMetadataResponse - 41, // 58: filer_pb.SeaweedFiler.KeepConnected:output_type -> filer_pb.KeepConnectedResponse - 43, // 59: filer_pb.SeaweedFiler.LocateBroker:output_type -> filer_pb.LocateBrokerResponse - 45, // 60: filer_pb.SeaweedFiler.KvGet:output_type -> filer_pb.KvGetResponse - 47, // 61: filer_pb.SeaweedFiler.KvPut:output_type -> filer_pb.KvPutResponse - 43, // [43:62] is the sub-list for method output_type - 24, // [24:43] is the sub-list for method input_type - 24, // [24:24] is the sub-list for extension type_name - 24, // [24:24] is the sub-list for extension extendee - 0, // [0:24] is the sub-list for field type_name + 56, // 19: filer_pb.LocateBrokerResponse.resources:type_name -> filer_pb.LocateBrokerResponse.Resource + 57, // 20: filer_pb.FilerConf.locations:type_name -> filer_pb.FilerConf.PathConf + 58, // 21: filer_pb.RemoteStorageMapping.mappings:type_name -> filer_pb.RemoteStorageMapping.MappingsEntry + 5, // 22: filer_pb.DownloadToLocalResponse.entry:type_name -> filer_pb.Entry + 25, // 23: filer_pb.LookupVolumeResponse.LocationsMapEntry.value:type_name -> filer_pb.Locations + 51, // 24: filer_pb.RemoteStorageMapping.MappingsEntry.value:type_name -> filer_pb.RemoteStorageLocation + 0, // 25: filer_pb.SeaweedFiler.LookupDirectoryEntry:input_type -> filer_pb.LookupDirectoryEntryRequest + 2, // 26: filer_pb.SeaweedFiler.ListEntries:input_type -> filer_pb.ListEntriesRequest + 12, // 27: filer_pb.SeaweedFiler.CreateEntry:input_type -> filer_pb.CreateEntryRequest + 14, // 28: filer_pb.SeaweedFiler.UpdateEntry:input_type -> filer_pb.UpdateEntryRequest + 16, // 29: filer_pb.SeaweedFiler.AppendToEntry:input_type -> filer_pb.AppendToEntryRequest + 18, // 30: filer_pb.SeaweedFiler.DeleteEntry:input_type -> filer_pb.DeleteEntryRequest + 20, // 31: filer_pb.SeaweedFiler.AtomicRenameEntry:input_type -> filer_pb.AtomicRenameEntryRequest + 22, // 32: filer_pb.SeaweedFiler.AssignVolume:input_type -> filer_pb.AssignVolumeRequest + 24, // 33: filer_pb.SeaweedFiler.LookupVolume:input_type -> filer_pb.LookupVolumeRequest + 29, // 34: filer_pb.SeaweedFiler.CollectionList:input_type -> filer_pb.CollectionListRequest + 31, // 35: filer_pb.SeaweedFiler.DeleteCollection:input_type -> filer_pb.DeleteCollectionRequest + 33, // 36: filer_pb.SeaweedFiler.Statistics:input_type -> filer_pb.StatisticsRequest + 35, // 37: filer_pb.SeaweedFiler.GetFilerConfiguration:input_type -> filer_pb.GetFilerConfigurationRequest + 37, // 38: filer_pb.SeaweedFiler.SubscribeMetadata:input_type -> filer_pb.SubscribeMetadataRequest + 37, // 39: filer_pb.SeaweedFiler.SubscribeLocalMetadata:input_type -> filer_pb.SubscribeMetadataRequest + 40, // 40: filer_pb.SeaweedFiler.KeepConnected:input_type -> filer_pb.KeepConnectedRequest + 42, // 41: filer_pb.SeaweedFiler.LocateBroker:input_type -> filer_pb.LocateBrokerRequest + 44, // 42: filer_pb.SeaweedFiler.KvGet:input_type -> filer_pb.KvGetRequest + 46, // 43: filer_pb.SeaweedFiler.KvPut:input_type -> filer_pb.KvPutRequest + 52, // 44: filer_pb.SeaweedFiler.DownloadToLocal:input_type -> filer_pb.DownloadToLocalRequest + 1, // 45: filer_pb.SeaweedFiler.LookupDirectoryEntry:output_type -> filer_pb.LookupDirectoryEntryResponse + 3, // 46: filer_pb.SeaweedFiler.ListEntries:output_type -> filer_pb.ListEntriesResponse + 13, // 47: filer_pb.SeaweedFiler.CreateEntry:output_type -> filer_pb.CreateEntryResponse + 15, // 48: filer_pb.SeaweedFiler.UpdateEntry:output_type -> filer_pb.UpdateEntryResponse + 17, // 49: filer_pb.SeaweedFiler.AppendToEntry:output_type -> filer_pb.AppendToEntryResponse + 19, // 50: filer_pb.SeaweedFiler.DeleteEntry:output_type -> filer_pb.DeleteEntryResponse + 21, // 51: filer_pb.SeaweedFiler.AtomicRenameEntry:output_type -> filer_pb.AtomicRenameEntryResponse + 23, // 52: filer_pb.SeaweedFiler.AssignVolume:output_type -> filer_pb.AssignVolumeResponse + 27, // 53: filer_pb.SeaweedFiler.LookupVolume:output_type -> filer_pb.LookupVolumeResponse + 30, // 54: filer_pb.SeaweedFiler.CollectionList:output_type -> filer_pb.CollectionListResponse + 32, // 55: filer_pb.SeaweedFiler.DeleteCollection:output_type -> filer_pb.DeleteCollectionResponse + 34, // 56: filer_pb.SeaweedFiler.Statistics:output_type -> filer_pb.StatisticsResponse + 36, // 57: filer_pb.SeaweedFiler.GetFilerConfiguration:output_type -> filer_pb.GetFilerConfigurationResponse + 38, // 58: filer_pb.SeaweedFiler.SubscribeMetadata:output_type -> filer_pb.SubscribeMetadataResponse + 38, // 59: filer_pb.SeaweedFiler.SubscribeLocalMetadata:output_type -> filer_pb.SubscribeMetadataResponse + 41, // 60: filer_pb.SeaweedFiler.KeepConnected:output_type -> filer_pb.KeepConnectedResponse + 43, // 61: filer_pb.SeaweedFiler.LocateBroker:output_type -> filer_pb.LocateBrokerResponse + 45, // 62: filer_pb.SeaweedFiler.KvGet:output_type -> filer_pb.KvGetResponse + 47, // 63: filer_pb.SeaweedFiler.KvPut:output_type -> filer_pb.KvPutResponse + 53, // 64: filer_pb.SeaweedFiler.DownloadToLocal:output_type -> filer_pb.DownloadToLocalResponse + 45, // [45:65] is the sub-list for method output_type + 25, // [25:45] is the sub-list for method input_type + 25, // [25:25] is the sub-list for extension type_name + 25, // [25:25] is the sub-list for extension extendee + 0, // [0:25] is the sub-list for field type_name } func init() { file_filer_proto_init() } @@ -4851,7 +4984,31 @@ func file_filer_proto_init() { return nil } } - file_filer_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_filer_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DownloadToLocalRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_filer_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DownloadToLocalResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_filer_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LocateBrokerResponse_Resource); i { case 0: return &v.state @@ -4863,7 +5020,7 @@ func file_filer_proto_init() { return nil } } - file_filer_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_filer_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FilerConf_PathConf); i { case 0: return &v.state @@ -4882,7 +5039,7 @@ func file_filer_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_filer_proto_rawDesc, NumEnums: 0, - NumMessages: 57, + NumMessages: 59, NumExtensions: 0, NumServices: 1, }, @@ -4927,6 +5084,7 @@ type SeaweedFilerClient interface { LocateBroker(ctx context.Context, in *LocateBrokerRequest, opts ...grpc.CallOption) (*LocateBrokerResponse, error) KvGet(ctx context.Context, in *KvGetRequest, opts ...grpc.CallOption) (*KvGetResponse, error) KvPut(ctx context.Context, in *KvPutRequest, opts ...grpc.CallOption) (*KvPutResponse, error) + DownloadToLocal(ctx context.Context, in *DownloadToLocalRequest, opts ...grpc.CallOption) (*DownloadToLocalResponse, error) } type seaweedFilerClient struct { @@ -5199,6 +5357,15 @@ func (c *seaweedFilerClient) KvPut(ctx context.Context, in *KvPutRequest, opts . return out, nil } +func (c *seaweedFilerClient) DownloadToLocal(ctx context.Context, in *DownloadToLocalRequest, opts ...grpc.CallOption) (*DownloadToLocalResponse, error) { + out := new(DownloadToLocalResponse) + err := c.cc.Invoke(ctx, "/filer_pb.SeaweedFiler/DownloadToLocal", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // SeaweedFilerServer is the server API for SeaweedFiler service. type SeaweedFilerServer interface { LookupDirectoryEntry(context.Context, *LookupDirectoryEntryRequest) (*LookupDirectoryEntryResponse, error) @@ -5220,6 +5387,7 @@ type SeaweedFilerServer interface { LocateBroker(context.Context, *LocateBrokerRequest) (*LocateBrokerResponse, error) KvGet(context.Context, *KvGetRequest) (*KvGetResponse, error) KvPut(context.Context, *KvPutRequest) (*KvPutResponse, error) + DownloadToLocal(context.Context, *DownloadToLocalRequest) (*DownloadToLocalResponse, error) } // UnimplementedSeaweedFilerServer can be embedded to have forward compatible implementations. @@ -5283,6 +5451,9 @@ func (*UnimplementedSeaweedFilerServer) KvGet(context.Context, *KvGetRequest) (* func (*UnimplementedSeaweedFilerServer) KvPut(context.Context, *KvPutRequest) (*KvPutResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method KvPut not implemented") } +func (*UnimplementedSeaweedFilerServer) DownloadToLocal(context.Context, *DownloadToLocalRequest) (*DownloadToLocalResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DownloadToLocal not implemented") +} func RegisterSeaweedFilerServer(s *grpc.Server, srv SeaweedFilerServer) { s.RegisterService(&_SeaweedFiler_serviceDesc, srv) @@ -5647,6 +5818,24 @@ func _SeaweedFiler_KvPut_Handler(srv interface{}, ctx context.Context, dec func( return interceptor(ctx, in, info, handler) } +func _SeaweedFiler_DownloadToLocal_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DownloadToLocalRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SeaweedFilerServer).DownloadToLocal(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/filer_pb.SeaweedFiler/DownloadToLocal", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SeaweedFilerServer).DownloadToLocal(ctx, req.(*DownloadToLocalRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _SeaweedFiler_serviceDesc = grpc.ServiceDesc{ ServiceName: "filer_pb.SeaweedFiler", HandlerType: (*SeaweedFilerServer)(nil), @@ -5711,6 +5900,10 @@ var _SeaweedFiler_serviceDesc = grpc.ServiceDesc{ MethodName: "KvPut", Handler: _SeaweedFiler_KvPut_Handler, }, + { + MethodName: "DownloadToLocal", + Handler: _SeaweedFiler_DownloadToLocal_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/weed/pb/volume_server.proto b/weed/pb/volume_server.proto index b1f2487ba..c255be488 100644 --- a/weed/pb/volume_server.proto +++ b/weed/pb/volume_server.proto @@ -469,17 +469,18 @@ message VolumeServerLeaveResponse { message FetchAndWriteNeedleRequest { uint32 volume_id = 1; uint64 needle_id = 2; - int64 offset = 3; - int64 size = 4; + uint32 cookie = 3; + int64 offset = 4; + int64 size = 5; // remote conf - string remote_type = 5; - string remote_name = 6; + string remote_type = 6; + string remote_name = 7; string s3_access_key = 8; string s3_secret_key = 9; string s3_region = 10; string s3_endpoint = 11; string remote_bucket = 12; - string remote_key = 13; + string remote_path = 13; } message FetchAndWriteNeedleResponse { } diff --git a/weed/pb/volume_server_pb/volume_server.pb.go b/weed/pb/volume_server_pb/volume_server.pb.go index b360349e4..aea7e7c2c 100644 --- a/weed/pb/volume_server_pb/volume_server.pb.go +++ b/weed/pb/volume_server_pb/volume_server.pb.go @@ -4323,17 +4323,18 @@ type FetchAndWriteNeedleRequest struct { VolumeId uint32 `protobuf:"varint,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` NeedleId uint64 `protobuf:"varint,2,opt,name=needle_id,json=needleId,proto3" json:"needle_id,omitempty"` - Offset int64 `protobuf:"varint,3,opt,name=offset,proto3" json:"offset,omitempty"` - Size int64 `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"` + Cookie uint32 `protobuf:"varint,3,opt,name=cookie,proto3" json:"cookie,omitempty"` + Offset int64 `protobuf:"varint,4,opt,name=offset,proto3" json:"offset,omitempty"` + Size int64 `protobuf:"varint,5,opt,name=size,proto3" json:"size,omitempty"` // remote conf - RemoteType string `protobuf:"bytes,5,opt,name=remote_type,json=remoteType,proto3" json:"remote_type,omitempty"` - RemoteName string `protobuf:"bytes,6,opt,name=remote_name,json=remoteName,proto3" json:"remote_name,omitempty"` + RemoteType string `protobuf:"bytes,6,opt,name=remote_type,json=remoteType,proto3" json:"remote_type,omitempty"` + RemoteName string `protobuf:"bytes,7,opt,name=remote_name,json=remoteName,proto3" json:"remote_name,omitempty"` S3AccessKey string `protobuf:"bytes,8,opt,name=s3_access_key,json=s3AccessKey,proto3" json:"s3_access_key,omitempty"` S3SecretKey string `protobuf:"bytes,9,opt,name=s3_secret_key,json=s3SecretKey,proto3" json:"s3_secret_key,omitempty"` S3Region string `protobuf:"bytes,10,opt,name=s3_region,json=s3Region,proto3" json:"s3_region,omitempty"` S3Endpoint string `protobuf:"bytes,11,opt,name=s3_endpoint,json=s3Endpoint,proto3" json:"s3_endpoint,omitempty"` RemoteBucket string `protobuf:"bytes,12,opt,name=remote_bucket,json=remoteBucket,proto3" json:"remote_bucket,omitempty"` - RemoteKey string `protobuf:"bytes,13,opt,name=remote_key,json=remoteKey,proto3" json:"remote_key,omitempty"` + RemotePath string `protobuf:"bytes,13,opt,name=remote_path,json=remotePath,proto3" json:"remote_path,omitempty"` } func (x *FetchAndWriteNeedleRequest) Reset() { @@ -4382,6 +4383,13 @@ func (x *FetchAndWriteNeedleRequest) GetNeedleId() uint64 { return 0 } +func (x *FetchAndWriteNeedleRequest) GetCookie() uint32 { + if x != nil { + return x.Cookie + } + return 0 +} + func (x *FetchAndWriteNeedleRequest) GetOffset() int64 { if x != nil { return x.Offset @@ -4445,9 +4453,9 @@ func (x *FetchAndWriteNeedleRequest) GetRemoteBucket() string { return "" } -func (x *FetchAndWriteNeedleRequest) GetRemoteKey() string { +func (x *FetchAndWriteNeedleRequest) GetRemotePath() string { if x != nil { - return x.RemoteKey + return x.RemotePath } return "" } @@ -5715,435 +5723,437 @@ var file_volume_server_proto_rawDesc = []byte{ 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x1b, 0x0a, 0x19, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8e, 0x03, 0x0a, 0x1a, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x6e, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa8, 0x03, 0x0a, 0x1a, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x73, - 0x33, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x73, 0x33, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, - 0x22, 0x0a, 0x0d, 0x73, 0x33, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x33, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x4b, 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x33, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, - 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x33, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x33, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x4b, 0x65, 0x79, 0x22, 0x1d, 0x0a, 0x1b, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x6e, - 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf8, 0x0c, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x66, 0x69, - 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, - 0x6f, 0x6d, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x12, 0x3d, 0x0a, 0x06, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x62, 0x0a, 0x13, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x53, - 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x14, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x1a, 0x4e, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, - 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x1a, 0xd5, 0x05, 0x0a, 0x12, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, - 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x57, 0x0a, 0x09, 0x63, 0x73, 0x76, 0x5f, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x53, 0x56, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x52, 0x08, 0x63, 0x73, 0x76, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x5a, - 0x0a, 0x0a, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x63, + 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, + 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x33, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x33, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x33, 0x5f, 0x73, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x73, 0x33, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x73, + 0x33, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x73, 0x33, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x33, 0x5f, 0x65, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, + 0x33, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, + 0x1d, 0x0a, 0x1b, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf8, + 0x0c, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x22, 0x0a, 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x6c, 0x65, + 0x49, 0x64, 0x73, 0x12, 0x3d, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x12, 0x62, 0x0a, 0x13, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x31, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x12, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x14, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x4e, 0x0a, + 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0xd5, 0x05, + 0x0a, 0x12, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x57, 0x0a, 0x09, 0x63, 0x73, 0x76, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, - 0x09, 0x6a, 0x73, 0x6f, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x63, 0x0a, 0x0d, 0x70, 0x61, - 0x72, 0x71, 0x75, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x3e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x53, 0x56, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x08, + 0x63, 0x73, 0x76, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x5a, 0x0a, 0x0a, 0x6a, 0x73, 0x6f, 0x6e, + 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x4a, 0x53, 0x4f, 0x4e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x09, 0x6a, 0x73, 0x6f, 0x6e, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x12, 0x63, 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x71, 0x75, 0x65, 0x74, 0x5f, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, + 0x61, 0x72, 0x71, 0x75, 0x65, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x0c, 0x70, 0x61, 0x72, + 0x71, 0x75, 0x65, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0xc8, 0x02, 0x0a, 0x08, 0x43, 0x53, + 0x56, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, + 0x72, 0x64, 0x44, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x10, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x63, 0x68, + 0x61, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x71, 0x75, 0x6f, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x65, 0x72, 0x12, + 0x34, 0x0a, 0x16, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x5f, + 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x14, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x45, 0x73, 0x63, 0x61, 0x70, 0x65, 0x43, 0x68, 0x61, 0x72, + 0x61, 0x63, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x41, 0x0a, 0x1d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x65, + 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x51, + 0x75, 0x6f, 0x74, 0x65, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x65, 0x72, 0x1a, 0x1f, 0x0a, 0x09, 0x4a, 0x53, 0x4f, 0x4e, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, 0x0e, 0x0a, 0x0c, 0x50, 0x61, 0x72, 0x71, 0x75, 0x65, 0x74, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0xf1, 0x03, 0x0a, 0x13, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5b, 0x0a, + 0x0a, 0x63, 0x73, 0x76, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x61, 0x72, 0x71, 0x75, 0x65, 0x74, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x71, 0x75, 0x65, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, - 0xc8, 0x02, 0x0a, 0x08, 0x43, 0x53, 0x56, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x28, 0x0a, 0x10, - 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, - 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x44, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x10, 0x71, 0x75, - 0x6f, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x65, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x61, - 0x63, 0x74, 0x6f, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x65, - 0x73, 0x63, 0x61, 0x70, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x45, 0x73, 0x63, 0x61, - 0x70, 0x65, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x1d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x64, - 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x51, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x44, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x1a, 0x1f, 0x0a, 0x09, 0x4a, 0x53, - 0x4f, 0x4e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, 0x0e, 0x0a, 0x0c, 0x50, - 0x61, 0x72, 0x71, 0x75, 0x65, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0xf1, 0x03, 0x0a, 0x13, + 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x53, 0x56, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, + 0x09, 0x63, 0x73, 0x76, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x5e, 0x0a, 0x0b, 0x6a, 0x73, + 0x6f, 0x6e, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x5b, 0x0a, 0x0a, 0x63, 0x73, 0x76, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x53, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x53, 0x56, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x09, 0x63, 0x73, 0x76, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x12, 0x5e, 0x0a, 0x0b, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x53, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x52, 0x0a, 0x6a, 0x73, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x1a, 0xe3, 0x01, 0x0a, 0x09, 0x43, 0x53, 0x56, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x21, - 0x0a, 0x0c, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x73, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x10, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x63, - 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x65, 0x72, - 0x12, 0x34, 0x0a, 0x16, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, - 0x5f, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x14, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x45, 0x73, 0x63, 0x61, 0x70, 0x65, 0x43, 0x68, 0x61, - 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x0a, 0x4a, 0x53, 0x4f, 0x4e, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x64, - 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x22, - 0x29, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x70, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x22, 0x55, 0x0a, 0x19, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x49, - 0x64, 0x22, 0xae, 0x01, 0x0a, 0x1a, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x65, 0x65, 0x64, - 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x08, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x63, - 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x10, - 0x0a, 0x03, 0x63, 0x72, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x63, 0x72, 0x63, - 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, - 0x74, 0x6c, 0x32, 0x9f, 0x22, 0x0a, 0x0c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x12, 0x5c, 0x0a, 0x0b, 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x12, 0x24, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x6f, 0x6e, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x0a, + 0x6a, 0x73, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x1a, 0xe3, 0x01, 0x0a, 0x09, 0x43, + 0x53, 0x56, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x71, 0x75, 0x6f, 0x74, + 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x71, 0x75, 0x6f, 0x74, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x72, + 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x44, 0x65, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, + 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, + 0x29, 0x0a, 0x10, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, + 0x6f, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x71, 0x75, 0x6f, 0x74, 0x65, + 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x71, 0x75, + 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x61, + 0x63, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x71, 0x75, 0x6f, 0x74, + 0x65, 0x45, 0x73, 0x63, 0x61, 0x70, 0x65, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, + 0x1a, 0x37, 0x0a, 0x0a, 0x4a, 0x53, 0x4f, 0x4e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x29, + 0x0a, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, + 0x44, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x22, 0x29, 0x0a, 0x0d, 0x51, 0x75, 0x65, + 0x72, 0x69, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x72, 0x65, 0x63, + 0x6f, 0x72, 0x64, 0x73, 0x22, 0x55, 0x0a, 0x19, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x65, + 0x65, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1b, + 0x0a, 0x09, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x08, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x49, 0x64, 0x22, 0xae, 0x01, 0x0a, 0x1a, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, + 0x65, 0x64, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6e, + 0x65, 0x65, 0x64, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x73, + 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x72, 0x63, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x63, 0x72, 0x63, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, + 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x32, 0x9f, 0x22, 0x0a, + 0x0c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x5c, 0x0a, + 0x0b, 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x24, 0x2e, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x6e, 0x0a, 0x11, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x11, 0x56, + 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x12, 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x13, 0x56, + 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x61, + 0x63, 0x74, 0x12, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x74, 0x0a, 0x13, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x12, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, 0x75, - 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x61, 0x63, 0x75, 0x75, - 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x2b, 0x2e, + 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, 0x75, 0x75, + 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x13, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x12, 0x2c, 0x2e, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, + 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, + 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x10, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, + 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x0e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x27, 0x2e, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, + 0x0a, 0x10, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x29, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x79, 0x6e, 0x63, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, - 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x13, 0x56, 0x61, - 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x12, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x6b, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x65, 0x0a, - 0x0e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, - 0x27, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x10, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x79, - 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7c, 0x0a, 0x15, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, + 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x70, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x70, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5c, 0x0a, 0x0b, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x79, 0x6e, - 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x7c, 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x6e, 0x63, 0x72, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2e, 0x2e, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x43, - 0x6f, 0x70, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x43, - 0x6f, 0x70, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x5c, 0x0a, 0x0b, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, + 0x6d, 0x65, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, 0x6f, - 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, - 0x0d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, - 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x5f, 0x0a, 0x0c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x12, 0x25, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x0d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, 0x61, 0x72, 0x6b, - 0x52, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, + 0x6d, 0x65, 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x27, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5f, 0x0a, 0x0c, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x12, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x61, 0x64, 0x6f, 0x6e, + 0x6c, 0x79, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, 0x61, 0x72, 0x6b, + 0x52, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x61, + 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x71, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x57, 0x72, 0x69, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, - 0x61, 0x72, 0x6b, 0x52, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, - 0x61, 0x72, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2b, 0x2e, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0f, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x28, 0x2e, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, + 0x61, 0x72, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, 0x61, 0x72, 0x6b, + 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0f, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x28, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x5f, 0x0a, 0x0c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x25, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x0a, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x70, - 0x79, 0x12, 0x23, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x43, 0x6f, 0x70, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x77, - 0x0a, 0x14, 0x52, 0x65, 0x61, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x08, 0x43, 0x6f, 0x70, 0x79, 0x46, - 0x69, 0x6c, 0x65, 0x12, 0x21, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x46, 0x69, - 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, - 0x0a, 0x0e, 0x52, 0x65, 0x61, 0x64, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, - 0x12, 0x27, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6c, - 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x61, - 0x64, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0f, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, - 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x28, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, - 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x6d, 0x0a, 0x10, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x6e, - 0x64, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, - 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, - 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x6e, 0x64, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x71, - 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x63, 0x65, - 0x69, 0x76, 0x65, 0x72, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, - 0x69, 0x6c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x7d, 0x0a, 0x16, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x2e, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x76, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x29, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5f, 0x0a, 0x0c, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x7a, 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x73, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x2e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x62, 0x75, 0x69, - 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x62, 0x75, 0x69, - 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x12, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, - 0x70, 0x79, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, 0x70, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x43, 0x6f, 0x70, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x77, 0x0a, 0x14, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, + 0x0a, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x23, 0x2e, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x24, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x14, 0x52, 0x65, 0x61, 0x64, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x2d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x46, 0x69, + 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x46, 0x69, 0x6c, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x55, 0x0a, 0x08, 0x43, 0x6f, 0x70, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x21, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x4d, - 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, - 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, - 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x11, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x61, 0x64, 0x12, - 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x61, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x71, 0x0a, 0x12, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x42, 0x6c, 0x6f, 0x62, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x42, 0x6c, - 0x6f, 0x62, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x42, 0x6c, 0x6f, 0x62, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x7d, 0x0a, 0x16, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x54, 0x6f, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x54, 0x6f, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x54, 0x6f, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x88, - 0x01, 0x0a, 0x19, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, - 0x65, 0x44, 0x61, 0x74, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x32, 0x2e, 0x76, + 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x0e, 0x52, 0x65, 0x61, 0x64, + 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x27, 0x2e, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x61, 0x64, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x4e, 0x65, 0x65, 0x64, 0x6c, + 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x68, 0x0a, 0x0f, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6c, + 0x6f, 0x62, 0x12, 0x28, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, + 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, - 0x74, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x33, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, - 0x76, 0x65, 0x44, 0x61, 0x74, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x8e, 0x01, 0x0a, 0x1b, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x46, - 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x34, 0x2e, 0x76, 0x6f, 0x6c, 0x75, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x10, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x29, 0x2e, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x12, 0x2b, + 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x16, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, + 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x15, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x12, 0x2e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2b, 0x2e, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, + 0x70, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, 0x70, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x14, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x12, 0x2d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x74, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x4d, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x2e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x73, 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x73, 0x55, 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x11, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x61, 0x64, 0x12, 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, + 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x45, 0x63, 0x42, 0x6c, 0x6f, 0x62, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2b, 0x2e, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x42, 0x6c, 0x6f, 0x62, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x45, 0x63, 0x42, 0x6c, 0x6f, 0x62, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x16, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x54, 0x6f, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x12, 0x2f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x73, 0x54, 0x6f, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x54, 0x6f, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x88, 0x01, 0x0a, 0x19, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x54, 0x6f, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x32, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x54, 0x6f, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x54, + 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x30, 0x01, 0x12, 0x8e, 0x01, 0x0a, 0x1b, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, + 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x12, 0x34, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, + 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x61, 0x74, 0x46, 0x72, - 0x6f, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x35, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x69, 0x65, 0x72, 0x4d, 0x6f, 0x76, - 0x65, 0x44, 0x61, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, + 0x6f, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, - 0x11, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, 0x65, 0x61, - 0x76, 0x65, 0x12, 0x2a, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, - 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, 0x65, - 0x61, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, - 0x13, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, - 0x65, 0x64, 0x6c, 0x65, 0x12, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x70, 0x65, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x71, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x65, - 0x65, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x42, 0x39, 0x5a, 0x37, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, - 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x11, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x2a, 0x2e, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x13, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x41, 0x6e, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x12, 0x2c, + 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, + 0x65, 0x65, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, + 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, + 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1e, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, + 0x64, 0x53, 0x74, 0x72, 0x69, 0x70, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x71, 0x0a, 0x12, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x2b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, + 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x39, + 0x5a, 0x37, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, + 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, + 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/weed/remote_storage/remote_storage.go b/weed/remote_storage/remote_storage.go index c94260ac0..bbc3eaa5b 100644 --- a/weed/remote_storage/remote_storage.go +++ b/weed/remote_storage/remote_storage.go @@ -32,6 +32,7 @@ type VisitFunc func(dir string, name string, isDirectory bool, remoteEntry *file type RemoteStorageClient interface { Traverse(loc *filer_pb.RemoteStorageLocation, visitFn VisitFunc) error ReadFile(loc *filer_pb.RemoteStorageLocation, offset int64, size int64) (data []byte, err error) + WriteDirectory(loc *filer_pb.RemoteStorageLocation, entry *filer_pb.Entry) (err error) WriteFile(loc *filer_pb.RemoteStorageLocation, entry *filer_pb.Entry, reader io.Reader) (remoteEntry *filer_pb.RemoteEntry, err error) UpdateFileMetadata(loc *filer_pb.RemoteStorageLocation, entry *filer_pb.Entry) (err error) DeleteFile(loc *filer_pb.RemoteStorageLocation) (err error) diff --git a/weed/remote_storage/s3/s3_storage_client.go b/weed/remote_storage/s3/s3_storage_client.go index 5292f4bc4..17c5079de 100644 --- a/weed/remote_storage/s3/s3_storage_client.go +++ b/weed/remote_storage/s3/s3_storage_client.go @@ -77,10 +77,10 @@ func (s *s3RemoteStorageClient) Traverse(remote *filer_pb.RemoteStorageLocation, } dir, name := util.FullPath(key).DirAndName() if err := visitFn(dir, name, false, &filer_pb.RemoteEntry{ - LastModifiedAt: (*content.LastModified).Unix(), - Size: *content.Size, - ETag: *content.ETag, - StorageName: s.conf.Name, + RemoteMtime: (*content.LastModified).Unix(), + RemoteSize: *content.Size, + RemoteETag: *content.ETag, + StorageName: s.conf.Name, }); err != nil { return false } @@ -116,6 +116,10 @@ func (s *s3RemoteStorageClient) ReadFile(loc *filer_pb.RemoteStorageLocation, of return writerAt.Bytes(), nil } +func (s *s3RemoteStorageClient) WriteDirectory(loc *filer_pb.RemoteStorageLocation, entry *filer_pb.Entry) (err error) { + return nil +} + func (s *s3RemoteStorageClient) WriteFile(loc *filer_pb.RemoteStorageLocation, entry *filer_pb.Entry, reader io.Reader) (remoteEntry *filer_pb.RemoteEntry, err error) { fileSize := int64(filer.FileSize(entry)) @@ -182,10 +186,10 @@ func (s *s3RemoteStorageClient) readFileRemoteEntry(loc *filer_pb.RemoteStorageL } return &filer_pb.RemoteEntry{ - LastModifiedAt: resp.LastModified.Unix(), - Size: *resp.ContentLength, - ETag: *resp.ETag, - StorageName: s.conf.Name, + RemoteMtime: resp.LastModified.Unix(), + RemoteSize: *resp.ContentLength, + RemoteETag: *resp.ETag, + StorageName: s.conf.Name, }, nil } diff --git a/weed/server/filer_grpc_server_remote.go b/weed/server/filer_grpc_server_remote.go new file mode 100644 index 000000000..93953f99d --- /dev/null +++ b/weed/server/filer_grpc_server_remote.go @@ -0,0 +1,161 @@ +package weed_server + +import ( + "context" + "fmt" + "github.com/chrislusf/seaweedfs/weed/filer" + "github.com/chrislusf/seaweedfs/weed/operation" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/chrislusf/seaweedfs/weed/pb/volume_server_pb" + "github.com/chrislusf/seaweedfs/weed/storage/needle" + "github.com/chrislusf/seaweedfs/weed/util" + "github.com/golang/protobuf/proto" + "strings" + "time" +) + +func (fs *FilerServer) DownloadToLocal(ctx context.Context, req *filer_pb.DownloadToLocalRequest) (*filer_pb.DownloadToLocalResponse, error) { + + // load all mappings + mappingEntry, err := fs.filer.FindEntry(ctx, util.JoinPath(filer.DirectoryEtcRemote, filer.REMOTE_STORAGE_MOUNT_FILE)) + if err != nil { + return nil, err + } + mappings, err := filer.UnmarshalRemoteStorageMappings(mappingEntry.Content) + if err != nil { + return nil, err + } + + // find mapping + var remoteStorageMountedLocation *filer_pb.RemoteStorageLocation + var localMountedDir string + for k, loc := range mappings.Mappings { + if strings.HasPrefix(req.Directory, k) { + localMountedDir, remoteStorageMountedLocation = k, loc + } + } + if localMountedDir == "" { + return nil, fmt.Errorf("%s is not mounted", req.Directory) + } + + // find storage configuration + storageConfEntry, err := fs.filer.FindEntry(ctx, util.JoinPath(filer.DirectoryEtcRemote, remoteStorageMountedLocation.Name+filer.REMOTE_STORAGE_CONF_SUFFIX)) + if err != nil { + return nil, err + } + storageConf := &filer_pb.RemoteConf{} + if unMarshalErr := proto.Unmarshal(storageConfEntry.Content, storageConf); unMarshalErr != nil { + return nil, fmt.Errorf("unmarshal remote storage conf %s/%s: %v", filer.DirectoryEtcRemote, remoteStorageMountedLocation.Name+filer.REMOTE_STORAGE_CONF_SUFFIX, unMarshalErr) + } + + // find the entry + entry, err := fs.filer.FindEntry(ctx, util.JoinPath(req.Directory, req.Name)) + if err == filer_pb.ErrNotFound { + return nil, err + } + + resp := &filer_pb.DownloadToLocalResponse{} + if entry.Remote == nil || entry.Remote.RemoteSize == 0 { + return resp, nil + } + + // detect storage option + so, err := fs.detectStorageOption(req.Directory, "", "000", 0, "", "", "") + if err != nil { + return resp, err + } + assignRequest, altRequest := so.ToAssignRequests(1) + + // find a good chunk size + chunkSize := int64(5 * 1024 * 1024) + chunkCount := entry.Remote.RemoteSize/chunkSize + 1 + for chunkCount > 1000 { + chunkSize *= 2 + chunkCount = entry.Remote.RemoteSize/chunkSize + 1 + } + + dest := util.FullPath(remoteStorageMountedLocation.Path).Child(string(util.FullPath(req.Directory).Child(req.Name))[len(localMountedDir):]) + + var chunks []*filer_pb.FileChunk + + for offset := int64(0); offset < entry.Remote.RemoteSize; offset += chunkSize { + size := chunkSize + if offset+chunkSize > entry.Remote.RemoteSize { + size = entry.Remote.RemoteSize - offset + } + + // assign one volume server + assignResult, err := operation.Assign(fs.filer.GetMaster, fs.grpcDialOption, assignRequest, altRequest) + if err != nil { + return resp, err + } + if assignResult.Error != "" { + return resp, fmt.Errorf("assign: %v", assignResult.Error) + } + fileId, parseErr := needle.ParseFileIdFromString(assignResult.Fid) + if assignResult.Error != "" { + return resp, fmt.Errorf("unrecognized file id %s: %v", assignResult.Fid, parseErr) + } + + // tell filer to tell volume server to download into needles + err = operation.WithVolumeServerClient(assignResult.Url, fs.grpcDialOption, func(volumeServerClient volume_server_pb.VolumeServerClient) error { + _, fetchAndWriteErr := volumeServerClient.FetchAndWriteNeedle(context.Background(), &volume_server_pb.FetchAndWriteNeedleRequest{ + VolumeId: uint32(fileId.VolumeId), + NeedleId: uint64(fileId.Key), + Cookie: uint32(fileId.Cookie), + Offset: offset, + Size: size, + RemoteType: storageConf.Type, + RemoteName: storageConf.Name, + S3AccessKey: storageConf.S3AccessKey, + S3SecretKey: storageConf.S3SecretKey, + S3Region: storageConf.S3Region, + S3Endpoint: storageConf.S3Endpoint, + RemoteBucket: remoteStorageMountedLocation.Bucket, + RemotePath: string(dest), + }) + if fetchAndWriteErr != nil { + return fmt.Errorf("volume server %s fetchAndWrite %s/$s: %v", assignResult.Url, req.Directory, req.Name, fetchAndWriteErr) + } + return nil + }) + + if err != nil { + return nil, err + } + + chunks = append(chunks, &filer_pb.FileChunk{ + FileId: assignResult.Fid, + Offset: offset, + Size: uint64(size), + Mtime: time.Now().Unix(), + Fid: &filer_pb.FileId{ + VolumeId: uint32(fileId.VolumeId), + FileKey: uint64(fileId.Key), + Cookie: uint32(fileId.Cookie), + }, + }) + + } + + garbage := entry.Chunks + + newEntry := entry.ShallowClone() + newEntry.Chunks = chunks + newEntry.Remote = proto.Clone(entry.Remote).(*filer_pb.RemoteEntry) + newEntry.Remote.LocalMtime = time.Now().Unix() + + // this skips meta data log events + + if err := fs.filer.Store.UpdateEntry(context.Background(), newEntry); err != nil { + return nil, err + } + fs.filer.DeleteChunks(garbage) + + fs.filer.NotifyUpdateEvent(ctx, entry, newEntry, true, false, nil) + + resp.Entry = entry.ToProtoEntry() + + return resp, nil + +} diff --git a/weed/server/volume_grpc_remote.go b/weed/server/volume_grpc_remote.go index 69e7276c9..fd9db2246 100644 --- a/weed/server/volume_grpc_remote.go +++ b/weed/server/volume_grpc_remote.go @@ -34,15 +34,22 @@ func (vs *VolumeServer) FetchAndWriteNeedle(ctx context.Context, req *volume_ser remoteStorageLocation := &filer_pb.RemoteStorageLocation{ Name: req.RemoteName, Bucket: req.RemoteBucket, - Path: req.RemoteKey, + Path: req.RemotePath, } data, ReadRemoteErr := client.ReadFile(remoteStorageLocation, req.Offset, req.Size) if ReadRemoteErr != nil { return nil, fmt.Errorf("read from remote %+v: %v", remoteStorageLocation, ReadRemoteErr) } - if err = v.WriteNeedleBlob(types.NeedleId(req.NeedleId), data, types.Size(req.Size)); err != nil { - return nil, fmt.Errorf("write blob needle %d size %d: %v", req.NeedleId, req.Size, err) + n := new(needle.Needle) + n.Id = types.NeedleId(req.NeedleId) + n.Cookie = types.Cookie(req.Cookie) + n.Data, n.DataSize = data, uint32(len(data)) + // copied from *Needle.prepareWriteBuffer() + n.Size = 4 + types.Size(n.DataSize) + 1 + n.Checksum = needle.NewCRC(n.Data) + if _, err = vs.store.WriteVolumeNeedle(v.Id, n, false); err != nil { + return nil, fmt.Errorf("write needle %d size %d: %v", req.NeedleId, req.Size, err) } return resp, nil diff --git a/weed/shell/command_remote_cache.go b/weed/shell/command_remote_cache.go new file mode 100644 index 000000000..a9386ac76 --- /dev/null +++ b/weed/shell/command_remote_cache.go @@ -0,0 +1,151 @@ +package shell + +import ( + "flag" + "fmt" + "github.com/chrislusf/seaweedfs/weed/filer" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/chrislusf/seaweedfs/weed/util" + "io" + "strings" +) + +func init() { + Commands = append(Commands, &commandRemoteCache{}) +} + +type commandRemoteCache struct { +} + +func (c *commandRemoteCache) Name() string { + return "remote.cache" +} + +func (c *commandRemoteCache) Help() string { + return `cache the file content for mounted directories or files + + # assume a remote storage is configured to name "s3_1" + remote.configure -name=s3_1 -type=s3 -access_key=xxx -secret_key=yyy + # mount and pull one bucket + remote.mount -dir=xxx -remote=s3_1/bucket + + # after mount, run one of these command to cache the content of the files + remote.cache -dir=xxx + remote.cache -dir=xxx/some/sub/dir + +` +} + +func (c *commandRemoteCache) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { + + remoteMountCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) + + dir := remoteMountCommand.String("dir", "", "a directory in filer") + + if err = remoteMountCommand.Parse(args); err != nil { + return nil + } + + mappings, listErr := filer.ReadMountMappings(commandEnv.option.GrpcDialOption, commandEnv.option.FilerAddress) + if listErr != nil { + return listErr + } + if *dir == "" { + jsonPrintln(writer, mappings) + fmt.Fprintln(writer, "need to specify '-dir' option") + return nil + } + + var localMountedDir string + var remoteStorageMountedLocation *filer_pb.RemoteStorageLocation + for k, loc := range mappings.Mappings { + if strings.HasPrefix(*dir, k) { + localMountedDir, remoteStorageMountedLocation = k, loc + } + } + if localMountedDir == "" { + jsonPrintln(writer, mappings) + fmt.Fprintf(writer, "%s is not mounted\n", *dir) + return nil + } + + // find remote storage configuration + remoteStorageConf, err := filer.ReadRemoteStorageConf(commandEnv.option.GrpcDialOption, commandEnv.option.FilerAddress, remoteStorageMountedLocation.Name) + if err != nil { + return err + } + + // pull content from remote + if err = c.cacheContentData(commandEnv, writer, util.FullPath(localMountedDir), remoteStorageMountedLocation, util.FullPath(*dir), remoteStorageConf); err != nil { + return fmt.Errorf("cache content data: %v", err) + } + + return nil +} + +func recursivelyTraverseDirectory(filerClient filer_pb.FilerClient, dirPath util.FullPath, visitEntry func(dir util.FullPath, entry *filer_pb.Entry) bool) (err error) { + + err = filer_pb.ReadDirAllEntries(filerClient, dirPath, "", func(entry *filer_pb.Entry, isLast bool) error { + if entry.IsDirectory { + if !visitEntry(dirPath, entry) { + return nil + } + subDir := dirPath.Child(entry.Name) + if err := recursivelyTraverseDirectory(filerClient, subDir, visitEntry); err != nil { + return err + } + }else { + if !visitEntry(dirPath, entry) { + return nil + } + } + return nil + }) + return +} + +func shouldCacheToLocal(entry *filer_pb.Entry) bool { + if entry.IsDirectory { + return false + } + if entry.RemoteEntry == nil { + return false + } + if entry.RemoteEntry.LocalMtime == 0 && entry.RemoteEntry.RemoteSize > 0 { + return true + } + return false +} + +func mayHaveCachedToLocal(entry *filer_pb.Entry) bool { + if entry.IsDirectory { + return false + } + if entry.RemoteEntry == nil { + return false + } + if entry.RemoteEntry.LocalMtime > 0 && len(entry.Chunks) > 0 { + return true + } + return false +} + +func (c *commandRemoteCache) cacheContentData(commandEnv *CommandEnv, writer io.Writer, localMountedDir util.FullPath, remoteMountedLocation *filer_pb.RemoteStorageLocation, dirToCache util.FullPath, remoteConf *filer_pb.RemoteConf) error { + + return recursivelyTraverseDirectory(commandEnv, dirToCache, func(dir util.FullPath, entry *filer_pb.Entry) bool { + if !shouldCacheToLocal(entry) { + return true // true means recursive traversal should continue + } + + println(dir, entry.Name) + + remoteLocation := filer.MapFullPathToRemoteStorageLocation(localMountedDir, remoteMountedLocation, dir.Child(entry.Name)) + + if err := filer.DownloadToLocal(commandEnv, remoteConf, remoteLocation, dir, entry); err != nil { + fmt.Fprintf(writer, "DownloadToLocal %+v: %v\n", remoteLocation, err) + return false + } + + return true + }) +} diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go index f7869e221..a0d41ce6f 100644 --- a/weed/shell/command_remote_mount.go +++ b/weed/shell/command_remote_mount.go @@ -178,8 +178,8 @@ func (c *commandRemoteMount) pullMetadata(commandEnv *CommandEnv, writer io.Writ Name: name, IsDirectory: isDirectory, Attributes: &filer_pb.FuseAttributes{ - FileSize: uint64(remoteEntry.Size), - Mtime: remoteEntry.LastModifiedAt, + FileSize: uint64(remoteEntry.RemoteSize), + Mtime: remoteEntry.RemoteMtime, FileMode: uint32(0644), }, RemoteEntry: remoteEntry, @@ -187,15 +187,8 @@ func (c *commandRemoteMount) pullMetadata(commandEnv *CommandEnv, writer io.Writ }) return createErr } else { - if existingEntry.RemoteEntry == nil || existingEntry.RemoteEntry.ETag != remoteEntry.ETag { - existingEntry.RemoteEntry = remoteEntry - existingEntry.Attributes.FileSize = uint64(remoteEntry.Size) - existingEntry.Attributes.Mtime = remoteEntry.LastModifiedAt - _, updateErr := client.UpdateEntry(ctx, &filer_pb.UpdateEntryRequest{ - Directory: localDir, - Entry: existingEntry, - }) - return updateErr + if existingEntry.RemoteEntry == nil || existingEntry.RemoteEntry.RemoteETag != remoteEntry.RemoteETag { + return doSaveRemoteEntry(client, localDir, existingEntry, remoteEntry) } } return nil @@ -240,3 +233,17 @@ func (c *commandRemoteMount) saveMountMapping(commandEnv *CommandEnv, writer io. return nil } + +func doSaveRemoteEntry(client filer_pb.SeaweedFilerClient, localDir string, existingEntry *filer_pb.Entry, remoteEntry *filer_pb.RemoteEntry) error { + existingEntry.RemoteEntry = remoteEntry + existingEntry.Attributes.FileSize = uint64(remoteEntry.RemoteSize) + existingEntry.Attributes.Mtime = remoteEntry.RemoteMtime + _, updateErr := client.UpdateEntry(context.Background(), &filer_pb.UpdateEntryRequest{ + Directory: localDir, + Entry: existingEntry, + }) + if updateErr != nil { + return updateErr + } + return nil +} \ No newline at end of file diff --git a/weed/shell/command_remote_uncache.go b/weed/shell/command_remote_uncache.go new file mode 100644 index 000000000..c07894508 --- /dev/null +++ b/weed/shell/command_remote_uncache.go @@ -0,0 +1,98 @@ +package shell + +import ( + "context" + "flag" + "fmt" + "github.com/chrislusf/seaweedfs/weed/filer" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/chrislusf/seaweedfs/weed/util" + "io" + "strings" +) + +func init() { + Commands = append(Commands, &commandRemoteUncache{}) +} + +type commandRemoteUncache struct { +} + +func (c *commandRemoteUncache) Name() string { + return "remote.uncache" +} + +func (c *commandRemoteUncache) Help() string { + return `keep the metadata but remote cache the file content for mounted directories or files + + remote.uncache -dir=xxx + remote.uncache -dir=xxx/some/sub/dir + +` +} + +func (c *commandRemoteUncache) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { + + remoteMountCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) + + dir := remoteMountCommand.String("dir", "", "a directory in filer") + + if err = remoteMountCommand.Parse(args); err != nil { + return nil + } + + mappings, listErr := filer.ReadMountMappings(commandEnv.option.GrpcDialOption, commandEnv.option.FilerAddress) + if listErr != nil { + return listErr + } + if *dir == "" { + jsonPrintln(writer, mappings) + fmt.Fprintln(writer, "need to specify '-dir' option") + return nil + } + + var localMountedDir string + for k, _ := range mappings.Mappings { + if strings.HasPrefix(*dir, k) { + localMountedDir = k + } + } + if localMountedDir == "" { + jsonPrintln(writer, mappings) + fmt.Fprintf(writer, "%s is not mounted\n", *dir) + return nil + } + + // pull content from remote + if err = c.uncacheContentData(commandEnv, writer, util.FullPath(*dir)); err != nil { + return fmt.Errorf("cache content data: %v", err) + } + + return nil +} + +func (c *commandRemoteUncache) uncacheContentData(commandEnv *CommandEnv, writer io.Writer, dirToCache util.FullPath) error { + + return recursivelyTraverseDirectory(commandEnv, dirToCache, func(dir util.FullPath, entry *filer_pb.Entry) bool { + if !mayHaveCachedToLocal(entry) { + return true // true means recursive traversal should continue + } + entry.RemoteEntry.LocalMtime = 0 + + println(dir, entry.Name) + + err := commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + _, updateErr := client.UpdateEntry(context.Background(), &filer_pb.UpdateEntryRequest{ + Directory: string(dir), + Entry: entry, + }) + return updateErr + }) + if err != nil { + fmt.Fprintf(writer, "uncache %+v: %v\n", dir.Child(entry.Name), err) + return false + } + + return true + }) +} From a6be2520c97f79d2dac0c748410c3de471cc8143 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 9 Aug 2021 14:37:25 -0700 Subject: [PATCH 195/265] fix --- weed/server/filer_grpc_server_remote.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/server/filer_grpc_server_remote.go b/weed/server/filer_grpc_server_remote.go index 93953f99d..e7c9c9e6e 100644 --- a/weed/server/filer_grpc_server_remote.go +++ b/weed/server/filer_grpc_server_remote.go @@ -115,7 +115,7 @@ func (fs *FilerServer) DownloadToLocal(ctx context.Context, req *filer_pb.Downlo RemotePath: string(dest), }) if fetchAndWriteErr != nil { - return fmt.Errorf("volume server %s fetchAndWrite %s/$s: %v", assignResult.Url, req.Directory, req.Name, fetchAndWriteErr) + return fmt.Errorf("volume server %s fetchAndWrite %s: %v", assignResult.Url, dest, fetchAndWriteErr) } return nil }) From 402315f117ec02d511dde0b4428bfd8d0ec8716d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 9 Aug 2021 14:37:34 -0700 Subject: [PATCH 196/265] go fmt --- weed/shell/command_remote_cache.go | 2 +- weed/shell/command_remote_mount.go | 2 +- weed/shell/command_remote_uncache.go | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/weed/shell/command_remote_cache.go b/weed/shell/command_remote_cache.go index a9386ac76..5f5fb060d 100644 --- a/weed/shell/command_remote_cache.go +++ b/weed/shell/command_remote_cache.go @@ -94,7 +94,7 @@ func recursivelyTraverseDirectory(filerClient filer_pb.FilerClient, dirPath util if err := recursivelyTraverseDirectory(filerClient, subDir, visitEntry); err != nil { return err } - }else { + } else { if !visitEntry(dirPath, entry) { return nil } diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go index a0d41ce6f..84a27cad6 100644 --- a/weed/shell/command_remote_mount.go +++ b/weed/shell/command_remote_mount.go @@ -246,4 +246,4 @@ func doSaveRemoteEntry(client filer_pb.SeaweedFilerClient, localDir string, exis return updateErr } return nil -} \ No newline at end of file +} diff --git a/weed/shell/command_remote_uncache.go b/weed/shell/command_remote_uncache.go index c07894508..7fc70b7a3 100644 --- a/weed/shell/command_remote_uncache.go +++ b/weed/shell/command_remote_uncache.go @@ -83,8 +83,8 @@ func (c *commandRemoteUncache) uncacheContentData(commandEnv *CommandEnv, writer err := commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { _, updateErr := client.UpdateEntry(context.Background(), &filer_pb.UpdateEntryRequest{ - Directory: string(dir), - Entry: entry, + Directory: string(dir), + Entry: entry, }) return updateErr }) From 9096f6f4f7cbb76e34d3ec1a0c77001f22dc6275 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 9 Aug 2021 15:08:53 -0700 Subject: [PATCH 197/265] cache: set upper limit of chunk size --- weed/server/filer_grpc_server_remote.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/weed/server/filer_grpc_server_remote.go b/weed/server/filer_grpc_server_remote.go index e7c9c9e6e..9cd3c296b 100644 --- a/weed/server/filer_grpc_server_remote.go +++ b/weed/server/filer_grpc_server_remote.go @@ -69,7 +69,7 @@ func (fs *FilerServer) DownloadToLocal(ctx context.Context, req *filer_pb.Downlo // find a good chunk size chunkSize := int64(5 * 1024 * 1024) chunkCount := entry.Remote.RemoteSize/chunkSize + 1 - for chunkCount > 1000 { + for chunkCount > 1000 && chunkSize < int64(fs.option.MaxMB)*1024*1024/2 { chunkSize *= 2 chunkCount = entry.Remote.RemoteSize/chunkSize + 1 } @@ -78,6 +78,7 @@ func (fs *FilerServer) DownloadToLocal(ctx context.Context, req *filer_pb.Downlo var chunks []*filer_pb.FileChunk + // FIXME limit on parallel for offset := int64(0); offset < entry.Remote.RemoteSize; offset += chunkSize { size := chunkSize if offset+chunkSize > entry.Remote.RemoteSize { From 8d3e2757358ebb1ce3be270860d2937f2f546e00 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 9 Aug 2021 15:16:45 -0700 Subject: [PATCH 198/265] remote: filer cache remote content on read --- weed/server/filer_server_handlers_read.go | 25 ++++++++++++++--------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/weed/server/filer_server_handlers_read.go b/weed/server/filer_server_handlers_read.go index 86454f8c5..eca89041d 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -3,6 +3,7 @@ package weed_server import ( "bytes" "context" + "fmt" "io" "mime" "net/http" @@ -163,19 +164,23 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) } return err } + chunks := entry.Chunks if entry.IsInRemoteOnly() { - var data []byte - data, err = fs.filer.ReadRemote(entry, offset, size) - if err != nil { - glog.Errorf("failed to read remote %s: %v", r.URL, err) - } - _, err = w.Write(data) - } else { - err = filer.StreamContent(fs.filer.MasterClient, writer, entry.Chunks, offset, size) - if err != nil { - glog.Errorf("failed to stream content %s: %v", r.URL, err) + dir, name := entry.FullPath.DirAndName() + if resp, err := fs.DownloadToLocal(context.Background(), &filer_pb.DownloadToLocalRequest{ + Directory: dir, + Name: name, + }); err != nil { + return fmt.Errorf("cache %s: %v", entry.FileSize, err) + } else { + chunks = resp.Entry.Chunks } } + + err = filer.StreamContent(fs.filer.MasterClient, writer, chunks, offset, size) + if err != nil { + glog.Errorf("failed to stream content %s: %v", r.URL, err) + } return err }) } From 02f728cb54c9410ff36c01381482628b73863682 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 9 Aug 2021 15:24:21 -0700 Subject: [PATCH 199/265] fix bug with remote.uncache --- weed/shell/command_remote_uncache.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/weed/shell/command_remote_uncache.go b/weed/shell/command_remote_uncache.go index 7fc70b7a3..64cc1472c 100644 --- a/weed/shell/command_remote_uncache.go +++ b/weed/shell/command_remote_uncache.go @@ -52,7 +52,7 @@ func (c *commandRemoteUncache) Do(args []string, commandEnv *CommandEnv, writer } var localMountedDir string - for k, _ := range mappings.Mappings { + for k := range mappings.Mappings { if strings.HasPrefix(*dir, k) { localMountedDir = k } @@ -78,6 +78,7 @@ func (c *commandRemoteUncache) uncacheContentData(commandEnv *CommandEnv, writer return true // true means recursive traversal should continue } entry.RemoteEntry.LocalMtime = 0 + entry.Chunks = nil println(dir, entry.Name) From a7012d9729cc5277114ac93580949fb487371395 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 9 Aug 2021 16:03:03 -0700 Subject: [PATCH 200/265] fix --- weed/server/filer_server_handlers_read.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/server/filer_server_handlers_read.go b/weed/server/filer_server_handlers_read.go index eca89041d..fc9cacf39 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -171,7 +171,7 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) Directory: dir, Name: name, }); err != nil { - return fmt.Errorf("cache %s: %v", entry.FileSize, err) + return fmt.Errorf("cache %s: %v", entry.FullPath, err) } else { chunks = resp.Entry.Chunks } From 69655ba8e56c94cc1ef6fea5420c5a66d8fe650a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 9 Aug 2021 22:11:57 -0700 Subject: [PATCH 201/265] mount: cache on reading remote storage --- weed/filesys/file.go | 27 +++++++++++++++++++++++++ weed/filesys/filehandle.go | 10 +++++++++ weed/pb/filer_pb/filer_pb_helper.go | 4 ++++ weed/server/filer_grpc_server_remote.go | 2 +- 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/weed/filesys/file.go b/weed/filesys/file.go index 7f021619c..b990b20d1 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -360,3 +360,30 @@ func (file *File) saveEntry(entry *filer_pb.Entry) error { func (file *File) getEntry() *filer_pb.Entry { return file.entry } + +func (file *File) downloadRemoteEntry(entry *filer_pb.Entry) (*filer_pb.Entry, error) { + err := file.wfs.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + + request := &filer_pb.DownloadToLocalRequest{ + Directory: file.dir.FullPath(), + Name: entry.Name, + } + + glog.V(4).Infof("download entry: %v", request) + resp, err := client.DownloadToLocal(context.Background(), request) + if err != nil { + glog.Errorf("DownloadToLocal file %s/%s: %v", file.dir.FullPath(), file.Name, err) + return fuse.EIO + } + + entry = resp.Entry + + file.wfs.metaCache.InsertEntry(context.Background(), filer.FromPbEntry(request.Directory, resp.Entry)) + + file.dirtyMetadata = false + + return nil + }) + + return entry, err +} diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index 9acede330..5cd7ca948 100644 --- a/weed/filesys/filehandle.go +++ b/weed/filesys/filehandle.go @@ -114,6 +114,16 @@ func (fh *FileHandle) readFromChunks(buff []byte, offset int64) (int64, error) { return 0, io.EOF } + if entry.IsInRemoteOnly() { + glog.V(4).Infof("download remote entry %s", fh.f.fullpath()) + newEntry, err := fh.f.downloadRemoteEntry(entry) + if err != nil { + glog.V(1).Infof("download remote entry %s: %v", fh.f.fullpath(), err) + return 0, err + } + entry = newEntry + } + fileSize := int64(filer.FileSize(entry)) fileFullPath := fh.f.fullpath() diff --git a/weed/pb/filer_pb/filer_pb_helper.go b/weed/pb/filer_pb/filer_pb_helper.go index ae282db75..7480d469a 100644 --- a/weed/pb/filer_pb/filer_pb_helper.go +++ b/weed/pb/filer_pb/filer_pb_helper.go @@ -12,6 +12,10 @@ import ( "github.com/viant/ptrie" ) +func (entry *Entry) IsInRemoteOnly() bool { + return len(entry.Chunks) == 0 && entry.RemoteEntry != nil && entry.RemoteEntry.RemoteSize > 0 +} + func ToFileIdObject(fileIdStr string) (*FileId, error) { t, err := needle.ParseFileIdFromString(fileIdStr) if err != nil { diff --git a/weed/server/filer_grpc_server_remote.go b/weed/server/filer_grpc_server_remote.go index 9cd3c296b..2cbfd3319 100644 --- a/weed/server/filer_grpc_server_remote.go +++ b/weed/server/filer_grpc_server_remote.go @@ -155,7 +155,7 @@ func (fs *FilerServer) DownloadToLocal(ctx context.Context, req *filer_pb.Downlo fs.filer.NotifyUpdateEvent(ctx, entry, newEntry, true, false, nil) - resp.Entry = entry.ToProtoEntry() + resp.Entry = newEntry.ToProtoEntry() return resp, nil From e9128e75d041ec5093bc88daac1bad7a9f33cf81 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 9 Aug 2021 22:46:12 -0700 Subject: [PATCH 202/265] Java: 1.6.7 Support Mounted Remote Storage --- other/java/client/pom.xml | 2 +- other/java/client/pom.xml.deploy | 2 +- other/java/client/pom_debug.xml | 2 +- .../java/seaweedfs/client/RemoteUtil.java | 23 +++++++++++++++++++ .../seaweedfs/client/SeaweedInputStream.java | 17 ++++++++++---- other/java/examples/pom.xml | 4 ++-- other/java/hdfs2/dependency-reduced-pom.xml | 2 +- other/java/hdfs2/pom.xml | 2 +- other/java/hdfs3/dependency-reduced-pom.xml | 2 +- other/java/hdfs3/pom.xml | 2 +- 10 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 other/java/client/src/main/java/seaweedfs/client/RemoteUtil.java diff --git a/other/java/client/pom.xml b/other/java/client/pom.xml index d2c91b121..70c5dbd31 100644 --- a/other/java/client/pom.xml +++ b/other/java/client/pom.xml @@ -5,7 +5,7 @@ com.github.chrislusf seaweedfs-client - 1.6.6 + 1.6.7 org.sonatype.oss diff --git a/other/java/client/pom.xml.deploy b/other/java/client/pom.xml.deploy index 7910e2491..82cf5e82b 100644 --- a/other/java/client/pom.xml.deploy +++ b/other/java/client/pom.xml.deploy @@ -5,7 +5,7 @@ com.github.chrislusf seaweedfs-client - 1.6.6 + 1.6.7 org.sonatype.oss diff --git a/other/java/client/pom_debug.xml b/other/java/client/pom_debug.xml index c3cf904c0..c72c81ab7 100644 --- a/other/java/client/pom_debug.xml +++ b/other/java/client/pom_debug.xml @@ -5,7 +5,7 @@ com.github.chrislusf seaweedfs-client - 1.6.6 + 1.6.7 org.sonatype.oss diff --git a/other/java/client/src/main/java/seaweedfs/client/RemoteUtil.java b/other/java/client/src/main/java/seaweedfs/client/RemoteUtil.java new file mode 100644 index 000000000..39c17644b --- /dev/null +++ b/other/java/client/src/main/java/seaweedfs/client/RemoteUtil.java @@ -0,0 +1,23 @@ +package seaweedfs.client; + +import java.io.IOException; + +public class RemoteUtil { + public static boolean isInRemoteOnly(FilerProto.Entry entry) { + if (entry.getChunksList() == null || entry.getChunksList().isEmpty()) { + return entry.getRemoteEntry() != null && entry.getRemoteEntry().getRemoteSize() > 0; + } + return false; + } + + public static FilerProto.Entry downloadRemoteEntry(FilerClient filerClient, String fullpath, FilerProto.Entry entry) throws IOException { + String dir = SeaweedOutputStream.getParentDirectory(fullpath); + String name = SeaweedOutputStream.getFileName(fullpath); + + final FilerProto.DownloadToLocalResponse downloadToLocalResponse = filerClient.getBlockingStub() + .downloadToLocal(FilerProto.DownloadToLocalRequest.newBuilder() + .setDirectory(dir).setName(name).build()); + + return downloadToLocalResponse.getEntry(); + } +} diff --git a/other/java/client/src/main/java/seaweedfs/client/SeaweedInputStream.java b/other/java/client/src/main/java/seaweedfs/client/SeaweedInputStream.java index 6097b8d56..9d1fb3417 100644 --- a/other/java/client/src/main/java/seaweedfs/client/SeaweedInputStream.java +++ b/other/java/client/src/main/java/seaweedfs/client/SeaweedInputStream.java @@ -19,9 +19,9 @@ public class SeaweedInputStream extends InputStream { private final FilerClient filerClient; private final String path; - private final FilerProto.Entry entry; private final List visibleIntervalList; private final long contentLength; + private FilerProto.Entry entry; private long position = 0; // cursor of the file @@ -35,10 +35,14 @@ public class SeaweedInputStream extends InputStream { this.entry = filerClient.lookupEntry( SeaweedOutputStream.getParentDirectory(fullpath), SeaweedOutputStream.getFileName(fullpath)); - if(entry == null){ + if (entry == null) { throw new FileNotFoundException(); } + if (RemoteUtil.isInRemoteOnly(entry)) { + entry = RemoteUtil.downloadRemoteEntry(filerClient, fullpath, entry); + } + this.contentLength = SeaweedRead.fileSize(entry); this.visibleIntervalList = SeaweedRead.nonOverlappingVisibleIntervals(filerClient, entry.getChunksList()); @@ -54,6 +58,11 @@ public class SeaweedInputStream extends InputStream { this.filerClient = filerClient; this.path = path; this.entry = entry; + + if (RemoteUtil.isInRemoteOnly(entry)) { + this.entry = RemoteUtil.downloadRemoteEntry(filerClient, path, entry); + } + this.contentLength = SeaweedRead.fileSize(entry); this.visibleIntervalList = SeaweedRead.nonOverlappingVisibleIntervals(filerClient, entry.getChunksList()); @@ -111,8 +120,8 @@ public class SeaweedInputStream extends InputStream { long bytesRead = 0; int len = buf.remaining(); int start = (int) this.position; - if (start+len <= entry.getContent().size()) { - entry.getContent().substring(start, start+len).copyTo(buf); + if (start + len <= entry.getContent().size()) { + entry.getContent().substring(start, start + len).copyTo(buf); } else { bytesRead = SeaweedRead.read(this.filerClient, this.visibleIntervalList, this.position, buf, SeaweedRead.fileSize(entry)); } diff --git a/other/java/examples/pom.xml b/other/java/examples/pom.xml index 9a42a0191..26c9bdfdc 100644 --- a/other/java/examples/pom.xml +++ b/other/java/examples/pom.xml @@ -11,13 +11,13 @@ com.github.chrislusf seaweedfs-client - 1.6.6 + 1.6.7 compile com.github.chrislusf seaweedfs-hadoop2-client - 1.6.6 + 1.6.7 compile diff --git a/other/java/hdfs2/dependency-reduced-pom.xml b/other/java/hdfs2/dependency-reduced-pom.xml index 1b5a5c3fc..bd31637ce 100644 --- a/other/java/hdfs2/dependency-reduced-pom.xml +++ b/other/java/hdfs2/dependency-reduced-pom.xml @@ -301,7 +301,7 @@ - 1.6.6 + 1.6.7 2.9.2 diff --git a/other/java/hdfs2/pom.xml b/other/java/hdfs2/pom.xml index 58e51a2a1..f15d24faa 100644 --- a/other/java/hdfs2/pom.xml +++ b/other/java/hdfs2/pom.xml @@ -5,7 +5,7 @@ 4.0.0 - 1.6.6 + 1.6.7 2.9.2 diff --git a/other/java/hdfs3/dependency-reduced-pom.xml b/other/java/hdfs3/dependency-reduced-pom.xml index 58556a9c7..4640b5a84 100644 --- a/other/java/hdfs3/dependency-reduced-pom.xml +++ b/other/java/hdfs3/dependency-reduced-pom.xml @@ -309,7 +309,7 @@ - 1.6.6 + 1.6.7 3.1.1 diff --git a/other/java/hdfs3/pom.xml b/other/java/hdfs3/pom.xml index bbcc1788d..efcc1e4c0 100644 --- a/other/java/hdfs3/pom.xml +++ b/other/java/hdfs3/pom.xml @@ -5,7 +5,7 @@ 4.0.0 - 1.6.6 + 1.6.7 3.1.1 From 18228f3044241041d6d54010f3982238dd922317 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 10 Aug 2021 02:48:41 -0700 Subject: [PATCH 203/265] fix help message --- weed/shell/command_remote_cache.go | 6 +++--- weed/shell/command_remote_mount.go | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/weed/shell/command_remote_cache.go b/weed/shell/command_remote_cache.go index 5f5fb060d..a964e994c 100644 --- a/weed/shell/command_remote_cache.go +++ b/weed/shell/command_remote_cache.go @@ -24,10 +24,10 @@ func (c *commandRemoteCache) Name() string { func (c *commandRemoteCache) Help() string { return `cache the file content for mounted directories or files - # assume a remote storage is configured to name "s3_1" - remote.configure -name=s3_1 -type=s3 -access_key=xxx -secret_key=yyy + # assume a remote storage is configured to name "cloud1" + remote.configure -name=cloud1 -type=s3 -access_key=xxx -secret_key=yyy # mount and pull one bucket - remote.mount -dir=xxx -remote=s3_1/bucket + remote.mount -dir=xxx -remote=cloud1/bucket # after mount, run one of these command to cache the content of the files remote.cache -dir=xxx diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go index 84a27cad6..3b04fec63 100644 --- a/weed/shell/command_remote_mount.go +++ b/weed/shell/command_remote_mount.go @@ -27,13 +27,13 @@ func (c *commandRemoteMount) Name() string { func (c *commandRemoteMount) Help() string { return `mount remote storage and pull its metadata - # assume a remote storage is configured to name "s3_1" - remote.configure -name=s3_1 -type=s3 -access_key=xxx -secret_key=yyy + # assume a remote storage is configured to name "cloud1" + remote.configure -name=cloud1 -type=s3 -access_key=xxx -secret_key=yyy # mount and pull one bucket - remote.mount -dir=xxx -remote=s3_1/bucket + remote.mount -dir=xxx -remote=cloud1/bucket # mount and pull one directory in the bucket - remote.mount -dir=xxx -remote=s3_1/bucket/dir1 + remote.mount -dir=xxx -remote=cloud1/bucket/dir1 # after mount, start a separate process to write updates to remote storage weed filer.remote.sync -filer=: -dir=xxx From 69a6da79696c1efe1e77f03c41f9c56c2bb90492 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 10 Aug 2021 02:50:28 -0700 Subject: [PATCH 204/265] avoid fail on tail error --- weed/operation/tail_volume.go | 5 ++- weed/shell/command_volume_balance.go | 2 +- weed/shell/command_volume_move.go | 10 +++-- weed/shell/command_volume_tier_move.go | 58 ++++++++++++++++---------- 4 files changed, 47 insertions(+), 28 deletions(-) diff --git a/weed/operation/tail_volume.go b/weed/operation/tail_volume.go index 045948274..79a5b3812 100644 --- a/weed/operation/tail_volume.go +++ b/weed/operation/tail_volume.go @@ -71,7 +71,10 @@ func TailVolumeFromSource(volumeServer string, grpcDialOption grpc.DialOption, v n := new(needle.Needle) n.ParseNeedleHeader(needleHeader) - n.ReadNeedleBodyBytes(needleBody, needle.CurrentVersion) + err = n.ReadNeedleBodyBytes(needleBody, needle.CurrentVersion) + if err != nil { + return err + } err = fn(n) diff --git a/weed/shell/command_volume_balance.go b/weed/shell/command_volume_balance.go index 6da128c68..162b66556 100644 --- a/weed/shell/command_volume_balance.go +++ b/weed/shell/command_volume_balance.go @@ -340,7 +340,7 @@ func moveVolume(commandEnv *CommandEnv, v *master_pb.VolumeInformationMessage, f } fmt.Fprintf(os.Stdout, " moving %s volume %s%d %s => %s\n", v.DiskType, collectionPrefix, v.Id, fullNode.info.Id, emptyNode.info.Id) if applyChange { - return LiveMoveVolume(commandEnv.option.GrpcDialOption, needle.VolumeId(v.Id), fullNode.info.Id, emptyNode.info.Id, 5*time.Second, v.DiskType) + return LiveMoveVolume(commandEnv.option.GrpcDialOption, os.Stderr, needle.VolumeId(v.Id), fullNode.info.Id, emptyNode.info.Id, 5*time.Second, v.DiskType, false) } return nil } diff --git a/weed/shell/command_volume_move.go b/weed/shell/command_volume_move.go index 84f33db34..115576f23 100644 --- a/weed/shell/command_volume_move.go +++ b/weed/shell/command_volume_move.go @@ -69,11 +69,11 @@ func (c *commandVolumeMove) Do(args []string, commandEnv *CommandEnv, writer io. return fmt.Errorf("source and target volume servers are the same!") } - return LiveMoveVolume(commandEnv.option.GrpcDialOption, volumeId, sourceVolumeServer, targetVolumeServer, 5*time.Second, *diskTypeStr) + return LiveMoveVolume(commandEnv.option.GrpcDialOption, writer, volumeId, sourceVolumeServer, targetVolumeServer, 5*time.Second, *diskTypeStr, false) } // LiveMoveVolume moves one volume from one source volume server to one target volume server, with idleTimeout to drain the incoming requests. -func LiveMoveVolume(grpcDialOption grpc.DialOption, volumeId needle.VolumeId, sourceVolumeServer, targetVolumeServer string, idleTimeout time.Duration, diskType string) (err error) { +func LiveMoveVolume(grpcDialOption grpc.DialOption, writer io.Writer, volumeId needle.VolumeId, sourceVolumeServer, targetVolumeServer string, idleTimeout time.Duration, diskType string, skipTailError bool) (err error) { log.Printf("copying volume %d from %s to %s", volumeId, sourceVolumeServer, targetVolumeServer) lastAppendAtNs, err := copyVolume(grpcDialOption, volumeId, sourceVolumeServer, targetVolumeServer, diskType) @@ -83,7 +83,11 @@ func LiveMoveVolume(grpcDialOption grpc.DialOption, volumeId needle.VolumeId, so log.Printf("tailing volume %d from %s to %s", volumeId, sourceVolumeServer, targetVolumeServer) if err = tailVolume(grpcDialOption, volumeId, sourceVolumeServer, targetVolumeServer, lastAppendAtNs, idleTimeout); err != nil { - return fmt.Errorf("tail volume %d from %s to %s: %v", volumeId, sourceVolumeServer, targetVolumeServer, err) + if skipTailError { + fmt.Fprintf(writer, "tail volume %d from %s to %s: %v", volumeId, sourceVolumeServer, targetVolumeServer, err) + } else { + return fmt.Errorf("tail volume %d from %s to %s: %v", volumeId, sourceVolumeServer, targetVolumeServer, err) + } } log.Printf("deleting volume %d from %s", volumeId, sourceVolumeServer) diff --git a/weed/shell/command_volume_tier_move.go b/weed/shell/command_volume_tier_move.go index 355063ded..bf623b899 100644 --- a/weed/shell/command_volume_tier_move.go +++ b/weed/shell/command_volume_tier_move.go @@ -8,7 +8,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/wdclient" "io" "path/filepath" - "strings" + "sync" "time" "github.com/chrislusf/seaweedfs/weed/storage/needle" @@ -19,6 +19,9 @@ func init() { } type commandVolumeTierMove struct { + activeServers map[string]struct{} + activeServersLock sync.Mutex + activeServersCond *sync.Cond } func (c *commandVolumeTierMove) Name() string { @@ -38,6 +41,9 @@ func (c *commandVolumeTierMove) Help() string { func (c *commandVolumeTierMove) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { + c.activeServers = make(map[string]struct{}) + c.activeServersCond = sync.NewCond(new(sync.Mutex)) + if err = commandEnv.confirmIsLocked(); err != nil { return } @@ -75,7 +81,7 @@ func (c *commandVolumeTierMove) Do(args []string, commandEnv *CommandEnv, writer _, allLocations := collectVolumeReplicaLocations(topologyInfo) for _, vid := range volumeIds { - if err = doVolumeTierMove(commandEnv, writer, vid, toDiskType, allLocations, *applyChange); err != nil { + if err = c.doVolumeTierMove(commandEnv, writer, vid, toDiskType, allLocations, *applyChange); err != nil { fmt.Printf("tier move volume %d: %v\n", vid, err) } } @@ -92,7 +98,7 @@ func isOneOf(server string, locations []wdclient.Location) bool { return false } -func doVolumeTierMove(commandEnv *CommandEnv, writer io.Writer, vid needle.VolumeId, toDiskType types.DiskType, allLocations []location, applyChanges bool) (err error) { +func (c *commandVolumeTierMove) doVolumeTierMove(commandEnv *CommandEnv, writer io.Writer, vid needle.VolumeId, toDiskType types.DiskType, allLocations []location, applyChanges bool) (err error) { // find volume location locations, found := commandEnv.MasterClient.GetLocations(uint32(vid)) if !found { @@ -127,26 +133,8 @@ func doVolumeTierMove(commandEnv *CommandEnv, writer io.Writer, vid needle.Volum break } - // mark all replicas as read only - if err = markVolumeReadonly(commandEnv.option.GrpcDialOption, vid, locations); err != nil { - return fmt.Errorf("mark volume %d as readonly on %s: %v", vid, locations[0].Url, err) - } - if err = LiveMoveVolume(commandEnv.option.GrpcDialOption, vid, sourceVolumeServer, dst.dataNode.Id, 5*time.Second, toDiskType.ReadableString()); err != nil { - return fmt.Errorf("move volume %d %s => %s : %v", vid, locations[0].Url, dst.dataNode.Id, err) - } - - // adjust volume count - dst.dataNode.DiskInfos[string(toDiskType)].VolumeCount++ - - // remove the remaining replicas - for _, loc := range locations { - if loc.Url != dst.dataNode.Id { - if err = deleteVolume(commandEnv.option.GrpcDialOption, vid, loc.Url); err != nil { - if !strings.Contains(err.Error(), "not found") { - fmt.Fprintf(writer, "failed to delete volume %d on %s: %v\n", vid, loc.Url, err) - } - } - } + if err := c.doMoveOneVolume(commandEnv, writer, vid, toDiskType, locations, sourceVolumeServer, dst); err != nil { + return err } } } @@ -158,6 +146,30 @@ func doVolumeTierMove(commandEnv *CommandEnv, writer io.Writer, vid needle.Volum return nil } +func (c *commandVolumeTierMove) doMoveOneVolume(commandEnv *CommandEnv, writer io.Writer, vid needle.VolumeId, toDiskType types.DiskType, locations []wdclient.Location, sourceVolumeServer string, dst location) (err error) { + + // mark all replicas as read only + if err = markVolumeReadonly(commandEnv.option.GrpcDialOption, vid, locations); err != nil { + return fmt.Errorf("mark volume %d as readonly on %s: %v", vid, locations[0].Url, err) + } + if err = LiveMoveVolume(commandEnv.option.GrpcDialOption, writer, vid, sourceVolumeServer, dst.dataNode.Id, 5*time.Second, toDiskType.ReadableString(), true); err != nil { + return fmt.Errorf("move volume %d %s => %s : %v", vid, locations[0].Url, dst.dataNode.Id, err) + } + + // adjust volume count + dst.dataNode.DiskInfos[string(toDiskType)].VolumeCount++ + + // remove the remaining replicas + for _, loc := range locations { + if loc.Url != dst.dataNode.Id && loc.Url != sourceVolumeServer { + if err = deleteVolume(commandEnv.option.GrpcDialOption, vid, loc.Url); err != nil { + fmt.Fprintf(writer, "failed to delete volume %d on %s: %v\n", vid, loc.Url, err) + } + } + } + return nil +} + func collectVolumeIdsForTierChange(commandEnv *CommandEnv, topologyInfo *master_pb.TopologyInfo, volumeSizeLimitMb uint64, sourceTier types.DiskType, collectionPattern string, fullPercentage float64, quietPeriod time.Duration) (vids []needle.VolumeId, err error) { quietSeconds := int64(quietPeriod / time.Second) From 48f448ee0930f2784e90662d3de92e0ed2454de9 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 10 Aug 2021 03:08:29 -0700 Subject: [PATCH 205/265] parallelize tier move --- weed/shell/command_volume_tier_move.go | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/weed/shell/command_volume_tier_move.go b/weed/shell/command_volume_tier_move.go index bf623b899..6a28b7970 100644 --- a/weed/shell/command_volume_tier_move.go +++ b/weed/shell/command_volume_tier_move.go @@ -133,9 +133,27 @@ func (c *commandVolumeTierMove) doVolumeTierMove(commandEnv *CommandEnv, writer break } - if err := c.doMoveOneVolume(commandEnv, writer, vid, toDiskType, locations, sourceVolumeServer, dst); err != nil { - return err + c.activeServersCond.L.Lock() + _, isSourceActive := c.activeServers[sourceVolumeServer] + _, isDestActive := c.activeServers[dst.dataNode.Id] + for isSourceActive || isDestActive { + c.activeServersCond.Wait() + _, isSourceActive = c.activeServers[sourceVolumeServer] + _, isDestActive = c.activeServers[dst.dataNode.Id] } + c.activeServers[sourceVolumeServer] = struct{}{} + c.activeServers[dst.dataNode.Id] = struct{}{} + c.activeServersCond.L.Unlock() + + go func(dst location) { + if err := c.doMoveOneVolume(commandEnv, writer, vid, toDiskType, locations, sourceVolumeServer, dst); err != nil { + fmt.Fprintf(writer, "move volume %d %s => %s: %v", vid, sourceVolumeServer, dst.dataNode.Id, err) + } + delete(c.activeServers, sourceVolumeServer) + delete(c.activeServers, dst.dataNode.Id) + c.activeServersCond.Signal() + }(dst) + } } From 8ff6c9a0c63851c884e69f07e5809eea224b0e0c Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 10 Aug 2021 03:25:18 -0700 Subject: [PATCH 206/265] output format --- weed/shell/command_volume_move.go | 2 +- weed/shell/command_volume_tier_move.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/weed/shell/command_volume_move.go b/weed/shell/command_volume_move.go index 115576f23..666e3e867 100644 --- a/weed/shell/command_volume_move.go +++ b/weed/shell/command_volume_move.go @@ -84,7 +84,7 @@ func LiveMoveVolume(grpcDialOption grpc.DialOption, writer io.Writer, volumeId n log.Printf("tailing volume %d from %s to %s", volumeId, sourceVolumeServer, targetVolumeServer) if err = tailVolume(grpcDialOption, volumeId, sourceVolumeServer, targetVolumeServer, lastAppendAtNs, idleTimeout); err != nil { if skipTailError { - fmt.Fprintf(writer, "tail volume %d from %s to %s: %v", volumeId, sourceVolumeServer, targetVolumeServer, err) + fmt.Fprintf(writer, "tail volume %d from %s to %s: %v\n", volumeId, sourceVolumeServer, targetVolumeServer, err) } else { return fmt.Errorf("tail volume %d from %s to %s: %v", volumeId, sourceVolumeServer, targetVolumeServer, err) } diff --git a/weed/shell/command_volume_tier_move.go b/weed/shell/command_volume_tier_move.go index 6a28b7970..d370d93e4 100644 --- a/weed/shell/command_volume_tier_move.go +++ b/weed/shell/command_volume_tier_move.go @@ -147,7 +147,7 @@ func (c *commandVolumeTierMove) doVolumeTierMove(commandEnv *CommandEnv, writer go func(dst location) { if err := c.doMoveOneVolume(commandEnv, writer, vid, toDiskType, locations, sourceVolumeServer, dst); err != nil { - fmt.Fprintf(writer, "move volume %d %s => %s: %v", vid, sourceVolumeServer, dst.dataNode.Id, err) + fmt.Fprintf(writer, "move volume %d %s => %s: %v\n", vid, sourceVolumeServer, dst.dataNode.Id, err) } delete(c.activeServers, sourceVolumeServer) delete(c.activeServers, dst.dataNode.Id) From f9cf9b93d32a2b01bc4d95ce7d24d86ef60be668 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 10 Aug 2021 03:30:18 -0700 Subject: [PATCH 207/265] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ee7a23810..828396230 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -30,7 +30,7 @@ jobs: time: '30s' - name: Set BUILD_TIME env - run: echo BUILD_TIME=$(date -u +%Y-%m-%d-%H-%M) >> ${GITHUB_ENV} + run: echo BUILD_TIME=$(date -u +%Y%m%d-%H%M) >> ${GITHUB_ENV} - name: Go Release Binaries uses: wangyoucao577/go-release-action@v1.17 From e6e57db530217ff57b3622b4672b03ebb6313e96 Mon Sep 17 00:00:00 2001 From: Bl1tz23 Date: Tue, 10 Aug 2021 13:42:46 +0300 Subject: [PATCH 208/265] Add liveness\readiness probe for s3 api handler on /status path --- Makefile | 2 +- weed/s3api/s3api_server.go | 8 ++++++-- weed/s3api/s3api_status_handlers.go | 8 ++++++++ 3 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 weed/s3api/s3api_status_handlers.go diff --git a/Makefile b/Makefile index 9a62eb9fe..3c389e6e3 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ deps: rm -rf /home/travis/gopath/src/github.com/coreos/etcd/vendor/golang.org/x/net/trace rm -rf /home/travis/gopath/src/go.etcd.io/etcd/vendor/golang.org/x/net/trace -build: deps +build: go build $(GO_FLAGS) -ldflags "$(LDFLAGS)" -o $(BINARY) $(SOURCE_DIR) install: deps diff --git a/weed/s3api/s3api_server.go b/weed/s3api/s3api_server.go index 54df29492..efd4778d9 100644 --- a/weed/s3api/s3api_server.go +++ b/weed/s3api/s3api_server.go @@ -2,12 +2,12 @@ package s3api import ( "fmt" - "github.com/chrislusf/seaweedfs/weed/filer" - . "github.com/chrislusf/seaweedfs/weed/s3api/s3_constants" "net/http" "strings" "time" + "github.com/chrislusf/seaweedfs/weed/filer" + . "github.com/chrislusf/seaweedfs/weed/s3api/s3_constants" "github.com/gorilla/mux" "google.golang.org/grpc" ) @@ -44,6 +44,10 @@ func NewS3ApiServer(router *mux.Router, option *S3ApiServerOption) (s3ApiServer func (s3a *S3ApiServer) registerRouter(router *mux.Router) { // API Router apiRouter := router.PathPrefix("/").Subrouter() + + // Readiness Probe + apiRouter.Methods("GET").Path("/status").HandlerFunc(s3a.StatusHandler) + var routers []*mux.Router if s3a.option.DomainName != "" { domainNames := strings.Split(s3a.option.DomainName, ",") diff --git a/weed/s3api/s3api_status_handlers.go b/weed/s3api/s3api_status_handlers.go new file mode 100644 index 000000000..914c27f40 --- /dev/null +++ b/weed/s3api/s3api_status_handlers.go @@ -0,0 +1,8 @@ +package s3api + +import "net/http" + +func (s3a *S3ApiServer) StatusHandler(w http.ResponseWriter, r *http.Request) { + // write out the response code and content type header + writeSuccessResponseEmpty(w) +} From 095f66cd64dee0c0a7972bd770a67ba426703bf9 Mon Sep 17 00:00:00 2001 From: Bl1tz23 Date: Tue, 10 Aug 2021 13:51:04 +0300 Subject: [PATCH 209/265] returned deps target call to build Makefile target --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 3c389e6e3..9a62eb9fe 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ deps: rm -rf /home/travis/gopath/src/github.com/coreos/etcd/vendor/golang.org/x/net/trace rm -rf /home/travis/gopath/src/go.etcd.io/etcd/vendor/golang.org/x/net/trace -build: +build: deps go build $(GO_FLAGS) -ldflags "$(LDFLAGS)" -o $(BINARY) $(SOURCE_DIR) install: deps From 85832d02c0a44250d4630c7951e97fcd4e7dd8c1 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 10 Aug 2021 04:13:08 -0700 Subject: [PATCH 210/265] wait for goroutines --- weed/shell/command_volume_tier_move.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/weed/shell/command_volume_tier_move.go b/weed/shell/command_volume_tier_move.go index d370d93e4..9719b442d 100644 --- a/weed/shell/command_volume_tier_move.go +++ b/weed/shell/command_volume_tier_move.go @@ -109,6 +109,7 @@ func (c *commandVolumeTierMove) doVolumeTierMove(commandEnv *CommandEnv, writer hasFoundTarget := false keepDataNodesSorted(allLocations, toDiskType) fn := capacityByFreeVolumeCount(toDiskType) + wg := sync.WaitGroup{} for _, dst := range allLocations { if fn(dst.dataNode) > 0 && !hasFoundTarget { // ask the volume server to replicate the volume @@ -145,6 +146,7 @@ func (c *commandVolumeTierMove) doVolumeTierMove(commandEnv *CommandEnv, writer c.activeServers[dst.dataNode.Id] = struct{}{} c.activeServersCond.L.Unlock() + wg.Add(1) go func(dst location) { if err := c.doMoveOneVolume(commandEnv, writer, vid, toDiskType, locations, sourceVolumeServer, dst); err != nil { fmt.Fprintf(writer, "move volume %d %s => %s: %v\n", vid, sourceVolumeServer, dst.dataNode.Id, err) @@ -152,11 +154,14 @@ func (c *commandVolumeTierMove) doVolumeTierMove(commandEnv *CommandEnv, writer delete(c.activeServers, sourceVolumeServer) delete(c.activeServers, dst.dataNode.Id) c.activeServersCond.Signal() + wg.Done() }(dst) } } + wg.Wait() + if !hasFoundTarget { fmt.Fprintf(writer, "can not find disk type %s for volume %d\n", toDiskType.ReadableString(), vid) } From 9d85569c55a19097c90520e215224c4765b117be Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 10 Aug 2021 05:10:57 -0700 Subject: [PATCH 211/265] ensure using local quorum consistency --- weed/filer/cassandra/cassandra_store_kv.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/filer/cassandra/cassandra_store_kv.go b/weed/filer/cassandra/cassandra_store_kv.go index dafa9bb15..3e9730238 100644 --- a/weed/filer/cassandra/cassandra_store_kv.go +++ b/weed/filer/cassandra/cassandra_store_kv.go @@ -25,7 +25,7 @@ func (store *CassandraStore) KvGet(ctx context.Context, key []byte) (data []byte if err := store.session.Query( "SELECT meta FROM filemeta WHERE directory=? AND name=?", - dir, name).Consistency(gocql.One).Scan(&data); err != nil { + dir, name).Scan(&data); err != nil { if err != gocql.ErrNotFound { return nil, filer.ErrKvNotFound } From db6275a0c859874449c6b234ac7e0b787a276038 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 10 Aug 2021 10:43:42 -0700 Subject: [PATCH 212/265] print out balance ratio --- weed/shell/command_volume_balance.go | 1 + 1 file changed, 1 insertion(+) diff --git a/weed/shell/command_volume_balance.go b/weed/shell/command_volume_balance.go index 162b66556..084d984df 100644 --- a/weed/shell/command_volume_balance.go +++ b/weed/shell/command_volume_balance.go @@ -287,6 +287,7 @@ func balanceSelectedVolume(commandEnv *CommandEnv, volumeReplicas map[uint32][]* // no more volume servers with empty slots break } + fmt.Fprintf(os.Stdout, "target ratio %.2f %s %.2f %s %.2f", idealVolumeRatio, fullNode.info.Id, fullNode.localVolumeRatio(capacityFunc), emptyNode.info.Id, emptyNode.localVolumeNextRatio(capacityFunc)) hasMoved, err = attemptToMoveOneVolume(commandEnv, volumeReplicas, fullNode, candidateVolumes, emptyNode, applyBalancing) if err != nil { return From e50a5b8e285db031bce3bfaf336df20fbd9be8ca Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 10 Aug 2021 11:10:09 -0700 Subject: [PATCH 213/265] minor: print disk type --- weed/shell/command_volume_balance.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/weed/shell/command_volume_balance.go b/weed/shell/command_volume_balance.go index 084d984df..116555e00 100644 --- a/weed/shell/command_volume_balance.go +++ b/weed/shell/command_volume_balance.go @@ -131,7 +131,7 @@ func balanceVolumeServersByDiskType(commandEnv *CommandEnv, diskType types.DiskT return v.DiskType == string(diskType) && (v.ReadOnly || v.Size >= volumeSizeLimit) }) } - if err := balanceSelectedVolume(commandEnv, volumeReplicas, nodes, capacityByMaxVolumeCount(diskType), sortReadOnlyVolumes, applyBalancing); err != nil { + if err := balanceSelectedVolume(commandEnv, diskType, volumeReplicas, nodes, capacityByMaxVolumeCount(diskType), sortReadOnlyVolumes, applyBalancing); err != nil { return err } @@ -146,7 +146,7 @@ func balanceVolumeServersByDiskType(commandEnv *CommandEnv, diskType types.DiskT return v.DiskType == string(diskType) && (!v.ReadOnly && v.Size < volumeSizeLimit) }) } - if err := balanceSelectedVolume(commandEnv, volumeReplicas, nodes, capacityByMaxVolumeCount(diskType), sortWritableVolumes, applyBalancing); err != nil { + if err := balanceSelectedVolume(commandEnv, diskType, volumeReplicas, nodes, capacityByMaxVolumeCount(diskType), sortWritableVolumes, applyBalancing); err != nil { return err } @@ -250,7 +250,7 @@ func sortReadOnlyVolumes(volumes []*master_pb.VolumeInformationMessage) { }) } -func balanceSelectedVolume(commandEnv *CommandEnv, volumeReplicas map[uint32][]*VolumeReplica, nodes []*Node, capacityFunc CapacityFunc, sortCandidatesFn func(volumes []*master_pb.VolumeInformationMessage), applyBalancing bool) (err error) { +func balanceSelectedVolume(commandEnv *CommandEnv, diskType types.DiskType, volumeReplicas map[uint32][]*VolumeReplica, nodes []*Node, capacityFunc CapacityFunc, sortCandidatesFn func(volumes []*master_pb.VolumeInformationMessage), applyBalancing bool) (err error) { selectedVolumeCount, volumeMaxCount := 0, 0 var nodesWithCapacity []*Node for _, dn := range nodes { @@ -287,7 +287,7 @@ func balanceSelectedVolume(commandEnv *CommandEnv, volumeReplicas map[uint32][]* // no more volume servers with empty slots break } - fmt.Fprintf(os.Stdout, "target ratio %.2f %s %.2f %s %.2f", idealVolumeRatio, fullNode.info.Id, fullNode.localVolumeRatio(capacityFunc), emptyNode.info.Id, emptyNode.localVolumeNextRatio(capacityFunc)) + fmt.Fprintf(os.Stdout, "disk %s target ratio %.2f %s %.2f %s %.2f", diskType.ReadableString(), idealVolumeRatio, fullNode.info.Id, fullNode.localVolumeRatio(capacityFunc), emptyNode.info.Id, emptyNode.localVolumeNextRatio(capacityFunc)) hasMoved, err = attemptToMoveOneVolume(commandEnv, volumeReplicas, fullNode, candidateVolumes, emptyNode, applyBalancing) if err != nil { return From 0526db12e2622134845fe0733148904bb04fdbf0 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 10 Aug 2021 11:37:12 -0700 Subject: [PATCH 214/265] do not treat read only volumes differently --- weed/shell/command_volume_balance.go | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/weed/shell/command_volume_balance.go b/weed/shell/command_volume_balance.go index 116555e00..8233affa7 100644 --- a/weed/shell/command_volume_balance.go +++ b/weed/shell/command_volume_balance.go @@ -120,7 +120,6 @@ func balanceVolumeServers(commandEnv *CommandEnv, diskTypes []types.DiskType, vo func balanceVolumeServersByDiskType(commandEnv *CommandEnv, diskType types.DiskType, volumeReplicas map[uint32][]*VolumeReplica, nodes []*Node, volumeSizeLimit uint64, collection string, applyBalancing bool) error { - // balance read only volumes for _, n := range nodes { n.selectVolumes(func(v *master_pb.VolumeInformationMessage) bool { if collection != "ALL_COLLECTIONS" { @@ -128,22 +127,7 @@ func balanceVolumeServersByDiskType(commandEnv *CommandEnv, diskType types.DiskT return false } } - return v.DiskType == string(diskType) && (v.ReadOnly || v.Size >= volumeSizeLimit) - }) - } - if err := balanceSelectedVolume(commandEnv, diskType, volumeReplicas, nodes, capacityByMaxVolumeCount(diskType), sortReadOnlyVolumes, applyBalancing); err != nil { - return err - } - - // balance writable volumes - for _, n := range nodes { - n.selectVolumes(func(v *master_pb.VolumeInformationMessage) bool { - if collection != "ALL_COLLECTIONS" { - if v.Collection != collection { - return false - } - } - return v.DiskType == string(diskType) && (!v.ReadOnly && v.Size < volumeSizeLimit) + return v.DiskType == string(diskType) }) } if err := balanceSelectedVolume(commandEnv, diskType, volumeReplicas, nodes, capacityByMaxVolumeCount(diskType), sortWritableVolumes, applyBalancing); err != nil { From b63b042afc0661debc53d01584241aa42074b308 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 10 Aug 2021 12:30:41 -0700 Subject: [PATCH 215/265] dedup keeps the largest replica --- weed/shell/command_volume_fix_replication.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/weed/shell/command_volume_fix_replication.go b/weed/shell/command_volume_fix_replication.go index 326cb2a40..20d004c6b 100644 --- a/weed/shell/command_volume_fix_replication.go +++ b/weed/shell/command_volume_fix_replication.go @@ -412,14 +412,14 @@ func pickOneReplicaToDelete(replicas []*VolumeReplica, replicaPlacement *super_b sort.Slice(replicas, func(i, j int) bool { a, b := replicas[i], replicas[j] - if a.info.CompactRevision != b.info.CompactRevision { - return a.info.CompactRevision < b.info.CompactRevision + if a.info.Size != b.info.Size { + return a.info.Size < b.info.Size } if a.info.ModifiedAtSecond != b.info.ModifiedAtSecond { return a.info.ModifiedAtSecond < b.info.ModifiedAtSecond } - if a.info.Size != b.info.Size { - return a.info.Size < b.info.Size + if a.info.CompactRevision != b.info.CompactRevision { + return a.info.CompactRevision < b.info.CompactRevision } return false }) From 057ef429ac95600c18d94103b11ceed472f1fb65 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 10 Aug 2021 12:33:29 -0700 Subject: [PATCH 216/265] format --- weed/shell/command_volume_balance.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/shell/command_volume_balance.go b/weed/shell/command_volume_balance.go index 8233affa7..df3067722 100644 --- a/weed/shell/command_volume_balance.go +++ b/weed/shell/command_volume_balance.go @@ -271,7 +271,7 @@ func balanceSelectedVolume(commandEnv *CommandEnv, diskType types.DiskType, volu // no more volume servers with empty slots break } - fmt.Fprintf(os.Stdout, "disk %s target ratio %.2f %s %.2f %s %.2f", diskType.ReadableString(), idealVolumeRatio, fullNode.info.Id, fullNode.localVolumeRatio(capacityFunc), emptyNode.info.Id, emptyNode.localVolumeNextRatio(capacityFunc)) + fmt.Fprintf(os.Stdout, "%s %.2f %.2f:%.2f\t", diskType.ReadableString(), idealVolumeRatio, fullNode.localVolumeRatio(capacityFunc), emptyNode.localVolumeNextRatio(capacityFunc)) hasMoved, err = attemptToMoveOneVolume(commandEnv, volumeReplicas, fullNode, candidateVolumes, emptyNode, applyBalancing) if err != nil { return From 1154e23e2d9709995c57b2f1a196d505de0a5698 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 10 Aug 2021 13:04:25 -0700 Subject: [PATCH 217/265] add logs for volume creation --- weed/server/master_server_handlers.go | 2 ++ weed/server/master_server_handlers_admin.go | 1 + 2 files changed, 3 insertions(+) diff --git a/weed/server/master_server_handlers.go b/weed/server/master_server_handlers.go index 0609732c7..32eb41114 100644 --- a/weed/server/master_server_handlers.go +++ b/weed/server/master_server_handlers.go @@ -2,6 +2,7 @@ package weed_server import ( "fmt" + "github.com/chrislusf/seaweedfs/weed/glog" "net/http" "strconv" "strings" @@ -113,6 +114,7 @@ func (ms *MasterServer) dirAssignHandler(w http.ResponseWriter, r *http.Request) } if ms.shouldVolumeGrow(option) { + glog.V(0).Infof("dirAssign volume growth %v from %v", option.String(), r.RemoteAddr) if ms.Topo.AvailableSpaceFor(option) <= 0 { writeJsonQuiet(w, r, http.StatusNotFound, operation.AssignResult{Error: "No free volumes left for " + option.String()}) return diff --git a/weed/server/master_server_handlers_admin.go b/weed/server/master_server_handlers_admin.go index fb16ef78c..4a86348d9 100644 --- a/weed/server/master_server_handlers_admin.go +++ b/weed/server/master_server_handlers_admin.go @@ -74,6 +74,7 @@ func (ms *MasterServer) volumeGrowHandler(w http.ResponseWriter, r *http.Request writeJsonError(w, r, http.StatusNotAcceptable, err) return } + glog.V(0).Infof("volumeGrowHandler received %v from %v", option.String(), r.RemoteAddr) if count, err = strconv.Atoi(r.FormValue("count")); err == nil { if ms.Topo.AvailableSpaceFor(option) < int64(count*option.ReplicaPlacement.GetCopyCount()) { From 01336d71ebfe5e2d15748ae125dd452f52b5000f Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 10 Aug 2021 13:04:33 -0700 Subject: [PATCH 218/265] minor --- weed/topology/volume_growth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/topology/volume_growth.go b/weed/topology/volume_growth.go index ae0b11c81..e2949848d 100644 --- a/weed/topology/volume_growth.go +++ b/weed/topology/volume_growth.go @@ -228,7 +228,7 @@ func (vg *VolumeGrowth) grow(grpcDialOption grpc.DialOption, topo *Topology, vid ReplicaPlacement: option.ReplicaPlacement, Ttl: option.Ttl, Version: needle.CurrentVersion, - DiskType: string(option.DiskType), + DiskType: option.DiskType.String(), } server.AddOrUpdateVolume(vi) topo.RegisterVolumeLayout(vi, server) From f2cd753bf9ddfbf1c040c7d21ab3d9f617aec15a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 10 Aug 2021 14:34:13 -0700 Subject: [PATCH 219/265] fix avoid lock error fix https://github.com/chrislusf/seaweedfs/issues/2247 --- weed/server/filer_server_handlers.go | 2 +- weed/server/volume_server_handlers.go | 14 +++++++++----- weed/server/volume_server_handlers_read.go | 1 - 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/weed/server/filer_server_handlers.go b/weed/server/filer_server_handlers.go index 0389e1e18..118646a04 100644 --- a/weed/server/filer_server_handlers.go +++ b/weed/server/filer_server_handlers.go @@ -58,8 +58,8 @@ func (fs *FilerServer) filerHandler(w http.ResponseWriter, r *http.Request) { glog.V(4).Infof("wait because inflight data %d > %d", fs.inFlightDataSize, fs.option.ConcurrentUploadLimit) fs.inFlightDataLimitCond.Wait() } - atomic.AddInt64(&fs.inFlightDataSize, contentLength) fs.inFlightDataLimitCond.L.Unlock() + atomic.AddInt64(&fs.inFlightDataSize, contentLength) defer func() { atomic.AddInt64(&fs.inFlightDataSize, -contentLength) fs.inFlightDataLimitCond.Signal() diff --git a/weed/server/volume_server_handlers.go b/weed/server/volume_server_handlers.go index ed7807bb8..ff2eccc11 100644 --- a/weed/server/volume_server_handlers.go +++ b/weed/server/volume_server_handlers.go @@ -42,6 +42,7 @@ func (vs *VolumeServer) privateStoreHandler(w http.ResponseWriter, r *http.Reque glog.V(4).Infof("wait because inflight download data %d > %d", vs.inFlightDownloadDataSize, vs.concurrentDownloadLimit) vs.inFlightDownloadDataLimitCond.Wait() } + vs.inFlightDownloadDataLimitCond.L.Unlock() vs.GetOrHeadHandler(w, r) case "DELETE": stats.DeleteRequest() @@ -55,8 +56,8 @@ func (vs *VolumeServer) privateStoreHandler(w http.ResponseWriter, r *http.Reque glog.V(4).Infof("wait because inflight upload data %d > %d", vs.inFlightUploadDataSize, vs.concurrentUploadLimit) vs.inFlightUploadDataLimitCond.Wait() } - atomic.AddInt64(&vs.inFlightUploadDataSize, contentLength) vs.inFlightUploadDataLimitCond.L.Unlock() + atomic.AddInt64(&vs.inFlightUploadDataSize, contentLength) defer func() { atomic.AddInt64(&vs.inFlightUploadDataSize, -contentLength) vs.inFlightUploadDataLimitCond.Signal() @@ -92,11 +93,14 @@ func (vs *VolumeServer) publicReadOnlyHandler(w http.ResponseWriter, r *http.Req w.Header().Set("Access-Control-Allow-Credentials", "true") } switch r.Method { - case "GET": - stats.ReadRequest() - vs.GetOrHeadHandler(w, r) - case "HEAD": + case "GET", "HEAD": stats.ReadRequest() + vs.inFlightDownloadDataLimitCond.L.Lock() + for vs.concurrentDownloadLimit != 0 && atomic.LoadInt64(&vs.inFlightDownloadDataSize) > vs.concurrentDownloadLimit { + glog.V(4).Infof("wait because inflight download data %d > %d", vs.inFlightDownloadDataSize, vs.concurrentDownloadLimit) + vs.inFlightDownloadDataLimitCond.Wait() + } + vs.inFlightDownloadDataLimitCond.L.Unlock() vs.GetOrHeadHandler(w, r) case "OPTIONS": stats.ReadRequest() diff --git a/weed/server/volume_server_handlers_read.go b/weed/server/volume_server_handlers_read.go index ae3c0b53f..8602b0854 100644 --- a/weed/server/volume_server_handlers_read.go +++ b/weed/server/volume_server_handlers_read.go @@ -129,7 +129,6 @@ func (vs *VolumeServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) onReadSizeFn := func(size types.Size) { needleSize = size atomic.AddInt64(&vs.inFlightDownloadDataSize, int64(needleSize)) - vs.inFlightDownloadDataLimitCond.L.Unlock() } if hasVolume { count, err = vs.store.ReadVolumeNeedle(volumeId, n, readOption, onReadSizeFn) From 5df38d610dc8ba2081088320e546f8a824d232cd Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 10 Aug 2021 15:43:21 -0700 Subject: [PATCH 220/265] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index fac4806bb..51d867cd5 100644 --- a/README.md +++ b/README.md @@ -69,16 +69,16 @@ Table of Contents * [License](#license) +## Quick Start for S3 API on Docker ## + +`docker run -p 8333:8333 chrislusf/seaweedfs server -s3` + ## Quick Start with single binary ## * Download the latest binary from https://github.com/chrislusf/seaweedfs/releases and unzip a single binary file `weed` or `weed.exe` * Run `weed server -dir=/some/data/dir -s3` to start one master, one volume server, one filer, and one S3 gateway. Also, to increase capacity, just add more volume servers by running `weed volume -dir="/some/data/dir2" -mserver=":9333" -port=8081` locally, or on a different machine, or on thousands of machines. That is it! -## Quick Start for S3 API on Docker ## - -`docker run -p 8333:8333 chrislusf/seaweedfs server -s3` - ## Introduction ## SeaweedFS is a simple and highly scalable distributed file system. There are two objectives: From ec09966fd3955b466cfa8f3a3945133226f6a3fd Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Wed, 11 Aug 2021 17:53:48 +0500 Subject: [PATCH 221/265] Retry save and update IAM identity https://github.com/chrislusf/seaweedfs/issues/2242 --- weed/iamapi/iamapi_server.go | 6 +++++- weed/s3api/auth_credentials_subscribe.go | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/weed/iamapi/iamapi_server.go b/weed/iamapi/iamapi_server.go index 037594165..ec718bd41 100644 --- a/weed/iamapi/iamapi_server.go +++ b/weed/iamapi/iamapi_server.go @@ -13,6 +13,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/s3api" . "github.com/chrislusf/seaweedfs/weed/s3api/s3_constants" "github.com/chrislusf/seaweedfs/weed/s3api/s3err" + "github.com/chrislusf/seaweedfs/weed/util" "github.com/chrislusf/seaweedfs/weed/wdclient" "github.com/gorilla/mux" "google.golang.org/grpc" @@ -103,7 +104,10 @@ func (iam IamS3ApiConfigure) PutS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfigurat iam.option.FilerGrpcAddress, iam.option.GrpcDialOption, func(client filer_pb.SeaweedFilerClient) error { - if err := filer.SaveInsideFiler(client, filer.IamConfigDirecotry, filer.IamIdentityFile, buf.Bytes()); err != nil { + err = util.Retry("saveIamIdentity", func() error { + return filer.SaveInsideFiler(client, filer.IamConfigDirecotry, filer.IamIdentityFile, buf.Bytes()) + }) + if err != nil { return err } return nil diff --git a/weed/s3api/auth_credentials_subscribe.go b/weed/s3api/auth_credentials_subscribe.go index 05cce632a..894faa614 100644 --- a/weed/s3api/auth_credentials_subscribe.go +++ b/weed/s3api/auth_credentials_subscribe.go @@ -23,7 +23,10 @@ func (s3a *S3ApiServer) subscribeMetaEvents(clientName string, prefix string, la dir = message.NewParentPath } if dir == filer.IamConfigDirecotry && message.NewEntry.Name == filer.IamIdentityFile { - if err := s3a.iam.loadS3ApiConfigurationFromBytes(message.NewEntry.Content); err != nil { + err := util.Retry("updateIamIdentity", func() error { + return s3a.iam.loadS3ApiConfigurationFromBytes(message.NewEntry.Content) + }) + if err != nil { return err } glog.V(0).Infof("updated %s/%s", filer.IamConfigDirecotry, filer.IamIdentityFile) From 775dfbae85f1fb3c2bc38cc42c77fa35ecff3811 Mon Sep 17 00:00:00 2001 From: "byunghwa.yun" Date: Wed, 11 Aug 2021 22:58:35 +0900 Subject: [PATCH 222/265] Synchronize number of open files --- weed/filesys/filehandle.go | 2 ++ weed/filesys/wfs.go | 9 +++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index 5cd7ca948..34affddb9 100644 --- a/weed/filesys/filehandle.go +++ b/weed/filesys/filehandle.go @@ -210,7 +210,9 @@ func (fh *FileHandle) Release(ctx context.Context, req *fuse.ReleaseRequest) err fh.Lock() defer fh.Unlock() + fh.f.wfs.handlesLock.Lock() fh.f.isOpen-- + fh.f.wfs.handlesLock.Unlock() if fh.f.isOpen <= 0 { fh.f.entry = nil diff --git a/weed/filesys/wfs.go b/weed/filesys/wfs.go index 0e0050964..84d4bdfa2 100644 --- a/weed/filesys/wfs.go +++ b/weed/filesys/wfs.go @@ -157,20 +157,21 @@ func (wfs *WFS) AcquireHandle(file *File, uid, gid uint32, writeOnly bool) (file wfs.handlesLock.Lock() existingHandle, found := wfs.handles[inodeId] - wfs.handlesLock.Unlock() - if found && existingHandle != nil { + if found && existingHandle != nil && existingHandle.f.isOpen > 0 { existingHandle.f.isOpen++ + wfs.handlesLock.Unlock() existingHandle.dirtyPages.SetWriteOnly(writeOnly) - glog.V(4).Infof("Acquired Handle %s open %d", fullpath, existingHandle.f.isOpen) + glog.V(4).Infof("Reuse AcquiredHandle %s open %d", fullpath, existingHandle.f.isOpen) return existingHandle } + wfs.handlesLock.Unlock() entry, _ := file.maybeLoadEntry(context.Background()) file.entry = entry fileHandle = newFileHandle(file, uid, gid, writeOnly) - file.isOpen++ wfs.handlesLock.Lock() + file.isOpen++ wfs.handles[inodeId] = fileHandle wfs.handlesLock.Unlock() fileHandle.handle = inodeId From f0afd35eec3d0a860b9b205709574f55e321a385 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Wed, 11 Aug 2021 19:29:04 +0500 Subject: [PATCH 223/265] Retry save and update IAM identity https://github.com/chrislusf/seaweedfs/issues/2242 --- weed/s3api/auth_credentials_subscribe.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/weed/s3api/auth_credentials_subscribe.go b/weed/s3api/auth_credentials_subscribe.go index 894faa614..05cce632a 100644 --- a/weed/s3api/auth_credentials_subscribe.go +++ b/weed/s3api/auth_credentials_subscribe.go @@ -23,10 +23,7 @@ func (s3a *S3ApiServer) subscribeMetaEvents(clientName string, prefix string, la dir = message.NewParentPath } if dir == filer.IamConfigDirecotry && message.NewEntry.Name == filer.IamIdentityFile { - err := util.Retry("updateIamIdentity", func() error { - return s3a.iam.loadS3ApiConfigurationFromBytes(message.NewEntry.Content) - }) - if err != nil { + if err := s3a.iam.loadS3ApiConfigurationFromBytes(message.NewEntry.Content); err != nil { return err } glog.V(0).Infof("updated %s/%s", filer.IamConfigDirecotry, filer.IamIdentityFile) From bfac55e6c080ec39f83eb9f9e41efb3edfe01545 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 11 Aug 2021 22:22:49 -0700 Subject: [PATCH 224/265] avoid integer overflow fix https://github.com/chrislusf/seaweedfs/issues/2254 --- weed/filer/filer_remote_storage.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/weed/filer/filer_remote_storage.go b/weed/filer/filer_remote_storage.go index f09658015..99ea1d3bb 100644 --- a/weed/filer/filer_remote_storage.go +++ b/weed/filer/filer_remote_storage.go @@ -35,7 +35,9 @@ func NewFilerRemoteStorage() (rs *FilerRemoteStorage) { func (rs *FilerRemoteStorage) LoadRemoteStorageConfigurationsAndMapping(filer *Filer) (err error) { // execute this on filer - entries, _, err := filer.ListDirectoryEntries(context.Background(), DirectoryEtcRemote, "", false, math.MaxInt64, "", "", "") + limit := int64(math.MaxInt32) + + entries, _, err := filer.ListDirectoryEntries(context.Background(), DirectoryEtcRemote, "", false, limit, "", "", "") if err != nil { if err == filer_pb.ErrNotFound { return nil From 7667d26ebf267bb0631f26bdfa05287b7defbc3a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 12 Aug 2021 00:20:11 -0700 Subject: [PATCH 225/265] gocql update related to https://github.com/chrislusf/seaweedfs/issues/2246 --- go.mod | 5 +++-- go.sum | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 8fdbf5f60..62df38f1d 100644 --- a/go.mod +++ b/go.mod @@ -27,11 +27,12 @@ require ( github.com/go-errors/errors v1.1.1 // indirect github.com/go-redis/redis/v8 v8.4.4 github.com/go-sql-driver/mysql v1.5.0 - github.com/gocql/gocql v0.0.0-20190829130954-e163eff7a8c6 + github.com/gocql/gocql v0.0.0-20210707082121-9a3953d1826d github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48 // indirect github.com/golang-jwt/jwt v3.2.1+incompatible github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e github.com/golang/protobuf v1.4.3 + github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.0.0 github.com/google/uuid v1.1.1 github.com/gorilla/mux v1.7.4 @@ -53,6 +54,7 @@ require ( github.com/olivere/elastic/v7 v7.0.19 github.com/peterh/liner v1.1.0 github.com/pierrec/lz4 v2.2.7+incompatible // indirect + github.com/posener/complete v1.2.3 github.com/pquerna/cachecontrol v0.1.0 github.com/prometheus/client_golang v1.11.0 github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563 // indirect @@ -90,7 +92,6 @@ require ( gopkg.in/jcmturner/goidentity.v3 v3.0.0 // indirect gopkg.in/jcmturner/gokrb5.v7 v7.3.0 // indirect modernc.org/sqlite v1.10.7 - github.com/posener/complete v1.2.3 ) // replace github.com/seaweedfs/fuse => /Users/chris/go/src/github.com/seaweedfs/fuse diff --git a/go.sum b/go.sum index f23ca0020..4541a5f7e 100644 --- a/go.sum +++ b/go.sum @@ -258,6 +258,8 @@ github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/V github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/gocql/gocql v0.0.0-20190829130954-e163eff7a8c6 h1:P66kRWyEoIx6URKgAC3ijx9jo9gEid7bEhLQ/Z0G65A= github.com/gocql/gocql v0.0.0-20190829130954-e163eff7a8c6/go.mod h1:Q7Sru5153KG8D9zwueuQJB3ccJf9/bIwF/x8b3oKgT8= +github.com/gocql/gocql v0.0.0-20210707082121-9a3953d1826d h1:k544nNVphXK4Yt0FTduvOvCfJabEY/DMkdNw0zpCwBE= +github.com/gocql/gocql v0.0.0-20210707082121-9a3953d1826d/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -300,6 +302,9 @@ github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8l github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= From 5469019852cf1399b64683cbcc54f4c077377afb Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 12 Aug 2021 17:54:34 -0700 Subject: [PATCH 226/265] adjust data type --- weed/command/master.go | 2 +- weed/server/master_grpc_server.go | 2 ++ weed/server/master_server.go | 2 +- weed/server/master_server_handlers_ui.go | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/weed/command/master.go b/weed/command/master.go index 0f5e2156d..bed55e334 100644 --- a/weed/command/master.go +++ b/weed/command/master.go @@ -198,7 +198,7 @@ func (m *MasterOptions) toMasterOption(whiteList []string) *weed_server.MasterOp Host: *m.ip, Port: *m.port, MetaFolder: *m.metaFolder, - VolumeSizeLimitMB: *m.volumeSizeLimitMB, + VolumeSizeLimitMB: uint32(*m.volumeSizeLimitMB), VolumePreallocate: *m.volumePreallocate, // PulseSeconds: *m.pulseSeconds, DefaultReplicaPlacement: *m.defaultReplication, diff --git a/weed/server/master_grpc_server.go b/weed/server/master_grpc_server.go index 50c9dbfdf..166432c28 100644 --- a/weed/server/master_grpc_server.go +++ b/weed/server/master_grpc_server.go @@ -313,6 +313,8 @@ func (ms *MasterServer) GetMasterConfiguration(ctx context.Context, req *master_ MetricsIntervalSeconds: uint32(ms.option.MetricsIntervalSec), StorageBackends: backend.ToPbStorageBackends(), DefaultReplication: ms.option.DefaultReplicaPlacement, + VolumeSizeLimitMB: uint32(ms.option.VolumeSizeLimitMB), + VolumePreallocate: ms.option.VolumePreallocate, Leader: leader, } diff --git a/weed/server/master_server.go b/weed/server/master_server.go index eab41524c..273d6ba7d 100644 --- a/weed/server/master_server.go +++ b/weed/server/master_server.go @@ -35,7 +35,7 @@ type MasterOption struct { Host string Port int MetaFolder string - VolumeSizeLimitMB uint + VolumeSizeLimitMB uint32 VolumePreallocate bool // PulseSeconds int DefaultReplicaPlacement string diff --git a/weed/server/master_server_handlers_ui.go b/weed/server/master_server_handlers_ui.go index 3822c6113..015bfbd00 100644 --- a/weed/server/master_server_handlers_ui.go +++ b/weed/server/master_server_handlers_ui.go @@ -19,7 +19,7 @@ func (ms *MasterServer) uiStatusHandler(w http.ResponseWriter, r *http.Request) RaftServer raft.Server Stats map[string]interface{} Counters *stats.ServerStats - VolumeSizeLimitMB uint + VolumeSizeLimitMB uint32 }{ util.Version(), ms.Topo.ToMap(), From 5571f4f70a2e304343e76638caacc3bd0338a8d1 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 12 Aug 2021 18:10:59 -0700 Subject: [PATCH 227/265] master: add master.follower to handle read file id lookup requests --- weed/Makefile | 5 + weed/command/command.go | 1 + weed/command/master_follower.go | 145 ++++++++++++++ weed/pb/grpc_client_server.go | 15 ++ weed/pb/master.proto | 2 + weed/pb/master_pb/master.pb.go | 241 +++++++++++++---------- weed/server/master_grpc_server_volume.go | 4 - weed/server/master_server.go | 9 +- 8 files changed, 306 insertions(+), 116 deletions(-) create mode 100644 weed/command/master_follower.go diff --git a/weed/Makefile b/weed/Makefile index ad1f0b6f9..205104969 100644 --- a/weed/Makefile +++ b/weed/Makefile @@ -41,3 +41,8 @@ debug_filer_copy: debug_filer_remote_sync: go build -gcflags="all=-N -l" dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec weed -- -v=4 filer.remote.sync -filer="localhost:8888" -dir=/buckets/b2 -timeAgo=10000h + +debug_master_follower: + go build -gcflags="all=-N -l" + dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec weed -- -v=4 master.follower + diff --git a/weed/command/command.go b/weed/command/command.go index 02de2bd35..a3fdcfc6f 100644 --- a/weed/command/command.go +++ b/weed/command/command.go @@ -28,6 +28,7 @@ var Commands = []*Command{ cmdFuse, cmdGateway, cmdMaster, + cmdMasterFollower, cmdMount, cmdS3, cmdIam, diff --git a/weed/command/master_follower.go b/weed/command/master_follower.go new file mode 100644 index 000000000..949743b3e --- /dev/null +++ b/weed/command/master_follower.go @@ -0,0 +1,145 @@ +package command + +import ( + "context" + "fmt" + "github.com/aws/aws-sdk-go/aws" + "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/pb" + "github.com/chrislusf/seaweedfs/weed/pb/master_pb" + "github.com/chrislusf/seaweedfs/weed/security" + "github.com/chrislusf/seaweedfs/weed/server" + "github.com/chrislusf/seaweedfs/weed/util" + "github.com/gorilla/mux" + "google.golang.org/grpc/reflection" + "net/http" + "strconv" + "strings" + "time" +) + +var ( + mf MasterOptions +) + +func init() { + cmdMasterFollower.Run = runMasterFollower // break init cycle + mf.port = cmdMasterFollower.Flag.Int("port", 9334, "http listen port") + mf.ipBind = cmdMasterFollower.Flag.String("ip.bind", "", "ip address to bind to") + mf.peers = cmdMasterFollower.Flag.String("masters", "localhost:9333", "all master nodes in comma separated ip:port list, example: 127.0.0.1:9093,127.0.0.1:9094,127.0.0.1:9095") + + mf.ip = aws.String(util.DetectedHostAddress()) + mf.metaFolder = aws.String("") + mf.volumeSizeLimitMB = nil + mf.volumePreallocate = nil + mf.defaultReplication = nil + mf.garbageThreshold = aws.Float64(0.1) + mf.whiteList = nil + mf.disableHttp = aws.Bool(false) + mf.metricsAddress = aws.String("") + mf.metricsIntervalSec = aws.Int(0) + mf.raftResumeState = aws.Bool(false) +} + +var cmdMasterFollower = &Command{ + UsageLine: "master.follower -port=9333 -masters=:", + Short: "start a master follower", + Long: `start a master follower to provide volume=>location mapping service + + The master follower does not participate in master election. + It just follow the existing masters, and listen for any volume location changes. + + In most cases, the master follower is not needed. In big data centers with thousands of volume + servers. In theory, the master may have trouble to keep up with the write requests and read requests. + + The master follower can relieve the master from from read requests, which only needs to + lookup a fileId or volumeId. + + The master follower currently can handle fileId lookup requests: + /dir/lookup?volumeId=4 + /dir/lookup?fileId=4,49c50924569199 + And gRPC API + rpc LookupVolume (LookupVolumeRequest) returns (LookupVolumeResponse) {} + + This master follower is stateless and can run from any place. + + `, +} + +func runMasterFollower(cmd *Command, args []string) bool { + + util.LoadConfiguration("security", false) + util.LoadConfiguration("master", false) + + startMasterFollower(mf) + + return true +} + +func startMasterFollower(masterOptions MasterOptions) { + + // collect settings from main masters + masters := strings.Split(*mf.peers, ",") + masterGrpcAddresses, err := pb.ParseServersToGrpcAddresses(masters) + if err != nil { + glog.V(0).Infof("ParseFilerGrpcAddress: %v", err) + return + } + + grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.master") + for i := 0; i < 10; i++ { + err = pb.WithOneOfGrpcMasterClients(masterGrpcAddresses, grpcDialOption, func(client master_pb.SeaweedClient) error { + resp, err := client.GetMasterConfiguration(context.Background(), &master_pb.GetMasterConfigurationRequest{}) + if err != nil { + return fmt.Errorf("get master grpc address %v configuration: %v", masterGrpcAddresses, err) + } + masterOptions.defaultReplication = &resp.DefaultReplication + masterOptions.volumeSizeLimitMB = aws.Uint(uint(resp.VolumeSizeLimitMB)) + masterOptions.volumePreallocate = &resp.VolumePreallocate + return nil + }) + if err != nil { + glog.V(0).Infof("failed to talk to filer %v: %v", masterGrpcAddresses, err) + glog.V(0).Infof("wait for %d seconds ...", i+1) + time.Sleep(time.Duration(i+1) * time.Second) + } + } + if err != nil { + glog.Errorf("failed to talk to filer %v: %v", masterGrpcAddresses, err) + return + } + + + option := masterOptions.toMasterOption(nil) + option.IsFollower = true + + + r := mux.NewRouter() + ms := weed_server.NewMasterServer(r, option, masters) + listeningAddress := *masterOptions.ipBind + ":" + strconv.Itoa(*masterOptions.port) + glog.V(0).Infof("Start Seaweed Master %s at %s", util.Version(), listeningAddress) + masterListener, e := util.NewListener(listeningAddress, 0) + if e != nil { + glog.Fatalf("Master startup error: %v", e) + } + + // starting grpc server + grpcPort := *masterOptions.port + 10000 + grpcL, err := util.NewListener(*masterOptions.ipBind+":"+strconv.Itoa(grpcPort), 0) + if err != nil { + glog.Fatalf("master failed to listen on grpc port %d: %v", grpcPort, err) + } + grpcS := pb.NewGrpcServer(security.LoadServerTLS(util.GetViper(), "grpc.master")) + master_pb.RegisterSeaweedServer(grpcS, ms) + reflection.Register(grpcS) + glog.V(0).Infof("Start Seaweed Master %s grpc server at %s:%d", util.Version(), *masterOptions.ip, grpcPort) + go grpcS.Serve(grpcL) + + go ms.MasterClient.KeepConnectedToMaster() + + // start http server + httpS := &http.Server{Handler: r} + go httpS.Serve(masterListener) + + select {} +} diff --git a/weed/pb/grpc_client_server.go b/weed/pb/grpc_client_server.go index fac8adcb3..15dc917e9 100644 --- a/weed/pb/grpc_client_server.go +++ b/weed/pb/grpc_client_server.go @@ -213,6 +213,21 @@ func WithMasterClient(master string, grpcDialOption grpc.DialOption, fn func(cli } +func WithOneOfGrpcMasterClients(masterGrpcAddresses []string, grpcDialOption grpc.DialOption, fn func(client master_pb.SeaweedClient) error) (err error) { + + for _, masterGrpcAddress := range masterGrpcAddresses { + err = WithCachedGrpcClient(func(grpcConnection *grpc.ClientConn) error { + client := master_pb.NewSeaweedClient(grpcConnection) + return fn(client) + }, masterGrpcAddress, grpcDialOption) + if err == nil { + return nil + } + } + + return err +} + func WithBrokerGrpcClient(brokerGrpcAddress string, grpcDialOption grpc.DialOption, fn func(client messaging_pb.SeaweedMessagingClient) error) error { return WithCachedGrpcClient(func(grpcConnection *grpc.ClientConn) error { diff --git a/weed/pb/master.proto b/weed/pb/master.proto index 6ef27fb4d..ce8a6dc12 100644 --- a/weed/pb/master.proto +++ b/weed/pb/master.proto @@ -275,6 +275,8 @@ message GetMasterConfigurationResponse { repeated StorageBackend storage_backends = 3; string default_replication = 4; string leader = 5; + uint32 volume_size_limit_m_b = 6; + bool volume_preallocate = 7; } message ListMasterClientsRequest { diff --git a/weed/pb/master_pb/master.pb.go b/weed/pb/master_pb/master.pb.go index 75e165ed6..46dad9325 100644 --- a/weed/pb/master_pb/master.pb.go +++ b/weed/pb/master_pb/master.pb.go @@ -2297,6 +2297,8 @@ type GetMasterConfigurationResponse struct { StorageBackends []*StorageBackend `protobuf:"bytes,3,rep,name=storage_backends,json=storageBackends,proto3" json:"storage_backends,omitempty"` DefaultReplication string `protobuf:"bytes,4,opt,name=default_replication,json=defaultReplication,proto3" json:"default_replication,omitempty"` Leader string `protobuf:"bytes,5,opt,name=leader,proto3" json:"leader,omitempty"` + VolumeSizeLimitMB uint32 `protobuf:"varint,6,opt,name=volume_size_limit_m_b,json=volumeSizeLimitMB,proto3" json:"volume_size_limit_m_b,omitempty"` + VolumePreallocate bool `protobuf:"varint,7,opt,name=volume_preallocate,json=volumePreallocate,proto3" json:"volume_preallocate,omitempty"` } func (x *GetMasterConfigurationResponse) Reset() { @@ -2366,6 +2368,20 @@ func (x *GetMasterConfigurationResponse) GetLeader() string { return "" } +func (x *GetMasterConfigurationResponse) GetVolumeSizeLimitMB() uint32 { + if x != nil { + return x.VolumeSizeLimitMB + } + return 0 +} + +func (x *GetMasterConfigurationResponse) GetVolumePreallocate() bool { + if x != nil { + return x.VolumePreallocate + } + return false +} + type ListMasterClientsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3251,7 +3267,7 @@ var file_master_proto_rawDesc = []byte{ 0x16, 0x0a, 0x14, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x92, 0x02, 0x0a, 0x1e, 0x47, 0x65, 0x74, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xf3, 0x02, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, @@ -3268,16 +3284,38 @@ var file_master_proto_rawDesc = []byte{ 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3b, 0x0a, - 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x42, 0x0a, 0x19, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, 0x70, 0x63, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0d, 0x67, 0x72, 0x70, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0xab, - 0x01, 0x0a, 0x16, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x30, 0x0a, + 0x15, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x5f, 0x6d, 0x5f, 0x62, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4d, 0x42, 0x12, + 0x2d, 0x0a, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x50, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x22, 0x3b, + 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x42, 0x0a, 0x19, 0x4c, + 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, 0x70, 0x63, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0d, 0x67, 0x72, 0x70, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, + 0xab, 0x01, 0x0a, 0x16, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, + 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, + 0x17, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, + 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x73, 0x4e, 0x73, 0x22, 0x8c, 0x01, 0x0a, + 0x18, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, @@ -3285,105 +3323,90 @@ var file_master_proto_rawDesc = []byte{ 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x17, - 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, - 0x0a, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x73, 0x4e, 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x18, - 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, - 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x72, 0x65, - 0x76, 0x69, 0x6f, 0x75, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x52, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xca, 0x09, 0x0a, 0x07, 0x53, 0x65, 0x61, 0x77, - 0x65, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, - 0x62, 0x65, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x1a, 0x1c, 0x2e, 0x6d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x51, - 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, - 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x00, 0x28, 0x01, 0x30, - 0x01, 0x12, 0x51, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, - 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, - 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x18, - 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, - 0x69, 0x63, 0x73, 0x12, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, - 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x52, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xca, 0x09, 0x0a, 0x07, 0x53, 0x65, 0x61, + 0x77, 0x65, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, + 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x1a, 0x1c, 0x2e, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, + 0x51, 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x12, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, + 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x00, 0x28, 0x01, + 0x30, 0x01, 0x12, 0x51, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x12, + 0x18, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x12, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, - 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x61, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x51, 0x0a, 0x0c, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, - 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, - 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, - 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, - 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, - 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, - 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, - 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x4c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, + 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, + 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, + 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, + 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x6d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x4c, 0x65, 0x61, 0x73, 0x65, + 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x2e, 0x6d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, + 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, + 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, + 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, + 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, + 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/weed/server/master_grpc_server_volume.go b/weed/server/master_grpc_server_volume.go index 4132ce690..314db363f 100644 --- a/weed/server/master_grpc_server_volume.go +++ b/weed/server/master_grpc_server_volume.go @@ -68,10 +68,6 @@ func (ms *MasterServer) ProcessGrowRequest() { func (ms *MasterServer) LookupVolume(ctx context.Context, req *master_pb.LookupVolumeRequest) (*master_pb.LookupVolumeResponse, error) { - if !ms.Topo.IsLeader() { - return nil, raft.NotLeaderError - } - resp := &master_pb.LookupVolumeResponse{} volumeLocations := ms.lookupVolumeId(req.VolumeIds, req.Collection) diff --git a/weed/server/master_server.go b/weed/server/master_server.go index 273d6ba7d..d2edeb6cb 100644 --- a/weed/server/master_server.go +++ b/weed/server/master_server.go @@ -44,6 +44,7 @@ type MasterOption struct { DisableHttp bool MetricsAddress string MetricsIntervalSec int + IsFollower bool } type MasterServer struct { @@ -145,7 +146,9 @@ func NewMasterServer(r *mux.Router, option *MasterOption, peers []string) *Maste ms.ProcessGrowRequest() - ms.startAdminScripts() + if !option.IsFollower { + ms.startAdminScripts() + } return ms } @@ -193,8 +196,8 @@ func (ms *MasterServer) proxyToLeader(f http.HandlerFunc) http.HandlerFunc { proxy.Transport = util.Transport proxy.ServeHTTP(w, r) } else { - // drop it to the floor - // writeJsonError(w, r, errors.New(ms.Topo.RaftServer.Name()+" does not know Leader yet:"+ms.Topo.RaftServer.Leader())) + // handle requests locally + f(w, r) } } } From d1d1fc772c884ffae466d24a82ef3d634951243a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 12 Aug 2021 20:33:00 -0700 Subject: [PATCH 228/265] move some volume lookup operations to grpc jwt related lookup will come in next commit --- weed/command/backup.go | 2 +- weed/operation/lookup.go | 17 +++++++++++------ weed/operation/tail_volume.go | 2 +- weed/server/volume_server_handlers_read.go | 2 +- weed/server/volume_server_handlers_write.go | 4 ++-- weed/topology/store_replicate.go | 16 +++++++--------- 6 files changed, 23 insertions(+), 20 deletions(-) diff --git a/weed/command/backup.go b/weed/command/backup.go index 207df770b..4c5a2d820 100644 --- a/weed/command/backup.go +++ b/weed/command/backup.go @@ -72,7 +72,7 @@ func runBackup(cmd *Command, args []string) bool { vid := needle.VolumeId(*s.volumeId) // find volume location, replication, ttl info - lookup, err := operation.Lookup(func() string { return *s.master }, vid.String()) + lookup, err := operation.LookupVolumeId(func() string { return *s.master }, grpcDialOption, vid.String()) if err != nil { fmt.Printf("Error looking up volume %d: %v\n", vid, err) return true diff --git a/weed/operation/lookup.go b/weed/operation/lookup.go index 0372e47b0..ea68f8763 100644 --- a/weed/operation/lookup.go +++ b/weed/operation/lookup.go @@ -79,16 +79,21 @@ func LookupFileId(masterFn GetMasterFn, fileId string) (fullUrl string, err erro return "http://" + lookup.Locations[rand.Intn(len(lookup.Locations))].Url + "/" + fileId, nil } +func LookupVolumeId(masterFn GetMasterFn, grpcDialOption grpc.DialOption, vid string) (*LookupResult, error) { + results, err := LookupVolumeIds(masterFn, grpcDialOption, []string{vid}) + return results[vid], err +} + // LookupVolumeIds find volume locations by cache and actual lookup -func LookupVolumeIds(masterFn GetMasterFn, grpcDialOption grpc.DialOption, vids []string) (map[string]LookupResult, error) { - ret := make(map[string]LookupResult) +func LookupVolumeIds(masterFn GetMasterFn, grpcDialOption grpc.DialOption, vids []string) (map[string]*LookupResult, error) { + ret := make(map[string]*LookupResult) var unknown_vids []string //check vid cache first for _, vid := range vids { - locations, cache_err := vc.Get(vid) - if cache_err == nil { - ret[vid] = LookupResult{VolumeId: vid, Locations: locations} + locations, cacheErr := vc.Get(vid) + if cacheErr == nil { + ret[vid] = &LookupResult{VolumeId: vid, Locations: locations} } else { unknown_vids = append(unknown_vids, vid) } @@ -122,7 +127,7 @@ func LookupVolumeIds(masterFn GetMasterFn, grpcDialOption grpc.DialOption, vids if vidLocations.Error != "" { vc.Set(vidLocations.VolumeId, locations, 10*time.Minute) } - ret[vidLocations.VolumeId] = LookupResult{ + ret[vidLocations.VolumeId] = &LookupResult{ VolumeId: vidLocations.VolumeId, Locations: locations, Error: vidLocations.Error, diff --git a/weed/operation/tail_volume.go b/weed/operation/tail_volume.go index 79a5b3812..e3f2c0664 100644 --- a/weed/operation/tail_volume.go +++ b/weed/operation/tail_volume.go @@ -13,7 +13,7 @@ import ( func TailVolume(masterFn GetMasterFn, grpcDialOption grpc.DialOption, vid needle.VolumeId, sinceNs uint64, timeoutSeconds int, fn func(n *needle.Needle) error) error { // find volume location, replication, ttl info - lookup, err := Lookup(masterFn, vid.String()) + lookup, err := LookupVolumeId(masterFn, grpcDialOption, vid.String()) if err != nil { return fmt.Errorf("look up volume %d: %v", vid, err) } diff --git a/weed/server/volume_server_handlers_read.go b/weed/server/volume_server_handlers_read.go index 8602b0854..29428730e 100644 --- a/weed/server/volume_server_handlers_read.go +++ b/weed/server/volume_server_handlers_read.go @@ -65,7 +65,7 @@ func (vs *VolumeServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) w.WriteHeader(http.StatusNotFound) return } - lookupResult, err := operation.Lookup(vs.GetMaster, volumeId.String()) + lookupResult, err := operation.LookupVolumeId(vs.GetMaster, vs.grpcDialOption, volumeId.String()) glog.V(2).Infoln("volume", volumeId, "found on", lookupResult, "error", err) if err != nil || len(lookupResult.Locations) <= 0 { glog.V(0).Infoln("lookup error:", err, r.URL.Path) diff --git a/weed/server/volume_server_handlers_write.go b/weed/server/volume_server_handlers_write.go index aeb7d6e65..bda8b986e 100644 --- a/weed/server/volume_server_handlers_write.go +++ b/weed/server/volume_server_handlers_write.go @@ -53,7 +53,7 @@ func (vs *VolumeServer) PostHandler(w http.ResponseWriter, r *http.Request) { } ret := operation.UploadResult{} - isUnchanged, writeError := topology.ReplicatedWrite(vs.GetMaster, vs.store, volumeId, reqNeedle, r) + isUnchanged, writeError := topology.ReplicatedWrite(vs.GetMaster, vs.grpcDialOption, vs.store, volumeId, reqNeedle, r) // http 204 status code does not allow body if writeError == nil && isUnchanged { @@ -146,7 +146,7 @@ func (vs *VolumeServer) DeleteHandler(w http.ResponseWriter, r *http.Request) { } } - _, err := topology.ReplicatedDelete(vs.GetMaster, vs.store, volumeId, n, r) + _, err := topology.ReplicatedDelete(vs.GetMaster, vs.grpcDialOption, vs.store, volumeId, n, r) writeDeleteResult(err, count, w, r) diff --git a/weed/topology/store_replicate.go b/weed/topology/store_replicate.go index 6d68bb26f..061c5a12c 100644 --- a/weed/topology/store_replicate.go +++ b/weed/topology/store_replicate.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "fmt" + "google.golang.org/grpc" "net/http" "net/url" "strconv" @@ -18,7 +19,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" ) -func ReplicatedWrite(masterFn operation.GetMasterFn, s *storage.Store, volumeId needle.VolumeId, n *needle.Needle, r *http.Request) (isUnchanged bool, err error) { +func ReplicatedWrite(masterFn operation.GetMasterFn, grpcDialOption grpc.DialOption, s *storage.Store, volumeId needle.VolumeId, n *needle.Needle, r *http.Request) (isUnchanged bool, err error) { //check JWT jwt := security.GetJwt(r) @@ -27,7 +28,7 @@ func ReplicatedWrite(masterFn operation.GetMasterFn, s *storage.Store, volumeId var remoteLocations []operation.Location if r.FormValue("type") != "replicate" { // this is the initial request - remoteLocations, err = getWritableRemoteReplications(s, volumeId, masterFn) + remoteLocations, err = getWritableRemoteReplications(s, grpcDialOption, volumeId, masterFn) if err != nil { glog.V(0).Infoln(err) return @@ -92,16 +93,14 @@ func ReplicatedWrite(masterFn operation.GetMasterFn, s *storage.Store, volumeId return } -func ReplicatedDelete(masterFn operation.GetMasterFn, store *storage.Store, - volumeId needle.VolumeId, n *needle.Needle, - r *http.Request) (size types.Size, err error) { +func ReplicatedDelete(masterFn operation.GetMasterFn, grpcDialOption grpc.DialOption, store *storage.Store, volumeId needle.VolumeId, n *needle.Needle, r *http.Request) (size types.Size, err error) { //check JWT jwt := security.GetJwt(r) var remoteLocations []operation.Location if r.FormValue("type") != "replicate" { - remoteLocations, err = getWritableRemoteReplications(store, volumeId, masterFn) + remoteLocations, err = getWritableRemoteReplications(store, grpcDialOption, volumeId, masterFn) if err != nil { glog.V(0).Infoln(err) return @@ -161,8 +160,7 @@ func DistributedOperation(locations []operation.Location, op func(location opera return ret.Error() } -func getWritableRemoteReplications(s *storage.Store, volumeId needle.VolumeId, masterFn operation.GetMasterFn) ( - remoteLocations []operation.Location, err error) { +func getWritableRemoteReplications(s *storage.Store, grpcDialOption grpc.DialOption, volumeId needle.VolumeId, masterFn operation.GetMasterFn) (remoteLocations []operation.Location, err error) { v := s.GetVolume(volumeId) if v != nil && v.ReplicaPlacement.GetCopyCount() == 1 { @@ -170,7 +168,7 @@ func getWritableRemoteReplications(s *storage.Store, volumeId needle.VolumeId, m } // not on local store, or has replications - lookupResult, lookupErr := operation.Lookup(masterFn, volumeId.String()) + lookupResult, lookupErr := operation.LookupVolumeId(masterFn, grpcDialOption, volumeId.String()) if lookupErr == nil { selfUrl := s.Ip + ":" + strconv.Itoa(s.Port) for _, location := range lookupResult.Locations { From 6238644c35fc5dafcc4eb1722b3d5c9b92c0b031 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 12 Aug 2021 20:52:04 -0700 Subject: [PATCH 229/265] remove gateway command --- weed/command/command.go | 1 - weed/command/gateway.go | 93 ----------------------------- weed/server/gateway_server.go | 106 ---------------------------------- 3 files changed, 200 deletions(-) delete mode 100644 weed/command/gateway.go delete mode 100644 weed/server/gateway_server.go diff --git a/weed/command/command.go b/weed/command/command.go index a3fdcfc6f..8d6525652 100644 --- a/weed/command/command.go +++ b/weed/command/command.go @@ -26,7 +26,6 @@ var Commands = []*Command{ cmdFilerSynchronize, cmdFix, cmdFuse, - cmdGateway, cmdMaster, cmdMasterFollower, cmdMount, diff --git a/weed/command/gateway.go b/weed/command/gateway.go deleted file mode 100644 index 8a6f852a5..000000000 --- a/weed/command/gateway.go +++ /dev/null @@ -1,93 +0,0 @@ -package command - -import ( - "net/http" - "strconv" - "strings" - "time" - - "github.com/chrislusf/seaweedfs/weed/glog" - "github.com/chrislusf/seaweedfs/weed/server" - "github.com/chrislusf/seaweedfs/weed/util" -) - -var ( - gatewayOptions GatewayOptions -) - -type GatewayOptions struct { - masters *string - filers *string - bindIp *string - port *int - maxMB *int -} - -func init() { - cmdGateway.Run = runGateway // break init cycle - gatewayOptions.masters = cmdGateway.Flag.String("master", "localhost:9333", "comma-separated master servers") - gatewayOptions.filers = cmdGateway.Flag.String("filer", "localhost:8888", "comma-separated filer servers") - gatewayOptions.bindIp = cmdGateway.Flag.String("ip.bind", "localhost", "ip address to bind to") - gatewayOptions.port = cmdGateway.Flag.Int("port", 5647, "gateway http listen port") - gatewayOptions.maxMB = cmdGateway.Flag.Int("maxMB", 4, "split files larger than the limit") -} - -var cmdGateway = &Command{ - UsageLine: "gateway -port=8888 -master=[,]* -filer=[,]*", - Short: "start a gateway server that points to a list of master servers or a list of filers", - Long: `start a gateway server which accepts REST operation to write any blobs, files, or topic messages. - - POST /blobs/ - upload the blob and return a chunk id - DELETE /blobs/ - delete a chunk id - - /* - POST /files/path/to/a/file - save /path/to/a/file on filer - DELETE /files/path/to/a/file - delete /path/to/a/file on filer - - POST /topics/topicName - save on filer to /topics/topicName//ts.json - */ -`, -} - -func runGateway(cmd *Command, args []string) bool { - - util.LoadConfiguration("security", false) - - gatewayOptions.startGateway() - - return true -} - -func (gw *GatewayOptions) startGateway() { - - defaultMux := http.NewServeMux() - - _, gws_err := weed_server.NewGatewayServer(defaultMux, &weed_server.GatewayOption{ - Masters: strings.Split(*gw.masters, ","), - Filers: strings.Split(*gw.filers, ","), - MaxMB: *gw.maxMB, - }) - if gws_err != nil { - glog.Fatalf("Gateway startup error: %v", gws_err) - } - - glog.V(0).Infof("Start Seaweed Gateway %s at %s:%d", util.Version(), *gw.bindIp, *gw.port) - gatewayListener, e := util.NewListener( - *gw.bindIp+":"+strconv.Itoa(*gw.port), - time.Duration(10)*time.Second, - ) - if e != nil { - glog.Fatalf("Filer listener error: %v", e) - } - - httpS := &http.Server{Handler: defaultMux} - if err := httpS.Serve(gatewayListener); err != nil { - glog.Fatalf("Gateway Fail to serve: %v", e) - } - -} diff --git a/weed/server/gateway_server.go b/weed/server/gateway_server.go deleted file mode 100644 index 608217ed7..000000000 --- a/weed/server/gateway_server.go +++ /dev/null @@ -1,106 +0,0 @@ -package weed_server - -import ( - "github.com/chrislusf/seaweedfs/weed/operation" - "google.golang.org/grpc" - "math/rand" - "net/http" - - "github.com/chrislusf/seaweedfs/weed/util" - - _ "github.com/chrislusf/seaweedfs/weed/filer/cassandra" - _ "github.com/chrislusf/seaweedfs/weed/filer/elastic/v7" - _ "github.com/chrislusf/seaweedfs/weed/filer/etcd" - _ "github.com/chrislusf/seaweedfs/weed/filer/hbase" - _ "github.com/chrislusf/seaweedfs/weed/filer/leveldb" - _ "github.com/chrislusf/seaweedfs/weed/filer/leveldb2" - _ "github.com/chrislusf/seaweedfs/weed/filer/leveldb3" - _ "github.com/chrislusf/seaweedfs/weed/filer/mongodb" - _ "github.com/chrislusf/seaweedfs/weed/filer/mysql" - _ "github.com/chrislusf/seaweedfs/weed/filer/mysql2" - _ "github.com/chrislusf/seaweedfs/weed/filer/postgres" - _ "github.com/chrislusf/seaweedfs/weed/filer/postgres2" - _ "github.com/chrislusf/seaweedfs/weed/filer/redis" - _ "github.com/chrislusf/seaweedfs/weed/filer/redis2" - "github.com/chrislusf/seaweedfs/weed/glog" - _ "github.com/chrislusf/seaweedfs/weed/notification/aws_sqs" - _ "github.com/chrislusf/seaweedfs/weed/notification/gocdk_pub_sub" - _ "github.com/chrislusf/seaweedfs/weed/notification/google_pub_sub" - _ "github.com/chrislusf/seaweedfs/weed/notification/kafka" - _ "github.com/chrislusf/seaweedfs/weed/notification/log" - "github.com/chrislusf/seaweedfs/weed/security" -) - -type GatewayOption struct { - Masters []string - Filers []string - MaxMB int - IsSecure bool -} - -type GatewayServer struct { - option *GatewayOption - secret security.SigningKey - grpcDialOption grpc.DialOption -} - -func NewGatewayServer(defaultMux *http.ServeMux, option *GatewayOption) (fs *GatewayServer, err error) { - - fs = &GatewayServer{ - option: option, - grpcDialOption: security.LoadClientTLS(util.GetViper(), "grpc.client"), - } - - if len(option.Masters) == 0 { - glog.Fatal("master list is required!") - } - - defaultMux.HandleFunc("/blobs/", fs.blobsHandler) - defaultMux.HandleFunc("/files/", fs.filesHandler) - defaultMux.HandleFunc("/topics/", fs.topicsHandler) - - return fs, nil -} - -func (fs *GatewayServer) getMaster() string { - randMaster := rand.Intn(len(fs.option.Masters)) - return fs.option.Masters[randMaster] -} - -func (fs *GatewayServer) blobsHandler(w http.ResponseWriter, r *http.Request) { - switch r.Method { - case "DELETE": - chunkId := r.URL.Path[len("/blobs/"):] - fullUrl, err := operation.LookupFileId(fs.getMaster, chunkId) - if err != nil { - writeJsonError(w, r, http.StatusNotFound, err) - return - } - var jwtAuthorization security.EncodedJwt - if fs.option.IsSecure { - jwtAuthorization = operation.LookupJwt(fs.getMaster(), chunkId) - } - body, statusCode, err := util.DeleteProxied(fullUrl, string(jwtAuthorization)) - if err != nil { - writeJsonError(w, r, http.StatusNotFound, err) - return - } - w.WriteHeader(statusCode) - w.Write(body) - case "POST": - submitForClientHandler(w, r, fs.getMaster, fs.grpcDialOption) - } -} - -func (fs *GatewayServer) filesHandler(w http.ResponseWriter, r *http.Request) { - switch r.Method { - case "DELETE": - case "POST": - } -} - -func (fs *GatewayServer) topicsHandler(w http.ResponseWriter, r *http.Request) { - switch r.Method { - case "POST": - } -} From 5a0f92423eb4f89d35b245b1913eb7ba60436742 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 12 Aug 2021 21:40:33 -0700 Subject: [PATCH 230/265] use grpc and jwt --- weed/command/benchmark.go | 2 +- weed/command/download.go | 21 +- weed/filer/filer_deletion.go | 12 +- weed/operation/assign_file_id.go | 29 +- weed/operation/chunked_file.go | 32 +- weed/operation/delete_content.go | 4 +- weed/operation/lookup.go | 70 +- weed/pb/master.proto | 5 +- weed/pb/master_pb/master.pb.go | 703 +++++++++++---------- weed/replication/source/filer_source.go | 4 +- weed/s3api/s3api_object_copy_handlers.go | 2 +- weed/server/master_grpc_server_volume.go | 14 +- weed/server/master_server_handlers.go | 4 +- weed/server/volume_server_handlers_read.go | 2 +- weed/util/http_util.go | 2 +- 15 files changed, 453 insertions(+), 453 deletions(-) diff --git a/weed/command/benchmark.go b/weed/command/benchmark.go index 4fedb55f1..f0c8f6139 100644 --- a/weed/command/benchmark.go +++ b/weed/command/benchmark.go @@ -212,7 +212,7 @@ func writeFiles(idChan chan int, fileIdLineChan chan string, s *stat) { } var jwtAuthorization security.EncodedJwt if isSecure { - jwtAuthorization = operation.LookupJwt(b.masterClient.GetMaster(), df.fp.Fid) + jwtAuthorization = operation.LookupJwt(b.masterClient.GetMaster(), b.grpcDialOption, df.fp.Fid) } if e := util.Delete(fmt.Sprintf("http://%s/%s", df.fp.Server, df.fp.Fid), string(jwtAuthorization)); e == nil { s.completed++ diff --git a/weed/command/download.go b/weed/command/download.go index 7bbff9448..a64d3f237 100644 --- a/weed/command/download.go +++ b/weed/command/download.go @@ -2,6 +2,8 @@ package command import ( "fmt" + "github.com/chrislusf/seaweedfs/weed/security" + "google.golang.org/grpc" "io" "io/ioutil" "net/http" @@ -43,20 +45,23 @@ var cmdDownload = &Command{ } func runDownload(cmd *Command, args []string) bool { + util.LoadConfiguration("security", false) + grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client") + for _, fid := range args { - if e := downloadToFile(func() string { return *d.server }, fid, util.ResolvePath(*d.dir)); e != nil { + if e := downloadToFile(func() string { return *d.server }, grpcDialOption, fid, util.ResolvePath(*d.dir)); e != nil { fmt.Println("Download Error: ", fid, e) } } return true } -func downloadToFile(masterFn operation.GetMasterFn, fileId, saveDir string) error { - fileUrl, lookupError := operation.LookupFileId(masterFn, fileId) +func downloadToFile(masterFn operation.GetMasterFn, grpcDialOption grpc.DialOption, fileId, saveDir string) error { + fileUrl, jwt, lookupError := operation.LookupFileId(masterFn, grpcDialOption, fileId) if lookupError != nil { return lookupError } - filename, _, rc, err := util.DownloadFile(fileUrl) + filename, _, rc, err := util.DownloadFile(fileUrl, jwt) if err != nil { return err } @@ -83,7 +88,7 @@ func downloadToFile(masterFn operation.GetMasterFn, fileId, saveDir string) erro fids := strings.Split(string(content), "\n") for _, partId := range fids { var n int - _, part, err := fetchContent(masterFn, partId) + _, part, err := fetchContent(masterFn, grpcDialOption, partId) if err == nil { n, err = f.Write(part) } @@ -103,13 +108,13 @@ func downloadToFile(masterFn operation.GetMasterFn, fileId, saveDir string) erro return nil } -func fetchContent(masterFn operation.GetMasterFn, fileId string) (filename string, content []byte, e error) { - fileUrl, lookupError := operation.LookupFileId(masterFn, fileId) +func fetchContent(masterFn operation.GetMasterFn, grpcDialOption grpc.DialOption, fileId string) (filename string, content []byte, e error) { + fileUrl, jwt, lookupError := operation.LookupFileId(masterFn, grpcDialOption, fileId) if lookupError != nil { return "", nil, lookupError } var rc *http.Response - if filename, _, rc, e = util.DownloadFile(fileUrl); e != nil { + if filename, _, rc, e = util.DownloadFile(fileUrl, jwt); e != nil { return "", nil, e } defer util.CloseResponse(rc) diff --git a/weed/filer/filer_deletion.go b/weed/filer/filer_deletion.go index 9eee38277..a12587541 100644 --- a/weed/filer/filer_deletion.go +++ b/weed/filer/filer_deletion.go @@ -10,9 +10,9 @@ import ( "github.com/chrislusf/seaweedfs/weed/wdclient" ) -func LookupByMasterClientFn(masterClient *wdclient.MasterClient) func(vids []string) (map[string]operation.LookupResult, error) { - return func(vids []string) (map[string]operation.LookupResult, error) { - m := make(map[string]operation.LookupResult) +func LookupByMasterClientFn(masterClient *wdclient.MasterClient) func(vids []string) (map[string]*operation.LookupResult, error) { + return func(vids []string) (map[string]*operation.LookupResult, error) { + m := make(map[string]*operation.LookupResult) for _, vid := range vids { locs, _ := masterClient.GetVidLocations(vid) var locations []operation.Location @@ -22,9 +22,9 @@ func LookupByMasterClientFn(masterClient *wdclient.MasterClient) func(vids []str PublicUrl: loc.PublicUrl, }) } - m[vid] = operation.LookupResult{ - VolumeId: vid, - Locations: locations, + m[vid] = &operation.LookupResult{ + VolumeOrFileId: vid, + Locations: locations, } } return m, nil diff --git a/weed/operation/assign_file_id.go b/weed/operation/assign_file_id.go index fabc820ff..f441dcb50 100644 --- a/weed/operation/assign_file_id.go +++ b/weed/operation/assign_file_id.go @@ -3,14 +3,11 @@ package operation import ( "context" "fmt" - "strings" - "github.com/chrislusf/seaweedfs/weed/storage/needle" "google.golang.org/grpc" "github.com/chrislusf/seaweedfs/weed/pb/master_pb" "github.com/chrislusf/seaweedfs/weed/security" - "github.com/chrislusf/seaweedfs/weed/util" ) type VolumeAssignRequest struct { @@ -96,18 +93,28 @@ func Assign(masterFn GetMasterFn, grpcDialOption grpc.DialOption, primaryRequest return ret, lastError } -func LookupJwt(master string, fileId string) security.EncodedJwt { +func LookupJwt(master string, grpcDialOption grpc.DialOption, fileId string) (token security.EncodedJwt) { - tokenStr := "" + WithMasterServerClient(master, grpcDialOption, func(masterClient master_pb.SeaweedClient) error { - if h, e := util.Head(fmt.Sprintf("http://%s/dir/lookup?fileId=%s", master, fileId)); e == nil { - bearer := h.Get("Authorization") - if len(bearer) > 7 && strings.ToUpper(bearer[0:6]) == "BEARER" { - tokenStr = bearer[7:] + resp, grpcErr := masterClient.LookupVolume(context.Background(), &master_pb.LookupVolumeRequest{ + VolumeOrFileIds: []string{fileId}, + }) + if grpcErr != nil { + return grpcErr } - } - return security.EncodedJwt(tokenStr) + if len(resp.VolumeIdLocations) == 0 { + return nil + } + + token = security.EncodedJwt(resp.VolumeIdLocations[0].Auth) + + return nil + + }) + + return } type StorageOption struct { diff --git a/weed/operation/chunked_file.go b/weed/operation/chunked_file.go index 8506e0518..94939f1f3 100644 --- a/weed/operation/chunked_file.go +++ b/weed/operation/chunked_file.go @@ -40,13 +40,14 @@ type ChunkManifest struct { // seekable chunked file reader type ChunkedFileReader struct { - totalSize int64 - chunkList []*ChunkInfo - master string - pos int64 - pr *io.PipeReader - pw *io.PipeWriter - mutex sync.Mutex + totalSize int64 + chunkList []*ChunkInfo + master string + pos int64 + pr *io.PipeReader + pw *io.PipeWriter + mutex sync.Mutex + grpcDialOption grpc.DialOption } func (s ChunkList) Len() int { return len(s) } @@ -92,7 +93,7 @@ func (cm *ChunkManifest) DeleteChunks(masterFn GetMasterFn, usePublicUrl bool, g return nil } -func readChunkNeedle(fileUrl string, w io.Writer, offset int64) (written int64, e error) { +func readChunkNeedle(fileUrl string, w io.Writer, offset int64, jwt string) (written int64, e error) { req, err := http.NewRequest("GET", fileUrl, nil) if err != nil { return written, err @@ -126,16 +127,17 @@ func readChunkNeedle(fileUrl string, w io.Writer, offset int64) (written int64, return io.Copy(w, resp.Body) } -func NewChunkedFileReader(chunkList []*ChunkInfo, master string) *ChunkedFileReader { +func NewChunkedFileReader(chunkList []*ChunkInfo, master string, grpcDialOption grpc.DialOption) *ChunkedFileReader { var totalSize int64 for _, chunk := range chunkList { totalSize += chunk.Size } sort.Sort(ChunkList(chunkList)) return &ChunkedFileReader{ - totalSize: totalSize, - chunkList: chunkList, - master: master, + totalSize: totalSize, + chunkList: chunkList, + master: master, + grpcDialOption: grpcDialOption, } } @@ -174,13 +176,13 @@ func (cf *ChunkedFileReader) WriteTo(w io.Writer) (n int64, err error) { for ; chunkIndex < len(cf.chunkList); chunkIndex++ { ci := cf.chunkList[chunkIndex] // if we need read date from local volume server first? - fileUrl, lookupError := LookupFileId(func() string { + fileUrl, jwt, lookupError := LookupFileId(func() string { return cf.master - }, ci.Fid) + }, cf.grpcDialOption, ci.Fid) if lookupError != nil { return n, lookupError } - if wn, e := readChunkNeedle(fileUrl, w, chunkStartOffset); e != nil { + if wn, e := readChunkNeedle(fileUrl, w, chunkStartOffset, jwt); e != nil { return n, e } else { n += wn diff --git a/weed/operation/delete_content.go b/weed/operation/delete_content.go index 868cb5694..15d07a52e 100644 --- a/weed/operation/delete_content.go +++ b/weed/operation/delete_content.go @@ -30,7 +30,7 @@ func ParseFileId(fid string) (vid string, key_cookie string, err error) { // DeleteFiles batch deletes a list of fileIds func DeleteFiles(masterFn GetMasterFn, usePublicUrl bool, grpcDialOption grpc.DialOption, fileIds []string) ([]*volume_server_pb.DeleteResult, error) { - lookupFunc := func(vids []string) (results map[string]LookupResult, err error) { + lookupFunc := func(vids []string) (results map[string]*LookupResult, err error) { results, err = LookupVolumeIds(masterFn, grpcDialOption, vids) if err == nil && usePublicUrl { for _, result := range results { @@ -46,7 +46,7 @@ func DeleteFiles(masterFn GetMasterFn, usePublicUrl bool, grpcDialOption grpc.Di } -func DeleteFilesWithLookupVolumeId(grpcDialOption grpc.DialOption, fileIds []string, lookupFunc func(vid []string) (map[string]LookupResult, error)) ([]*volume_server_pb.DeleteResult, error) { +func DeleteFilesWithLookupVolumeId(grpcDialOption grpc.DialOption, fileIds []string, lookupFunc func(vid []string) (map[string]*LookupResult, error)) ([]*volume_server_pb.DeleteResult, error) { var ret []*volume_server_pb.DeleteResult diff --git a/weed/operation/lookup.go b/weed/operation/lookup.go index ea68f8763..8717f6b36 100644 --- a/weed/operation/lookup.go +++ b/weed/operation/lookup.go @@ -2,17 +2,14 @@ package operation import ( "context" - "encoding/json" "errors" "fmt" "google.golang.org/grpc" "math/rand" - "net/url" "strings" "time" "github.com/chrislusf/seaweedfs/weed/pb/master_pb" - "github.com/chrislusf/seaweedfs/weed/util" ) type Location struct { @@ -20,63 +17,33 @@ type Location struct { PublicUrl string `json:"publicUrl,omitempty"` } type LookupResult struct { - VolumeId string `json:"volumeId,omitempty"` - Locations []Location `json:"locations,omitempty"` - Error string `json:"error,omitempty"` + VolumeOrFileId string `json:"volumeOrFileId,omitempty"` + Locations []Location `json:"locations,omitempty"` + Jwt string `json:"jwt,omitempty"` + Error string `json:"error,omitempty"` } func (lr *LookupResult) String() string { - return fmt.Sprintf("VolumeId:%s, Locations:%v, Error:%s", lr.VolumeId, lr.Locations, lr.Error) + return fmt.Sprintf("VolumeOrFileId:%s, Locations:%v, Error:%s", lr.VolumeOrFileId, lr.Locations, lr.Error) } var ( vc VidCache // caching of volume locations, re-check if after 10 minutes ) -func Lookup(masterFn GetMasterFn, vid string) (ret *LookupResult, err error) { - locations, cache_err := vc.Get(vid) - if cache_err != nil { - if ret, err = do_lookup(masterFn, vid); err == nil { - vc.Set(vid, ret.Locations, 10*time.Minute) - } - } else { - ret = &LookupResult{VolumeId: vid, Locations: locations} - } - return -} - -func do_lookup(masterFn GetMasterFn, vid string) (*LookupResult, error) { - values := make(url.Values) - values.Add("volumeId", vid) - server := masterFn() - jsonBlob, err := util.Post("http://"+server+"/dir/lookup", values) - if err != nil { - return nil, err - } - var ret LookupResult - err = json.Unmarshal(jsonBlob, &ret) - if err != nil { - return nil, err - } - if ret.Error != "" { - return nil, errors.New(ret.Error) - } - return &ret, nil -} - -func LookupFileId(masterFn GetMasterFn, fileId string) (fullUrl string, err error) { +func LookupFileId(masterFn GetMasterFn, grpcDialOption grpc.DialOption, fileId string) (fullUrl string, jwt string, err error) { parts := strings.Split(fileId, ",") if len(parts) != 2 { - return "", errors.New("Invalid fileId " + fileId) + return "", jwt, errors.New("Invalid fileId " + fileId) } - lookup, lookupError := Lookup(masterFn, parts[0]) + lookup, lookupError := LookupVolumeId(masterFn, grpcDialOption, parts[0]) if lookupError != nil { - return "", lookupError + return "", jwt, lookupError } if len(lookup.Locations) == 0 { - return "", errors.New("File Not Found") + return "", jwt, errors.New("File Not Found") } - return "http://" + lookup.Locations[rand.Intn(len(lookup.Locations))].Url + "/" + fileId, nil + return "http://" + lookup.Locations[rand.Intn(len(lookup.Locations))].Url + "/" + fileId, lookup.Jwt, nil } func LookupVolumeId(masterFn GetMasterFn, grpcDialOption grpc.DialOption, vid string) (*LookupResult, error) { @@ -93,7 +60,7 @@ func LookupVolumeIds(masterFn GetMasterFn, grpcDialOption grpc.DialOption, vids for _, vid := range vids { locations, cacheErr := vc.Get(vid) if cacheErr == nil { - ret[vid] = &LookupResult{VolumeId: vid, Locations: locations} + ret[vid] = &LookupResult{VolumeOrFileId: vid, Locations: locations} } else { unknown_vids = append(unknown_vids, vid) } @@ -108,7 +75,7 @@ func LookupVolumeIds(masterFn GetMasterFn, grpcDialOption grpc.DialOption, vids err := WithMasterServerClient(masterFn(), grpcDialOption, func(masterClient master_pb.SeaweedClient) error { req := &master_pb.LookupVolumeRequest{ - VolumeIds: unknown_vids, + VolumeOrFileIds: unknown_vids, } resp, grpcErr := masterClient.LookupVolume(context.Background(), req) if grpcErr != nil { @@ -125,12 +92,13 @@ func LookupVolumeIds(masterFn GetMasterFn, grpcDialOption grpc.DialOption, vids }) } if vidLocations.Error != "" { - vc.Set(vidLocations.VolumeId, locations, 10*time.Minute) + vc.Set(vidLocations.VolumeOrFileId, locations, 10*time.Minute) } - ret[vidLocations.VolumeId] = &LookupResult{ - VolumeId: vidLocations.VolumeId, - Locations: locations, - Error: vidLocations.Error, + ret[vidLocations.VolumeOrFileId] = &LookupResult{ + VolumeOrFileId: vidLocations.VolumeOrFileId, + Locations: locations, + Jwt: vidLocations.Auth, + Error: vidLocations.Error, } } diff --git a/weed/pb/master.proto b/weed/pb/master.proto index ce8a6dc12..fcd5cebf1 100644 --- a/weed/pb/master.proto +++ b/weed/pb/master.proto @@ -140,14 +140,15 @@ message VolumeLocation { } message LookupVolumeRequest { - repeated string volume_ids = 1; + repeated string volume_or_file_ids = 1; string collection = 2; // optional, a bit faster if provided. } message LookupVolumeResponse { message VolumeIdLocation { - string volume_id = 1; + string volume_or_file_id = 1; repeated Location locations = 2; string error = 3; + string auth = 4; } repeated VolumeIdLocation volume_id_locations = 1; } diff --git a/weed/pb/master_pb/master.pb.go b/weed/pb/master_pb/master.pb.go index 46dad9325..427f3650b 100644 --- a/weed/pb/master_pb/master.pb.go +++ b/weed/pb/master_pb/master.pb.go @@ -890,8 +890,8 @@ type LookupVolumeRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - VolumeIds []string `protobuf:"bytes,1,rep,name=volume_ids,json=volumeIds,proto3" json:"volume_ids,omitempty"` - Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` // optional, a bit faster if provided. + VolumeOrFileIds []string `protobuf:"bytes,1,rep,name=volume_or_file_ids,json=volumeOrFileIds,proto3" json:"volume_or_file_ids,omitempty"` + Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` // optional, a bit faster if provided. } func (x *LookupVolumeRequest) Reset() { @@ -926,9 +926,9 @@ func (*LookupVolumeRequest) Descriptor() ([]byte, []int) { return file_master_proto_rawDescGZIP(), []int{10} } -func (x *LookupVolumeRequest) GetVolumeIds() []string { +func (x *LookupVolumeRequest) GetVolumeOrFileIds() []string { if x != nil { - return x.VolumeIds + return x.VolumeOrFileIds } return nil } @@ -2771,9 +2771,10 @@ type LookupVolumeResponse_VolumeIdLocation struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` - Locations []*Location `protobuf:"bytes,2,rep,name=locations,proto3" json:"locations,omitempty"` - Error string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` + VolumeOrFileId string `protobuf:"bytes,1,opt,name=volume_or_file_id,json=volumeOrFileId,proto3" json:"volume_or_file_id,omitempty"` + Locations []*Location `protobuf:"bytes,2,rep,name=locations,proto3" json:"locations,omitempty"` + Error string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` + Auth string `protobuf:"bytes,4,opt,name=auth,proto3" json:"auth,omitempty"` } func (x *LookupVolumeResponse_VolumeIdLocation) Reset() { @@ -2808,9 +2809,9 @@ func (*LookupVolumeResponse_VolumeIdLocation) Descriptor() ([]byte, []int) { return file_master_proto_rawDescGZIP(), []int{11, 0} } -func (x *LookupVolumeResponse_VolumeIdLocation) GetVolumeId() string { +func (x *LookupVolumeResponse_VolumeIdLocation) GetVolumeOrFileId() string { if x != nil { - return x.VolumeId + return x.VolumeOrFileId } return "" } @@ -2829,6 +2830,13 @@ func (x *LookupVolumeResponse_VolumeIdLocation) GetError() string { return "" } +func (x *LookupVolumeResponse_VolumeIdLocation) GetAuth() string { + if x != nil { + return x.Auth + } + return "" +} + type LookupEcVolumeResponse_EcShardIdLocation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3057,249 +3065,268 @@ var file_master_proto_rawDesc = []byte{ 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x22, 0x54, 0x0a, 0x13, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xf2, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, - 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x60, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x5f, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, - 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, - 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x78, 0x0a, 0x10, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x3b, 0x0a, - 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x72, 0x6c, 0x22, 0xd0, 0x02, 0x0a, 0x0d, 0x41, - 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, - 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, - 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x63, 0x6b, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x32, 0x0a, 0x16, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x5f, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, - 0x6d, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x4d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x62, 0x12, 0x32, 0x0a, 0x15, - 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x57, 0x72, 0x69, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0x93, 0x01, - 0x0a, 0x0e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x10, 0x0a, 0x03, 0x66, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x66, - 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x75, - 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, - 0x12, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, - 0x75, 0x74, 0x68, 0x22, 0x84, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, - 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, - 0x74, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, - 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0x6f, 0x0a, 0x12, 0x53, 0x74, - 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x08, 0x75, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x0a, 0x0a, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7b, 0x0a, - 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4e, - 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x65, 0x63, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x22, 0x51, 0x0a, 0x16, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, - 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x91, 0x03, 0x0a, 0x08, 0x44, 0x69, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, - 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0f, 0x66, 0x72, 0x65, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x11, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x46, 0x0a, 0x0c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x6e, 0x66, - 0x6f, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0b, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x50, 0x0a, 0x0e, 0x65, 0x63, - 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0c, - 0x65, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x2e, 0x0a, 0x13, - 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x72, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb7, 0x01, 0x0a, - 0x0c, 0x44, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x44, 0x0a, - 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x73, 0x1a, 0x51, 0x0a, 0x0e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf0, 0x01, 0x0a, 0x08, 0x52, 0x61, 0x63, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x40, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x69, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x64, 0x69, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x1a, 0x51, 0x0a, 0x0e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xef, 0x01, 0x0a, 0x0e, 0x44, 0x61, - 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x32, 0x0a, 0x0a, - 0x72, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x63, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x72, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, - 0x12, 0x46, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, - 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x64, - 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x1a, 0x51, 0x0a, 0x0e, 0x44, 0x69, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfe, 0x01, 0x0a, 0x0c, - 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x45, 0x0a, 0x11, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x49, 0x6e, - 0x66, 0x6f, 0x73, 0x12, 0x44, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x65, 0x72, 0x22, 0x62, 0x0a, 0x13, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x5f, 0x6f, 0x72, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4f, 0x72, 0x46, + 0x69, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x95, 0x02, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x60, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x1a, 0x9a, 0x01, 0x0a, 0x10, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x6f, 0x72, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4f, 0x72, 0x46, 0x69, 0x6c, 0x65, 0x49, + 0x64, 0x12, 0x31, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x75, + 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x22, 0x3b, + 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x72, 0x6c, 0x22, 0xd0, 0x02, 0x0a, 0x0d, + 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, + 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x63, 0x6b, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x32, 0x0a, 0x16, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x6d, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x4d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x62, 0x12, 0x32, 0x0a, + 0x15, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x57, 0x72, + 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0x93, + 0x01, 0x0a, 0x0e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x66, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, + 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x12, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x61, 0x75, 0x74, 0x68, 0x22, 0x84, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, + 0x74, 0x74, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, + 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0x6f, 0x0a, 0x12, 0x53, + 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x08, 0x75, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x0a, 0x0a, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7b, + 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x2c, 0x0a, + 0x12, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x65, 0x63, 0x5f, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x22, 0x51, 0x0a, 0x16, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, + 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, + 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x91, 0x03, 0x0a, 0x08, 0x44, 0x69, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, + 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x66, 0x72, 0x65, 0x65, 0x5f, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0f, 0x66, 0x72, 0x65, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x11, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x46, 0x0a, 0x0c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x6e, + 0x66, 0x6f, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0b, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x50, 0x0a, 0x0e, 0x65, + 0x63, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, + 0x0c, 0x65, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x2e, 0x0a, + 0x13, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb7, 0x01, + 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x44, + 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x73, 0x1a, 0x51, 0x0a, 0x0e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf0, 0x01, 0x0a, 0x08, 0x52, 0x61, 0x63, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4e, 0x6f, + 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x40, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x69, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x64, 0x69, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x1a, 0x51, 0x0a, 0x0e, 0x44, 0x69, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xef, 0x01, 0x0a, 0x0e, 0x44, + 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x32, 0x0a, + 0x0a, 0x72, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, + 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x72, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x73, 0x12, 0x46, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x1a, 0x51, 0x0a, 0x0e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x13, 0x0a, 0x11, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x83, 0x01, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x74, 0x6f, 0x70, 0x6f, - 0x6c, 0x6f, 0x67, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x6f, 0x70, 0x6f, - 0x6c, 0x6f, 0x67, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, - 0x67, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2f, 0x0a, 0x14, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x62, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4d, 0x62, 0x22, 0x34, 0x0a, 0x15, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, - 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x22, 0xfb, 0x01, - 0x0a, 0x16, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x61, 0x0a, 0x12, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, - 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x33, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, - 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x4c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x61, 0x0a, 0x11, 0x45, 0x63, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x49, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, - 0x08, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x73, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x42, 0x0a, 0x13, 0x56, - 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x67, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x67, - 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, - 0x16, 0x0a, 0x14, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4d, 0x61, - 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xf3, 0x02, 0x0a, 0x1e, 0x47, 0x65, 0x74, - 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x44, - 0x0a, 0x10, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x52, 0x0f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x30, 0x0a, - 0x15, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x5f, 0x6d, 0x5f, 0x62, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4d, 0x42, 0x12, - 0x2d, 0x0a, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x61, 0x6c, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x50, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x22, 0x3b, - 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x42, 0x0a, 0x19, 0x4c, - 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, 0x70, 0x63, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0d, 0x67, 0x72, 0x70, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, - 0xab, 0x01, 0x0a, 0x16, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, + 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfe, 0x01, 0x0a, + 0x0c, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x45, 0x0a, + 0x11, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, + 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x44, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x1a, 0x51, 0x0a, 0x0e, 0x44, 0x69, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x13, 0x0a, + 0x11, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x74, 0x6f, 0x70, + 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x6f, 0x70, + 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x74, 0x6f, 0x70, 0x6f, 0x6c, + 0x6f, 0x67, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2f, 0x0a, 0x14, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x62, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4d, 0x62, 0x22, 0x34, 0x0a, 0x15, 0x4c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x22, 0xfb, + 0x01, 0x0a, 0x16, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x61, 0x0a, 0x12, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, + 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x4c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, + 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x61, 0x0a, 0x11, 0x45, 0x63, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, + 0x0a, 0x08, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x07, 0x73, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x09, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x42, 0x0a, 0x13, + 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x67, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x5f, 0x74, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, + 0x67, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x22, 0x16, 0x0a, 0x14, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xf3, 0x02, 0x0a, 0x1e, 0x47, 0x65, + 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, + 0x44, 0x0a, 0x10, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x0f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x30, + 0x0a, 0x15, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x5f, 0x62, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4d, 0x42, + 0x12, 0x2d, 0x0a, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x61, 0x6c, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x50, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x22, + 0x3b, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x42, 0x0a, 0x19, + 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, 0x70, + 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x67, 0x72, 0x70, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x22, 0xab, 0x01, 0x0a, 0x16, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, + 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x4d, + 0x0a, 0x17, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x1c, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x73, 0x4e, 0x73, 0x22, 0x8c, 0x01, + 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x54, 0x6f, 0x6b, 0x65, @@ -3307,106 +3334,90 @@ var file_master_proto_rawDesc = []byte{ 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, - 0x17, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, - 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x73, 0x4e, 0x73, 0x22, 0x8c, 0x01, 0x0a, - 0x18, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, - 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x72, - 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, - 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x52, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xca, 0x09, 0x0a, 0x07, 0x53, 0x65, 0x61, - 0x77, 0x65, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, - 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x1a, 0x1c, 0x2e, 0x6d, 0x61, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, - 0x51, 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x12, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, - 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x00, 0x28, 0x01, - 0x30, 0x01, 0x12, 0x51, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x12, - 0x18, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, - 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, - 0x74, 0x69, 0x63, 0x73, 0x12, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x12, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x4c, 0x6f, 0x6f, 0x6b, - 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, - 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, - 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, - 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, - 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, - 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x6d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x4c, 0x65, 0x61, 0x73, 0x65, - 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x2e, 0x6d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, - 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, - 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, - 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, - 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, - 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, - 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, - 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x1b, 0x0a, 0x19, + 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xca, 0x09, 0x0a, 0x07, 0x53, 0x65, + 0x61, 0x77, 0x65, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, + 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x1a, 0x1c, 0x2e, 0x6d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, + 0x12, 0x51, 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x12, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, + 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x00, 0x28, + 0x01, 0x30, 0x01, 0x12, 0x51, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x12, 0x18, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, + 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x12, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x6d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x4c, 0x6f, 0x6f, + 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, + 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, + 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, + 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x28, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x24, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x4c, 0x65, 0x61, 0x73, + 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x2e, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, + 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x65, + 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, + 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, + 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, + 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, + 0x2f, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( diff --git a/weed/replication/source/filer_source.go b/weed/replication/source/filer_source.go index f94ad99dd..085c0a700 100644 --- a/weed/replication/source/filer_source.go +++ b/weed/replication/source/filer_source.go @@ -96,7 +96,7 @@ func (fs *FilerSource) LookupFileId(part string) (fileUrls []string, err error) func (fs *FilerSource) ReadPart(fileId string) (filename string, header http.Header, resp *http.Response, err error) { if fs.proxyByFiler { - return util.DownloadFile("http://" + fs.address + "/?proxyChunkId=" + fileId) + return util.DownloadFile("http://" + fs.address + "/?proxyChunkId=" + fileId, "") } fileUrls, err := fs.LookupFileId(fileId) @@ -105,7 +105,7 @@ func (fs *FilerSource) ReadPart(fileId string) (filename string, header http.Hea } for _, fileUrl := range fileUrls { - filename, header, resp, err = util.DownloadFile(fileUrl) + filename, header, resp, err = util.DownloadFile(fileUrl, "") if err != nil { glog.V(1).Infof("fail to read from %s: %v", fileUrl, err) } else { diff --git a/weed/s3api/s3api_object_copy_handlers.go b/weed/s3api/s3api_object_copy_handlers.go index 799483a18..60dd54152 100644 --- a/weed/s3api/s3api_object_copy_handlers.go +++ b/weed/s3api/s3api_object_copy_handlers.go @@ -62,7 +62,7 @@ func (s3a *S3ApiServer) CopyObjectHandler(w http.ResponseWriter, r *http.Request srcUrl := fmt.Sprintf("http://%s%s/%s%s", s3a.option.Filer, s3a.option.BucketsPath, srcBucket, srcObject) - _, _, resp, err := util.DownloadFile(srcUrl) + _, _, resp, err := util.DownloadFile(srcUrl, "") if err != nil { s3err.WriteErrorResponse(w, s3err.ErrInvalidCopySource, r) return diff --git a/weed/server/master_grpc_server_volume.go b/weed/server/master_grpc_server_volume.go index 314db363f..4b975a0c4 100644 --- a/weed/server/master_grpc_server_volume.go +++ b/weed/server/master_grpc_server_volume.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/chrislusf/raft" "reflect" + "strings" "sync" "time" @@ -69,7 +70,7 @@ func (ms *MasterServer) ProcessGrowRequest() { func (ms *MasterServer) LookupVolume(ctx context.Context, req *master_pb.LookupVolumeRequest) (*master_pb.LookupVolumeResponse, error) { resp := &master_pb.LookupVolumeResponse{} - volumeLocations := ms.lookupVolumeId(req.VolumeIds, req.Collection) + volumeLocations := ms.lookupVolumeId(req.VolumeOrFileIds, req.Collection) for _, result := range volumeLocations { var locations []*master_pb.Location @@ -79,10 +80,15 @@ func (ms *MasterServer) LookupVolume(ctx context.Context, req *master_pb.LookupV PublicUrl: loc.PublicUrl, }) } + var auth string + if strings.Contains(result.VolumeOrFileId, ",") { // this is a file id + auth = string(security.GenJwt(ms.guard.SigningKey, ms.guard.ExpiresAfterSec, result.VolumeOrFileId)) + } resp.VolumeIdLocations = append(resp.VolumeIdLocations, &master_pb.LookupVolumeResponse_VolumeIdLocation{ - VolumeId: result.VolumeId, - Locations: locations, - Error: result.Error, + VolumeOrFileId: result.VolumeOrFileId, + Locations: locations, + Error: result.Error, + Auth: auth, }) } diff --git a/weed/server/master_server_handlers.go b/weed/server/master_server_handlers.go index 32eb41114..2a1f6d523 100644 --- a/weed/server/master_server_handlers.go +++ b/weed/server/master_server_handlers.go @@ -86,8 +86,8 @@ func (ms *MasterServer) findVolumeLocation(collection, vid string) operation.Loo err = fmt.Errorf("volume id %s not found", vid) } ret := operation.LookupResult{ - VolumeId: vid, - Locations: locations, + VolumeOrFileId: vid, + Locations: locations, } if err != nil { ret.Error = err.Error() diff --git a/weed/server/volume_server_handlers_read.go b/weed/server/volume_server_handlers_read.go index 29428730e..5d12108d3 100644 --- a/weed/server/volume_server_handlers_read.go +++ b/weed/server/volume_server_handlers_read.go @@ -252,7 +252,7 @@ func (vs *VolumeServer) tryHandleChunkedFile(n *needle.Needle, fileName string, w.Header().Set("X-File-Store", "chunked") - chunkedFileReader := operation.NewChunkedFileReader(chunkManifest.Chunks, vs.GetMaster()) + chunkedFileReader := operation.NewChunkedFileReader(chunkManifest.Chunks, vs.GetMaster(), vs.grpcDialOption) defer chunkedFileReader.Close() rs := conditionallyResizeImages(chunkedFileReader, ext, r) diff --git a/weed/util/http_util.go b/weed/util/http_util.go index 1630760b1..2efd6b5aa 100644 --- a/weed/util/http_util.go +++ b/weed/util/http_util.go @@ -180,7 +180,7 @@ func GetUrlStream(url string, values url.Values, readFn func(io.Reader) error) e return readFn(r.Body) } -func DownloadFile(fileUrl string) (filename string, header http.Header, resp *http.Response, e error) { +func DownloadFile(fileUrl string, jwt string) (filename string, header http.Header, resp *http.Response, e error) { response, err := client.Get(fileUrl) if err != nil { return "", nil, nil, err From a8617c1a39f78f43f546755e87d895ccbcafc0fb Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 13 Aug 2021 01:54:35 -0700 Subject: [PATCH 231/265] tail volume: fix zero cookie problem from batch deletion --- weed/storage/volume_write.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/weed/storage/volume_write.go b/weed/storage/volume_write.go index a286c5dd5..ad3dad388 100644 --- a/weed/storage/volume_write.go +++ b/weed/storage/volume_write.go @@ -143,7 +143,10 @@ func (v *Volume) doWriteRequest(n *needle.Needle) (offset uint64, size Size, isU err = fmt.Errorf("reading existing needle: %v", existingNeedleReadErr) return } - if existingNeedle.Cookie != n.Cookie { + if n.Cookie == 0 { + // this is from batch deletion, and read back again when tailing a remote volume + n.Cookie = existingNeedle.Cookie + } else if existingNeedle.Cookie != n.Cookie { glog.V(0).Infof("write cookie mismatch: existing %s, new %s", needle.NewFileIdFromNeedle(v.Id, existingNeedle), needle.NewFileIdFromNeedle(v.Id, n)) err = fmt.Errorf("mismatching cookie %x", n.Cookie) From 78e8ddf910ed055d39f720f035f458edebafbd50 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 13 Aug 2021 02:09:35 -0700 Subject: [PATCH 232/265] Only when tailing volume, the zero-ed cookie should skip checking. This only happens when checkCookie == false and fsync == false. --- weed/server/volume_grpc_remote.go | 2 +- weed/server/volume_grpc_tail.go | 2 +- weed/storage/store.go | 4 ++-- weed/storage/volume_vacuum_test.go | 2 +- weed/storage/volume_write.go | 18 ++++++++++-------- weed/topology/store_replicate.go | 2 +- 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/weed/server/volume_grpc_remote.go b/weed/server/volume_grpc_remote.go index fd9db2246..5ca6619bd 100644 --- a/weed/server/volume_grpc_remote.go +++ b/weed/server/volume_grpc_remote.go @@ -48,7 +48,7 @@ func (vs *VolumeServer) FetchAndWriteNeedle(ctx context.Context, req *volume_ser // copied from *Needle.prepareWriteBuffer() n.Size = 4 + types.Size(n.DataSize) + 1 n.Checksum = needle.NewCRC(n.Data) - if _, err = vs.store.WriteVolumeNeedle(v.Id, n, false); err != nil { + if _, err = vs.store.WriteVolumeNeedle(v.Id, n, true, false); err != nil { return nil, fmt.Errorf("write needle %d size %d: %v", req.NeedleId, req.Size, err) } diff --git a/weed/server/volume_grpc_tail.go b/weed/server/volume_grpc_tail.go index 6c039ebf5..3ea902ed3 100644 --- a/weed/server/volume_grpc_tail.go +++ b/weed/server/volume_grpc_tail.go @@ -90,7 +90,7 @@ func (vs *VolumeServer) VolumeTailReceiver(ctx context.Context, req *volume_serv defer glog.V(1).Infof("receive tailing volume %d finished", v.Id) return resp, operation.TailVolumeFromSource(req.SourceVolumeServer, vs.grpcDialOption, v.Id, req.SinceNs, int(req.IdleTimeoutSeconds), func(n *needle.Needle) error { - _, err := vs.store.WriteVolumeNeedle(v.Id, n, false) + _, err := vs.store.WriteVolumeNeedle(v.Id, n, false, false) return err }) diff --git a/weed/storage/store.go b/weed/storage/store.go index c407a6081..fe3ec1912 100644 --- a/weed/storage/store.go +++ b/weed/storage/store.go @@ -332,13 +332,13 @@ func (s *Store) Close() { } } -func (s *Store) WriteVolumeNeedle(i needle.VolumeId, n *needle.Needle, fsync bool) (isUnchanged bool, err error) { +func (s *Store) WriteVolumeNeedle(i needle.VolumeId, n *needle.Needle, checkCookie bool, fsync bool) (isUnchanged bool, err error) { if v := s.findVolume(i); v != nil { if v.IsReadOnly() { err = fmt.Errorf("volume %d is read only", i) return } - _, _, isUnchanged, err = v.writeNeedle2(n, fsync && s.isStopping) + _, _, isUnchanged, err = v.writeNeedle2(n, checkCookie, fsync && s.isStopping) return } glog.V(0).Infoln("volume", i, "not found!") diff --git a/weed/storage/volume_vacuum_test.go b/weed/storage/volume_vacuum_test.go index 89fff4b2b..c9596d11d 100644 --- a/weed/storage/volume_vacuum_test.go +++ b/weed/storage/volume_vacuum_test.go @@ -129,7 +129,7 @@ func TestCompaction(t *testing.T) { } func doSomeWritesDeletes(i int, v *Volume, t *testing.T, infos []*needleInfo) { n := newRandomNeedle(uint64(i)) - _, size, _, err := v.writeNeedle2(n, false) + _, size, _, err := v.writeNeedle2(n, true, false) if err != nil { t.Fatalf("write file %d: %v", i, err) } diff --git a/weed/storage/volume_write.go b/weed/storage/volume_write.go index ad3dad388..794b1c125 100644 --- a/weed/storage/volume_write.go +++ b/weed/storage/volume_write.go @@ -91,7 +91,7 @@ func (v *Volume) asyncRequestAppend(request *needle.AsyncRequest) { v.asyncRequestsChan <- request } -func (v *Volume) syncWrite(n *needle.Needle) (offset uint64, size Size, isUnchanged bool, err error) { +func (v *Volume) syncWrite(n *needle.Needle, checkCookie bool) (offset uint64, size Size, isUnchanged bool, err error) { // glog.V(4).Infof("writing needle %s", needle.NewFileIdFromNeedle(v.Id, n).String()) actualSize := needle.GetActualSize(Size(len(n.Data)), v.Version()) @@ -103,10 +103,10 @@ func (v *Volume) syncWrite(n *needle.Needle) (offset uint64, size Size, isUnchan return } - return v.doWriteRequest(n) + return v.doWriteRequest(n, checkCookie) } -func (v *Volume) writeNeedle2(n *needle.Needle, fsync bool) (offset uint64, size Size, isUnchanged bool, err error) { +func (v *Volume) writeNeedle2(n *needle.Needle, checkCookie bool, fsync bool) (offset uint64, size Size, isUnchanged bool, err error) { // glog.V(4).Infof("writing needle %s", needle.NewFileIdFromNeedle(v.Id, n).String()) if n.Ttl == needle.EMPTY_TTL && v.Ttl != needle.EMPTY_TTL { n.SetHasTtl() @@ -114,7 +114,7 @@ func (v *Volume) writeNeedle2(n *needle.Needle, fsync bool) (offset uint64, size } if !fsync { - return v.syncWrite(n) + return v.syncWrite(n, checkCookie) } else { asyncRequest := needle.NewAsyncRequest(n, true) // using len(n.Data) here instead of n.Size before n.Size is populated in n.Append() @@ -127,7 +127,7 @@ func (v *Volume) writeNeedle2(n *needle.Needle, fsync bool) (offset uint64, size } } -func (v *Volume) doWriteRequest(n *needle.Needle) (offset uint64, size Size, isUnchanged bool, err error) { +func (v *Volume) doWriteRequest(n *needle.Needle, checkCookie bool) (offset uint64, size Size, isUnchanged bool, err error) { // glog.V(4).Infof("writing needle %s", needle.NewFileIdFromNeedle(v.Id, n).String()) if v.isFileUnchanged(n) { size = Size(n.DataSize) @@ -143,10 +143,12 @@ func (v *Volume) doWriteRequest(n *needle.Needle) (offset uint64, size Size, isU err = fmt.Errorf("reading existing needle: %v", existingNeedleReadErr) return } - if n.Cookie == 0 { + if n.Cookie == 0 && !checkCookie { // this is from batch deletion, and read back again when tailing a remote volume + // which only happens when checkCookie == false and fsync == false n.Cookie = existingNeedle.Cookie - } else if existingNeedle.Cookie != n.Cookie { + } + if existingNeedle.Cookie != n.Cookie { glog.V(0).Infof("write cookie mismatch: existing %s, new %s", needle.NewFileIdFromNeedle(v.Id, existingNeedle), needle.NewFileIdFromNeedle(v.Id, n)) err = fmt.Errorf("mismatching cookie %x", n.Cookie) @@ -274,7 +276,7 @@ func (v *Volume) startWorker() { for i := 0; i < len(currentRequests); i++ { if currentRequests[i].IsWriteRequest { - offset, size, isUnchanged, err := v.doWriteRequest(currentRequests[i].N) + offset, size, isUnchanged, err := v.doWriteRequest(currentRequests[i].N, true) currentRequests[i].UpdateResult(offset, uint64(size), isUnchanged, err) } else { size, err := v.doDeleteRequest(currentRequests[i].N) diff --git a/weed/topology/store_replicate.go b/weed/topology/store_replicate.go index 061c5a12c..b114b468d 100644 --- a/weed/topology/store_replicate.go +++ b/weed/topology/store_replicate.go @@ -42,7 +42,7 @@ func ReplicatedWrite(masterFn operation.GetMasterFn, grpcDialOption grpc.DialOpt } if s.GetVolume(volumeId) != nil { - isUnchanged, err = s.WriteVolumeNeedle(volumeId, n, fsync) + isUnchanged, err = s.WriteVolumeNeedle(volumeId, n, true, fsync) if err != nil { err = fmt.Errorf("failed to write to local disk: %v", err) glog.V(0).Infoln(err) From 333cdce485ee5389306527cc8c1b40fdcf884137 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 13 Aug 2021 02:57:14 -0700 Subject: [PATCH 233/265] add verbose message --- weed/shell/command_volume_fsck.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/weed/shell/command_volume_fsck.go b/weed/shell/command_volume_fsck.go index 27c253209..9e778b918 100644 --- a/weed/shell/command_volume_fsck.go +++ b/weed/shell/command_volume_fsck.go @@ -313,6 +313,9 @@ func (c *commandVolumeFsck) collectFilerFileIds(tempFolder string, volumeIdToSer }, func(entry *filer_pb.FullEntry, outputChan chan interface{}) (err error) { dChunks, mChunks, resolveErr := filer.ResolveChunkManifest(filer.LookupFn(c.env), entry.Entry.Chunks, 0, math.MaxInt64) if resolveErr != nil { + if verbose { + fmt.Fprintf(writer, "resolving manifest chunks in %s: %v\n", util.NewFullPath(entry.Dir, entry.Entry.Name), resolveErr) + } return nil } dChunks = append(dChunks, mChunks...) From 0f7d4556d839ffc9d0dcfbc965e3b970cb30c77d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 13 Aug 2021 03:09:28 -0700 Subject: [PATCH 234/265] shell: volume.tier.move makes up changes if volume move failed --- weed/shell/command_ec_encode.go | 24 +----------------------- weed/shell/command_volume_move.go | 11 +++++++++++ weed/shell/command_volume_tier_move.go | 9 ++++++++- weed/shell/command_volume_tier_upload.go | 2 +- 4 files changed, 21 insertions(+), 25 deletions(-) diff --git a/weed/shell/command_ec_encode.go b/weed/shell/command_ec_encode.go index 8480bab06..014b9bab7 100644 --- a/weed/shell/command_ec_encode.go +++ b/weed/shell/command_ec_encode.go @@ -100,7 +100,7 @@ func doEcEncode(commandEnv *CommandEnv, collection string, vid needle.VolumeId, // fmt.Printf("found ec %d shards on %v\n", vid, locations) // mark the volume as readonly - err = markVolumeReadonly(commandEnv.option.GrpcDialOption, vid, locations) + err = markVolumeReplicasWritable(commandEnv.option.GrpcDialOption, vid, locations, false) if err != nil { return fmt.Errorf("mark volume %d as readonly on %s: %v", vid, locations[0].Url, err) } @@ -120,28 +120,6 @@ func doEcEncode(commandEnv *CommandEnv, collection string, vid needle.VolumeId, return nil } -func markVolumeReadonly(grpcDialOption grpc.DialOption, volumeId needle.VolumeId, locations []wdclient.Location) error { - - for _, location := range locations { - - fmt.Printf("markVolumeReadonly %d on %s ...\n", volumeId, location.Url) - - err := operation.WithVolumeServerClient(location.Url, grpcDialOption, func(volumeServerClient volume_server_pb.VolumeServerClient) error { - _, markErr := volumeServerClient.VolumeMarkReadonly(context.Background(), &volume_server_pb.VolumeMarkReadonlyRequest{ - VolumeId: uint32(volumeId), - }) - return markErr - }) - - if err != nil { - return err - } - - } - - return nil -} - func generateEcShards(grpcDialOption grpc.DialOption, volumeId needle.VolumeId, collection string, sourceVolumeServer string) error { fmt.Printf("generateEcShards %s %d on %s ...\n", collection, volumeId, sourceVolumeServer) diff --git a/weed/shell/command_volume_move.go b/weed/shell/command_volume_move.go index 666e3e867..db212fe3f 100644 --- a/weed/shell/command_volume_move.go +++ b/weed/shell/command_volume_move.go @@ -4,6 +4,7 @@ import ( "context" "flag" "fmt" + "github.com/chrislusf/seaweedfs/weed/wdclient" "io" "log" "time" @@ -190,3 +191,13 @@ func markVolumeWritable(grpcDialOption grpc.DialOption, volumeId needle.VolumeId return err }) } + +func markVolumeReplicasWritable(grpcDialOption grpc.DialOption, volumeId needle.VolumeId, locations []wdclient.Location, writable bool) error { + for _, location := range locations { + fmt.Printf("markVolumeReadonly %d on %s ...\n", volumeId, location.Url) + if err:= markVolumeWritable(grpcDialOption, volumeId, location.Url, writable); err != nil { + return err + } + } + return nil +} diff --git a/weed/shell/command_volume_tier_move.go b/weed/shell/command_volume_tier_move.go index 9719b442d..c72958259 100644 --- a/weed/shell/command_volume_tier_move.go +++ b/weed/shell/command_volume_tier_move.go @@ -3,6 +3,7 @@ package shell import ( "flag" "fmt" + "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/master_pb" "github.com/chrislusf/seaweedfs/weed/storage/types" "github.com/chrislusf/seaweedfs/weed/wdclient" @@ -172,10 +173,16 @@ func (c *commandVolumeTierMove) doVolumeTierMove(commandEnv *CommandEnv, writer func (c *commandVolumeTierMove) doMoveOneVolume(commandEnv *CommandEnv, writer io.Writer, vid needle.VolumeId, toDiskType types.DiskType, locations []wdclient.Location, sourceVolumeServer string, dst location) (err error) { // mark all replicas as read only - if err = markVolumeReadonly(commandEnv.option.GrpcDialOption, vid, locations); err != nil { + if err = markVolumeReplicasWritable(commandEnv.option.GrpcDialOption, vid, locations, false); err != nil { return fmt.Errorf("mark volume %d as readonly on %s: %v", vid, locations[0].Url, err) } if err = LiveMoveVolume(commandEnv.option.GrpcDialOption, writer, vid, sourceVolumeServer, dst.dataNode.Id, 5*time.Second, toDiskType.ReadableString(), true); err != nil { + + // mark all replicas as writable + if err = markVolumeReplicasWritable(commandEnv.option.GrpcDialOption, vid, locations, true); err != nil { + glog.Errorf("mark volume %d as writable on %s: %v", vid, locations[0].Url, err) + } + return fmt.Errorf("move volume %d %s => %s : %v", vid, locations[0].Url, dst.dataNode.Id, err) } diff --git a/weed/shell/command_volume_tier_upload.go b/weed/shell/command_volume_tier_upload.go index f92cdc3e4..c8540a7dc 100644 --- a/weed/shell/command_volume_tier_upload.go +++ b/weed/shell/command_volume_tier_upload.go @@ -101,7 +101,7 @@ func doVolumeTierUpload(commandEnv *CommandEnv, writer io.Writer, collection str return fmt.Errorf("volume %d not found", vid) } - err = markVolumeReadonly(commandEnv.option.GrpcDialOption, needle.VolumeId(vid), locations) + err = markVolumeReplicasWritable(commandEnv.option.GrpcDialOption, needle.VolumeId(vid), locations, false) if err != nil { return fmt.Errorf("mark volume %d as readonly on %s: %v", vid, locations[0].Url, err) } From f4decf02dff3aa6df9e9d75646abc58abca35e72 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 13 Aug 2021 03:24:21 -0700 Subject: [PATCH 235/265] volume copying: clean up stale volume data files fix https://github.com/chrislusf/seaweedfs/issues/2250 --- weed/server/volume_grpc_copy.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/weed/server/volume_grpc_copy.go b/weed/server/volume_grpc_copy.go index 086591e97..2ad77a7ff 100644 --- a/weed/server/volume_grpc_copy.go +++ b/weed/server/volume_grpc_copy.go @@ -69,16 +69,25 @@ func (vs *VolumeServer) VolumeCopy(ctx context.Context, req *volume_server_pb.Vo ioutil.WriteFile(dataBaseFileName+".note", []byte(fmt.Sprintf("copying from %s", req.SourceDataNode)), 0755) + defer func() { + if err != nil { + os.Remove(dataBaseFileName + ".dat") + os.Remove(indexBaseFileName + ".idx") + os.Remove(dataBaseFileName + ".vif") + os.Remove(dataBaseFileName + ".note") + } + }() + // println("source:", volFileInfoResp.String()) - if err := vs.doCopyFile(client, false, req.Collection, req.VolumeId, volFileInfoResp.CompactionRevision, volFileInfoResp.DatFileSize, dataBaseFileName, ".dat", false, true); err != nil { + if err = vs.doCopyFile(client, false, req.Collection, req.VolumeId, volFileInfoResp.CompactionRevision, volFileInfoResp.DatFileSize, dataBaseFileName, ".dat", false, true); err != nil { return err } - if err := vs.doCopyFile(client, false, req.Collection, req.VolumeId, volFileInfoResp.CompactionRevision, volFileInfoResp.IdxFileSize, indexBaseFileName, ".idx", false, false); err != nil { + if err = vs.doCopyFile(client, false, req.Collection, req.VolumeId, volFileInfoResp.CompactionRevision, volFileInfoResp.IdxFileSize, indexBaseFileName, ".idx", false, false); err != nil { return err } - if err := vs.doCopyFile(client, false, req.Collection, req.VolumeId, volFileInfoResp.CompactionRevision, volFileInfoResp.DatFileSize, dataBaseFileName, ".vif", false, true); err != nil { + if err = vs.doCopyFile(client, false, req.Collection, req.VolumeId, volFileInfoResp.CompactionRevision, volFileInfoResp.DatFileSize, dataBaseFileName, ".vif", false, true); err != nil { return err } From b961fcd338c1499fd8f1de9a7e77da4e127dfe65 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 13 Aug 2021 11:00:11 -0700 Subject: [PATCH 236/265] filer: stream read from volume server, reduce memory usage --- weed/filer/filechunk_manifest.go | 35 ++++++++++++++++++++++++++++++++ weed/filer/stream.go | 10 ++------- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/weed/filer/filechunk_manifest.go b/weed/filer/filechunk_manifest.go index 0c6b0cfe3..2115e7856 100644 --- a/weed/filer/filechunk_manifest.go +++ b/weed/filer/filechunk_manifest.go @@ -132,6 +132,41 @@ func retriedFetchChunkData(urlStrings []string, cipherKey []byte, isGzipped bool } +func retriedStreamFetchChunkData(writer io.Writer, urlStrings []string, cipherKey []byte, isGzipped bool, isFullChunk bool, offset int64, size int) (err error) { + + var shouldRetry bool + var written int + + for waitTime := time.Second; waitTime < util.RetryWaitTime; waitTime += waitTime / 2 { + for _, urlString := range urlStrings { + shouldRetry, err = util.ReadUrlAsStream(urlString+"?readDeleted=true", cipherKey, isGzipped, isFullChunk, offset, size, func(data []byte) { + writer.Write(data) + written += len(data) + }) + if !shouldRetry { + break + } + if err != nil { + glog.V(0).Infof("read %s failed, err: %v", urlString, err) + if written > 0 { + break + } + } else { + break + } + } + if err != nil && shouldRetry && written > 0 { + glog.V(0).Infof("retry reading in %v", waitTime) + time.Sleep(waitTime) + } else { + break + } + } + + return err + +} + func MaybeManifestize(saveFunc SaveDataAsChunkFunctionType, inputChunks []*filer_pb.FileChunk) (chunks []*filer_pb.FileChunk, err error) { return doMaybeManifestize(saveFunc, inputChunks, ManifestBatch, mergeIntoManifest) } diff --git a/weed/filer/stream.go b/weed/filer/stream.go index 503e6b23f..c61ee3c12 100644 --- a/weed/filer/stream.go +++ b/weed/filer/stream.go @@ -16,7 +16,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/wdclient" ) -func StreamContent(masterClient wdclient.HasLookupFileIdFunction, w io.Writer, chunks []*filer_pb.FileChunk, offset int64, size int64) error { +func StreamContent(masterClient wdclient.HasLookupFileIdFunction, writer io.Writer, chunks []*filer_pb.FileChunk, offset int64, size int64) error { glog.V(9).Infof("start to stream content for chunks: %+v\n", chunks) chunkViews := ViewFromChunks(masterClient.GetLookupFileIdFunction(), chunks, offset, size) @@ -40,18 +40,12 @@ func StreamContent(masterClient wdclient.HasLookupFileIdFunction, w io.Writer, c urlStrings := fileId2Url[chunkView.FileId] start := time.Now() - data, err := retriedFetchChunkData(urlStrings, chunkView.CipherKey, chunkView.IsGzipped, chunkView.IsFullChunk(), chunkView.Offset, int(chunkView.Size)) + err := retriedStreamFetchChunkData(writer, urlStrings, chunkView.CipherKey, chunkView.IsGzipped, chunkView.IsFullChunk(), chunkView.Offset, int(chunkView.Size)) stats.FilerRequestHistogram.WithLabelValues("chunkDownload").Observe(time.Since(start).Seconds()) if err != nil { stats.FilerRequestCounter.WithLabelValues("chunkDownloadError").Inc() return fmt.Errorf("read chunk: %v", err) } - - _, err = w.Write(data) - if err != nil { - stats.FilerRequestCounter.WithLabelValues("chunkDownloadedError").Inc() - return fmt.Errorf("write chunk: %v", err) - } stats.FilerRequestCounter.WithLabelValues("chunkDownload").Inc() } From 2d519c6cb6b2630435142dd6abdc8e5eeb30cd4a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 13 Aug 2021 11:13:30 -0700 Subject: [PATCH 237/265] adjust the retry logic --- weed/filer/filechunk_manifest.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/weed/filer/filechunk_manifest.go b/weed/filer/filechunk_manifest.go index 2115e7856..dbc851496 100644 --- a/weed/filer/filechunk_manifest.go +++ b/weed/filer/filechunk_manifest.go @@ -143,6 +143,7 @@ func retriedStreamFetchChunkData(writer io.Writer, urlStrings []string, cipherKe writer.Write(data) written += len(data) }) + shouldRetry = shouldRetry && written == 0 if !shouldRetry { break } @@ -155,7 +156,7 @@ func retriedStreamFetchChunkData(writer io.Writer, urlStrings []string, cipherKe break } } - if err != nil && shouldRetry && written > 0 { + if err != nil && shouldRetry { glog.V(0).Infof("retry reading in %v", waitTime) time.Sleep(waitTime) } else { From e02a317d3d61bdb6fa01e4647edc75522ab1b402 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 13 Aug 2021 11:30:38 -0700 Subject: [PATCH 238/265] adjust retry logic in case some data is partially written --- weed/filer/filechunk_manifest.go | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/weed/filer/filechunk_manifest.go b/weed/filer/filechunk_manifest.go index dbc851496..8853db60a 100644 --- a/weed/filer/filechunk_manifest.go +++ b/weed/filer/filechunk_manifest.go @@ -135,23 +135,30 @@ func retriedFetchChunkData(urlStrings []string, cipherKey []byte, isGzipped bool func retriedStreamFetchChunkData(writer io.Writer, urlStrings []string, cipherKey []byte, isGzipped bool, isFullChunk bool, offset int64, size int) (err error) { var shouldRetry bool - var written int + var totalWritten int for waitTime := time.Second; waitTime < util.RetryWaitTime; waitTime += waitTime / 2 { for _, urlString := range urlStrings { + var localProcesed int shouldRetry, err = util.ReadUrlAsStream(urlString+"?readDeleted=true", cipherKey, isGzipped, isFullChunk, offset, size, func(data []byte) { + if totalWritten > localProcesed { + toBeSkipped := totalWritten - localProcesed + if len(data) <= toBeSkipped { + localProcesed += len(data) + return // skip if already processed + } + data = data[len(data)-toBeSkipped:] + localProcesed += toBeSkipped + } writer.Write(data) - written += len(data) + localProcesed += len(data) + totalWritten += len(data) }) - shouldRetry = shouldRetry && written == 0 if !shouldRetry { break } if err != nil { glog.V(0).Infof("read %s failed, err: %v", urlString, err) - if written > 0 { - break - } } else { break } From 0c66b173a4b50dd4589fa16a521d52060cbe5c16 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 13 Aug 2021 11:31:43 -0700 Subject: [PATCH 239/265] fix --- weed/filer/filechunk_manifest.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/filer/filechunk_manifest.go b/weed/filer/filechunk_manifest.go index 8853db60a..00dbf1fd6 100644 --- a/weed/filer/filechunk_manifest.go +++ b/weed/filer/filechunk_manifest.go @@ -147,7 +147,7 @@ func retriedStreamFetchChunkData(writer io.Writer, urlStrings []string, cipherKe localProcesed += len(data) return // skip if already processed } - data = data[len(data)-toBeSkipped:] + data = data[toBeSkipped:] localProcesed += toBeSkipped } writer.Write(data) From 7937db52e1a6b8be0e04da0b2ed9d62284fa2698 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 02:54:13 -0700 Subject: [PATCH 240/265] Filer locationPrefix configure does not exec replication #2257 fix https://github.com/chrislusf/seaweedfs/issues/2257 --- weed/command/master.go | 2 +- weed/command/server.go | 2 +- weed/server/filer_server_handlers_write.go | 23 +++++++++------------- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/weed/command/master.go b/weed/command/master.go index bed55e334..4eb43ee09 100644 --- a/weed/command/master.go +++ b/weed/command/master.go @@ -54,7 +54,7 @@ func init() { m.volumeSizeLimitMB = cmdMaster.Flag.Uint("volumeSizeLimitMB", 30*1000, "Master stops directing writes to oversized volumes.") m.volumePreallocate = cmdMaster.Flag.Bool("volumePreallocate", false, "Preallocate disk space for volumes.") // m.pulseSeconds = cmdMaster.Flag.Int("pulseSeconds", 5, "number of seconds between heartbeats") - m.defaultReplication = cmdMaster.Flag.String("defaultReplication", "000", "Default replication type if not specified.") + m.defaultReplication = cmdMaster.Flag.String("defaultReplication", "", "Default replication type if not specified.") m.garbageThreshold = cmdMaster.Flag.Float64("garbageThreshold", 0.3, "threshold to vacuum and reclaim spaces") m.whiteList = cmdMaster.Flag.String("whiteList", "", "comma separated Ip addresses having write permission. No limit if empty.") m.disableHttp = cmdMaster.Flag.Bool("disableHttp", false, "disable http requests, only gRPC operations are allowed.") diff --git a/weed/command/server.go b/weed/command/server.go index fe10b24f7..c784d90b9 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -89,7 +89,7 @@ func init() { masterOptions.peers = cmdServer.Flag.String("master.peers", "", "all master nodes in comma separated ip:masterPort list") masterOptions.volumeSizeLimitMB = cmdServer.Flag.Uint("master.volumeSizeLimitMB", 30*1000, "Master stops directing writes to oversized volumes.") masterOptions.volumePreallocate = cmdServer.Flag.Bool("master.volumePreallocate", false, "Preallocate disk space for volumes.") - masterOptions.defaultReplication = cmdServer.Flag.String("master.defaultReplication", "000", "Default replication type if not specified.") + masterOptions.defaultReplication = cmdServer.Flag.String("master.defaultReplication", "", "Default replication type if not specified.") masterOptions.garbageThreshold = cmdServer.Flag.Float64("garbageThreshold", 0.3, "threshold to vacuum and reclaim spaces") masterOptions.metricsAddress = cmdServer.Flag.String("metrics.address", "", "Prometheus gateway address") masterOptions.metricsIntervalSec = cmdServer.Flag.Int("metrics.intervalSeconds", 15, "Prometheus push interval in seconds") diff --git a/weed/server/filer_server_handlers_write.go b/weed/server/filer_server_handlers_write.go index 8d11e664a..39d983ab7 100644 --- a/weed/server/filer_server_handlers_write.go +++ b/weed/server/filer_server_handlers_write.go @@ -116,18 +116,6 @@ func (fs *FilerServer) DeleteHandler(w http.ResponseWriter, r *http.Request) { } func (fs *FilerServer) detectStorageOption(requestURI, qCollection, qReplication string, ttlSeconds int32, diskType, dataCenter, rack string) (*operation.StorageOption, error) { - collection := util.Nvl(qCollection, fs.option.Collection) - replication := util.Nvl(qReplication, fs.option.DefaultReplication) - - // required by buckets folder - bucketDefaultReplication, fsync := "", false - if strings.HasPrefix(requestURI, fs.filer.DirBucketsPath+"/") { - collection = fs.filer.DetectBucket(util.FullPath(requestURI)) - bucketDefaultReplication, fsync = fs.filer.ReadBucketOption(collection) - } - if replication == "" { - replication = bucketDefaultReplication - } rule := fs.filer.FilerConf.MatchStorageRule(requestURI) @@ -135,6 +123,13 @@ func (fs *FilerServer) detectStorageOption(requestURI, qCollection, qReplication return nil, ErrReadOnly } + // required by buckets folder + bucketDefaultCollection, bucketDefaultReplication, fsync := "", "", false + if strings.HasPrefix(requestURI, fs.filer.DirBucketsPath+"/") { + bucketDefaultCollection = fs.filer.DetectBucket(util.FullPath(requestURI)) + bucketDefaultReplication, fsync = fs.filer.ReadBucketOption(bucketDefaultCollection) + } + if ttlSeconds == 0 { ttl, err := needle.ReadTTL(rule.GetTtl()) if err != nil { @@ -144,8 +139,8 @@ func (fs *FilerServer) detectStorageOption(requestURI, qCollection, qReplication } return &operation.StorageOption{ - Replication: util.Nvl(replication, rule.Replication), - Collection: util.Nvl(collection, rule.Collection), + Replication: util.Nvl(qReplication, rule.Replication, bucketDefaultReplication, fs.option.DefaultReplication), + Collection: util.Nvl(qCollection, rule.Collection, bucketDefaultCollection, fs.option.Collection), DataCenter: util.Nvl(dataCenter, fs.option.DataCenter), Rack: util.Nvl(rack, fs.option.Rack), TtlSeconds: ttlSeconds, From 0db251799457849ff9d9e4839cb3efb438c93e14 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 02:55:44 -0700 Subject: [PATCH 241/265] go fmt --- weed/command/master_follower.go | 2 -- weed/replication/source/filer_source.go | 2 +- weed/shell/command_volume_move.go | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/weed/command/master_follower.go b/weed/command/master_follower.go index 949743b3e..b628f7abf 100644 --- a/weed/command/master_follower.go +++ b/weed/command/master_follower.go @@ -109,11 +109,9 @@ func startMasterFollower(masterOptions MasterOptions) { return } - option := masterOptions.toMasterOption(nil) option.IsFollower = true - r := mux.NewRouter() ms := weed_server.NewMasterServer(r, option, masters) listeningAddress := *masterOptions.ipBind + ":" + strconv.Itoa(*masterOptions.port) diff --git a/weed/replication/source/filer_source.go b/weed/replication/source/filer_source.go index 085c0a700..60c33463f 100644 --- a/weed/replication/source/filer_source.go +++ b/weed/replication/source/filer_source.go @@ -96,7 +96,7 @@ func (fs *FilerSource) LookupFileId(part string) (fileUrls []string, err error) func (fs *FilerSource) ReadPart(fileId string) (filename string, header http.Header, resp *http.Response, err error) { if fs.proxyByFiler { - return util.DownloadFile("http://" + fs.address + "/?proxyChunkId=" + fileId, "") + return util.DownloadFile("http://"+fs.address+"/?proxyChunkId="+fileId, "") } fileUrls, err := fs.LookupFileId(fileId) diff --git a/weed/shell/command_volume_move.go b/weed/shell/command_volume_move.go index db212fe3f..3dcf41354 100644 --- a/weed/shell/command_volume_move.go +++ b/weed/shell/command_volume_move.go @@ -195,7 +195,7 @@ func markVolumeWritable(grpcDialOption grpc.DialOption, volumeId needle.VolumeId func markVolumeReplicasWritable(grpcDialOption grpc.DialOption, volumeId needle.VolumeId, locations []wdclient.Location, writable bool) error { for _, location := range locations { fmt.Printf("markVolumeReadonly %d on %s ...\n", volumeId, location.Url) - if err:= markVolumeWritable(grpcDialOption, volumeId, location.Url, writable); err != nil { + if err := markVolumeWritable(grpcDialOption, volumeId, location.Url, writable); err != nil { return err } } From 8126ab4b5d7204ffcba364e14e857c498e4afe55 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 05:03:45 -0700 Subject: [PATCH 242/265] rename --- weed/server/master_grpc_server.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/weed/server/master_grpc_server.go b/weed/server/master_grpc_server.go index 166432c28..afd479b21 100644 --- a/weed/server/master_grpc_server.go +++ b/weed/server/master_grpc_server.go @@ -176,9 +176,9 @@ func (ms *MasterServer) SendHeartbeat(stream master_pb.Seaweed_SendHeartbeatServ // And clients gets the up-to-date list of volume locations func (ms *MasterServer) KeepConnected(stream master_pb.Seaweed_KeepConnectedServer) error { - req, err := stream.Recv() - if err != nil { - return err + req, recvErr := stream.Recv() + if recvErr != nil { + return recvErr } if !ms.Topo.IsLeader() { @@ -195,8 +195,8 @@ func (ms *MasterServer) KeepConnected(stream master_pb.Seaweed_KeepConnectedServ defer ms.deleteClient(clientName) for _, message := range ms.Topo.ToVolumeLocations() { - if err := stream.Send(message); err != nil { - return err + if sendErr := stream.Send(message); sendErr != nil { + return sendErr } } From 4909bd968405e33b0250a582081586d804a190a4 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 05:06:44 -0700 Subject: [PATCH 243/265] gRpc connection error on filer when no volume left #2243 fix https://github.com/chrislusf/seaweedfs/issues/2243 grpc do not cache connections only when connection problem happens. Normal error results should not close the shared grpc connection. --- weed/pb/grpc_client_server.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/weed/pb/grpc_client_server.go b/weed/pb/grpc_client_server.go index 15dc917e9..53935858e 100644 --- a/weed/pb/grpc_client_server.go +++ b/weed/pb/grpc_client_server.go @@ -119,9 +119,7 @@ func WithCachedGrpcClient(fn func(*grpc.ClientConn) error, address string, opts } executionErr := fn(vgc.ClientConn) if executionErr != nil { - vgc.errCount++ - if vgc.errCount > 3 || - strings.Contains(executionErr.Error(), "transport") || + if strings.Contains(executionErr.Error(), grpc.ErrServerStopped) || strings.Contains(executionErr.Error(), "connection closed") { grpcClientsLock.Lock() if t, ok := grpcClients[address]; ok { From 08258a819d355883ec102e1a3dc6f1e7a1c5f1b4 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 05:10:30 -0700 Subject: [PATCH 244/265] fix mistake --- weed/pb/grpc_client_server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/pb/grpc_client_server.go b/weed/pb/grpc_client_server.go index 53935858e..8543df366 100644 --- a/weed/pb/grpc_client_server.go +++ b/weed/pb/grpc_client_server.go @@ -119,7 +119,7 @@ func WithCachedGrpcClient(fn func(*grpc.ClientConn) error, address string, opts } executionErr := fn(vgc.ClientConn) if executionErr != nil { - if strings.Contains(executionErr.Error(), grpc.ErrServerStopped) || + if strings.Contains(executionErr.Error(), "transport") || strings.Contains(executionErr.Error(), "connection closed") { grpcClientsLock.Lock() if t, ok := grpcClients[address]; ok { From 68b166727263dd0f3d59612cafcbc3ca87db0cdc Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 06:18:23 -0700 Subject: [PATCH 245/265] Added SeaweedFS_LogicalStructure.png --- note/SeaweedFS_LogicalStructure.png | Bin 0 -> 621 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 note/SeaweedFS_LogicalStructure.png diff --git a/note/SeaweedFS_LogicalStructure.png b/note/SeaweedFS_LogicalStructure.png new file mode 100644 index 0000000000000000000000000000000000000000..1f4c208f13b76dc30d090e946538dfccd63503ea GIT binary patch literal 621 zcmYjPJ#U*(6n%-*s!A29OQou+)Cnmaf_U$lI2rjcHVP2O1{`;BFn)$-W57V_*kiW* zl@3v-E?qlx>ee68f6+^ErApkda}P)NUU=*~-Q%OTM+l)~v!@Rr9@O^YIr#UlzdzPR zIq0hB>F2xO2pztvIycqoe$Eqy1gbTeK%_V;D}m|)AwiytGaf`muqwrrRRBSMmCg8^ zvsuF-62Yg^`6+I>mzlCzn0fwgjRpIA}yENxc8E%8DG{kp-bAZpP5QlGXXDK8W}SYFBM z8C#bPr`qPM;Y7TO@1`|MJ8;td?Lda_uVwCxNhD`hsF9#F+sbI?!{#;J+xcX-#v4n@ z%57hFTq$)t*C#%hRTh1#)!l^rF7&9g^-amP6USTl*jtP@c4RF4twMT*W{mM#iOOMw zi_OqdxuTEV;5s5>tSI$}^#j*3{!R9GOsMxCpLV`{jlaQ<^3v25_suB0MTZDILkFLK Q{kR4gnH@)eQg0vr0DuRo{r~^~ literal 0 HcmV?d00001 From 8ea9a2434d74e7e3eab5a3d23fce57e137ff3fb8 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 06:20:02 -0700 Subject: [PATCH 246/265] Added SeaweedFS_RemoteMount.png --- note/SeaweedFS_RemoteMount.png | Bin 0 -> 785 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 note/SeaweedFS_RemoteMount.png diff --git a/note/SeaweedFS_RemoteMount.png b/note/SeaweedFS_RemoteMount.png new file mode 100644 index 0000000000000000000000000000000000000000..8cdf38ea2a9186573da25ca1cb916067fdffa69d GIT binary patch literal 785 zcmYjPJ8s)R5Ty+y2pqUf5Cj2I5pW6-TrO9%N>L;wN?uYDWlL6Luf(s#k4(~*r81q* zkQ=0Ml_R7`l`e-!p95rQDnN>z&)YYHnYa5mw7SPf?~gc+J2rdT82mwXUcChS@y++g zDk;WYm3#X6;Wx(}ek=7^nLPMW>~TEq)DbU$TuUEXY|>2&q>B1ouhi zMt7f!fw)3yy0L&iD5fdo6W6W*=#OVBHt_`zt0Ap zL?^&TV!`^e{&}_u4V~ySIl9q$g968MVy|Ln)asqd_=1)}H=Yr7q~>DgoYQk=XqK*E z>Mkzbi;l829c0sa?C!=72+3k$+P6l+?yarlp000WcS!T5&dPL58NEf9(S}lI6)f-N zU>4fTspuzJIx{z0(0nqz^TQq4K{(%?(!#ZsUNA{7m9>n;vHu_kVkH8G7d8H=_besk q`wxnB`|X!M@R?tmT6^+ty1eENIqn5_@b%Y^5x|_OTiTO){rN9~Al+I3 literal 0 HcmV?d00001 From 561bea954dfe428b97e3d83764e16edf922f8e0e Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 07:23:23 -0700 Subject: [PATCH 247/265] Update SeaweedFS_RemoteMount.png --- note/SeaweedFS_RemoteMount.png | Bin 785 -> 69032 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/SeaweedFS_RemoteMount.png b/note/SeaweedFS_RemoteMount.png index 8cdf38ea2a9186573da25ca1cb916067fdffa69d..27fc3cbf38d022e98cff02d0891fc9529526e407 100644 GIT binary patch literal 69032 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⪻}*z%^i z*9V7O`e+hTU)@d6N>mplGra1Avg%qtofa+;?C+OWLef$0Kp&8Ecv?djRvMypx%8=2 zjdu5oEjMTL%!xJ@PDPbJE)FQ^$vo#OuqTv%xjkUKdrym#4B9LI}q;BKLwy_Z`QuGDE8PTCgZCxgasZ`)EAq0Y9!#GW96Zrs-Y3_hod>p&ruOw?4ZMoow+N#8E8 z^4{^YRY7XCwD9}lZp4%zGgN_7(Lyz*taM?|gCJo3F~x>O!=)6Tx=jvsF{c#qs`%S3 zMN@LBz@C_#Oe-v`=au;RvxKT9RG5qJi{??;+AZ+C{{whpL;S>;{JPm3U*5kwJ~JL? zxnkeZN76aLbYrEktAWX>AE@^af=pPB?I2rUX4fQ_^Hk z34O>$ zpgjHaoH0rG`hK&j)}_FQRuJHOQ?w*9zA)c-Qk6U*zYljsgysSWTQljI zj&5{L6T1f@J`&{f`!Zpb)s^EeJ0G%$4)2@6tI$`dF(m9?0(RxP>&C~* zSOS6upyMbi>1CE<<8D`{9;RvsCwO;jeA03OWHA#gP#BuD^o7 z#|0Z~K+lJ!V)xs>hwR7tWx{BG8$22P+0)UyM1sB1!%Sd6Rb1KvbljqCT=NhZu6DHr z*8MfC-Gcwci;rRa-Mj^t7G;k^y#&VH8>P9>8$5~OuYQT%cZuaq(!viUa+Fk|qwsM>c)u*BfWOnd^dPlQXIaKs7@Y-ju_|2JS!tM5V;=>tz-Ue)M~#oVJg-KZ9YsMNhmv6I=O@XyN2Pty)^E7c7)* zdp_5DcDf8UJge_Ux5jqc?{`^RE;k=M`)mKm;`|J^&FUTgr8m%`d&P0Tf!A^~Q2lAo znXvWK9${Sh6Y*PLKOz?da_Wvhi*Qzc7+}Giqn-l8$V&&%UWyj<21-|xU28^M{qx6p zRPM zOfRpbxrf4%crqWV&G{*B7D%Hh#fWj(vckD&-!GdTdza`mt6bjt-PRLxndSWD`LM{6 z7W(wzkd}dtjj5Xq@;xF^g8&3*wj_IXJu1PZsiZB$Tv1j;UNoHxD=Ee3FzZ zA`5`Gk+ekHJDMY6F5VO#&bxVYRxfU}T^-mWEt0ThAmB^rakq)k?_s9*)O38;*`VjC z#lLq{2cqA*p!W6$7UsmAM6l?EjK=e1#3pQ(9KNc2`w6P)EEoH8TDm$q-c&)=ZOUJ4 zbq}la>R}Bt@GB*z&A7zNOG?dU(9reK_78erRXa6sI0zRl$LDxM;}wnn=T87;6MhO6 zKK}7A@Gz3{&Mx=7xCfN$qdwZW$;qiHe?0?(*7;^VmeT2~k}ZS3e_byFmW<~EH|<24 zZv&J_#7UVGCmaqdwi2gv)@T29ocwbpbPS?OpB*j*>bbd{HUKdi3O2C58cgdQ_TI0B zRe0>rz6U9CFPxppGXupAQ)v!kG&Jm%=n+fXhX_Nq7Ay*P$F`4|;oDJ3`86$7f}?`` z1~@*VE{E{aZnhs-sFACxw8R$l-F$FD;1QbYHfME6oB8Vro*4EZ{_l~*PXH1+0C`$(^fCYEU<8camqsoi>*tTA5U#suzdtKSt-BUNvC-O`n4EkET2izf06)`Y zUOv7FE{=!o9U&)gHbfEGQz+ZVsY2K729I<6mh)!A&^*C<6;p>MqV>cnCc)|{jS!NwShNFs}jSU0Tg(0e^|rW znrpV?2^ki?SPlMW*y9=}9?@Q^6ZWY};gnLGjOUwjS8$3dsBoo~^AbmI`Ri7kP&g zbfSec2?Yi8M+&{r`#ya`!v_?|ZtABRRPavpC5HBQa5&|+w8%JnQAC;|AyCn0PPcB% zi}!)q7?Kq#2MZCoq1PCqe|I+@-i`9@KY`a0JsLCETKdM{r+d3{?fCA*SDrlK6`_n{ z`}ZtumkW{RR(_8)T#=efY-aBktB^V0BCevtCZHKU?O? zgJsQCiOOdCU9mwgPnIM%_am(@m*FCG9*CmJcuTHYuaU8!zJ~;oYqJday&R$^Oi*ZJ z$(22qkE@=)%VFMJ<$8i=)AvCkP0Xmp*rV0rIXN(%bG;wRkJ;fx4qA)F8+nyFLeUUq zWo63>OG^#B0eY|t_1P|1ew{Dt?c^#_zGFF>)%_?Gqaq;4$Hv0C``*%Ws|=~lg5fU} zR?0;{<(g=P%hi4-3tMyrjZK%PbWS0et4zvXgjVMq?w zHe*3~(Kd59Z^N(*hX@a#*(?p_#8Dss)4ZE^9SsBjL@CwmN5ALwoBeoHl7SfJdu~NV zg>3%#ZEbGu${}PZYaG6e9`7;g{}TjKYEMr7xPQlJkB2H7Vv@9s%w4A$HCc=@g4;Lb>UmE2$ZESfl5&9X0Lko#}BDYFc@0& z^z?3oJ2LX;+*(BoAWNwuOSFXc<-vGvh7)Y;-LG24RWfmAT>Uq8)8)CSAX#FRBHNCM zy8~dt3!1QF}h`uaLj@tdMUQc}`7$nTY>SZlKSAjB+B#z7}+g)VmDTV*LbWlz^u zlC4FSJN9(>>9V#yc`{7f8;5w0*ogj5L@b9Y4d3vxK%MPlznSaJ>2`j)cwn0ihQqE!HB3xMk? zrLO)-5VY17N7BeSj*S3#d;R7TJ z`uyxY#txWZBsD?B$K>SS8O9}HFg4^4BpQiRAy+M0v+zy6JZ5-!IP4U-4~qjaoemH= zn*(v<+q3Ooz2)E_30PyGAS8Sb%peevkUE!^sBCI=aR*!)$t|i$Wb^U&FFHmcJ$ z#XCQHj%)M?e^B~iML}^6M9PHz>(2k8EP+f-+5v$)!79cHf+7%N*EgT9l#HtFsX6WoX5&$iqcnw&`vev9P)oEo85dk z64*hc*7+;5^8Y_W^-mNg@*a$3+%|JB^FSVq%fXN6zuxViF?)7P!k~YtVe9OupYs3D3*317)8YNsE$bGV_ z3&4I&N$>ri+5A_a*zuOFbriu%{Mj|!DY>$^%P|9dL80yI)Y=beH9nJnw0D*5|J40g zO!@D8wMD-a^9Z55MvuaP!u2|#j*==JuUf*`xG1Y?!Wfi zsHyX%CZ_+8L2xRfT(zhVo4D=t)A?h3$Zfe$tQ`A|670;{3ogZ=P^0I5J5z^{<)4a z8{R7Lu2`j-FORDknP=$l7Znb&~&o|N7&ztnnJ8Pt~WSqsq0F zBX{};-7e+Q+b8ppG~VRF v%G`ot%c3omFh_mk|JvLCe5$_0@&m#&X{u2w!#Chv4}r+bs7RMd8HM~m8dtVh delta 403 zcmWkqJx|*}0KFhUhzhaL79pfgR;M7_=Zo=}%h|CL?);SyCtWZ(;sl(8#DNemNZlAi z#{2=qkcs|-4oqy!oxAr3)C})aZ+cJ5_4%g!;IQ(}_Q5s)V8=3vmuc<;Tbmhw`~3Ui zBP3oKgVo#NUjWu#=CZpB1z41{jF5H&kvf0;wTJVSi?QrE+Jq^XV3yY%ZSfDHPfmDVOKHP9?0C`Z~(il9+^*pi&=B zyM~VRK&WJep*szmM__~ z74y`)lO#ngH5nw4B@ZRFj*4OX$m*v0g$WIn2 b*7h6iGq4802FN|Xzq(lsES-@RKKuC}(xr9? From c587acf3ee3cf10403d8bdeb0f631c17a7e2d558 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 07:24:04 -0700 Subject: [PATCH 248/265] Delete SeaweedFS_LogicalStructure.png --- note/SeaweedFS_LogicalStructure.png | Bin 621 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 note/SeaweedFS_LogicalStructure.png diff --git a/note/SeaweedFS_LogicalStructure.png b/note/SeaweedFS_LogicalStructure.png deleted file mode 100644 index 1f4c208f13b76dc30d090e946538dfccd63503ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 621 zcmYjPJ#U*(6n%-*s!A29OQou+)Cnmaf_U$lI2rjcHVP2O1{`;BFn)$-W57V_*kiW* zl@3v-E?qlx>ee68f6+^ErApkda}P)NUU=*~-Q%OTM+l)~v!@Rr9@O^YIr#UlzdzPR zIq0hB>F2xO2pztvIycqoe$Eqy1gbTeK%_V;D}m|)AwiytGaf`muqwrrRRBSMmCg8^ zvsuF-62Yg^`6+I>mzlCzn0fwgjRpIA}yENxc8E%8DG{kp-bAZpP5QlGXXDK8W}SYFBM z8C#bPr`qPM;Y7TO@1`|MJ8;td?Lda_uVwCxNhD`hsF9#F+sbI?!{#;J+xcX-#v4n@ z%57hFTq$)t*C#%hRTh1#)!l^rF7&9g^-amP6USTl*jtP@c4RF4twMT*W{mM#iOOMw zi_OqdxuTEV;5s5>tSI$}^#j*3{!R9GOsMxCpLV`{jlaQ<^3v25_suB0MTZDILkFLK Q{kR4gnH@)eQg0vr0DuRo{r~^~ From e0c45c24f5884cdb8a18730c4c89157acec5eb52 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 07:28:56 -0700 Subject: [PATCH 249/265] Update SeaweedFS_RemoteMount.png --- note/SeaweedFS_RemoteMount.png | Bin 69032 -> 71779 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/SeaweedFS_RemoteMount.png b/note/SeaweedFS_RemoteMount.png index 27fc3cbf38d022e98cff02d0891fc9529526e407..5d2f2f0bde12937230932dedd2f8ea3c04b6ab23 100644 GIT binary patch literal 71779 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⪻}*z%^i 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 From 2c38f8738f61ccb6aa88a9a6a6396933af040dfa Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 08:04:55 -0700 Subject: [PATCH 250/265] Update SeaweedFS_RemoteMount.png --- note/SeaweedFS_RemoteMount.png | Bin 71779 -> 79808 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/SeaweedFS_RemoteMount.png b/note/SeaweedFS_RemoteMount.png index 5d2f2f0bde12937230932dedd2f8ea3c04b6ab23..9f9179be8b1bfd889eb0d7133cee6b1621548c75 100644 GIT binary patch literal 79808 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 KlPi-o5B?ucGn}0O literal 71779 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 Date: Sat, 14 Aug 2021 11:35:44 -0700 Subject: [PATCH 251/265] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 51d867cd5..9a9440244 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,7 @@ Faster and Cheaper than direct cloud storage! * [WebDAV] accesses as a mapped drive on Mac and Windows, or from mobile devices. * [AES256-GCM Encrypted Storage][FilerDataEncryption] safely stores the encrypted data. * [Super Large Files][SuperLargeFiles] stores large or super large files in tens of TB. +* [Cloud Data Accelerator][RemoteStorage] transparently access cloud at local speed with content cache, metadata cache, and asynchronous write back. ## Kubernetes ## * [Kubernetes CSI Driver][SeaweedFsCsiDriver] A Container Storage Interface (CSI) Driver. [![Docker Pulls](https://img.shields.io/docker/pulls/chrislusf/seaweedfs-csi-driver.svg?maxAge=4800)](https://hub.docker.com/r/chrislusf/seaweedfs-csi-driver/) @@ -168,6 +169,8 @@ Faster and Cheaper than direct cloud storage! [ActiveActiveAsyncReplication]: https://github.com/chrislusf/seaweedfs/wiki/Filer-Active-Active-cross-cluster-continuous-synchronization [FilerStoreReplication]: https://github.com/chrislusf/seaweedfs/wiki/Filer-Store-Replication [KeyLargeValueStore]: https://github.com/chrislusf/seaweedfs/wiki/Filer-as-a-Key-Large-Value-Store +[RemoteStorage]: https://github.com/chrislusf/seaweedfs/wiki/Remote-Storage-Architecture + [Back to TOC](#table-of-contents) @@ -321,7 +324,7 @@ When requesting a file key, an optional "dataCenter" parameter can limit the ass [Back to TOC](#table-of-contents) -## Architecture ## +## Object Store Architecture ## Usually distributed file systems split each file into chunks, a central master keeps a mapping of filenames, chunk indices to chunk handles, and also which chunks each chunk server has. From e2115bfbd284a7e232b9baf0519232495af9ead5 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 11:37:53 -0700 Subject: [PATCH 252/265] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9a9440244..865cc8c99 100644 --- a/README.md +++ b/README.md @@ -146,7 +146,7 @@ Faster and Cheaper than direct cloud storage! * [WebDAV] accesses as a mapped drive on Mac and Windows, or from mobile devices. * [AES256-GCM Encrypted Storage][FilerDataEncryption] safely stores the encrypted data. * [Super Large Files][SuperLargeFiles] stores large or super large files in tens of TB. -* [Cloud Data Accelerator][RemoteStorage] transparently access cloud at local speed with content cache, metadata cache, and asynchronous write back. +* [Cloud Data Accelerator][RemoteStorage] transparently read and write existing cloud data at local speed with content cache, metadata cache, and asynchronous write back. ## Kubernetes ## * [Kubernetes CSI Driver][SeaweedFsCsiDriver] A Container Storage Interface (CSI) Driver. [![Docker Pulls](https://img.shields.io/docker/pulls/chrislusf/seaweedfs-csi-driver.svg?maxAge=4800)](https://hub.docker.com/r/chrislusf/seaweedfs-csi-driver/) From 0c671885bf5fc65cbb18a53097bf840ca06d37bf Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 11:47:10 -0700 Subject: [PATCH 253/265] Update SeaweedFS_RemoteMount.png --- note/SeaweedFS_RemoteMount.png | Bin 79808 -> 80066 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/SeaweedFS_RemoteMount.png b/note/SeaweedFS_RemoteMount.png index 9f9179be8b1bfd889eb0d7133cee6b1621548c75..3265a5296b8fb5d50879c63792eeb0e02d5267d0 100644 GIT binary patch delta 56559 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 z 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%0A(j1lyCJJbs{pd*e5{l^x(n3f}|- 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 From 708debca147c7bbe65ad000cd90e1c91c52f0b9d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 15:11:52 -0700 Subject: [PATCH 254/265] remote.cache and uncache: more flexible options to select files to cache or uncache --- weed/shell/command_remote_cache.go | 17 ++++-- weed/shell/command_remote_uncache.go | 80 ++++++++++++++++++++++++++-- 2 files changed, 89 insertions(+), 8 deletions(-) diff --git a/weed/shell/command_remote_cache.go b/weed/shell/command_remote_cache.go index a964e994c..c74166611 100644 --- a/weed/shell/command_remote_cache.go +++ b/weed/shell/command_remote_cache.go @@ -32,6 +32,12 @@ func (c *commandRemoteCache) Help() string { # after mount, run one of these command to cache the content of the files remote.cache -dir=xxx remote.cache -dir=xxx/some/sub/dir + remote.cache -dir=xxx/some/sub/dir -include=*.pdf + + This is designed to run regularly. So you can add it to some cronjob. + If a file is already synchronized with the remote copy, the file will be skipped to avoid unnecessary copy. + + The actual data copying goes through volume severs. ` } @@ -41,6 +47,7 @@ func (c *commandRemoteCache) Do(args []string, commandEnv *CommandEnv, writer io remoteMountCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) dir := remoteMountCommand.String("dir", "", "a directory in filer") + fileFiler := newFileFilter(remoteMountCommand) if err = remoteMountCommand.Parse(args); err != nil { return nil @@ -76,7 +83,7 @@ func (c *commandRemoteCache) Do(args []string, commandEnv *CommandEnv, writer io } // pull content from remote - if err = c.cacheContentData(commandEnv, writer, util.FullPath(localMountedDir), remoteStorageMountedLocation, util.FullPath(*dir), remoteStorageConf); err != nil { + if err = c.cacheContentData(commandEnv, writer, util.FullPath(localMountedDir), remoteStorageMountedLocation, util.FullPath(*dir), fileFiler, remoteStorageConf); err != nil { return fmt.Errorf("cache content data: %v", err) } @@ -122,7 +129,7 @@ func mayHaveCachedToLocal(entry *filer_pb.Entry) bool { return false } if entry.RemoteEntry == nil { - return false + return false // should not uncache an entry that is not in remote } if entry.RemoteEntry.LocalMtime > 0 && len(entry.Chunks) > 0 { return true @@ -130,13 +137,17 @@ func mayHaveCachedToLocal(entry *filer_pb.Entry) bool { return false } -func (c *commandRemoteCache) cacheContentData(commandEnv *CommandEnv, writer io.Writer, localMountedDir util.FullPath, remoteMountedLocation *filer_pb.RemoteStorageLocation, dirToCache util.FullPath, remoteConf *filer_pb.RemoteConf) error { +func (c *commandRemoteCache) cacheContentData(commandEnv *CommandEnv, writer io.Writer, localMountedDir util.FullPath, remoteMountedLocation *filer_pb.RemoteStorageLocation, dirToCache util.FullPath, fileFilter *FileFilter, remoteConf *filer_pb.RemoteConf) error { return recursivelyTraverseDirectory(commandEnv, dirToCache, func(dir util.FullPath, entry *filer_pb.Entry) bool { if !shouldCacheToLocal(entry) { return true // true means recursive traversal should continue } + if fileFilter.matches(entry) { + return true + } + println(dir, entry.Name) remoteLocation := filer.MapFullPathToRemoteStorageLocation(localMountedDir, remoteMountedLocation, dir.Child(entry.Name)) diff --git a/weed/shell/command_remote_uncache.go b/weed/shell/command_remote_uncache.go index 64cc1472c..f94fe8bec 100644 --- a/weed/shell/command_remote_uncache.go +++ b/weed/shell/command_remote_uncache.go @@ -8,6 +8,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/util" "io" + "path/filepath" "strings" ) @@ -25,19 +26,25 @@ func (c *commandRemoteUncache) Name() string { func (c *commandRemoteUncache) Help() string { return `keep the metadata but remote cache the file content for mounted directories or files + This is designed to run regularly. So you can add it to some cronjob. + If a file is not synchronized with the remote copy, the file will be skipped to avoid loss of data. + remote.uncache -dir=xxx remote.uncache -dir=xxx/some/sub/dir + remote.uncache -dir=xxx/some/sub/dir -include=*.pdf + remote.uncache -dir=xxx/some/sub/dir -exclude=*.txt ` } func (c *commandRemoteUncache) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { - remoteMountCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) + remoteUnmountCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) - dir := remoteMountCommand.String("dir", "", "a directory in filer") + dir := remoteUnmountCommand.String("dir", "", "a directory in filer") + fileFiler := newFileFilter(remoteUnmountCommand) - if err = remoteMountCommand.Parse(args); err != nil { + if err = remoteUnmountCommand.Parse(args); err != nil { return nil } @@ -64,19 +71,28 @@ func (c *commandRemoteUncache) Do(args []string, commandEnv *CommandEnv, writer } // pull content from remote - if err = c.uncacheContentData(commandEnv, writer, util.FullPath(*dir)); err != nil { + if err = c.uncacheContentData(commandEnv, writer, util.FullPath(*dir), fileFiler); err != nil { return fmt.Errorf("cache content data: %v", err) } return nil } -func (c *commandRemoteUncache) uncacheContentData(commandEnv *CommandEnv, writer io.Writer, dirToCache util.FullPath) error { +func (c *commandRemoteUncache) uncacheContentData(commandEnv *CommandEnv, writer io.Writer, dirToCache util.FullPath, fileFilter *FileFilter) error { return recursivelyTraverseDirectory(commandEnv, dirToCache, func(dir util.FullPath, entry *filer_pb.Entry) bool { if !mayHaveCachedToLocal(entry) { return true // true means recursive traversal should continue } + + if fileFilter.matches(entry) { + return true + } + + if entry.RemoteEntry.LocalMtime < entry.Attributes.Mtime { + return true // should not uncache an entry that is not synchronized with remote + } + entry.RemoteEntry.LocalMtime = 0 entry.Chunks = nil @@ -97,3 +113,57 @@ func (c *commandRemoteUncache) uncacheContentData(commandEnv *CommandEnv, writer return true }) } + +type FileFilter struct { + include *string + exclude *string + minSize *int64 + maxSize *int64 + minAge *int64 + maxAge *int64 +} + +func newFileFilter(remoteMountCommand *flag.FlagSet) (ff *FileFilter) { + ff = &FileFilter{} + ff.include = remoteMountCommand.String("include", "", "pattens of file names, e.g., *.pdf, *.html, ab?d.txt") + ff.exclude = remoteMountCommand.String("exclude", "", "pattens of file names, e.g., *.pdf, *.html, ab?d.txt") + ff.minSize = remoteMountCommand.Int64("minSize", -1, "minimum file size in bytes") + ff.maxSize = remoteMountCommand.Int64("maxSize", -1, "maximum file size in bytes") + ff.minAge = remoteMountCommand.Int64("minAge", -1, "minimum file age in seconds") + ff.maxAge = remoteMountCommand.Int64("maxAge", -1, "maximum file age in seconds") + return +} + +func (ff *FileFilter) matches(entry *filer_pb.Entry) bool { + if *ff.include != "" { + if ok, _ := filepath.Match(*ff.include, entry.Name); !ok { + return true + } + } + if *ff.exclude != "" { + if ok, _ := filepath.Match(*ff.exclude, entry.Name); ok { + return true + } + } + if *ff.minSize != -1 { + if int64(entry.Attributes.FileSize) < *ff.minSize { + return false + } + } + if *ff.maxSize != -1 { + if int64(entry.Attributes.FileSize) > *ff.maxSize { + return false + } + } + if *ff.minAge != -1 { + if entry.Attributes.Crtime < *ff.minAge { + return false + } + } + if *ff.maxAge != -1 { + if entry.Attributes.Crtime > *ff.maxAge { + return false + } + } + return false +} From ba6923b22356f0f4ea1206655e9a91627a2f3b9e Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 15:14:01 -0700 Subject: [PATCH 255/265] use default or path-specific setting for cache replication level --- weed/server/filer_grpc_server_remote.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/server/filer_grpc_server_remote.go b/weed/server/filer_grpc_server_remote.go index 2cbfd3319..64b56997c 100644 --- a/weed/server/filer_grpc_server_remote.go +++ b/weed/server/filer_grpc_server_remote.go @@ -60,7 +60,7 @@ func (fs *FilerServer) DownloadToLocal(ctx context.Context, req *filer_pb.Downlo } // detect storage option - so, err := fs.detectStorageOption(req.Directory, "", "000", 0, "", "", "") + so, err := fs.detectStorageOption(req.Directory, "", "", 0, "", "", "") if err != nil { return resp, err } From 9921801e0c30ccf08db709461874d8dcbbeefcb1 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 15:14:26 -0700 Subject: [PATCH 256/265] Revert "use default or path-specific setting for cache replication level" This reverts commit ba6923b22356f0f4ea1206655e9a91627a2f3b9e. --- weed/server/filer_grpc_server_remote.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/server/filer_grpc_server_remote.go b/weed/server/filer_grpc_server_remote.go index 64b56997c..2cbfd3319 100644 --- a/weed/server/filer_grpc_server_remote.go +++ b/weed/server/filer_grpc_server_remote.go @@ -60,7 +60,7 @@ func (fs *FilerServer) DownloadToLocal(ctx context.Context, req *filer_pb.Downlo } // detect storage option - so, err := fs.detectStorageOption(req.Directory, "", "", 0, "", "", "") + so, err := fs.detectStorageOption(req.Directory, "", "000", 0, "", "", "") if err != nil { return resp, err } From 53e66980b2907dcde53aaef7adfa96fe5590416a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 15:16:10 -0700 Subject: [PATCH 257/265] add comments --- weed/server/filer_grpc_server_remote.go | 1 + 1 file changed, 1 insertion(+) diff --git a/weed/server/filer_grpc_server_remote.go b/weed/server/filer_grpc_server_remote.go index 2cbfd3319..8144d6a90 100644 --- a/weed/server/filer_grpc_server_remote.go +++ b/weed/server/filer_grpc_server_remote.go @@ -60,6 +60,7 @@ func (fs *FilerServer) DownloadToLocal(ctx context.Context, req *filer_pb.Downlo } // detect storage option + // replication level is set to "000" to ensure only need to ask one volume server to fetch the data. so, err := fs.detectStorageOption(req.Directory, "", "000", 0, "", "", "") if err != nil { return resp, err From 00ffbb4c9af998066c79ecca2fb059a3057caf4e Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 15:18:38 -0700 Subject: [PATCH 258/265] Update SeaweedFS_RemoteMount.png --- note/SeaweedFS_RemoteMount.png | Bin 80066 -> 83205 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/SeaweedFS_RemoteMount.png b/note/SeaweedFS_RemoteMount.png index 3265a5296b8fb5d50879c63792eeb0e02d5267d0..9e3d66e1b40c0cccfce4407054a6d42c585a3242 100644 GIT binary patch literal 83205 zcmZ^~2Ut_f);}DIQdFdhiYOpOQIL>?t`JB* z2#5*_B2tvz5d;M3-T&sCd*5^QeBbkI!p`iSnYCut{8pV1Z7tOk%x9TFAkYbQHG~cb zMBfVn(YP`m1zOatiq?UDG*lf`Wl+(_b8{dNQ;##!(3$LRWlORI2|-l;z7vv^u(78) z3qcSb36OP zpQzY4*^_}5l&qwbFjQPt9H8OwfwPB$<=?H=w$3&#W{0g1Brv7_nLFSW z+yBg#x+m(6HOwAut|DnlRhNbvc_l4M84XN|vN{y0 z4F#)ds>vwZ!{A0}O|YGm6BXm&jDgt_sBlwzBM(Uzw6ZqZ$yrh#?e1V|jzd}N8X?tP zNF+xOHD|DuwuFSKELp`J=*$5aKn;d~ySquERkVz>EIpiT$od3B3oKGu%93ghb#ica zqQVFSQyfkUE@^{6!Q6~A>{YOiy2=P!XS}Meo{haHQr}cV+un^R?S#}o=;~=&Im%+m zTAH3Ns*V@}*xH7u2Gx_2B|wp88ZbOoO3K|{UzUh*a79z}zzCv>2aclRrY@!9hLS~- zkW_nfElZd(&chXLU_>;8t6N%H!jP^2u@DzqeF;kqYZW7DBlO|2S$k5z5a5BK2Jnf3 zS?N%um92sAj^+SwD2kz>g|>!1g`@&SDVtjw0ZqCXb3EMC7L4_DHo&0_RS;yn8Cu;^ z%hZZ0p{H)BgEhr_+Sn*-5Diph?5J>OM+0CrTDhrOW9&Ut zDY6b~K%ZEot3AfrUR6s|N5k2{T-MVHX07W)AfTaOPe~mIIL=JnQ$v?(?x8}#Q9QL( zaTaPsG+J5J$_5TY<22pK8tV3LNDA5p=u6AU-VN@q441{?0XC2@Ll2m`u9mG7Sx41W zO9l(P;p!%-EUl(vfVZ}^)N@DMT4+dkxMEfC1b37L6l)}5hBLCW*3rfhw7^JhTP%g zS=YcxRaMhU6G@as+S`*|B-Iax$EZ3JU~s6D8`1ztLg4IV$?oR%W|~M8!X9g9;i0Au zCMX+H4_6D}NK}K9;JO-aFf&~(DA0n|bXIkNJLtkSbtF`^B_Y!GI(QvjjHaH4im43H zyRwX(yM&qsN?HPGZS7>~s_$ZmHK5=<)C^S*R~09Pax#QFy4bnP98MKMmZIhaGy|Ik zMRWqYDjQ1JsGFAPx35j|7@$U(V6Y@MW05Iq|+ zCw&`zcQXScTN{G9DZ!bfqH1l4HU(aB!x*^OT1i`)AteZs`VMHgfu_3?(wS%}t)gZt zg~QrfsH5~LNDn=PCRQ5nY3rhFq;ZHZC>J+bTQg@f0PU1Dfj_E-JH&`ekhIj(gqUj@ zc%aqofwxF%st|p35=k0sXX#|9FKKV@hNfD>B#9PQDn?RxcN=F9S4X0aqpqZ$gF2X~ zCaI$#>1?B_<17o)($R;Rt5}kW$`pM!30+Gqj57(U4#7HWBgsT9ODq)_R2}Du(3N#l zc6D)}I(VQgRm>2Qy3#~24yH?XSCcVwag>pA(6W>qnsHQ8_5N#=|0dcc1lW|s2 zbAwoUQcQ_tJ+hHI*oEL==x7Otn5kjR9jFp&SQV&^Bu-M(Ttit^lccUHBcbZ#WMO8n zswZJb#7WyhF|KyNcyI{{S<=+Z$Wg@{>#T}!hNDq>dRk;X8#gT!(NR}j1C7wNMyLGj1ioGLAp9oA$n*FoP(q$!kkKW1LM>U z9Dp%g)FpKh7z>ya)I}emPnNP%w=y%rQq^#p5R8hBJDEz-$7x}-rSKY1S5FBkYYmhe zNsEYb)FVU9Fjo4?20$N9ICE(mJx3`?cPd&BZG*P;u+RV|&<2HY({ngvL;@6_sv!m9uId4GlqI^k>bl}7WG95SG}XgN&)k6|<0N6JZ)Ym2tF1vb zcToof0_>>gVWlaB1EgJ97H3V+kv6r|0rUe(2TjzM(zBD5B-!IgNHseTL!z29*-=;4 z7OZ6{;iw~n)E)Xk8B2*HrW9F%CLD7OZ=^98$nG+C37)xnspf`ex z8VRm$udSzP?*Y-2a>G1iV+rqT#E zEgd~WRaG+BfFz5sQHQ}Sl+_$9jL=SMp0X~kfG)sFSWtj@K*40qtnk{F+SXvnL-di- zkv!Zgz~xM}B3kKrs9HK#`cn!R)6p4uSFvS`XRd5CvlB0pShq8ty zFvZFgLsMr}B+^t%9U(Iftc5ZLBMXD;k=@{Mu&EhNhh&H_Lz}vi^)OZh zM~VwYgFtbWC2PvKLUrAd(&ic#`UEp4u(_dg*$isj2DG?b-^@{+HsMJUj&?XJ==0_rBw|kGxyk z+fBp6ywe}z4enH;aAFuW*{lrbuM+ z{loV2s!E8;`zLrr!I${>Ktad2U%38S?Np4l5qxS8c=SY>W+X6hIFIz(7v#b7wo4m} zgFoN$*pDUIH#B`MH80#3j9Ht@N!2$?@?M&nYOzkZJpzM<{x)ElG|gSswvlhIhk?cW z%0$D~8_IpH=y{FPH1p8V(DS&U`}dnad^jc`xxUb^dz*Wl{I$fC)l_{Y5@y$j-oI61 z0-u+;aN)w$Th*-dUy2{N`-FgmCX(IV+Nv-3?y-&fZ1NiWtn0y0%~}!XuZQ-RTTkZY zJk|N)x&A$CL(*{qvA!D0b){$bUBm@dfT5lSLKTI48zL^Q72<2x_q=Iwu&Otaj)4Vl zM_e4K_d0#UTc)nQ9`}M|G#x9FZrHrsIfa0Al-s|Lxg6<$9TZ+74^^|h+TY*_Jtg+u zIw586>8InrFR=RI0*j=a+SC9R*qkXicjKe{lF94)Cv3X2!`VZ=_ZEm4>xYn-nVAEo zj9xlU-e>mU1XF$t)#U1AF#{8va}W0ObG~6|I`iX&p1kOlufWniPMrTS{Ic3*KF;&b zJt*53#PRMvLWzk#`)H=NvOn#S7(KclaWP&_y-Fre=K{oxtNrwrAT zFt-Bz!V=1`T;(f3h)uUwrit|c&zHQKU%&o2MD2t-rMI0E;5)D2t{onmN~Y!uiR8Cc z@2t;X;XxYO4OCp#h!u?u=BDOPf4y^zlKk8HIzeediLyIe)gJ78{>jRKIE8Uvo0yKj zqc0HC*FuLe=9PCvq$vmWSTecw)HNYmqFy*nYj`g=F}#Op)_u6UzizO$IA{=J5cTQK zz)8hDzciHxqSqj7^$2{lgf3fMiwdSi+;+l8%KGEEJwP_wpxOp?@zJKjH! zWNW2_b}Ih5RVeb*KI+%iv|Qn(5R;?WtNeBae}lDM0VP~V!^h}80L(0OY4g`ap0O|557+8Vvqygk;ShN)Kk~}=)k=Gm z*%5ZaWn(iI7MAb(PoA8PRYh|Yw?Hs6pXb-#^R#z%o}7FaVG!`-VS#SWBjyjuP+NAv zx;0=Swawy#-O7Hf&wnYLNNE=vu@)EzKPSu1E9YGDL%ju@pt5mUIobUod7z?AbV~gl zR&k#*2b+pgQwwGvMm*=Z_VRO*%|Y|{s3I+9|!lY?>HIaq_I)&hQ&?7R5J0GJpFJ7to)P$ml~@*D3w*A}dQ9t}`DDx}vsdu85%ohhLLtGbr{3zPdD1!b(M{BoZZ)_u`Z$?khL|wsf^a=0m=k_O2gtI*7eRxY0N(43K$)(@))DO+wyn}#u3x{dr^q(8vCyBP&`C|j5EyKTk*?}eelYPoa3HjZf& z#wbi@YS<8wu%9i_FroOQDO@=@%B|4uOVJjvm$PawAz=sK54HOLTo!Wvf{MY(DJQlC zp-MW_7CVos$D-LI4NKH}YsZ(PwOW1x>UvI9saX+8&kj~omK1V)6>KCBig~JF6yy^c zZ}{r&K0ZjBEk83co6%-sPAG`xW3sF{S9^;c>0odBJr%9+<=|k~zE?F7zZt`d{mID@ z0nLMoVph*br%uJpn92-MO!|T{F+46W2h%pHk?U@be|s!)hf7ArGt)uC^#h6aezgSRL9%Mg zzPsE&D{)vtw0yI99q1xTm@l1RXm}b>-`Op~gTghRGAF)8@~b?L_uZc67AmpD?5O>y zbX^?C(-grz#gEzru?X(zDzpRJHa$N~qXEp+ui&-uoW1kVb^!3Dpp+nlGomhhE$xG4 zj`>gB8mzKUT~FlXj?~u76A;DJeMFR$7n;bKG=gHIF{@9Kr0t&$Jm^Ejyrh16lrLUO z>X&peYDNmR<5wE47qxk^$B6=d+Mr!=eYQKkKtH@!aa&XM(A4_piWH)s2q9X3GdYT$ z<(I!a+kYxZK`}7eF63(eX>QDQ|F5m`jCEy`%e$kK?_iG|+2eVaqbDq%l!e@P#fB4JEhsR_A30pfXm;Yg9PEtzU>aSGmEkr4i&*I7xbGhLkQtvLEi z`IbYDIQ$2h7s&~~*$Zl8;PiohSsNyfzFMxLFsEznd{^Wzj#U+l2>iGZm42i!-{p;* zJS1Y~e<9(Yd!;zmPbn!ULN=4NTg$~l!D|pr7XFLe^m-luk!m&a6p{IK4Shy z%Kk^ou6sUwmK*0EQ|>^-;5o)C2+|MVHy1kmZt4G@`%}V0%h|gyb17QtUV386 z1&NOTPv5AOo%Z;zcJ_sYs!PbqcJq$dKcwRCuTCcciE+K#2XwgSXKPFmc*ZbB-$>)< zUF=0W84jA_vi3-LY9h|^C;k4n)cpN6@?g0g5hkB&v5OfmEo z5+FC4Et=&ctVjHs36z>781#is7g1TGgPtoz6ZWIIM(3~p^CQa18Mg40vB58q1(E(i+aZAgMi^fKHiO_IO zTs9-{f_jrvQa<4Gbg~fPXJO2o*NlgH-@HL8eAVd%+(SSwPf$kc&Nu=nwfm*`&Z~1g zJTJK#;h?Iy(m2uN1wax0&uR-sh5;^K`RePOT&r&k=+%W3zkA*dOwU{aC{_Thf1?`p zXknr6J$aMHwa&KIZfUx`uHaVlW%%8C?QSpR9UK(FNw6^ z3lcXBJ)Jv80x5pq&HSju%!i;0E~zu4X$>3C+PM4f^Ns(C>0h$jiUjsx|F)?vz&~BK z$A;Fk@+sZbwYBG~Z6c{X=cGu6d4Rv@qpi(KOGn3c?%YG*+w8jM`saJFZK4Hs>U)tlDBcyQb%r#{KBPd~$(@%-n zZsYEUKPkEX7bQmjP;$XfRE$uOJ6v@8WzNki%I((C(F*{`A_1dyMI$<1IJckKcA)Ye zZBiegxD;Ab6%_#=?ml2NAQ!)uP9Egz75wryCW*N`5 z+3?)lOF#7oPmVEye7zK92L4cYCco&*DsxYr;R?5trd*T}Jf5X_N@b26SvZc_@P*Eq z^CK(Q##@cl_`(>EbKnZymPRUHI?w5Jb$55~FOR?0zXnrPRb96?Q#KV7`T{k@G%Kx6 ze_)W7mX5W?D17}qP_e9g<^mU&Wwq-fp`xnFtrZ9k*r(j^*&%6bf5L^8yg2DMb=&+; z`0+od$#*l9$o_GydoAen-hPa`iJe~Y!?uj06YKHwgkn_$YP|E6wAru6y2}o3Dq+GW zx=Iep9jGqqU1@cL9(;YIfuLe9x5lkBACB;@SkLOX#iaG8g^x`4U#3qdh4)NX%g`mi zhbeu?4li*%$mA?cIgKAd{Ly+w5P?0xvgf{ zH-q>lhn0&rP@i|#JZ$ss)VhQ2QqX)oVR zw5cc0F#MF0cV9UELM-*s+Y|Fb?7dTob=HFwm0qq}pl;v2xO74&McNf`7}bRQRXy`< zM@-s6h%c5zV(rAn-TPC8p9;aGWUt8#ie^g2yEkx&-#V?hxBPlBOEdoI^7{HPlL?1k zH%QQzhv#>N17ey|qwUwhch|iuTDZe=?V)bnr@Et$P?PcV@RsL~Ijk=)RW_Cn;v{@; zxPan|MwGJRNA%K@g6$*hI;HI%@Kh~Lq#||sM%{K7uD9>Zz2pob!khRn;S0edq#jUG zyjDhT+(mm|N+NyPb(&aROtWHrT^)Wa$30(t%UYxE!{;bFv9!pzTU~*f`C-DxnYeId zKxepdixHfOfI~WR3S0RalwQ8ixHkdE8IOYtEA~I*(;V+1bM8lJ&CheBbRI)*c7beGNSD7 zeSUekT&Lb;E#}%&yPY#Pi2d{*tPgA!4{`w}5O9SdD2-OZL7Vas*_n}VD0My&RyDzV zq2s^2@gFNP?^R3{0Z}+v8M)^E{v&Lr@a5~J+}t0}z0-SjlaYlfu*pQb!AdynL1O<> zd!|BP^0^dN9v(Zuk|_PC#R5M6gHn2AMOM|gX2y3mW@$Z;yLfb!ri90jU*sI~rrMti zs?0YSN@R*qb;{b`c*m@FZ!G9rYLoB$jF3lw{Kk3Z$q3Jh*rP6E^+eYwAJ?68Z|5&; zxKHu2I#U>!r#=*naN{sD0~Hqem9L^R%+p2FID5B_ApswahF(V~|GIdO?uOM(3qII( zAM_+l#F~5Pr4N@icH#A#)g0|SG@G7fe{aVL7M2-SAH8i|<31~$5h9T#<)a1kt$?WL z5a$|SyTew`n`a!>Mdz=3%?-Sg-hW+1Ba=XLTvq5$ys%*OCyC^5pOf>CzvY7o; z+x{7>y!+m9{pW+BM|4pc`w#4IA}ceU@`V&m0FIH9uagdY>mogS2+?a}0glJVOhjo5 z>MAE-7_+y%Qe@G(n-XYUWoYHy?_!#YW+8D}CgTTtvWrdHG+$z06x-8Eh~^Dd5oe3O;wj9+XF4EV?if zykqay*ko?a>eBlzQBh0~dTzU*A%EqWdg?tf1p)T+vBvOv>w?L~w?}@CGgTH0~7+1A*8rGe43w5x0R`p*k{_QuL>WY~@R}-6S1@$Tl(a!0X&)t{#enQ5}Tao3$4ffJsvq2eQQs<4C$I>)Q z>YrX({5?p?4!BzVT6m7KM3IExo5O?k56ZGM#sItP+l+=l;?JLXM zk&dFp{qeU4n-%$3%ef1iH?A}Md{6=bLCaTbxdRP5X>0;dQ^wxBU^(bG@9! z>KaTaIiWo*p~SuFa)i`e8UnUj{q?I2{qU>sB!g?szbK&Zy?KwMlc1Zq-9KEv*7`#bJ9X;3zv-m)CAN+i>NElN4YT+7eO~5%0F?e|nH6hvib(34 z^Dk(w-*_FNveVesmOT0HMdf!WXkN-|a-$S;3HRI~eN*J)7RR0Nrw`{8?}k0)y`h~x zkQ9E_Wc9OcM7?Ika%UWd$8>Q|y?^Ervy9>~8g8q$yD0tn`?!89^TS}Rk_Mw7d#~%# z$cYYJ3^POU1A;T2(>r3ZxnthIRN^d7BDEm@v`N6vv_{L=N(&>+kB}@E^$Q<_vYHb{ zb!)mz0-`hMR%%|3<$XqKH?3ZdDKMlve4mDg*?m zIQ)EnV(6r&pN>#ydYN^NyX>cmyPH24;LK;#s&$1rB`-ZuymLyR!&p-n|H1fM({QAc zD3jpjd?W&)q|gJ{gQgF|n)p*OmlkLg^zs=)xvv~G*z^`{|C~I6US;o&fncN|a0_Xs z4k+Q+F@?2Dy0Hov)GY70$M4?I0r{B+UL$pWmsz?@H`#tRUT`dZe2Pk1%{v1#(())u zsFeCpw^9z)@@R|o+Th(vk@rh^>3W~i@3Xi3>ep=}nz1VUimBVbw3#GrKLP(iQq;9V z0*C_0p%bHcn2sOO&H_BIO2F_D_4M?t4a-RkCgu-hgU_b9T^pb3+IL@!<<>5+a+$iO z&8i{JaT1ylOdtqpWyGc$*+k#6jJyPbG7{V$%kkrK($bYJfttpu4WEmsz z6j;pPA$vwYAQ9PGK4qw@$aCV8tju`cK!?N17|X&)`L~fDfepXN*WG>2_-*}YtNGbt z`*&XW|Kh<)kNAO@)Vp(f15z3|G4ha1D18|dU^XXKRaG(na&~?n7(6Cl?dg4tnfvm? zxAsuv&j}$`UapYpCyXs`-WXnQsc5DVrarW)OSWdOWy&gS^S!z>7;1r{JMM@J4r5Wh zg%(7k0uxm%NztXJx;k`H8ij{?0Dq%2D?ioau86f;Oko$}$Y9@Vui}W&rsyv(c9ZL_ zJSBz{e6WZP9FzLP(NyE(|I5?F9)=zMa=XV$(+3uL;vGx|osQ2ApBGBa56vy%yLWW! zvb}_!NB6m3374>mJlQHu+?a-zoV;ETl#W5-5)9~J8T>~d zeJonOw8xpu8WeP;>K$o&DPZ&Qv6H7jTRch#DFr%8$nP#45bhTQGL0YYkN>lXz%>0B z3YnGR2%tQLw-!cUis?LIFXeU2bhC(0bkARu?-?`u*HetF8v55DNukM70Z+(H{tw1e zr1TUnfKxrbKcFTSJUVM4+4jNaE|wnV@do+24M3kzJ%r)diRU9uf~3vTB>9tfj&tD_ zui33gdnxMuE26=D7~6RRzA?b~8(j-u{h!E;jr3j&uJbypCmMt7AXKv59X;9gIPKHi z+6*mCpEBLa>z|+(AVMYA%l!PK+OBSYz50}#Uo7hkHLb)_4OVwo^qR5ZrMP^v+$L7K z=q3|mO=gkPCmbBF-J{LQAK#gVe5G!!)YDo2AoqKT8#XH%ZFi3>S^YtwE9x-r$!nub zJ&cCYbSrp?L}um?p3_uMzdTt=lY{$JlXyu#onGMl5Q^jsRGMTu0!|&VS2!W?E6{8FfeD<*^wP(v_ z{OnsrK@S%9C2TMJt`Plv*nlwRop0)Z;B`jNOv};!L{u_!iB{W>ijSuX-@0CN!rkGh zSW^A{*(a9}4-|o1HIyo2#lHQi!cHCk)7#LyQ9?d@yH{UODHRnv>h^^!+BeibZUz$^oH`H()76Bt&OyWh`V^7}k zGO(mdlI7fYQ!jD{#*dy1A3i#UlDfe_0g~YVTS??c&we;j-=vTH9bUIyI`j?(Uo0ux zjGY)-A7;)eIp$t^mluJ2^W+%kr3i4FuP~CX-KJgOiT;zu7dkm_E{YjHf?=Gay=@&O z&X|jxw>_$qQ?-?LeSl}t@d3YbN}%p}nU~cC^*n-G@;3_oZN*30iWjPR_Hp}j?-`HP7I=37(AcB7l5eXg+p*o- z!h`u>XSG3qcx8lSBp@9i>J899Pq@P8o}`(L>XMH!=lzWERDa#`2B%MyW~<~Bs}}uQ z+7L~JzocEFA~$rz1{R@FIj$2igXOR9|}A!TbIeZvcA%vF)ewsNj$_@ju$OVwDxMPg{UbYolP zR&+;eSO0w_Ql_Ff**~%z+4tc?ff*1o9pCjIntgIkNgvW$6jSBaan=mF5jbh~RQF=@q3;9{f5V%k@-8ZxaT{53uV$jCYhLqu0xpo z4W?{LGYQh(JNLRBWdQ$Xh9g)c-$Orls=?(QVgru}320Bv$z1%y^ST!h}TtuD3R?-0~0rJm?Ylf~(`Hw`<+? ziVX9jc4vC2e)CCVR?Gnz<;NZhbF8swIXJsM2+V*u%lW)0(dp%coi+&$LEO5PS=|LM zHt2d*%0CWvJKAxhX6t)OYY@nrCfE1**FWG{jZcIv*x+Ds;c9yT%Ww;b>4+G993oRI z@s6M+`>FbpFTJsGW{|grP-A~@ZHAXtzv3nk^^6Q|lm z8rsI*=L5W7{&3Fu{6+W=qnaVm2pCzXs(BqSoh8?_2m%WtMvu%P0e)a9P8>fstD~av zJ(24@lC)Ca1pV8E_|n~LfI`0B-G%bb@6KBblj&Xu=a0P}&iKUBoYpOWgR}iAEunc) z{b^-PFj0LSj7``|aW`PEODU<+^6o~@3=ut&*Q+=AJ}-Ua`qr0PbG|_c+FZijSl^C( z-}|qr^Eq_fEeNAVxz_YYl^#gVl^?fmgVG9L?WK#(mwZ6T=KrQF80k-c7G$HHtDP2q z;~=x6{G#gd^`XjH`J8#~NAm&~FFuQQe~-W@yav_pm>n1=YFXw z=CMglc9=c61+k?Lv=>yN)3bG{HgA}&A{AZaX4fauvIEPb>C7f4&fls%4K3O51}gXDD}Pmxrh+Q<0t0D>%qEX}MzhFK-(U+|t(dBy zVYfVE?_fk|lho-YvOMzYtmIm6CbC+c8oQeQ1ZmQJvjxib-lFb#T2X?pR7CF#-Y%i| zN(v^t@;O5WzksBug1~!L=Oy@5?5ec#$>)P^OLssIXb^c@_E>tT|mU z7E%Q{iHxT2M=`6C)RKoK?U~%%(nhTl%`<$fvtj`Wt){2o7#|qGn8ikL_nFBFGxNXz z2#v zuVS=Afdn!`8c}dDyCtEbzv{F9!I?-cdZ*6}<<61`-T$k}e!Fjs1`M(di#?gdKP|QY z5b{@sKJM7b6yZOrT>h^cg)@LBk9`|)C?9`P|5u9>zyG^XV!V}r??bw?P4`4m7gvO* zGQOy=YnNN{(`2y8)t^uMG+tLuGs5M?Cv&Xobr#T*(+&S9P%Yi**i}s0k$-sl8$=@= z55ub;_aD^?Upxx3NpjSr&KwsgLFBy4%&B*{6gcy(0{F=W#^gBYB*Ba z$8meT&iyJDcxcgZb@*7MM2xr*kRj&`(t5YUI7hq57JYAfsk!5Ipo!#}Oor=ylI&97 zglTs9$3SDkepaAIgAqm*_x@Ze$@_jfRaa$ufJ!RM?^TG?0pfP!*dud0UUPk8^F)vp}i-C9l&zNDYYw{s$OtMw7D z;#~%+@bN(1nxk7YVOpoY&& zF6FGNndE~qm)Rj-&U}MBKi3OTfJQFIsVUiqi87iPAIj!vF5zdM$nBZZ$uB@o-c9~w zOWWcH?bW%^hy}0l&dpGI~I^K?RSa{X;KBa-@+4E4{ z+q!)LolLrO2jCMmiEFkn-1Y82a{E^{o{cELzSCY1Q9-6+6xGUwuQI}1PpmrB@m=V9@ zN)8*1fBrT*WmkJV@AK);RS-f$e`{@WXBvm$)|aEtN6UELgmO0X6!)m^o*a1#=@rep z5vG3-801TC!M<*2`6b-xA7~sQwImhxEzb&i7VJFad`|8zDu^OQF~o+G*Nmm{8&|_d zMNYh%>JQTu%Ma16cA8|lns7k(5XCVvzrt1PvvK~TadiOKe3ige1zOA<9~utTHG`{B z?7eYC{SRw2`^FZfjZv>CbKmeYRmC|qqPZ-Gm36f-PcQ5OiQ*|yS`m=<5ff@rS>oG2 zT!P3(j{nx!MLtbSElYKiTYG)K(CbsSi|*P_VxVVb!Rxj*aF_l!@!Q9WX)=1(4bJv7 zmBaE)dKKjzCO2+BzawE3WNO^t%E5Jq6kd0pGP~xe+4AZu?M$3 zl0wE@rTJLtyk6+8+K#72=@u@1O2y~S1p5zzolM+d2P6A@oL)1S=TD{C3X|#+g>mH8 zuePUm=N0bV9x6msdh4~DJ$o@~p3`Z*d604X(pXd{RjugI#`hthQSpMi*YJF)wa-I{0#6HfC$06)^eoNr_IU4`1IzZ{b<#mgF*W`& zd|_`S_IqN*g}Vu1X_I$f|0HW_7Z5B9a{J0`FSeiF6w~0k#w@m{yVGt|LFj;ZD@i}x z$$#L2CCCtGkJ!6czcfO^*jm`7$cjv_6{7(YY;P{*iuMb4uoo!}@(2w~ZL9pRIf?Ww!Ag`kEX_zYyVf(k~VCyiBp%hV3`c4^VU#=lqXz z^jduA0)xMP_W=!Vw9fNsCD)i#TKt{hK2ebSVk1KRCyiM_jpE z6*DV!P^DPX{Y~N#$@rcetbl;5O!4h(F1U6h=dBIks6P+M`Kl_GWU}3UVX|wlWRS0= z1m^M$@lIZ&9>gk z;pB3!(c?z*Ku*`o`*3z12Pz2;^VYK6K;GJHq|8M$XQ0XV)HBNB_r3;!bj-HTO;aDCtqO8k!VHe$WoDUwU{$%S`S;{JH{*n=-DMF#xOK70D^Ud;aW(;yT$ zdUZ@I^pu*~>|4bgCHg|+(T72tY^)Kog;`lU);dp#m)Uv+74Xf7%4Ekt#iig2ujZqR zRJCwow;i1%*-J!d3uuCO?RR2*UWmv6p_D(&xG4Te{`AD>{Vrp_mUp9I`4aF=*QGR4 z9(%Rx6)CW+Nk*VvN+wv`k7*L0FHZLbKNf|RS%66y%TGIGO_t$ z{iN~}JeGMH-{dDwhbs7<9=}-1N&~vC6Cmc>n(UP8olu$S!h<;TVUh)HZO2~AupRtlvUm$Vsw9t=Pf!RY+2LG z1bX&ymD9zC2el&i*O!RA6rKYQ#Y?A=#5(^ollPyg?r!Q`U^~n6Vng|_ngf)&W6X{4 zbi$6q)Kx(fYx+|(GPEY?Dg8+5AFHOu*Uf10BsbfLmGfLcm;q(%?kBn!Q5o0 zNjLwpoxOyYkNVAsi;IhaV#uGK!41PsiG}tS-ZU`C(cjk~YBI`f;uZ-foW#gS^r4{HC`I3cYd{`mY9vorm3!4x1?p`^vE zm4=|?P5mXV;$BXmHgW453a zr=Fr3qrYT*o1Q2mBeMoReSBDPYmDyK-Tj?do3GlRv!{n#w^uB$5-Kj4GzA<1OH+m% zLPJA$=o;BUs!m0EL$d!-{+Z!Q`N&ES%`fR6{JI!lRWSVE;zGT%VC;1S*OZsz#x z3L}oZ)HEqEEN8*hJH>P6ikO`6Q2gOEI2CC=)1FXu zu(yge2yAkI2?|b0gH}POB|Wa(dh{QqRd(-?J;0^AXI%X5{itt15&kxmVt8^e4*UP8 z`s%1C+wSWjMQM=kE~UG>o1sCvyFoxeKqLl9Nof!ULAnJ*LP9C&ZlpsR;dk*o@AIwo zt;OHW%zaOfp(LpZcd321B&gHL}5aDfB&b9Z$$>5Ff=RI6dD?{h|toS><`zCJJ> z9eNuZn}x6}jrzRL;eU7nwK0xj>OX9xwp22UuPLMU_bYSno=yP5jb^ElRohG{0zb!x zH*#$EU%NW^S3g>qt%f9TbxM8iOZshvLuA+4?xgkg^W!n5;|muA2q->c@zOr6=C5I@VVKan_xHLL^! z`TK!xE8y1r$}s#bX|0gyNAI3o`Ldrq(xltM2lj&59HhRZfmTy4mm%{%2Y(W02f;ng z893@#|K=#L&?2~P>eh$X?KbHQ)jtLHQ(Yadp)4r2<62Pq{`srnrpI{Sl@YfPyiv^K z&Flcy{gBad5M5neWh||%6dp9P*FYn=bGkL0OS5Zzp~PX*6q*}yCu9z!;FK@Fyb89q zULS@8)!ei<|2LXYL=S^TJO1x}K9Z<5d~Epc1ZrGmi6s0=NIJkNdTR0_Ii#=ZczlAm zUyi@ZPDGV>5xYVdv$N&LVyW&IZc@I|@QvLD_yxAJ38a6p;qXYQZMvrR`mSQitc&pQ z?@ne!;H!ypu{VIJ%R_hz+tFoZuHKJwd&zcODYLZVI3%L>LaTY?Zn262G-NRor;J7< z6Ru-~ZoHqOl;|FrFA%yhz||{8AP*5Cs0A>4m#!f6qK>8D9&U&W&A6*t52)Ek$kpncmI=U>uB$!mX_!a?Er-V8mS z2BDQ^#E^9e!QNGXa1`gC=lKfx1)D+D@}I5TkoIYy0Y{%G)uOxE=S25?Ne%e`Gp|ZS_qyYOZ zVTs2${37muy;Brutu$96^`_e`QD1~KSL#Al;%h2O-&bjd@%tWaQ5>)N1^;@dpmDX@ zT$0MN)1dn;_TdM1+}yuMR*@_0X{;mO zYlG73UE;q!8h>`r%fNSXWH=@#JKf(J5K+zCEGvmN@>FAWQ@;u>gVP$#)Moo+YDnB; zeGKL(Q_dQ{zeNAi@mDM0L-0a5(u=^~0Z*TsjLZt;mzG2uWHMz>YM~F_2K<85UpSnm zt<7=ic-;T-6%-OO0^RT57ygyDw8^hBYM}um49}oPHu_%qh=rp?U7`Z}x7Y%%OFdm? z3WW=g+{(K!aTB%Ny}i3(b9YCr9ts2=>B4S851kBXH0TY%vxx>Wg+o7IRRu&lyK+&} zO|z3r7yWwI>5L=V8{=qeLaJlUKafOmQy(lRuPf3Ab%73LR zvN-lBOA=4T_jOYZAmDnr{ylLtK0f{)sDrkgAWS>~=>IQckEKe+$nmMA3wQVx>muW8 z)B}`6t1BH)wJBD%w{hH(GfN5oV^Akcqpn7tl@jhYQh`esNnTwWm?ylb)F-3s*a>6& z{7YlKjIsIG1MqW~DMm?EXYWiwC#^rTwe-fn2SznZ%U6X*Z=+g6!+%0A|k&2BocNu$w2wi9_3>Nqa#ECA@g|5S^)( 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 literal 80066 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 From f365af81c23ea7fb7cbc204b9cc988f9fb549ebc Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 15:41:13 -0700 Subject: [PATCH 259/265] parallelize remote content fetching --- weed/server/filer_grpc_server_remote.go | 118 +++++++++++++----------- 1 file changed, 63 insertions(+), 55 deletions(-) diff --git a/weed/server/filer_grpc_server_remote.go b/weed/server/filer_grpc_server_remote.go index 8144d6a90..54e9445ce 100644 --- a/weed/server/filer_grpc_server_remote.go +++ b/weed/server/filer_grpc_server_remote.go @@ -78,66 +78,74 @@ func (fs *FilerServer) DownloadToLocal(ctx context.Context, req *filer_pb.Downlo dest := util.FullPath(remoteStorageMountedLocation.Path).Child(string(util.FullPath(req.Directory).Child(req.Name))[len(localMountedDir):]) var chunks []*filer_pb.FileChunk + var fetchAndWriteErr error - // FIXME limit on parallel + limitedConcurrentExecutor := util.NewLimitedConcurrentExecutor(8) for offset := int64(0); offset < entry.Remote.RemoteSize; offset += chunkSize { - size := chunkSize - if offset+chunkSize > entry.Remote.RemoteSize { - size = entry.Remote.RemoteSize - offset - } + localOffset := offset - // assign one volume server - assignResult, err := operation.Assign(fs.filer.GetMaster, fs.grpcDialOption, assignRequest, altRequest) - if err != nil { - return resp, err - } - if assignResult.Error != "" { - return resp, fmt.Errorf("assign: %v", assignResult.Error) - } - fileId, parseErr := needle.ParseFileIdFromString(assignResult.Fid) - if assignResult.Error != "" { - return resp, fmt.Errorf("unrecognized file id %s: %v", assignResult.Fid, parseErr) - } - - // tell filer to tell volume server to download into needles - err = operation.WithVolumeServerClient(assignResult.Url, fs.grpcDialOption, func(volumeServerClient volume_server_pb.VolumeServerClient) error { - _, fetchAndWriteErr := volumeServerClient.FetchAndWriteNeedle(context.Background(), &volume_server_pb.FetchAndWriteNeedleRequest{ - VolumeId: uint32(fileId.VolumeId), - NeedleId: uint64(fileId.Key), - Cookie: uint32(fileId.Cookie), - Offset: offset, - Size: size, - RemoteType: storageConf.Type, - RemoteName: storageConf.Name, - S3AccessKey: storageConf.S3AccessKey, - S3SecretKey: storageConf.S3SecretKey, - S3Region: storageConf.S3Region, - S3Endpoint: storageConf.S3Endpoint, - RemoteBucket: remoteStorageMountedLocation.Bucket, - RemotePath: string(dest), - }) - if fetchAndWriteErr != nil { - return fmt.Errorf("volume server %s fetchAndWrite %s: %v", assignResult.Url, dest, fetchAndWriteErr) + limitedConcurrentExecutor.Execute(func() { + size := chunkSize + if localOffset+chunkSize > entry.Remote.RemoteSize { + size = entry.Remote.RemoteSize - localOffset } - return nil + + // assign one volume server + assignResult, err := operation.Assign(fs.filer.GetMaster, fs.grpcDialOption, assignRequest, altRequest) + if err != nil { + fetchAndWriteErr = err + return + } + if assignResult.Error != "" { + fetchAndWriteErr = fmt.Errorf("assign: %v", assignResult.Error) + return + } + fileId, parseErr := needle.ParseFileIdFromString(assignResult.Fid) + if assignResult.Error != "" { + fetchAndWriteErr = fmt.Errorf("unrecognized file id %s: %v", assignResult.Fid, parseErr) + return + } + + // tell filer to tell volume server to download into needles + err = operation.WithVolumeServerClient(assignResult.Url, fs.grpcDialOption, func(volumeServerClient volume_server_pb.VolumeServerClient) error { + _, fetchAndWriteErr := volumeServerClient.FetchAndWriteNeedle(context.Background(), &volume_server_pb.FetchAndWriteNeedleRequest{ + VolumeId: uint32(fileId.VolumeId), + NeedleId: uint64(fileId.Key), + Cookie: uint32(fileId.Cookie), + Offset: localOffset, + Size: size, + RemoteType: storageConf.Type, + RemoteName: storageConf.Name, + S3AccessKey: storageConf.S3AccessKey, + S3SecretKey: storageConf.S3SecretKey, + S3Region: storageConf.S3Region, + S3Endpoint: storageConf.S3Endpoint, + RemoteBucket: remoteStorageMountedLocation.Bucket, + RemotePath: string(dest), + }) + if fetchAndWriteErr != nil { + return fmt.Errorf("volume server %s fetchAndWrite %s: %v", assignResult.Url, dest, fetchAndWriteErr) + } + return nil + }) + + if err != nil { + fetchAndWriteErr = err + return + } + + chunks = append(chunks, &filer_pb.FileChunk{ + FileId: assignResult.Fid, + Offset: localOffset, + Size: uint64(size), + Mtime: time.Now().Unix(), + Fid: &filer_pb.FileId{ + VolumeId: uint32(fileId.VolumeId), + FileKey: uint64(fileId.Key), + Cookie: uint32(fileId.Cookie), + }, + }) }) - - if err != nil { - return nil, err - } - - chunks = append(chunks, &filer_pb.FileChunk{ - FileId: assignResult.Fid, - Offset: offset, - Size: uint64(size), - Mtime: time.Now().Unix(), - Fid: &filer_pb.FileId{ - VolumeId: uint32(fileId.VolumeId), - FileKey: uint64(fileId.Key), - Cookie: uint32(fileId.Cookie), - }, - }) - } garbage := entry.Chunks From 889b143fa73b95f15548fd31e0543496afd91362 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 15:44:47 -0700 Subject: [PATCH 260/265] adjust modification detection logic --- weed/server/filer_grpc_server_remote.go | 2 +- weed/shell/command_remote_cache.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/weed/server/filer_grpc_server_remote.go b/weed/server/filer_grpc_server_remote.go index 54e9445ce..97927e9c0 100644 --- a/weed/server/filer_grpc_server_remote.go +++ b/weed/server/filer_grpc_server_remote.go @@ -153,7 +153,7 @@ func (fs *FilerServer) DownloadToLocal(ctx context.Context, req *filer_pb.Downlo newEntry := entry.ShallowClone() newEntry.Chunks = chunks newEntry.Remote = proto.Clone(entry.Remote).(*filer_pb.RemoteEntry) - newEntry.Remote.LocalMtime = time.Now().Unix() + newEntry.Remote.LocalMtime = entry.Mtime.Unix() // this skips meta data log events diff --git a/weed/shell/command_remote_cache.go b/weed/shell/command_remote_cache.go index c74166611..8980fc82e 100644 --- a/weed/shell/command_remote_cache.go +++ b/weed/shell/command_remote_cache.go @@ -118,7 +118,7 @@ func shouldCacheToLocal(entry *filer_pb.Entry) bool { if entry.RemoteEntry == nil { return false } - if entry.RemoteEntry.LocalMtime == 0 && entry.RemoteEntry.RemoteSize > 0 { + if entry.RemoteEntry.LocalMtime < entry.Attributes.Mtime && entry.RemoteEntry.RemoteSize > 0 { return true } return false From cb53802752919fd91342927b401f8f66652c79ec Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 15:55:53 -0700 Subject: [PATCH 261/265] adjust help message --- weed/shell/command_remote_cache.go | 8 ++++---- weed/shell/command_remote_mount.go | 6 +++--- weed/shell/command_remote_uncache.go | 8 ++++---- weed/shell/command_remote_unmount.go | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/weed/shell/command_remote_cache.go b/weed/shell/command_remote_cache.go index 8980fc82e..561484302 100644 --- a/weed/shell/command_remote_cache.go +++ b/weed/shell/command_remote_cache.go @@ -27,12 +27,12 @@ func (c *commandRemoteCache) Help() string { # assume a remote storage is configured to name "cloud1" remote.configure -name=cloud1 -type=s3 -access_key=xxx -secret_key=yyy # mount and pull one bucket - remote.mount -dir=xxx -remote=cloud1/bucket + remote.mount -dir=/xxx -remote=cloud1/bucket # after mount, run one of these command to cache the content of the files - remote.cache -dir=xxx - remote.cache -dir=xxx/some/sub/dir - remote.cache -dir=xxx/some/sub/dir -include=*.pdf + remote.cache -dir=/xxx + remote.cache -dir=/xxx/some/sub/dir + remote.cache -dir=/xxx/some/sub/dir -include=*.pdf This is designed to run regularly. So you can add it to some cronjob. If a file is already synchronized with the remote copy, the file will be skipped to avoid unnecessary copy. diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go index 3b04fec63..189d1d937 100644 --- a/weed/shell/command_remote_mount.go +++ b/weed/shell/command_remote_mount.go @@ -31,12 +31,12 @@ func (c *commandRemoteMount) Help() string { remote.configure -name=cloud1 -type=s3 -access_key=xxx -secret_key=yyy # mount and pull one bucket - remote.mount -dir=xxx -remote=cloud1/bucket + remote.mount -dir=/xxx -remote=cloud1/bucket # mount and pull one directory in the bucket - remote.mount -dir=xxx -remote=cloud1/bucket/dir1 + remote.mount -dir=/xxx -remote=cloud1/bucket/dir1 # after mount, start a separate process to write updates to remote storage - weed filer.remote.sync -filer=: -dir=xxx + weed filer.remote.sync -filer=: -dir=/xxx ` } diff --git a/weed/shell/command_remote_uncache.go b/weed/shell/command_remote_uncache.go index f94fe8bec..733218379 100644 --- a/weed/shell/command_remote_uncache.go +++ b/weed/shell/command_remote_uncache.go @@ -29,10 +29,10 @@ func (c *commandRemoteUncache) Help() string { This is designed to run regularly. So you can add it to some cronjob. If a file is not synchronized with the remote copy, the file will be skipped to avoid loss of data. - remote.uncache -dir=xxx - remote.uncache -dir=xxx/some/sub/dir - remote.uncache -dir=xxx/some/sub/dir -include=*.pdf - remote.uncache -dir=xxx/some/sub/dir -exclude=*.txt + remote.uncache -dir=/xxx + remote.uncache -dir=/xxx/some/sub/dir + remote.uncache -dir=/xxx/some/sub/dir -include=*.pdf + remote.uncache -dir=/xxx/some/sub/dir -exclude=*.txt ` } diff --git a/weed/shell/command_remote_unmount.go b/weed/shell/command_remote_unmount.go index b16da44f1..b65d125aa 100644 --- a/weed/shell/command_remote_unmount.go +++ b/weed/shell/command_remote_unmount.go @@ -27,10 +27,10 @@ func (c *commandRemoteUnmount) Help() string { # assume a remote storage is configured to name "s3_1" remote.configure -name=s3_1 -type=s3 -access_key=xxx -secret_key=yyy # mount and pull one bucket - remote.mount -dir=xxx -remote=s3_1/bucket + remote.mount -dir=/xxx -remote=s3_1/bucket # unmount the mounted directory and remove its cache - remote.unmount -dir=xxx + remote.unmount -dir=/xxx ` } From c34747c79d99d8a08bea31b7339b17dca6fad44d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 21:46:34 -0700 Subject: [PATCH 262/265] rename, fix wrong logic. --- other/java/client/src/main/proto/filer.proto | 2 +- weed/command/filer_remote_sync.go | 2 +- weed/pb/filer.proto | 2 +- weed/pb/filer_pb/filer.pb.go | 1083 +++++++++--------- weed/server/filer_grpc_server_remote.go | 2 +- weed/shell/command_remote_cache.go | 4 +- weed/shell/command_remote_mount.go | 10 + weed/shell/command_remote_uncache.go | 4 +- 8 files changed, 560 insertions(+), 549 deletions(-) diff --git a/other/java/client/src/main/proto/filer.proto b/other/java/client/src/main/proto/filer.proto index c9257ddca..bb415741f 100644 --- a/other/java/client/src/main/proto/filer.proto +++ b/other/java/client/src/main/proto/filer.proto @@ -96,7 +96,7 @@ message ListEntriesResponse { message RemoteEntry { string storage_name = 1; - int64 local_mtime = 2; + int64 last_local_sync_ts_ms = 2; string remote_e_tag = 3; int64 remote_mtime = 4; int64 remote_size = 5; diff --git a/weed/command/filer_remote_sync.go b/weed/command/filer_remote_sync.go index b7e90b3e7..8b20957e4 100644 --- a/weed/command/filer_remote_sync.go +++ b/weed/command/filer_remote_sync.go @@ -239,7 +239,7 @@ func shouldSendToRemote(entry *filer_pb.Entry) bool { if entry.RemoteEntry == nil { return true } - if entry.RemoteEntry.LocalMtime < entry.Attributes.Mtime { + if entry.RemoteEntry.LastLocalSyncTsNs/1e9 < entry.Attributes.Mtime { return true } return false diff --git a/weed/pb/filer.proto b/weed/pb/filer.proto index c9257ddca..1c22276ae 100644 --- a/weed/pb/filer.proto +++ b/weed/pb/filer.proto @@ -96,7 +96,7 @@ message ListEntriesResponse { message RemoteEntry { string storage_name = 1; - int64 local_mtime = 2; + int64 last_local_sync_ts_ns = 2; string remote_e_tag = 3; int64 remote_mtime = 4; int64 remote_size = 5; diff --git a/weed/pb/filer_pb/filer.pb.go b/weed/pb/filer_pb/filer.pb.go index 1f2cdafcd..bf40958dc 100644 --- a/weed/pb/filer_pb/filer.pb.go +++ b/weed/pb/filer_pb/filer.pb.go @@ -262,11 +262,11 @@ type RemoteEntry struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StorageName string `protobuf:"bytes,1,opt,name=storage_name,json=storageName,proto3" json:"storage_name,omitempty"` - LocalMtime int64 `protobuf:"varint,2,opt,name=local_mtime,json=localMtime,proto3" json:"local_mtime,omitempty"` - RemoteETag string `protobuf:"bytes,3,opt,name=remote_e_tag,json=remoteETag,proto3" json:"remote_e_tag,omitempty"` - RemoteMtime int64 `protobuf:"varint,4,opt,name=remote_mtime,json=remoteMtime,proto3" json:"remote_mtime,omitempty"` - RemoteSize int64 `protobuf:"varint,5,opt,name=remote_size,json=remoteSize,proto3" json:"remote_size,omitempty"` + StorageName string `protobuf:"bytes,1,opt,name=storage_name,json=storageName,proto3" json:"storage_name,omitempty"` + LastLocalSyncTsNs int64 `protobuf:"varint,2,opt,name=last_local_sync_ts_ms,json=lastLocalSyncTsMs,proto3" json:"last_local_sync_ts_ms,omitempty"` + RemoteETag string `protobuf:"bytes,3,opt,name=remote_e_tag,json=remoteETag,proto3" json:"remote_e_tag,omitempty"` + RemoteMtime int64 `protobuf:"varint,4,opt,name=remote_mtime,json=remoteMtime,proto3" json:"remote_mtime,omitempty"` + RemoteSize int64 `protobuf:"varint,5,opt,name=remote_size,json=remoteSize,proto3" json:"remote_size,omitempty"` } func (x *RemoteEntry) Reset() { @@ -308,9 +308,9 @@ func (x *RemoteEntry) GetStorageName() string { return "" } -func (x *RemoteEntry) GetLocalMtime() int64 { +func (x *RemoteEntry) GetLastLocalSyncTsMs() int64 { if x != nil { - return x.LocalMtime + return x.LastLocalSyncTsNs } return 0 } @@ -3664,547 +3664,548 @@ var file_filer_proto_rawDesc = []byte{ 0x22, 0x3c, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0xb7, + 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0xc8, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x6d, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x74, 0x69, - 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x5f, 0x74, - 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x45, 0x54, 0x61, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x6d, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x4d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xbf, 0x03, 0x0a, 0x05, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x64, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, - 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, - 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x12, 0x38, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x75, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x65, 0x73, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, - 0x12, 0x39, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x68, - 0x61, 0x72, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0a, 0x68, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x2a, 0x0a, - 0x11, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x68, 0x61, 0x72, 0x64, 0x4c, 0x69, - 0x6e, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0b, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x1a, 0x3b, 0x0a, - 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x44, 0x0a, 0x09, 0x46, 0x75, - 0x6c, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x72, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, + 0x65, 0x12, 0x30, 0x0a, 0x15, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, + 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x73, 0x5f, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x54, + 0x73, 0x4d, 0x73, 0x12, 0x20, 0x0a, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x5f, + 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x45, 0x54, 0x61, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, + 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x4d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xbf, 0x03, 0x0a, 0x05, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, + 0x73, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, + 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x12, 0x38, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x75, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x12, 0x39, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0c, + 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0a, 0x68, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x2a, + 0x0a, 0x11, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x68, 0x61, 0x72, 0x64, 0x4c, + 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0b, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x1a, 0x3b, + 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x44, 0x0a, 0x09, 0x46, + 0x75, 0x6c, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x72, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x22, 0x8f, 0x02, 0x0a, 0x11, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x09, 0x6f, 0x6c, 0x64, 0x5f, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6f, 0x6c, 0x64, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x22, 0x8f, 0x02, 0x0a, 0x11, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x09, 0x6f, 0x6c, 0x64, 0x5f, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6f, 0x6c, 0x64, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, - 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, - 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, - 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x22, 0xe6, 0x02, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x65, - 0x5f, 0x74, 0x61, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x54, 0x61, 0x67, - 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x03, 0x66, 0x69, 0x64, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, - 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x03, 0x66, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x0a, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, - 0x52, 0x09, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, - 0x69, 0x70, 0x68, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x09, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, - 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0c, 0x69, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, - 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x6d, 0x61, 0x6e, 0x69, - 0x66, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x22, 0x40, 0x0a, 0x11, 0x46, - 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, - 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x58, 0x0a, - 0x06, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x12, - 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x07, 0x52, - 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x22, 0x9d, 0x03, 0x0a, 0x0e, 0x46, 0x75, 0x73, 0x65, - 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, - 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x66, - 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, - 0x67, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, - 0x63, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x69, 0x6d, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, - 0x74, 0x74, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x74, - 0x74, 0x6c, 0x53, 0x65, 0x63, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x79, 0x6d, 0x6c, 0x69, - 0x6e, 0x6b, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x64, 0x35, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6d, 0x64, 0x35, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, - 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, - 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x25, 0x0a, 0x05, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x6f, 0x45, 0x78, 0x63, 0x6c, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, - 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, - 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, - 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x2b, 0x0a, - 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xac, 0x01, 0x0a, 0x12, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, - 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, - 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, - 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x80, 0x01, 0x0a, 0x14, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x98, 0x02, 0x0a, - 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, - 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x69, - 0x73, 0x5f, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0b, 0x69, 0x73, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x34, - 0x0a, 0x16, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, - 0x76, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, - 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, - 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x22, 0xba, 0x01, 0x0a, 0x18, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x6c, 0x64, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x44, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x6c, 0x64, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x44, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x22, 0x1b, 0x0a, 0x19, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xec, - 0x01, 0x0a, 0x13, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, - 0x0a, 0x07, 0x74, 0x74, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x74, 0x74, 0x6c, 0x53, 0x65, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, - 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, - 0x72, 0x61, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x61, 0x63, 0x6b, - 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0xe2, 0x01, - 0x0a, 0x14, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, - 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, - 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x72, 0x6c, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x22, 0x34, 0x0a, 0x13, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x73, 0x22, 0x3d, 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3b, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x55, 0x72, 0x6c, 0x22, 0xc3, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, - 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x61, - 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x4d, 0x61, 0x70, 0x1a, 0x54, 0x0a, 0x11, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x20, 0x0a, 0x0a, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7b, 0x0a, 0x15, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4e, 0x6f, - 0x72, 0x6d, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x65, 0x63, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x22, 0x50, 0x0a, 0x16, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x39, 0x0a, 0x17, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, - 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, - 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0x6f, 0x0a, 0x12, 0x53, 0x74, 0x61, - 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1b, - 0x0a, 0x09, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x08, 0x75, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x66, - 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x09, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1e, 0x0a, 0x1c, 0x47, 0x65, - 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xde, 0x02, 0x0a, 0x1d, 0x47, - 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x5f, - 0x6d, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x61, 0x78, 0x4d, 0x62, 0x12, - 0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x72, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69, 0x72, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, - 0x12, 0x16, 0x0a, 0x06, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x30, 0x0a, 0x14, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, - 0x63, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x95, 0x01, 0x0a, 0x18, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x74, - 0x68, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x70, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, - 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x69, - 0x6e, 0x63, 0x65, 0x4e, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, - 0x4a, 0x0a, 0x12, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4e, - 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x05, 0x74, - 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, 0x73, - 0x22, 0x61, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x13, 0x0a, 0x05, - 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, - 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, - 0x65, 0x79, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x22, 0x65, 0x0a, 0x14, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x08, 0x67, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x4b, 0x65, - 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, - 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xcd, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x63, 0x61, 0x74, - 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x1a, 0x58, 0x0a, 0x08, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, 0x70, 0x63, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x67, 0x72, 0x70, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, - 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x0a, 0x0c, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x3b, 0x0a, 0x0d, 0x4b, 0x76, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x36, 0x0a, 0x0c, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a, - 0x0d, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x22, 0xeb, 0x02, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, - 0x6e, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x09, - 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x66, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x09, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x87, 0x02, 0x0a, 0x08, 0x50, 0x61, 0x74, - 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1e, - 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, - 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, - 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x66, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x66, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x2e, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, - 0x6c, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, - 0x6c, 0x79, 0x22, 0xba, 0x01, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x33, 0x5f, - 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x73, 0x33, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, - 0x0d, 0x73, 0x33, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x33, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, - 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x33, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1f, - 0x0a, 0x0b, 0x73, 0x33, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x33, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, - 0xbe, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x48, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x70, - 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x61, 0x70, 0x70, 0x69, - 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, - 0x67, 0x73, 0x1a, 0x5c, 0x0a, 0x0d, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x57, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x4a, 0x0a, 0x16, 0x44, 0x6f, 0x77, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x40, 0x0a, 0x17, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, + 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x22, 0xe6, 0x02, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x05, + 0x65, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x54, 0x61, + 0x67, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x03, 0x66, 0x69, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x03, 0x66, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x0a, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, + 0x64, 0x52, 0x09, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x09, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x69, + 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x6d, 0x61, 0x6e, + 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x22, 0x40, 0x0a, 0x11, + 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, + 0x74, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, + 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x58, + 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, + 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x07, + 0x52, 0x06, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x22, 0x9d, 0x03, 0x0a, 0x0e, 0x46, 0x75, 0x73, + 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x66, + 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, + 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1b, + 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, + 0x03, 0x67, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, + 0x16, 0x0a, 0x06, 0x63, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x06, 0x63, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x69, 0x6d, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x74, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, + 0x74, 0x74, 0x6c, 0x53, 0x65, 0x63, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x79, 0x6d, 0x6c, + 0x69, 0x6e, 0x6b, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x64, 0x35, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6d, 0x64, 0x35, 0x12, 0x1b, 0x0a, 0x09, 0x64, + 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x25, 0x0a, + 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x6f, 0x45, 0x78, 0x63, 0x6c, 0x12, 0x31, 0x0a, 0x15, 0x69, + 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, + 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, + 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x2b, + 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xac, 0x01, 0x0a, 0x12, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, + 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x32, 0xb6, 0x0d, 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x77, - 0x65, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, - 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, - 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x4c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, - 0x0d, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1e, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, - 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, - 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x4f, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, - 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, - 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, - 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, - 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, - 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, + 0x6f, 0x6d, 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, + 0x68, 0x65, 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x80, 0x01, 0x0a, 0x14, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x98, 0x02, + 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x69, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, + 0x69, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, + 0x34, 0x0a, 0x16, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, + 0x69, 0x76, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x14, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, + 0x5f, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4f, 0x74, 0x68, 0x65, + 0x72, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xba, 0x01, 0x0a, 0x18, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, + 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x6c, 0x64, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x44, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x6c, 0x64, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x44, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x22, 0x1b, 0x0a, 0x19, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0xec, 0x01, 0x0a, 0x13, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, + 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x17, 0x0a, 0x07, 0x74, 0x74, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x06, 0x74, 0x74, 0x6c, 0x53, 0x65, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, + 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, + 0x04, 0x72, 0x61, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x61, 0x63, + 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0xe2, + 0x01, 0x0a, 0x14, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x75, 0x72, 0x6c, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x72, + 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x34, 0x0a, 0x13, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x73, 0x22, 0x3d, 0x0a, 0x09, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3b, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x55, 0x72, 0x6c, 0x22, 0xc3, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, + 0x0a, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6d, 0x61, 0x70, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, + 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x4d, 0x61, 0x70, 0x1a, 0x54, 0x0a, 0x11, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x20, 0x0a, 0x0a, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7b, 0x0a, + 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4e, + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x65, 0x63, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x22, 0x50, 0x0a, 0x16, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x39, 0x0a, 0x17, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, - 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x6a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, - 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4f, 0x0a, - 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x12, 0x1d, 0x2e, + 0x6e, 0x73, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, + 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, + 0x74, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, + 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0x6f, 0x0a, 0x12, 0x53, 0x74, + 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x08, 0x75, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x1e, 0x0a, 0x1c, 0x47, + 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xde, 0x02, 0x0a, 0x1d, + 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x61, 0x78, + 0x5f, 0x6d, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x61, 0x78, 0x4d, 0x62, + 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x72, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69, 0x72, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, + 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x95, 0x01, 0x0a, + 0x18, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, + 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x70, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x19, 0x0a, 0x08, 0x73, + 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, + 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, + 0x12, 0x4a, 0x0a, 0x12, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x05, + 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, 0x4e, + 0x73, 0x22, 0x61, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x13, 0x0a, + 0x05, 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x73, + 0x4e, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6b, 0x65, 0x79, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x65, 0x0a, 0x14, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x4b, + 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x0a, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, + 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xcd, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x1a, 0x58, 0x0a, + 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, 0x70, + 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x67, 0x72, 0x70, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x0a, 0x0c, 0x4b, 0x76, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x3b, 0x0a, 0x0d, 0x4b, 0x76, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x36, 0x0a, 0x0c, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, + 0x0a, 0x0d, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xeb, 0x02, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, + 0x6f, 0x6e, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x09, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x87, 0x02, 0x0a, 0x08, 0x50, 0x61, + 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, + 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x66, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x66, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x2e, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x77, 0x74, + 0x68, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, + 0x6e, 0x6c, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, + 0x6e, 0x6c, 0x79, 0x22, 0xba, 0x01, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x33, + 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x73, 0x33, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x22, + 0x0a, 0x0d, 0x73, 0x33, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x33, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, + 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x33, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, + 0x1f, 0x0a, 0x0b, 0x73, 0x33, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x33, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x22, 0xbe, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x48, 0x0a, 0x08, 0x6d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x73, 0x1a, 0x5c, 0x0a, 0x0d, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x57, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x4a, 0x0a, 0x16, 0x44, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x40, 0x0a, 0x17, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, + 0x61, 0x64, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x32, 0xb6, 0x0d, 0x0a, 0x0c, 0x53, 0x65, 0x61, + 0x77, 0x65, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, + 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, + 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, + 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, + 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, + 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x5e, 0x0a, 0x11, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x52, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4f, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, + 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x6a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x65, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4c, 0x6f, 0x63, 0x61, + 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4f, + 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x12, 0x1d, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, + 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, - 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, - 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, - 0x0a, 0x05, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, - 0x50, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, - 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0f, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, - 0x61, 0x64, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x6f, 0x4c, - 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x54, - 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, - 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, - 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, + 0x76, 0x50, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0f, 0x44, 0x6f, 0x77, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x20, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x6f, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, + 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, + 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/weed/server/filer_grpc_server_remote.go b/weed/server/filer_grpc_server_remote.go index 97927e9c0..6d77e310a 100644 --- a/weed/server/filer_grpc_server_remote.go +++ b/weed/server/filer_grpc_server_remote.go @@ -153,7 +153,7 @@ func (fs *FilerServer) DownloadToLocal(ctx context.Context, req *filer_pb.Downlo newEntry := entry.ShallowClone() newEntry.Chunks = chunks newEntry.Remote = proto.Clone(entry.Remote).(*filer_pb.RemoteEntry) - newEntry.Remote.LocalMtime = entry.Mtime.Unix() + newEntry.Remote.LastLocalSyncTsNs = time.Now().UnixNano() // this skips meta data log events diff --git a/weed/shell/command_remote_cache.go b/weed/shell/command_remote_cache.go index 561484302..4e19b6a99 100644 --- a/weed/shell/command_remote_cache.go +++ b/weed/shell/command_remote_cache.go @@ -118,7 +118,7 @@ func shouldCacheToLocal(entry *filer_pb.Entry) bool { if entry.RemoteEntry == nil { return false } - if entry.RemoteEntry.LocalMtime < entry.Attributes.Mtime && entry.RemoteEntry.RemoteSize > 0 { + if entry.RemoteEntry.LastLocalSyncTsNs == 0 && entry.RemoteEntry.RemoteSize > 0 { return true } return false @@ -131,7 +131,7 @@ func mayHaveCachedToLocal(entry *filer_pb.Entry) bool { if entry.RemoteEntry == nil { return false // should not uncache an entry that is not in remote } - if entry.RemoteEntry.LocalMtime > 0 && len(entry.Chunks) > 0 { + if entry.RemoteEntry.LastLocalSyncTsNs > 0 && len(entry.Chunks) > 0 { return true } return false diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go index 189d1d937..2483fa5be 100644 --- a/weed/shell/command_remote_mount.go +++ b/weed/shell/command_remote_mount.go @@ -234,6 +234,16 @@ func (c *commandRemoteMount) saveMountMapping(commandEnv *CommandEnv, writer io. return nil } +// if an entry has synchronized metadata but has not synchronized content +// entry.Attributes.FileSize == entry.RemoteEntry.RemoteSize +// entry.Attributes.Mtime == entry.RemoteEntry.RemoteMtime +// entry.RemoteEntry.LastLocalSyncTsNs == 0 +// if an entry has synchronized metadata but has synchronized content before +// entry.Attributes.FileSize == entry.RemoteEntry.RemoteSize +// entry.Attributes.Mtime == entry.RemoteEntry.RemoteMtime +// entry.RemoteEntry.LastLocalSyncTsNs > 0 +// if an entry has synchronized metadata but has new updates +// entry.Attributes.Mtime * 1,000,000,000 > entry.RemoteEntry.LastLocalSyncTsNs func doSaveRemoteEntry(client filer_pb.SeaweedFilerClient, localDir string, existingEntry *filer_pb.Entry, remoteEntry *filer_pb.RemoteEntry) error { existingEntry.RemoteEntry = remoteEntry existingEntry.Attributes.FileSize = uint64(remoteEntry.RemoteSize) diff --git a/weed/shell/command_remote_uncache.go b/weed/shell/command_remote_uncache.go index 733218379..0e5152f78 100644 --- a/weed/shell/command_remote_uncache.go +++ b/weed/shell/command_remote_uncache.go @@ -89,11 +89,11 @@ func (c *commandRemoteUncache) uncacheContentData(commandEnv *CommandEnv, writer return true } - if entry.RemoteEntry.LocalMtime < entry.Attributes.Mtime { + if entry.RemoteEntry.LastLocalSyncTsNs/1e9 < entry.Attributes.Mtime { return true // should not uncache an entry that is not synchronized with remote } - entry.RemoteEntry.LocalMtime = 0 + entry.RemoteEntry.LastLocalSyncTsNs = 0 entry.Chunks = nil println(dir, entry.Name) From 3ada61c875158dedd24618013da01939cc7acc07 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 14 Aug 2021 21:50:35 -0700 Subject: [PATCH 263/265] rename --- other/java/client/src/main/proto/filer.proto | 2 +- weed/pb/filer_pb/filer.pb.go | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/other/java/client/src/main/proto/filer.proto b/other/java/client/src/main/proto/filer.proto index bb415741f..1c22276ae 100644 --- a/other/java/client/src/main/proto/filer.proto +++ b/other/java/client/src/main/proto/filer.proto @@ -96,7 +96,7 @@ message ListEntriesResponse { message RemoteEntry { string storage_name = 1; - int64 last_local_sync_ts_ms = 2; + int64 last_local_sync_ts_ns = 2; string remote_e_tag = 3; int64 remote_mtime = 4; int64 remote_size = 5; diff --git a/weed/pb/filer_pb/filer.pb.go b/weed/pb/filer_pb/filer.pb.go index bf40958dc..702f7e3df 100644 --- a/weed/pb/filer_pb/filer.pb.go +++ b/weed/pb/filer_pb/filer.pb.go @@ -263,7 +263,7 @@ type RemoteEntry struct { unknownFields protoimpl.UnknownFields StorageName string `protobuf:"bytes,1,opt,name=storage_name,json=storageName,proto3" json:"storage_name,omitempty"` - LastLocalSyncTsNs int64 `protobuf:"varint,2,opt,name=last_local_sync_ts_ms,json=lastLocalSyncTsMs,proto3" json:"last_local_sync_ts_ms,omitempty"` + LastLocalSyncTsNs int64 `protobuf:"varint,2,opt,name=last_local_sync_ts_ns,json=lastLocalSyncTsNs,proto3" json:"last_local_sync_ts_ns,omitempty"` RemoteETag string `protobuf:"bytes,3,opt,name=remote_e_tag,json=remoteETag,proto3" json:"remote_e_tag,omitempty"` RemoteMtime int64 `protobuf:"varint,4,opt,name=remote_mtime,json=remoteMtime,proto3" json:"remote_mtime,omitempty"` RemoteSize int64 `protobuf:"varint,5,opt,name=remote_size,json=remoteSize,proto3" json:"remote_size,omitempty"` @@ -308,7 +308,7 @@ func (x *RemoteEntry) GetStorageName() string { return "" } -func (x *RemoteEntry) GetLastLocalSyncTsMs() int64 { +func (x *RemoteEntry) GetLastLocalSyncTsNs() int64 { if x != nil { return x.LastLocalSyncTsNs } @@ -3669,9 +3669,9 @@ var file_filer_proto_rawDesc = []byte{ 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x15, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, - 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x73, 0x5f, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x54, - 0x73, 0x4d, 0x73, 0x12, 0x20, 0x0a, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x5f, + 0x73, 0x4e, 0x73, 0x12, 0x20, 0x0a, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x54, 0x61, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65, 0x6d, From 9462f5129a8c6c66200150b41ddfe96a3dd0454e Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 15 Aug 2021 01:53:46 -0700 Subject: [PATCH 264/265] shell: add "remote.meta.sync" --- weed/filer/read_remote.go | 6 +- weed/remote_storage/s3/s3_storage_client.go | 6 +- weed/shell/command_remote_cache.go | 31 +-- weed/shell/command_remote_meta_sync.go | 208 ++++++++++++++++++++ weed/shell/command_remote_mount.go | 61 +----- weed/util/fullpath.go | 10 +- 6 files changed, 230 insertions(+), 92 deletions(-) create mode 100644 weed/shell/command_remote_meta_sync.go diff --git a/weed/filer/read_remote.go b/weed/filer/read_remote.go index 77ca81f15..eee536ff6 100644 --- a/weed/filer/read_remote.go +++ b/weed/filer/read_remote.go @@ -30,10 +30,14 @@ func MapFullPathToRemoteStorageLocation(localMountedDir util.FullPath, remoteMou Bucket: remoteMountedLocation.Bucket, Path: remoteMountedLocation.Path, } - remoteLocation.Path += string(fp)[len(localMountedDir):] + remoteLocation.Path = string(util.FullPath(remoteLocation.Path).Child(string(fp)[len(localMountedDir):])) return remoteLocation } +func MapRemoteStorageLocationPathToFullPath(localMountedDir util.FullPath, remoteMountedLocation *filer_pb.RemoteStorageLocation, remoteLocationPath string)(fp util.FullPath) { + return localMountedDir.Child(remoteLocationPath[len(remoteMountedLocation.Path):]) +} + func DownloadToLocal(filerClient filer_pb.FilerClient, remoteConf *filer_pb.RemoteConf, remoteLocation *filer_pb.RemoteStorageLocation, parent util.FullPath, entry *filer_pb.Entry) error { return filerClient.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { _, err := client.DownloadToLocal(context.Background(), &filer_pb.DownloadToLocalRequest{ diff --git a/weed/remote_storage/s3/s3_storage_client.go b/weed/remote_storage/s3/s3_storage_client.go index 17c5079de..7c4d895ec 100644 --- a/weed/remote_storage/s3/s3_storage_client.go +++ b/weed/remote_storage/s3/s3_storage_client.go @@ -70,11 +70,7 @@ func (s *s3RemoteStorageClient) Traverse(remote *filer_pb.RemoteStorageLocation, listErr := s.conn.ListObjectsV2Pages(listInput, func(page *s3.ListObjectsV2Output, lastPage bool) bool { for _, content := range page.Contents { key := *content.Key - if len(pathKey) == 0 { - key = "/" + key - } else { - key = key[len(pathKey):] - } + key = "/" + key dir, name := util.FullPath(key).DirAndName() if err := visitFn(dir, name, false, &filer_pb.RemoteEntry{ RemoteMtime: (*content.LastModified).Unix(), diff --git a/weed/shell/command_remote_cache.go b/weed/shell/command_remote_cache.go index 4e19b6a99..21c479258 100644 --- a/weed/shell/command_remote_cache.go +++ b/weed/shell/command_remote_cache.go @@ -7,7 +7,6 @@ import ( "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/util" "io" - "strings" ) func init() { @@ -53,33 +52,9 @@ func (c *commandRemoteCache) Do(args []string, commandEnv *CommandEnv, writer io return nil } - mappings, listErr := filer.ReadMountMappings(commandEnv.option.GrpcDialOption, commandEnv.option.FilerAddress) - if listErr != nil { - return listErr - } - if *dir == "" { - jsonPrintln(writer, mappings) - fmt.Fprintln(writer, "need to specify '-dir' option") - return nil - } - - var localMountedDir string - var remoteStorageMountedLocation *filer_pb.RemoteStorageLocation - for k, loc := range mappings.Mappings { - if strings.HasPrefix(*dir, k) { - localMountedDir, remoteStorageMountedLocation = k, loc - } - } - if localMountedDir == "" { - jsonPrintln(writer, mappings) - fmt.Fprintf(writer, "%s is not mounted\n", *dir) - return nil - } - - // find remote storage configuration - remoteStorageConf, err := filer.ReadRemoteStorageConf(commandEnv.option.GrpcDialOption, commandEnv.option.FilerAddress, remoteStorageMountedLocation.Name) - if err != nil { - return err + localMountedDir, remoteStorageMountedLocation, remoteStorageConf, detectErr := detectMountInfo(commandEnv, writer, *dir) + if detectErr != nil{ + return detectErr } // pull content from remote diff --git a/weed/shell/command_remote_meta_sync.go b/weed/shell/command_remote_meta_sync.go new file mode 100644 index 000000000..7e111143c --- /dev/null +++ b/weed/shell/command_remote_meta_sync.go @@ -0,0 +1,208 @@ +package shell + +import ( + "context" + "flag" + "fmt" + "github.com/chrislusf/seaweedfs/weed/filer" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/chrislusf/seaweedfs/weed/remote_storage" + "github.com/chrislusf/seaweedfs/weed/util" + "io" + "strings" +) + +func init() { + Commands = append(Commands, &commandRemoteMetaSync{}) +} + +type commandRemoteMetaSync struct { +} + +func (c *commandRemoteMetaSync) Name() string { + return "remote.meta.sync" +} + +func (c *commandRemoteMetaSync) Help() string { + return `synchronize the local file meta data with the remote file metadata + + # assume a remote storage is configured to name "cloud1" + remote.configure -name=cloud1 -type=s3 -access_key=xxx -secret_key=yyy + # mount and pull one bucket + remote.mount -dir=/xxx -remote=cloud1/bucket + + After mount, if the remote file can be changed, + run this command to synchronize the metadata of the mounted folder or any sub folder + + remote.meta.sync -dir=/xxx + remote.meta.sync -dir=/xxx/some/subdir + + This is designed to run regularly. So you can add it to some cronjob. + + If there are no other operations changing remote files, this operation is not needed. + +` +} + +func (c *commandRemoteMetaSync) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { + + remoteMetaSyncCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) + + dir := remoteMetaSyncCommand.String("dir", "", "a directory in filer") + + if err = remoteMetaSyncCommand.Parse(args); err != nil { + return nil + } + + localMountedDir, remoteStorageMountedLocation, remoteStorageConf, detectErr := detectMountInfo(commandEnv, writer, *dir) + if detectErr != nil{ + return detectErr + } + + // pull metadata from remote + if err = pullMetadata(commandEnv, writer, util.FullPath(localMountedDir), remoteStorageMountedLocation, util.FullPath(*dir), remoteStorageConf); err != nil { + return fmt.Errorf("cache content data: %v", err) + } + + return nil +} + +func detectMountInfo(commandEnv *CommandEnv, writer io.Writer, dir string) (string, *filer_pb.RemoteStorageLocation, *filer_pb.RemoteConf, error) { + mappings, listErr := filer.ReadMountMappings(commandEnv.option.GrpcDialOption, commandEnv.option.FilerAddress) + if listErr != nil { + return "", nil, nil, listErr + } + if dir == "" { + jsonPrintln(writer, mappings) + return "", nil, nil, fmt.Errorf("need to specify '-dir' option") + } + + var localMountedDir string + var remoteStorageMountedLocation *filer_pb.RemoteStorageLocation + for k, loc := range mappings.Mappings { + if strings.HasPrefix(dir, k) { + localMountedDir, remoteStorageMountedLocation = k, loc + } + } + if localMountedDir == "" { + jsonPrintln(writer, mappings) + return "", nil, nil, fmt.Errorf("%s is not mounted", dir) + } + + // find remote storage configuration + remoteStorageConf, err := filer.ReadRemoteStorageConf(commandEnv.option.GrpcDialOption, commandEnv.option.FilerAddress, remoteStorageMountedLocation.Name) + if err != nil { + return "", nil, nil, err + } + + return localMountedDir, remoteStorageMountedLocation, remoteStorageConf, nil +} + +/* + This function update entry.RemoteEntry if the remote has any changes. + + To pull remote updates, or created for the first time, the criteria is: + entry == nil or (entry.RemoteEntry != nil and entry.RemoteEntry.RemoteTag != remote.RemoteTag) + After the meta pull, the entry.RemoteEntry will have: + remoteEntry.LastLocalSyncTsNs == 0 + Attributes.FileSize = uint64(remoteEntry.RemoteSize) + Attributes.Mtime = remoteEntry.RemoteMtime + remoteEntry.RemoteTag = actual remote tag + chunks = nil + + When reading the file content or pulling the file content in "remote.cache", the criteria is: + Attributes.FileSize > 0 and len(chunks) == 0 + After caching the file content, the entry.RemoteEntry will be + remoteEntry.LastLocalSyncTsNs == time.Now.UnixNano() + Attributes.FileSize = uint64(remoteEntry.RemoteSize) + Attributes.Mtime = remoteEntry.RemoteMtime + chunks = non-emtpy + + When "weed filer.remote.sync" to upload local changes to remote, the criteria is: + Attributes.Mtime > remoteEntry.RemoteMtime + Right after "weed filer.remote.sync", the entry.RemoteEntry will be + remoteEntry.LastLocalSyncTsNs = time.Now.UnixNano() + remoteEntry.RemoteSize = actual remote size, which should equal to entry.Attributes.FileSize + remoteEntry.RemoteMtime = actual remote mtime, which should be a little greater than entry.Attributes.Mtime + remoteEntry.RemoteTag = actual remote tag + + + If entry does not exists, need to pull meta + If entry.RemoteEntry == nil, this is a new local change and should not be overwritten + If entry.RemoteEntry.RemoteTag != remoteEntry.RemoteTag { + the remote version is updated, need to pull meta + } + */ +func pullMetadata(commandEnv *CommandEnv, writer io.Writer, localMountedDir util.FullPath, remoteMountedLocation *filer_pb.RemoteStorageLocation, dirToCache util.FullPath, remoteConf *filer_pb.RemoteConf) error { + + // visit remote storage + remoteStorage, err := remote_storage.GetRemoteStorage(remoteConf) + if err != nil { + return err + } + + remote := filer.MapFullPathToRemoteStorageLocation(localMountedDir, remoteMountedLocation, dirToCache) + println("local :", localMountedDir) + println("remote:", remoteMountedLocation.Path) + println("local+:", dirToCache) + println("remote+:", remote.Path) + + err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + ctx := context.Background() + err = remoteStorage.Traverse(remote, func(remoteDir, name string, isDirectory bool, remoteEntry *filer_pb.RemoteEntry) error { + localDir := filer.MapRemoteStorageLocationPathToFullPath(localMountedDir, remoteMountedLocation, remoteDir) + fmt.Fprint(writer, localDir.Child(name)) + + lookupResponse, lookupErr := filer_pb.LookupEntry(client, &filer_pb.LookupDirectoryEntryRequest{ + Directory: string(localDir), + Name: name, + }) + var existingEntry *filer_pb.Entry + if lookupErr != nil { + if lookupErr != filer_pb.ErrNotFound { + return lookupErr + } + } else { + existingEntry = lookupResponse.Entry + } + + if existingEntry == nil { + _, createErr := client.CreateEntry(ctx, &filer_pb.CreateEntryRequest{ + Directory: string(localDir), + Entry: &filer_pb.Entry{ + Name: name, + IsDirectory: isDirectory, + Attributes: &filer_pb.FuseAttributes{ + FileSize: uint64(remoteEntry.RemoteSize), + Mtime: remoteEntry.RemoteMtime, + FileMode: uint32(0644), + }, + RemoteEntry: remoteEntry, + }, + }) + fmt.Fprintln(writer, " (create)") + return createErr + } else { + if existingEntry.RemoteEntry == nil { + // this is a new local change and should not be overwritten + fmt.Fprintln(writer, " (skip)") + return nil + } + if existingEntry.RemoteEntry.RemoteETag != remoteEntry.RemoteETag { + // the remote version is updated, need to pull meta + fmt.Fprintln(writer, " (update)") + return doSaveRemoteEntry(client, string(localDir), existingEntry, remoteEntry) + } + } + fmt.Fprintln(writer, " (skip)") + return nil + }) + return err + }) + + if err != nil { + return err + } + + return nil +} diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go index 2483fa5be..077c64e94 100644 --- a/weed/shell/command_remote_mount.go +++ b/weed/shell/command_remote_mount.go @@ -67,8 +67,8 @@ func (c *commandRemoteMount) Do(args []string, commandEnv *CommandEnv, writer io return fmt.Errorf("find configuration for %s: %v", *remote, err) } - // pull metadata from remote - if err = c.pullMetadata(commandEnv, writer, *dir, *nonEmpty, remoteConf, remoteStorageLocation); err != nil { + // sync metadata from remote + if err = c.syncMetadata(commandEnv, writer, *dir, *nonEmpty, remoteConf, remoteStorageLocation); err != nil { return fmt.Errorf("pull metadata: %v", err) } @@ -111,7 +111,7 @@ func (c *commandRemoteMount) findRemoteStorageConfiguration(commandEnv *CommandE } -func (c *commandRemoteMount) pullMetadata(commandEnv *CommandEnv, writer io.Writer, dir string, nonEmpty bool, remoteConf *filer_pb.RemoteConf, remote *filer_pb.RemoteStorageLocation) error { +func (c *commandRemoteMount) syncMetadata(commandEnv *CommandEnv, writer io.Writer, dir string, nonEmpty bool, remoteConf *filer_pb.RemoteConf, remote *filer_pb.RemoteStorageLocation) error { // find existing directory, and ensure the directory is empty err := commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { @@ -146,58 +146,9 @@ func (c *commandRemoteMount) pullMetadata(commandEnv *CommandEnv, writer io.Writ return err } - // visit remote storage - remoteStorage, err := remote_storage.GetRemoteStorage(remoteConf) - if err != nil { - return err - } - - err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { - ctx := context.Background() - err = remoteStorage.Traverse(remote, func(remoteDir, name string, isDirectory bool, remoteEntry *filer_pb.RemoteEntry) error { - localDir := dir + remoteDir - println(util.NewFullPath(localDir, name)) - - lookupResponse, lookupErr := filer_pb.LookupEntry(client, &filer_pb.LookupDirectoryEntryRequest{ - Directory: localDir, - Name: name, - }) - var existingEntry *filer_pb.Entry - if lookupErr != nil { - if lookupErr != filer_pb.ErrNotFound { - return lookupErr - } - } else { - existingEntry = lookupResponse.Entry - } - - if existingEntry == nil { - _, createErr := client.CreateEntry(ctx, &filer_pb.CreateEntryRequest{ - Directory: localDir, - Entry: &filer_pb.Entry{ - Name: name, - IsDirectory: isDirectory, - Attributes: &filer_pb.FuseAttributes{ - FileSize: uint64(remoteEntry.RemoteSize), - Mtime: remoteEntry.RemoteMtime, - FileMode: uint32(0644), - }, - RemoteEntry: remoteEntry, - }, - }) - return createErr - } else { - if existingEntry.RemoteEntry == nil || existingEntry.RemoteEntry.RemoteETag != remoteEntry.RemoteETag { - return doSaveRemoteEntry(client, localDir, existingEntry, remoteEntry) - } - } - return nil - }) - return err - }) - - if err != nil { - return err + // pull metadata from remote + if err = pullMetadata(commandEnv, writer, util.FullPath(dir), remote, util.FullPath(dir), remoteConf); err != nil { + return fmt.Errorf("cache content data: %v", err) } return nil diff --git a/weed/util/fullpath.go b/weed/util/fullpath.go index f2119707e..85028b052 100644 --- a/weed/util/fullpath.go +++ b/weed/util/fullpath.go @@ -31,10 +31,14 @@ func (fp FullPath) Name() string { func (fp FullPath) Child(name string) FullPath { dir := string(fp) - if strings.HasSuffix(dir, "/") { - return FullPath(dir + name) + noPrefix := name + if strings.HasPrefix(name, "/") { + noPrefix = name[1:] } - return FullPath(dir + "/" + name) + if strings.HasSuffix(dir, "/") { + return FullPath(dir + noPrefix) + } + return FullPath(dir + "/" + noPrefix) } func (fp FullPath) AsInode() uint64 { From ec989b037717f8fd7f0ed3bbc80f0a33654fe7aa Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 15 Aug 2021 02:10:27 -0700 Subject: [PATCH 265/265] remove println --- weed/shell/command_remote_meta_sync.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/weed/shell/command_remote_meta_sync.go b/weed/shell/command_remote_meta_sync.go index 7e111143c..b6fb15a62 100644 --- a/weed/shell/command_remote_meta_sync.go +++ b/weed/shell/command_remote_meta_sync.go @@ -142,10 +142,6 @@ func pullMetadata(commandEnv *CommandEnv, writer io.Writer, localMountedDir util } remote := filer.MapFullPathToRemoteStorageLocation(localMountedDir, remoteMountedLocation, dirToCache) - println("local :", localMountedDir) - println("remote:", remoteMountedLocation.Path) - println("local+:", dirToCache) - println("remote+:", remote.Path) err = commandEnv.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { ctx := context.Background()