From f29ae0db76682d91ca1da8b5337d02df779c8c03 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 28 Feb 2021 18:08:26 -0800 Subject: [PATCH 001/284] 2.29 --- 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 424307ff6..5be2e0f9d 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.28" -version: 2.28 +appVersion: "2.29" +version: 2.29 diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index 8768b32f6..0d8459bc1 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.28" - started using {.Chart.appVersion} + # imageTag: "2.29" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index 55f5b52d6..2a7e57c5d 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, 28) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 29) COMMIT = "" ) From 2cca07b44c577d25df784db8d801f3ed99613ccd Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 28 Feb 2021 18:59:09 -0800 Subject: [PATCH 002/284] cloud tier to non-AWS s3 gateways --- weed/storage/backend/s3_backend/s3_sessions.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/weed/storage/backend/s3_backend/s3_sessions.go b/weed/storage/backend/s3_backend/s3_sessions.go index e2fdf1eb6..b8378c379 100644 --- a/weed/storage/backend/s3_backend/s3_sessions.go +++ b/weed/storage/backend/s3_backend/s3_sessions.go @@ -34,8 +34,9 @@ func createSession(awsAccessKeyId, awsSecretAccessKey, region, endpoint string) } config := &aws.Config{ - Region: aws.String(region), - Endpoint: aws.String(endpoint), + Region: aws.String(region), + Endpoint: aws.String(endpoint), + S3ForcePathStyle: aws.Bool(true), } if awsAccessKeyId != "" && awsSecretAccessKey != "" { config.Credentials = credentials.NewStaticCredentials(awsAccessKeyId, awsSecretAccessKey, "") From 1b1c018165681ab138f9c5c071128b23a466c4e7 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 28 Feb 2021 19:02:43 -0800 Subject: [PATCH 003/284] adjust text --- weed/shell/command_ec_encode.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/shell/command_ec_encode.go b/weed/shell/command_ec_encode.go index edacf22c6..634cb11e2 100644 --- a/weed/shell/command_ec_encode.go +++ b/weed/shell/command_ec_encode.go @@ -274,7 +274,7 @@ func collectVolumeIdsForEcEncode(commandEnv *CommandEnv, selectedCollection stri quietSeconds := int64(quietPeriod / time.Second) nowUnixSeconds := time.Now().Unix() - fmt.Printf("ec encode volumes quiet for: %d seconds\n", quietSeconds) + fmt.Printf("collect volumes quiet for: %d seconds\n", quietSeconds) vidMap := make(map[uint32]bool) eachDataNode(topologyInfo, func(dc string, rack RackId, dn *master_pb.DataNodeInfo) { From c9722dceb2769cd6a943a11bcf5958a669777217 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 28 Feb 2021 20:26:55 -0800 Subject: [PATCH 004/284] adjust log level --- weed/replication/sink/s3sink/s3_write.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/weed/replication/sink/s3sink/s3_write.go b/weed/replication/sink/s3sink/s3_write.go index bf1ad9b76..3dde52616 100644 --- a/weed/replication/sink/s3sink/s3_write.go +++ b/weed/replication/sink/s3sink/s3_write.go @@ -24,7 +24,7 @@ func (s3sink *S3Sink) deleteObject(key string) error { result, err := s3sink.conn.DeleteObject(input) if err == nil { - glog.V(0).Infof("[%s] delete %s: %v", s3sink.bucket, key, result) + glog.V(2).Infof("[%s] delete %s: %v", s3sink.bucket, key, result) } else { glog.Errorf("[%s] delete %s: %v", s3sink.bucket, key, err) } @@ -43,7 +43,7 @@ func (s3sink *S3Sink) createMultipartUpload(key string, entry *filer_pb.Entry) ( result, err := s3sink.conn.CreateMultipartUpload(input) if err == nil { - glog.V(0).Infof("[%s] createMultipartUpload %s: %v", s3sink.bucket, key, result) + glog.V(2).Infof("[%s] createMultipartUpload %s: %v", s3sink.bucket, key, result) } else { glog.Errorf("[%s] createMultipartUpload %s: %v", s3sink.bucket, key, err) return "", err @@ -94,7 +94,7 @@ func (s3sink *S3Sink) completeMultipartUpload(ctx context.Context, key, uploadId result, err := s3sink.conn.CompleteMultipartUpload(input) if err == nil { - glog.V(1).Infof("[%s] completeMultipartUpload %s: %v", s3sink.bucket, key, result) + glog.V(2).Infof("[%s] completeMultipartUpload %s: %v", s3sink.bucket, key, result) } else { glog.Errorf("[%s] completeMultipartUpload %s: %v", s3sink.bucket, key, err) return fmt.Errorf("[%s] completeMultipartUpload %s: %v", s3sink.bucket, key, err) @@ -123,7 +123,7 @@ func (s3sink *S3Sink) uploadPart(key, uploadId string, partId int, chunk *filer. result, err := s3sink.conn.UploadPart(input) if err == nil { - glog.V(0).Infof("[%s] uploadPart %s %d upload: %v", s3sink.bucket, key, partId, result) + glog.V(2).Infof("[%s] uploadPart %s %d upload: %v", s3sink.bucket, key, partId, result) } else { glog.Errorf("[%s] uploadPart %s %d upload: %v", s3sink.bucket, key, partId, err) } From 540441fd385cf28b8065a683f88348f88e78f6b7 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 28 Feb 2021 20:34:14 -0800 Subject: [PATCH 005/284] go fmt --- weed/command/filer_backup.go | 1 - weed/replication/sink/azuresink/azure_sink.go | 2 +- weed/replication/sink/b2sink/b2_sink.go | 10 +++++----- weed/replication/sink/filersink/filer_sink.go | 4 ++-- weed/replication/sink/gcssink/gcs_sink.go | 10 +++++----- weed/storage/needle/needle_read_write.go | 2 +- 6 files changed, 14 insertions(+), 15 deletions(-) diff --git a/weed/command/filer_backup.go b/weed/command/filer_backup.go index 8cb7441f6..888b46fe7 100644 --- a/weed/command/filer_backup.go +++ b/weed/command/filer_backup.go @@ -155,4 +155,3 @@ func doFilerBackup(grpcDialOption grpc.DialOption, backupOption *FilerBackupOpti }) } - diff --git a/weed/replication/sink/azuresink/azure_sink.go b/weed/replication/sink/azuresink/azure_sink.go index 865f1b25c..d13a1049b 100644 --- a/weed/replication/sink/azuresink/azure_sink.go +++ b/weed/replication/sink/azuresink/azure_sink.go @@ -42,7 +42,7 @@ func (g *AzureSink) IsIncremental() bool { } func (g *AzureSink) Initialize(configuration util.Configuration, prefix string) error { - g.isIncremental = configuration.GetBool(prefix+"is_incremental") + g.isIncremental = configuration.GetBool(prefix + "is_incremental") return g.initialize( configuration.GetString(prefix+"account_name"), configuration.GetString(prefix+"account_key"), diff --git a/weed/replication/sink/b2sink/b2_sink.go b/weed/replication/sink/b2sink/b2_sink.go index 8738231d5..90a0bb2e8 100644 --- a/weed/replication/sink/b2sink/b2_sink.go +++ b/weed/replication/sink/b2sink/b2_sink.go @@ -14,10 +14,10 @@ import ( ) type B2Sink struct { - client *b2.Client - bucket string - dir string - filerSource *source.FilerSource + client *b2.Client + bucket string + dir string + filerSource *source.FilerSource isIncremental bool } @@ -38,7 +38,7 @@ func (g *B2Sink) IsIncremental() bool { } func (g *B2Sink) Initialize(configuration util.Configuration, prefix string) error { - g.isIncremental = configuration.GetBool(prefix+"is_incremental") + g.isIncremental = configuration.GetBool(prefix + "is_incremental") return g.initialize( configuration.GetString(prefix+"b2_account_id"), configuration.GetString(prefix+"b2_master_application_key"), diff --git a/weed/replication/sink/filersink/filer_sink.go b/weed/replication/sink/filersink/filer_sink.go index 4165e87be..d7c5fccc3 100644 --- a/weed/replication/sink/filersink/filer_sink.go +++ b/weed/replication/sink/filersink/filer_sink.go @@ -30,7 +30,7 @@ type FilerSink struct { grpcDialOption grpc.DialOption address string writeChunkByFiler bool - isIncremental bool + isIncremental bool } func init() { @@ -50,7 +50,7 @@ func (fs *FilerSink) IsIncremental() bool { } func (fs *FilerSink) Initialize(configuration util.Configuration, prefix string) error { - fs.isIncremental = configuration.GetBool(prefix+"is_incremental") + fs.isIncremental = configuration.GetBool(prefix + "is_incremental") return fs.DoInitialize( "", configuration.GetString(prefix+"grpcAddress"), diff --git a/weed/replication/sink/gcssink/gcs_sink.go b/weed/replication/sink/gcssink/gcs_sink.go index 02f482862..5cf5b7317 100644 --- a/weed/replication/sink/gcssink/gcs_sink.go +++ b/weed/replication/sink/gcssink/gcs_sink.go @@ -18,10 +18,10 @@ import ( ) type GcsSink struct { - client *storage.Client - bucket string - dir string - filerSource *source.FilerSource + client *storage.Client + bucket string + dir string + filerSource *source.FilerSource isIncremental bool } @@ -42,7 +42,7 @@ func (g *GcsSink) IsIncremental() bool { } func (g *GcsSink) Initialize(configuration util.Configuration, prefix string) error { - g.isIncremental = configuration.GetBool(prefix+"is_incremental") + g.isIncremental = configuration.GetBool(prefix + "is_incremental") return g.initialize( configuration.GetString(prefix+"google_application_credentials"), configuration.GetString(prefix+"bucket"), diff --git a/weed/storage/needle/needle_read_write.go b/weed/storage/needle/needle_read_write.go index 0f72bc0bb..e51df955e 100644 --- a/weed/storage/needle/needle_read_write.go +++ b/weed/storage/needle/needle_read_write.go @@ -168,7 +168,7 @@ func ReadNeedleBlob(r backend.BackendStorageFile, offset int64, size Size, versi } if err != nil { fileSize, _, _ := r.GetStat() - println("n",n, "dataSize", dataSize, "offset", offset, "fileSize", fileSize) + println("n", n, "dataSize", dataSize, "offset", offset, "fileSize", fileSize) } return dataSlice, err From 65fbc0575f8321d29ba60fa8248d6df8e8b5b6cb Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 28 Feb 2021 22:57:01 -0800 Subject: [PATCH 006/284] 2clusters adds tiering to s3 --- docker/compose/local-clusters-compose.yml | 2 ++ docker/compose/master-cloud.toml | 30 +++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 docker/compose/master-cloud.toml diff --git a/docker/compose/local-clusters-compose.yml b/docker/compose/local-clusters-compose.yml index 7bd16aa3f..402ab8d8a 100644 --- a/docker/compose/local-clusters-compose.yml +++ b/docker/compose/local-clusters-compose.yml @@ -11,6 +11,8 @@ services: - 8888:8888 - 18888:18888 command: "server -ip=server1 -filer -volume.max=0 -master.volumeSizeLimitMB=1024 -volume.preStopSeconds=1" + volumes: + - ./master-cloud.toml:/etc/seaweedfs/master.toml server2: image: chrislusf/seaweedfs:local ports: diff --git a/docker/compose/master-cloud.toml b/docker/compose/master-cloud.toml new file mode 100644 index 000000000..17289c114 --- /dev/null +++ b/docker/compose/master-cloud.toml @@ -0,0 +1,30 @@ + +# 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 + +# configurations for tiered cloud storage +# old volumes are transparently moved to cloud for cost efficiency +[storage.backend] + [storage.backend.s3.default] + enabled = true + aws_access_key_id = "any" # if empty, loads from the shared credentials file (~/.aws/credentials). + aws_secret_access_key = "any" # if empty, loads from the shared credentials file (~/.aws/credentials). + region = "us-east-2" + bucket = "volume_bucket" # an existing bucket + endpoint = "http://server2:8333" From d680676d45e7d5447c241cfef47a5c665931fc85 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 1 Mar 2021 00:47:03 -0800 Subject: [PATCH 007/284] skip already loaded backends --- weed/storage/backend/backend.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/weed/storage/backend/backend.go b/weed/storage/backend/backend.go index b8b883be6..2dc61d02e 100644 --- a/weed/storage/backend/backend.go +++ b/weed/storage/backend/backend.go @@ -58,6 +58,9 @@ func LoadConfiguration(config *util.ViperProxy) { if !config.GetBool(StorageBackendPrefix + "." + backendTypeName + "." + backendStorageId + ".enabled") { continue } + if _, found := BackendStorages[backendTypeName+"."+backendStorageId]; found { + continue + } backendStorage, buildErr := backendStorageFactory.BuildStorage(config, StorageBackendPrefix+"."+backendTypeName+"."+backendStorageId+".", backendStorageId) if buildErr != nil { @@ -81,6 +84,9 @@ func LoadFromPbStorageBackends(storageBackends []*master_pb.StorageBackend) { glog.Warningf("storage type %s not found", storageBackend.Type) continue } + if _, found := BackendStorages[storageBackend.Type+"."+storageBackend.Id]; found { + continue + } backendStorage, buildErr := backendStorageFactory.BuildStorage(newProperties(storageBackend.Properties), "", storageBackend.Id) if buildErr != nil { glog.Fatalf("fail to create backend storage %s.%s", storageBackend.Type, storageBackend.Id) From 015d16f43f1ff0a8b8576914c665c963b700f768 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 1 Mar 2021 00:48:30 -0800 Subject: [PATCH 008/284] add vif file versions in case loading superblock fails --- weed/storage/volume_loading.go | 4 ++-- weed/storage/volume_tier.go | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/weed/storage/volume_loading.go b/weed/storage/volume_loading.go index bff1055bb..cf34ff133 100644 --- a/weed/storage/volume_loading.go +++ b/weed/storage/volume_loading.go @@ -39,12 +39,12 @@ func (v *Volume) load(alsoLoadIndex bool, createDatIfMissing bool, needleMapKind } }() - hasVolumeInfoFile := v.maybeLoadVolumeInfo() && v.volumeInfo.Version != 0 + hasVolumeInfoFile := v.maybeLoadVolumeInfo() if v.HasRemoteFile() { v.noWriteCanDelete = true v.noWriteOrDelete = false - glog.V(0).Infof("loading volume %d from remote %v", v.Id, v.volumeInfo.Files) + glog.V(0).Infof("loading volume %d from remote %v", v.Id, v.volumeInfo) v.LoadRemoteFile() alreadyHasSuperBlock = true } else if exists, canRead, canWrite, modifiedTime, fileSize := util.CheckFile(v.FileName(".dat")); exists { diff --git a/weed/storage/volume_tier.go b/weed/storage/volume_tier.go index 77efd8a14..da93221b2 100644 --- a/weed/storage/volume_tier.go +++ b/weed/storage/volume_tier.go @@ -6,6 +6,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/pb/volume_server_pb" "github.com/chrislusf/seaweedfs/weed/storage/backend" _ "github.com/chrislusf/seaweedfs/weed/storage/backend/s3_backend" + "github.com/chrislusf/seaweedfs/weed/storage/needle" ) func (v *Volume) GetVolumeInfo() *volume_server_pb.VolumeInfo { @@ -14,14 +15,24 @@ func (v *Volume) GetVolumeInfo() *volume_server_pb.VolumeInfo { func (v *Volume) maybeLoadVolumeInfo() (found bool) { - v.volumeInfo, v.hasRemoteFile, _ = pb.MaybeLoadVolumeInfo(v.FileName(".vif")) + var err error + v.volumeInfo, v.hasRemoteFile, err = pb.MaybeLoadVolumeInfo(v.FileName(".vif")) + + if v.volumeInfo.Version == 0 { + v.volumeInfo.Version = uint32(needle.CurrentVersion) + } if v.hasRemoteFile { glog.V(0).Infof("volume %d is tiered to %s as %s and read only", v.Id, v.volumeInfo.Files[0].BackendName(), v.volumeInfo.Files[0].Key) } - return + if err != nil { + glog.Warningf("load volume %d.vif file: %v", v.Id, err) + return false + } + + return true } From 6e43e8ce17dab9b5b99fa9449e869c910981bff9 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 1 Mar 2021 00:48:59 -0800 Subject: [PATCH 009/284] add logs for remote file loading --- weed/storage/volume_loading.go | 1 + 1 file changed, 1 insertion(+) diff --git a/weed/storage/volume_loading.go b/weed/storage/volume_loading.go index cf34ff133..7f70031ed 100644 --- a/weed/storage/volume_loading.go +++ b/weed/storage/volume_loading.go @@ -83,6 +83,7 @@ func (v *Volume) load(alsoLoadIndex bool, createDatIfMissing bool, needleMapKind if alreadyHasSuperBlock { err = v.readSuperBlock() + glog.V(0).Infof("readSuperBlock volume %d version %v", v.Id, v.SuperBlock.Version) } else { if !v.SuperBlock.Initialized() { return fmt.Errorf("volume %s not initialized", v.FileName(".dat")) From c46d16b2f32108f4afce601d3c8f0a33f596bce9 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 1 Mar 2021 01:20:06 -0800 Subject: [PATCH 010/284] skip network error when remote volumes start --- weed/storage/super_block/replica_placement.go | 3 +++ weed/storage/volume_loading.go | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/weed/storage/super_block/replica_placement.go b/weed/storage/super_block/replica_placement.go index 65ec53819..a263e6669 100644 --- a/weed/storage/super_block/replica_placement.go +++ b/weed/storage/super_block/replica_placement.go @@ -36,6 +36,9 @@ func NewReplicaPlacementFromByte(b byte) (*ReplicaPlacement, error) { } func (rp *ReplicaPlacement) Byte() byte { + if rp == nil { + return 0 + } ret := rp.DiffDataCenterCount*100 + rp.DiffRackCount*10 + rp.SameRackCount return byte(ret) } diff --git a/weed/storage/volume_loading.go b/weed/storage/volume_loading.go index 7f70031ed..0cf603ad8 100644 --- a/weed/storage/volume_loading.go +++ b/weed/storage/volume_loading.go @@ -84,6 +84,11 @@ func (v *Volume) load(alsoLoadIndex bool, createDatIfMissing bool, needleMapKind if alreadyHasSuperBlock { err = v.readSuperBlock() glog.V(0).Infof("readSuperBlock volume %d version %v", v.Id, v.SuperBlock.Version) + if v.HasRemoteFile() { + // maybe temporary network problem + glog.Errorf("readSuperBlock remote volume %d: %v", v.Id, err) + err = nil + } } else { if !v.SuperBlock.Initialized() { return fmt.Errorf("volume %s not initialized", v.FileName(".dat")) From cee929793ae85556ca859a5c115e1188b8cae0da Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 1 Mar 2021 02:39:33 -0800 Subject: [PATCH 011/284] add seaweedfilesystem at gmail dot com --- README.md | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 58885eb61..e7460f93a 100644 --- a/README.md +++ b/README.md @@ -79,17 +79,34 @@ SeaweedFS is a simple and highly scalable distributed file system. There are two 1. to store billions of files! 2. to serve the files fast! -SeaweedFS started as an Object Store to handle small files efficiently. Instead of managing all file metadata in a central master, the central master only manages volumes on volume servers, and these volume servers manage files and their metadata. This relieves concurrency pressure from the central master and spreads file metadata into volume servers, allowing faster file access (O(1), usually just one disk read operation). +SeaweedFS started as an Object Store to handle small files efficiently. +Instead of managing all file metadata in a central master, +the central master only manages volumes on volume servers, +and these volume servers manage files and their metadata. +This relieves concurrency pressure from the central master and spreads file metadata into volume servers, +allowing faster file access (O(1), usually just one disk read operation). -SeaweedFS can transparently integrate with the cloud. With hot data on local cluster, and warm data on the cloud with O(1) access time, SeaweedFS can achieve both fast local access time and elastic cloud storage capacity. What's more, the cloud storage access API cost is minimized. Faster and Cheaper than direct cloud storage! +SeaweedFS can transparently integrate with the cloud. +With hot data on local cluster, and warm data on the cloud with O(1) access time, +SeaweedFS can achieve both fast local access time and elastic cloud storage capacity. +What's more, the cloud storage access API cost is minimized. +Faster and Cheaper than direct cloud storage! +Signup for future managed SeaweedFS cluster offering at "seaweedfilesystem at gmail dot com". -There is only 40 bytes of disk storage overhead for each file's metadata. It is so simple with O(1) disk reads that you are welcome to challenge the performance with your actual use cases. +There is only 40 bytes of disk storage overhead for each file's metadata. +It is so simple with O(1) disk reads that you are welcome to challenge the performance with your actual use cases. -SeaweedFS started by implementing [Facebook's Haystack design paper](http://www.usenix.org/event/osdi10/tech/full_papers/Beaver.pdf). Also, SeaweedFS implements erasure coding with ideas from [f4: Facebook’s Warm BLOB Storage System](https://www.usenix.org/system/files/conference/osdi14/osdi14-paper-muralidhar.pdf) +SeaweedFS started by implementing [Facebook's Haystack design paper](http://www.usenix.org/event/osdi10/tech/full_papers/Beaver.pdf). +Also, SeaweedFS implements erasure coding with ideas from +[f4: Facebook’s Warm BLOB Storage System](https://www.usenix.org/system/files/conference/osdi14/osdi14-paper-muralidhar.pdf) -On top of the object store, optional [Filer] can support directories and POSIX attributes. Filer is a separate linearly-scalable stateless server with customizable metadata stores, e.g., MySql, Postgres, Redis, Cassandra, HBase, Mongodb, Elastic Search, LevelDB, RocksDB, MemSql, TiDB, Etcd, CockroachDB, etc. +On top of the object store, optional [Filer] can support directories and POSIX attributes. +Filer is a separate linearly-scalable stateless server with customizable metadata stores, +e.g., MySql, Postgres, Redis, Cassandra, HBase, Mongodb, Elastic Search, LevelDB, RocksDB, MemSql, TiDB, Etcd, CockroachDB, etc. -For any distributed key value stores, the large values can be offloaded to SeaweedFS. With the fast access speed and linearly scalable capacity, SeaweedFS can work as a distributed [Key-Large-Value store][KeyLargeValueStore]. +For any distributed key value stores, the large values can be offloaded to SeaweedFS. +With the fast access speed and linearly scalable capacity, +SeaweedFS can work as a distributed [Key-Large-Value store][KeyLargeValueStore]. [Back to TOC](#table-of-contents) From 4b75981d69ee6c15a320b114c19418100a13562d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 1 Mar 2021 02:40:22 -0800 Subject: [PATCH 012/284] add dependency for local dev cluster --- docker/compose/local-clusters-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/compose/local-clusters-compose.yml b/docker/compose/local-clusters-compose.yml index 402ab8d8a..f9e9a1589 100644 --- a/docker/compose/local-clusters-compose.yml +++ b/docker/compose/local-clusters-compose.yml @@ -13,6 +13,8 @@ services: command: "server -ip=server1 -filer -volume.max=0 -master.volumeSizeLimitMB=1024 -volume.preStopSeconds=1" volumes: - ./master-cloud.toml:/etc/seaweedfs/master.toml + depends_on: + - server2 server2: image: chrislusf/seaweedfs:local ports: From 551172242007f8af1a4e70459c9ce0cb5fe11fd7 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 1 Mar 2021 12:41:55 -0800 Subject: [PATCH 013/284] s3: list permission is needed to list my buckets fix https://github.com/chrislusf/seaweedfs/issues/1837 --- weed/s3api/s3api_bucket_handlers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/s3api/s3api_bucket_handlers.go b/weed/s3api/s3api_bucket_handlers.go index 338f82668..48e8cb047 100644 --- a/weed/s3api/s3api_bucket_handlers.go +++ b/weed/s3api/s3api_bucket_handlers.go @@ -51,7 +51,7 @@ func (s3a *S3ApiServer) ListBucketsHandler(w http.ResponseWriter, r *http.Reques var buckets []*s3.Bucket for _, entry := range entries { if entry.IsDirectory { - if identity != nil && !identity.canDo(s3_constants.ACTION_ADMIN, entry.Name) { + if identity != nil && !identity.canDo(s3_constants.ACTION_LIST, entry.Name) { continue } buckets = append(buckets, &s3.Bucket{ From 02e146f3e1663f2d957d2a8d55155d131820f790 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 2 Mar 2021 08:54:18 -0800 Subject: [PATCH 014/284] return err --- weed/filesys/dir_link.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/weed/filesys/dir_link.go b/weed/filesys/dir_link.go index ba3280f03..29391faeb 100644 --- a/weed/filesys/dir_link.go +++ b/weed/filesys/dir_link.go @@ -83,6 +83,10 @@ func (dir *Dir) Link(ctx context.Context, req *fuse.LinkRequest, old fs.Node) (f return nil }) + if err != nil { + return nil, fuse.EIO + } + // create new file node newNode := dir.newFile(req.NewName, request.Entry) newFile := newNode.(*File) From be9c7c21ecc0450244e4e02648c0ac5ba49f458a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 2 Mar 2021 11:17:17 -0800 Subject: [PATCH 015/284] reduce possibility of nil file entry --- 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 10a0a2b44..ca826fbbc 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -389,12 +389,12 @@ func (dir *Dir) removeOneFile(req *fuse.RemoveRequest) error { // clear entry inside the file fsNode := dir.wfs.fsNodeCache.GetFsNode(filePath) + dir.wfs.fsNodeCache.DeleteFsNode(filePath) if fsNode != nil { if file, ok := fsNode.(*File); ok { file.clearEntry() } } - dir.wfs.fsNodeCache.DeleteFsNode(filePath) // remove current file handle if any dir.wfs.handlesLock.Lock() From bcf32591b7971e912b8ea1814c0f63f95f9b352d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 2 Mar 2021 13:33:56 -0800 Subject: [PATCH 016/284] reduce possibility of nil entry --- weed/filesys/file.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/weed/filesys/file.go b/weed/filesys/file.go index a210c5152..bd722b31f 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -106,7 +106,7 @@ func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *f glog.V(4).Infof("%v file setattr %+v", file.fullpath(), req) - _, err := file.maybeLoadEntry(ctx) + entry, err := file.maybeLoadEntry(ctx) if err != nil { return err } @@ -123,12 +123,12 @@ func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *f if req.Valid.Size() { - glog.V(4).Infof("%v file setattr set size=%v chunks=%d", file.fullpath(), req.Size, len(file.entry.Chunks)) - if req.Size < filer.FileSize(file.entry) { + glog.V(4).Infof("%v file setattr set size=%v chunks=%d", file.fullpath(), req.Size, len(entry.Chunks)) + if req.Size < filer.FileSize(entry) { // fmt.Printf("truncate %v \n", fullPath) var chunks []*filer_pb.FileChunk var truncatedChunks []*filer_pb.FileChunk - for _, chunk := range file.entry.Chunks { + for _, chunk := range entry.Chunks { int64Size := int64(chunk.Size) if chunk.Offset+int64Size > int64(req.Size) { // this chunk is truncated @@ -143,36 +143,36 @@ func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *f } } } - file.entry.Chunks = chunks + entry.Chunks = chunks file.entryViewCache, _ = filer.NonOverlappingVisibleIntervals(file.wfs.LookupFn(), chunks) file.reader = nil } - file.entry.Attributes.FileSize = req.Size + entry.Attributes.FileSize = req.Size file.dirtyMetadata = true } if req.Valid.Mode() { - file.entry.Attributes.FileMode = uint32(req.Mode) + entry.Attributes.FileMode = uint32(req.Mode) file.dirtyMetadata = true } if req.Valid.Uid() { - file.entry.Attributes.Uid = req.Uid + entry.Attributes.Uid = req.Uid file.dirtyMetadata = true } if req.Valid.Gid() { - file.entry.Attributes.Gid = req.Gid + entry.Attributes.Gid = req.Gid file.dirtyMetadata = true } if req.Valid.Crtime() { - file.entry.Attributes.Crtime = req.Crtime.Unix() + entry.Attributes.Crtime = req.Crtime.Unix() file.dirtyMetadata = true } if req.Valid.Mtime() { - file.entry.Attributes.Mtime = req.Mtime.Unix() + entry.Attributes.Mtime = req.Mtime.Unix() file.dirtyMetadata = true } @@ -188,7 +188,7 @@ func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *f return nil } - return file.saveEntry(file.entry) + return file.saveEntry(entry) } From e982b06bcdbb1d5f5433d4befd1b457e0bc23562 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 2 Mar 2021 20:59:39 -0800 Subject: [PATCH 017/284] support IPv6 --- weed/command/mount_std.go | 2 +- weed/command/msg_broker.go | 2 +- weed/command/s3.go | 2 +- weed/command/webdav.go | 2 +- weed/pb/grpc_client_server.go | 59 +++++++++++++---------------------- weed/server/filer_server.go | 2 +- weed/util/fasthttp_util.go | 1 + 7 files changed, 28 insertions(+), 42 deletions(-) diff --git a/weed/command/mount_std.go b/weed/command/mount_std.go index a6d562d40..6eb836311 100644 --- a/weed/command/mount_std.go +++ b/weed/command/mount_std.go @@ -53,7 +53,7 @@ func RunMount(option *MountOptions, umask os.FileMode) bool { filer := *option.filer // parse filer grpc address - filerGrpcAddress, err := pb.ParseFilerGrpcAddress(filer) + filerGrpcAddress, err := pb.ParseServerToGrpcAddress(filer) if err != nil { glog.V(0).Infof("ParseFilerGrpcAddress: %v", err) return true diff --git a/weed/command/msg_broker.go b/weed/command/msg_broker.go index b4b5855ff..db0b4148d 100644 --- a/weed/command/msg_broker.go +++ b/weed/command/msg_broker.go @@ -63,7 +63,7 @@ func (msgBrokerOpt *MessageBrokerOptions) startQueueServer() bool { grace.SetupProfiling(*messageBrokerStandaloneOptions.cpuprofile, *messageBrokerStandaloneOptions.memprofile) - filerGrpcAddress, err := pb.ParseFilerGrpcAddress(*msgBrokerOpt.filer) + filerGrpcAddress, err := pb.ParseServerToGrpcAddress(*msgBrokerOpt.filer) if err != nil { glog.Fatal(err) return false diff --git a/weed/command/s3.go b/weed/command/s3.go index d8e3e306b..c8292a7d5 100644 --- a/weed/command/s3.go +++ b/weed/command/s3.go @@ -137,7 +137,7 @@ func runS3(cmd *Command, args []string) bool { func (s3opt *S3Options) startS3Server() bool { - filerGrpcAddress, err := pb.ParseFilerGrpcAddress(*s3opt.filer) + filerGrpcAddress, err := pb.ParseServerToGrpcAddress(*s3opt.filer) if err != nil { glog.Fatal(err) return false diff --git a/weed/command/webdav.go b/weed/command/webdav.go index 2bd4a3c61..781ea1e36 100644 --- a/weed/command/webdav.go +++ b/weed/command/webdav.go @@ -78,7 +78,7 @@ func (wo *WebDavOption) startWebDav() bool { } // parse filer grpc address - filerGrpcAddress, err := pb.ParseFilerGrpcAddress(*wo.filer) + filerGrpcAddress, err := pb.ParseServerToGrpcAddress(*wo.filer) if err != nil { glog.Fatal(err) return false diff --git a/weed/pb/grpc_client_server.go b/weed/pb/grpc_client_server.go index 910114313..341718ae4 100644 --- a/weed/pb/grpc_client_server.go +++ b/weed/pb/grpc_client_server.go @@ -3,6 +3,7 @@ package pb import ( "context" "fmt" + "github.com/chrislusf/seaweedfs/weed/glog" "net/http" "strconv" "strings" @@ -108,51 +109,51 @@ func WithCachedGrpcClient(fn func(*grpc.ClientConn) error, address string, opts } func ParseServerToGrpcAddress(server string) (serverGrpcAddress string, err error) { - colonIndex := strings.LastIndex(server, ":") - if colonIndex < 0 { - return "", fmt.Errorf("server should have hostname:port format: %v", server) - } - port, parseErr := strconv.ParseUint(server[colonIndex+1:], 10, 64) + host, port, parseErr := hostAndPort(server) if parseErr != nil { return "", fmt.Errorf("server port parse error: %v", parseErr) } grpcPort := int(port) + 10000 - return fmt.Sprintf("%s:%d", server[:colonIndex], grpcPort), nil + return fmt.Sprintf("%s:%d", host, grpcPort), nil +} + +func hostAndPort(address string) (host string, port uint64, err error) { + colonIndex := strings.LastIndex(address, ":") + if colonIndex < 0 { + return "", 0, fmt.Errorf("server should have hostname:port format: %v", address) + } + port, err = strconv.ParseUint(address[colonIndex+1:], 10, 64) + if err != nil { + return "", 0, fmt.Errorf("server port parse error: %v", err) + } + + return address[:colonIndex], port, err } func ServerToGrpcAddress(server string) (serverGrpcAddress string) { - hostnameAndPort := strings.Split(server, ":") - if len(hostnameAndPort) != 2 { - return fmt.Sprintf("unexpected server address: %s", server) - } - port, parseErr := strconv.ParseUint(hostnameAndPort[1], 10, 64) + host, port, parseErr := hostAndPort(server) if parseErr != nil { - return fmt.Sprintf("failed to parse port for %s:%s", hostnameAndPort[0], hostnameAndPort[1]) + glog.Fatalf("server address %s parse error: %v", server, parseErr) } grpcPort := int(port) + 10000 - return fmt.Sprintf("%s:%d", hostnameAndPort[0], grpcPort) + return fmt.Sprintf("%s:%d", host, grpcPort) } func GrpcAddressToServerAddress(grpcAddress string) (serverAddress string) { - hostnameAndPort := strings.Split(grpcAddress, ":") - if len(hostnameAndPort) != 2 { - return fmt.Sprintf("unexpected grpcAddress: %s", grpcAddress) - } - - grpcPort, parseErr := strconv.ParseUint(hostnameAndPort[1], 10, 64) + host, grpcPort, parseErr := hostAndPort(grpcAddress) if parseErr != nil { - return fmt.Sprintf("failed to parse port for %s:%s", hostnameAndPort[0], hostnameAndPort[1]) + glog.Fatalf("server grpc address %s parse error: %v", grpcAddress, parseErr) } port := int(grpcPort) - 10000 - return fmt.Sprintf("%s:%d", hostnameAndPort[0], port) + return fmt.Sprintf("%s:%d", host, port) } func WithMasterClient(master string, grpcDialOption grpc.DialOption, fn func(client master_pb.SeaweedClient) error) error { @@ -197,19 +198,3 @@ func WithGrpcFilerClient(filerGrpcAddress string, grpcDialOption grpc.DialOption }, filerGrpcAddress, grpcDialOption) } - -func ParseFilerGrpcAddress(filer string) (filerGrpcAddress string, err error) { - hostnameAndPort := strings.Split(filer, ":") - if len(hostnameAndPort) != 2 { - return "", fmt.Errorf("filer should have hostname:port format: %v", hostnameAndPort) - } - - filerPort, parseErr := strconv.ParseUint(hostnameAndPort[1], 10, 64) - if parseErr != nil { - return "", fmt.Errorf("filer port parse error: %v", parseErr) - } - - filerGrpcPort := int(filerPort) + 10000 - - return fmt.Sprintf("%s:%d", hostnameAndPort[0], filerGrpcPort), nil -} diff --git a/weed/server/filer_server.go b/weed/server/filer_server.go index 22474a5e2..9e0770afa 100644 --- a/weed/server/filer_server.go +++ b/weed/server/filer_server.go @@ -153,7 +153,7 @@ func NewFilerServer(defaultMux, readonlyMux *http.ServeMux, option *FilerOption) func (fs *FilerServer) checkWithMaster() { for _, master := range fs.option.Masters { - _, err := pb.ParseFilerGrpcAddress(master) + _, err := pb.ParseServerToGrpcAddress(master) if err != nil { glog.Fatalf("invalid master address %s: %v", master, err) } diff --git a/weed/util/fasthttp_util.go b/weed/util/fasthttp_util.go index 82575af98..6c31a40da 100644 --- a/weed/util/fasthttp_util.go +++ b/weed/util/fasthttp_util.go @@ -18,6 +18,7 @@ var ( WriteTimeout: time.Second, MaxIdleConnDuration: time.Minute, DisableHeaderNamesNormalizing: true, // If you set the case on your headers correctly you can enable this. + DialDualStack: true, } // Put everything in pools to prevent garbage. From bd727b7b537312c492c8a3bdacc8864237d45a47 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 2 Mar 2021 20:59:56 -0800 Subject: [PATCH 018/284] go fmt --- 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 341718ae4..c7a47a91c 100644 --- a/weed/pb/grpc_client_server.go +++ b/weed/pb/grpc_client_server.go @@ -127,7 +127,7 @@ func hostAndPort(address string) (host string, port uint64, err error) { } port, err = strconv.ParseUint(address[colonIndex+1:], 10, 64) if err != nil { - return "", 0, fmt.Errorf("server port parse error: %v", err) + return "", 0, fmt.Errorf("server port parse error: %v", err) } return address[:colonIndex], port, err From d520bc2b087d7415a2ea6dfc0a85bd240d1ed0ff Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 2 Mar 2021 21:30:15 -0800 Subject: [PATCH 019/284] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e7460f93a..4a13f09d9 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ It is so simple with O(1) disk reads that you are welcome to challenge the perfo SeaweedFS started by implementing [Facebook's Haystack design paper](http://www.usenix.org/event/osdi10/tech/full_papers/Beaver.pdf). Also, SeaweedFS implements erasure coding with ideas from -[f4: Facebook’s Warm BLOB Storage System](https://www.usenix.org/system/files/conference/osdi14/osdi14-paper-muralidhar.pdf) +[f4: Facebook’s Warm BLOB Storage System](https://www.usenix.org/system/files/conference/osdi14/osdi14-paper-muralidhar.pdf), and has a lot of similarities with [Facebook’s Tectonic Filesystem](https://www.usenix.org/system/files/fast21-pan.pdf) On top of the object store, optional [Filer] can support directories and POSIX attributes. Filer is a separate linearly-scalable stateless server with customizable metadata stores, From 0c5c51eb983781b441cc8acfac3ce2e437591e98 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 2 Mar 2021 23:07:29 -0800 Subject: [PATCH 020/284] adjust help message --- weed/command/filer_meta_tail.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/weed/command/filer_meta_tail.go b/weed/command/filer_meta_tail.go index 189cacefc..8451ffd78 100644 --- a/weed/command/filer_meta_tail.go +++ b/weed/command/filer_meta_tail.go @@ -23,7 +23,7 @@ func init() { } var cmdFilerMetaTail = &Command{ - UsageLine: "filer.meta.tail [-filer=localhost:8888] [-target=/]", + UsageLine: "filer.meta.tail [-filer=localhost:8888] [-pathPrefix=/]", Short: "see continuous changes on a filer", Long: `See continuous changes on a filer. @@ -36,7 +36,7 @@ var cmdFilerMetaTail = &Command{ var ( tailFiler = cmdFilerMetaTail.Flag.String("filer", "localhost:8888", "filer hostname:port") - tailTarget = cmdFilerMetaTail.Flag.String("pathPrefix", "/", "path to a folder or file, or common prefix for the folders or files on filer") + tailTarget = cmdFilerMetaTail.Flag.String("pathPrefix", "/", "path to a folder or common prefix for the folders or files on filer") tailStart = cmdFilerMetaTail.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\"") tailPattern = cmdFilerMetaTail.Flag.String("pattern", "", "full path or just filename pattern, ex: \"/home/?opher\", \"*.pdf\", see https://golang.org/pkg/path/filepath/#Match ") esServers = cmdFilerMetaTail.Flag.String("es", "", "comma-separated elastic servers http://") From c0842fe99f9ae8fcb672411c87aa233fc321c16b Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 3 Mar 2021 02:02:29 -0800 Subject: [PATCH 021/284] add filer.meta.backup command --- weed/command/command.go | 1 + weed/command/filer_meta_backup.go | 268 ++++++++++++++++++++++++++++++ 2 files changed, 269 insertions(+) create mode 100644 weed/command/filer_meta_backup.go diff --git a/weed/command/command.go b/weed/command/command.go index 5506e6969..a9063eaa0 100644 --- a/weed/command/command.go +++ b/weed/command/command.go @@ -17,6 +17,7 @@ var Commands = []*Command{ cmdFiler, cmdFilerBackup, cmdFilerCat, + cmdFilerMetaBackup, cmdFilerMetaTail, cmdFilerReplicate, cmdFilerSynchronize, diff --git a/weed/command/filer_meta_backup.go b/weed/command/filer_meta_backup.go new file mode 100644 index 000000000..7121db44b --- /dev/null +++ b/weed/command/filer_meta_backup.go @@ -0,0 +1,268 @@ +package command + +import ( + "context" + "fmt" + "github.com/chrislusf/seaweedfs/weed/filer" + "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/spf13/viper" + "google.golang.org/grpc" + "io" + "reflect" + "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" +) + +var ( + metaBackup FilerMetaBackupOptions +) + +type FilerMetaBackupOptions struct { + grpcDialOption grpc.DialOption + filerAddress *string + filerDirectory *string + restart *bool + backupFilerConfig *string + + store filer.FilerStore +} + +func init() { + cmdFilerMetaBackup.Run = runFilerMetaBackup // break init cycle + metaBackup.filerAddress = cmdFilerMetaBackup.Flag.String("filer", "localhost:8888", "filer hostname:port") + metaBackup.filerDirectory = cmdFilerMetaBackup.Flag.String("filerDir", "/", "a folder on the filer") + metaBackup.restart = cmdFilerMetaBackup.Flag.Bool("restart", false, "copy the full metadata snapshot before async continuous backup") + metaBackup.backupFilerConfig = cmdFilerMetaBackup.Flag.String("config", "", "path to filer.toml specifying backup filer store") +} + +var cmdFilerMetaBackup = &Command{ + UsageLine: "filer.meta.backup [-filer=localhost:8888] [-filerDir=/] [-restart] -config=/path/to/backup_filer.toml", + Short: "continuously backup filer meta data changes to anther filer store specified in a backup_filer.toml", + Long: `continuously backup filer meta data changes. +The backup writes to another filer store specified in a backup_filer.toml. + + weed filer.meta.backup -config=/path/to/backup_filer.toml -filer="localhost:8888" + weed filer.meta.backup -config=/path/to/backup_filer.toml -filer="localhost:8888" -restart + + `, +} + +func runFilerMetaBackup(cmd *Command, args []string) bool { + + metaBackup.grpcDialOption = security.LoadClientTLS(util.GetViper(), "grpc.client") + + // load backup_filer.toml + v := viper.New() + v.SetConfigFile(*metaBackup.backupFilerConfig) + + if err := v.ReadInConfig(); err != nil { // Handle errors reading the config file + glog.Fatalf("Failed to load %s file.\nPlease use this command to generate the a %s.toml file\n"+ + " weed scaffold -config=%s -output=.\n\n\n", + *metaBackup.backupFilerConfig, "backup_filer", "filer") + } + + if err := metaBackup.initStore(v); err != nil { + glog.V(0).Infof("init backup filer store: %v", err) + return true + } + + missingPreviousBackup := false + _, err := metaBackup.getOffset() + if err != nil { + missingPreviousBackup = true + } + + if *metaBackup.restart || missingPreviousBackup { + glog.V(0).Infof("traversing metadata tree...") + startTime := time.Now() + if err := metaBackup.traverseMetadata(); err != nil { + glog.Errorf("traverse meta data: %v", err) + return true + } + glog.V(0).Infof("metadata copied up to %v", startTime) + if err := metaBackup.setOffset(startTime); err != nil { + startTime = time.Now() + } + } + + for { + err := metaBackup.streamMetadataBackup() + if err != nil { + glog.Errorf("filer meta backup from %s: %v", *metaBackup.filerAddress, err) + time.Sleep(1747 * time.Millisecond) + } + } + + return true +} + +func (metaBackup *FilerMetaBackupOptions) initStore(v *viper.Viper) error { + // load configuration for default filer store + hasDefaultStoreConfigured := false + for _, store := range filer.Stores { + if v.GetBool(store.GetName() + ".enabled") { + store = reflect.New(reflect.ValueOf(store).Elem().Type()).Interface().(filer.FilerStore) + if err := store.Initialize(v, store.GetName()+"."); err != nil { + glog.Fatalf("failed to initialize store for %s: %+v", store.GetName(), err) + } + glog.V(0).Infof("configured filer store to %s", store.GetName()) + hasDefaultStoreConfigured = true + metaBackup.store = filer.NewFilerStoreWrapper(store) + break + } + } + if !hasDefaultStoreConfigured { + return fmt.Errorf("no filer store enabled in %s", v.ConfigFileUsed()) + } + + return nil +} + +func (metaBackup *FilerMetaBackupOptions) traverseMetadata() (err error) { + var saveErr error + + traverseErr := filer_pb.TraverseBfs(metaBackup, util.FullPath(*metaBackup.filerDirectory), func(parentPath util.FullPath, entry *filer_pb.Entry) { + + println("+", parentPath.Child(entry.Name)) + if err := metaBackup.store.InsertEntry(context.Background(), filer.FromPbEntry(string(parentPath), entry)); err != nil { + saveErr = fmt.Errorf("insert entry error: %v\n", err) + return + } + + }) + + if traverseErr != nil { + return fmt.Errorf("traverse: %v", traverseErr) + } + return saveErr +} + +var ( + MetaBackupKey = []byte("metaBackup") +) + +func (metaBackup *FilerMetaBackupOptions) streamMetadataBackup() error { + + startTime, err := metaBackup.getOffset() + if err != nil { + startTime = time.Now() + } + glog.V(0).Infof("streaming from %v", startTime) + + store := metaBackup.store + + eachEntryFunc := func(resp *filer_pb.SubscribeMetadataResponse) error { + + ctx := context.Background() + message := resp.EventNotification + + if message.OldEntry == nil && message.NewEntry == nil { + return nil + } + if message.OldEntry == nil && message.NewEntry != nil { + println("+", util.FullPath(message.NewParentPath).Child(message.NewEntry.Name)) + entry := filer.FromPbEntry(message.NewParentPath, message.NewEntry) + return store.InsertEntry(ctx, entry) + } + if message.OldEntry != nil && message.NewEntry == nil { + println("-", util.FullPath(resp.Directory).Child(message.OldEntry.Name)) + return store.DeleteEntry(ctx, util.FullPath(resp.Directory).Child(message.OldEntry.Name)) + } + if message.OldEntry != nil && message.NewEntry != nil { + if resp.Directory == message.NewParentPath && message.OldEntry.Name == message.NewEntry.Name { + println("~", util.FullPath(message.NewParentPath).Child(message.NewEntry.Name)) + entry := filer.FromPbEntry(message.NewParentPath, message.NewEntry) + return store.UpdateEntry(ctx, entry) + } + println("-", util.FullPath(resp.Directory).Child(message.OldEntry.Name)) + if err := store.DeleteEntry(ctx, util.FullPath(resp.Directory).Child(message.OldEntry.Name)); err != nil { + return err + } + println("+", util.FullPath(message.NewParentPath).Child(message.NewEntry.Name)) + return store.InsertEntry(ctx, filer.FromPbEntry(message.NewParentPath, message.NewEntry)) + } + + 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 + } + } + + } + + }) + return tailErr +} + +func (metaBackup *FilerMetaBackupOptions) getOffset() (lastWriteTime time.Time, err error) { + value, err := metaBackup.store.KvGet(context.Background(), MetaBackupKey) + if err != nil { + return + } + tsNs := util.BytesToUint64(value) + + return time.Unix(0, int64(tsNs)), nil +} + +func (metaBackup *FilerMetaBackupOptions) setOffset(lastWriteTime time.Time) error { + valueBuf := make([]byte, 8) + util.Uint64toBytes(valueBuf, uint64(lastWriteTime.UnixNano())) + + if err := metaBackup.store.KvPut(context.Background(), MetaBackupKey, valueBuf); err != nil { + return err + } + return nil +} + +var _ = filer_pb.FilerClient(&FilerMetaBackupOptions{}) + +func (metaBackup *FilerMetaBackupOptions) WithFilerClient(fn func(filer_pb.SeaweedFilerClient) error) error { + + return pb.WithFilerClient(*metaBackup.filerAddress, metaBackup.grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { + return fn(client) + }) + +} + +func (metaBackup *FilerMetaBackupOptions) AdjustedUrl(location *filer_pb.Location) string { + return location.Url +} From 40ff30b83f2375c43a2bc482d647799f2cabbf33 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 3 Mar 2021 02:12:46 -0800 Subject: [PATCH 022/284] adjust help message --- weed/command/filer_meta_backup.go | 2 +- weed/util/fla9/fla9.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/weed/command/filer_meta_backup.go b/weed/command/filer_meta_backup.go index 7121db44b..ba0b44659 100644 --- a/weed/command/filer_meta_backup.go +++ b/weed/command/filer_meta_backup.go @@ -35,7 +35,7 @@ func init() { cmdFilerMetaBackup.Run = runFilerMetaBackup // break init cycle metaBackup.filerAddress = cmdFilerMetaBackup.Flag.String("filer", "localhost:8888", "filer hostname:port") metaBackup.filerDirectory = cmdFilerMetaBackup.Flag.String("filerDir", "/", "a folder on the filer") - metaBackup.restart = cmdFilerMetaBackup.Flag.Bool("restart", false, "copy the full metadata snapshot before async continuous backup") + metaBackup.restart = cmdFilerMetaBackup.Flag.Bool("restart", false, "copy the full metadata before async incremental backup") metaBackup.backupFilerConfig = cmdFilerMetaBackup.Flag.String("config", "", "path to filer.toml specifying backup filer store") } diff --git a/weed/util/fla9/fla9.go b/weed/util/fla9/fla9.go index 1538daa55..eb5700e8c 100644 --- a/weed/util/fla9/fla9.go +++ b/weed/util/fla9/fla9.go @@ -886,7 +886,7 @@ func (f *FlagSet) parseOne() (bool, error) { // The return value will be ErrHelp if -help or -h were set but not defined. func (f *FlagSet) Parse(arguments []string) error { if _, ok := f.formal[DefaultConfigFlagName]; !ok { - f.String(DefaultConfigFlagName, "", "file with command line options with each line in optionName=optionValue format") + f.String(DefaultConfigFlagName, "", "a file of command line options, each line in optionName=optionValue format") } f.parsed = true From 280c10ec8fabca5b8f3c4e493095501bd9ba046f Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 3 Mar 2021 10:52:02 -0800 Subject: [PATCH 023/284] Update backers.md --- backers.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backers.md b/backers.md index 725615237..dd8c69e67 100644 --- a/backers.md +++ b/backers.md @@ -1,3 +1,4 @@ +

Sponsors & Backers

- [Become a backer or sponsor on Patreon](https://www.patreon.com/seaweedfs). @@ -12,3 +13,4 @@ - [ColorfulClouds Tech Co. Ltd.](https://caiyunai.com/) - [Haravan - Ecommerce Platform](https://www.haravan.com) +- PeterCxy - Creator of Shelter App From f5cc96f289a986bc68df9097331c353c7f8545a8 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 4 Mar 2021 12:31:26 -0800 Subject: [PATCH 024/284] skip checking master peers if not starting master --- weed/command/server.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/weed/command/server.go b/weed/command/server.go index 611578953..370ebdd46 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -156,9 +156,11 @@ func runServer(cmd *Command, args []string) bool { *isStartingFiler = true } - _, peerList := checkPeers(*serverIp, *masterOptions.port, *masterOptions.peers) - peers := strings.Join(peerList, ",") - masterOptions.peers = &peers + if *isStartingMasterServer { + _, peerList := checkPeers(*serverIp, *masterOptions.port, *masterOptions.peers) + peers := strings.Join(peerList, ",") + masterOptions.peers = &peers + } // ip address masterOptions.ip = serverIp From c5cb346a08129cd02d9962448d54dddcd0e03d69 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 4 Mar 2021 12:36:20 -0800 Subject: [PATCH 025/284] fix compilation error --- weed/command/server.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/weed/command/server.go b/weed/command/server.go index 370ebdd46..64321b4d7 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -165,12 +165,12 @@ func runServer(cmd *Command, args []string) bool { // ip address masterOptions.ip = serverIp masterOptions.ipBind = serverBindIp - filerOptions.masters = &peers + filerOptions.masters = masterOptions.peers filerOptions.ip = serverIp filerOptions.bindIp = serverBindIp serverOptions.v.ip = serverIp serverOptions.v.bindIp = serverBindIp - serverOptions.v.masters = &peers + serverOptions.v.masters = masterOptions.peers serverOptions.v.idleConnectionTimeout = serverTimeout serverOptions.v.dataCenter = serverDataCenter serverOptions.v.rack = serverRack From 2e89c8c9aee141e0ca471644639c970ebaf1dcaa Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 4 Mar 2021 14:03:40 -0800 Subject: [PATCH 026/284] delete the folder object in multi_object_delete fix https://github.com/chrislusf/seaweedfs/issues/1857 --- weed/s3api/s3api_object_handlers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index 19d85c495..55199d4eb 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -185,7 +185,7 @@ func (s3a *S3ApiServer) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *h for _, object := range deleteObjects.Objects { lastSeparator := strings.LastIndex(object.ObjectName, "/") - parentDirectoryPath, entryName, isDeleteData, isRecursive := "", object.ObjectName, true, false + parentDirectoryPath, entryName, isDeleteData, isRecursive := "", object.ObjectName, true, true if lastSeparator > 0 && lastSeparator+1 < len(object.ObjectName) { entryName = object.ObjectName[lastSeparator+1:] parentDirectoryPath = "/" + object.ObjectName[:lastSeparator] From 400de380f48c44c7700fdf7e8f247bf856662c10 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 5 Mar 2021 02:29:38 -0800 Subject: [PATCH 027/284] volume server: support tcp direct put/get/delete --- weed/command/volume.go | 22 +++ .../volume_server_tcp_handlers_write.go | 133 ++++++++++++++++++ weed/storage/backend/disk_file.go | 2 +- weed/storage/needle/crc.go | 24 ++++ weed/storage/volume_stream_write.go | 106 ++++++++++++++ weed/storage/volume_vacuum.go | 2 +- 6 files changed, 287 insertions(+), 2 deletions(-) create mode 100644 weed/server/volume_server_tcp_handlers_write.go create mode 100644 weed/storage/volume_stream_write.go diff --git a/weed/command/volume.go b/weed/command/volume.go index 659c93d96..cf162a732 100644 --- a/weed/command/volume.go +++ b/weed/command/volume.go @@ -251,6 +251,9 @@ func (v VolumeServerOptions) startVolumeServer(volumeFolders, maxVolumeCounts, v } } + // starting tcp server + go v.startTcpService(volumeServer) + // starting the cluster http server clusterHttpServer := v.startClusterHttpService(volumeMux) @@ -368,3 +371,22 @@ func (v VolumeServerOptions) startClusterHttpService(handler http.Handler) httpd }() return clusterHttpServer } + +func (v VolumeServerOptions) startTcpService(volumeServer *weed_server.VolumeServer) { + listeningAddress := *v.bindIp + ":" + strconv.Itoa(*v.port+20000) + glog.V(0).Infoln("Start Seaweed volume server", util.Version(), "tcp at", listeningAddress) + listener, e := util.NewListener(listeningAddress, 0) + if e != nil { + glog.Fatalf("Volume server listener error on %s:%v", listeningAddress, e) + } + defer listener.Close() + + for { + c, err := listener.Accept() + if err != nil { + fmt.Println(err) + return + } + go volumeServer.HandleTcpConnection(c) + } +} diff --git a/weed/server/volume_server_tcp_handlers_write.go b/weed/server/volume_server_tcp_handlers_write.go new file mode 100644 index 000000000..7c2f1a77f --- /dev/null +++ b/weed/server/volume_server_tcp_handlers_write.go @@ -0,0 +1,133 @@ +package weed_server + +import ( + "bufio" + "fmt" + "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/storage/needle" + "github.com/chrislusf/seaweedfs/weed/util" + "net" + "strings" +) + +func (vs *VolumeServer) HandleTcpConnection(c net.Conn) { + defer c.Close() + + glog.V(0).Infof("Serving writes from %s", c.RemoteAddr().String()) + + bufReader := bufio.NewReaderSize(c, 1024*1024) + bufWriter := bufio.NewWriterSize(c, 1024*1024) + + for { + cmd, err := bufReader.ReadString('\n') + if err != nil { + glog.Errorf("read command from %s: %v", c.RemoteAddr().String(), err) + return + } + switch cmd[0] { + case '+': + fileId := cmd[1:] + err = vs.handleTcpPut(fileId, bufReader) + if err == nil { + bufWriter.Write([]byte("+OK\n")) + } else { + bufWriter.Write([]byte("-ERR " + string(err.Error()) + "\n")) + } + case '-': + fileId := cmd[1:] + err = vs.handleTcpDelete(fileId) + if err == nil { + bufWriter.Write([]byte("+OK\n")) + } else { + bufWriter.Write([]byte("-ERR " + string(err.Error()) + "\n")) + } + case '?': + fileId := cmd[1:] + err = vs.handleTcpGet(fileId, bufWriter) + case '!': + bufWriter.Flush() + } + + } + +} + +func (vs *VolumeServer) handleTcpGet(fileId string, writer *bufio.Writer) (err error) { + + volumeId, n, err2 := vs.parseFileId(fileId) + if err2 != nil { + return err2 + } + + volume := vs.store.GetVolume(volumeId) + if volume == nil { + return fmt.Errorf("volume %d not found", volumeId) + } + + err = volume.StreamRead(n, writer) + if err != nil { + return err + } + + return nil +} + +func (vs *VolumeServer) handleTcpPut(fileId string, bufReader *bufio.Reader) (err error) { + + volumeId, n, err2 := vs.parseFileId(fileId) + if err2 != nil { + return err2 + } + + volume := vs.store.GetVolume(volumeId) + if volume == nil { + return fmt.Errorf("volume %d not found", volumeId) + } + + sizeBuf := make([]byte, 4) + if _, err = bufReader.Read(sizeBuf); err != nil { + return err + } + dataSize := util.BytesToUint32(sizeBuf) + + err = volume.StreamWrite(n, bufReader, dataSize) + if err != nil { + return err + } + + return nil +} + +func (vs *VolumeServer) handleTcpDelete(fileId string) (err error) { + + volumeId, n, err2 := vs.parseFileId(fileId) + if err2 != nil { + return err2 + } + + _, err = vs.store.DeleteVolumeNeedle(volumeId, n) + if err != nil { + return err + } + + return nil +} + +func (vs *VolumeServer) parseFileId(fileId string) (needle.VolumeId, *needle.Needle, error) { + + commaIndex := strings.LastIndex(fileId, ",") + if commaIndex <= 0 { + return 0, nil, fmt.Errorf("unknown fileId %s", fileId) + } + + vid, fid := fileId[0:commaIndex], fileId[commaIndex+1:] + + volumeId, ve := needle.NewVolumeId(vid) + if ve != nil { + return 0, nil, fmt.Errorf("unknown volume id in fileId %s", fileId) + } + + n := new(needle.Needle) + n.ParsePath(fid) + return volumeId, n, nil +} diff --git a/weed/storage/backend/disk_file.go b/weed/storage/backend/disk_file.go index 498963c31..3b42429cf 100644 --- a/weed/storage/backend/disk_file.go +++ b/weed/storage/backend/disk_file.go @@ -52,7 +52,7 @@ func (df *DiskFile) WriteAt(p []byte, off int64) (n int, err error) { return } -func (df *DiskFile) Append(p []byte) (n int, err error) { +func (df *DiskFile) Write(p []byte) (n int, err error) { return df.WriteAt(p, df.fileSize) } diff --git a/weed/storage/needle/crc.go b/weed/storage/needle/crc.go index 6fd910bb7..e1bac829a 100644 --- a/weed/storage/needle/crc.go +++ b/weed/storage/needle/crc.go @@ -2,6 +2,8 @@ package needle import ( "fmt" + "hash" + "io" "github.com/klauspost/crc32" @@ -29,3 +31,25 @@ func (n *Needle) Etag() string { util.Uint32toBytes(bits, uint32(n.Checksum)) return fmt.Sprintf("%x", bits) } + +func NewCRCwriter(w io.Writer) *CRCwriter { + + return &CRCwriter{ + h: crc32.New(table), + w: w, + } + +} + +type CRCwriter struct { + h hash.Hash32 + w io.Writer +} + +func (c *CRCwriter) Write(p []byte) (n int, err error) { + n, err = c.w.Write(p) // with each write ... + c.h.Write(p) // ... update the hash + return +} + +func (c *CRCwriter) Sum() uint32 { return c.h.Sum32() } // final hash diff --git a/weed/storage/volume_stream_write.go b/weed/storage/volume_stream_write.go new file mode 100644 index 000000000..f619de30b --- /dev/null +++ b/weed/storage/volume_stream_write.go @@ -0,0 +1,106 @@ +package storage + +import ( + "bufio" + "fmt" + "github.com/chrislusf/seaweedfs/weed/util" + "io" + "time" + + "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/storage/backend" + "github.com/chrislusf/seaweedfs/weed/storage/needle" + . "github.com/chrislusf/seaweedfs/weed/storage/types" +) + +func (v *Volume) StreamWrite(n *needle.Needle, data io.Reader, dataSize uint32) (err error) { + + v.dataFileAccessLock.Lock() + defer v.dataFileAccessLock.Unlock() + + df, ok := v.DataBackend.(*backend.DiskFile) + if !ok { + return fmt.Errorf("unexpected volume backend") + } + offset, _, _ := v.DataBackend.GetStat() + + header := make([]byte, NeedleHeaderSize+TimestampSize) // adding timestamp to reuse it and avoid extra allocation + CookieToBytes(header[0:CookieSize], n.Cookie) + NeedleIdToBytes(header[CookieSize:CookieSize+NeedleIdSize], n.Id) + n.Size = 4 + Size(dataSize) + 1 + SizeToBytes(header[CookieSize+NeedleIdSize:CookieSize+NeedleIdSize+SizeSize], n.Size) + + n.DataSize = dataSize + + // needle header + df.Write(header[0:NeedleHeaderSize]) + + // data size and data + util.Uint32toBytes(header[0:4], n.DataSize) + df.Write(header[0:4]) + // write and calculate CRC + crcWriter := needle.NewCRCwriter(df) + io.Copy(crcWriter, io.LimitReader(data, int64(dataSize))) + + // flags + util.Uint8toBytes(header[0:1], n.Flags) + df.Write(header[0:1]) + + // data checksum + util.Uint32toBytes(header[0:needle.NeedleChecksumSize], crcWriter.Sum()) + df.Write(header[0:needle.NeedleChecksumSize]) + + // write timestamp, padding + n.AppendAtNs = uint64(time.Now().UnixNano()) + util.Uint64toBytes(header[needle.NeedleChecksumSize:needle.NeedleChecksumSize+TimestampSize], n.AppendAtNs) + padding := needle.PaddingLength(n.Size, needle.Version3) + df.Write(header[0 : needle.NeedleChecksumSize+TimestampSize+padding]) + + // add to needle map + if err = v.nm.Put(n.Id, ToOffset(int64(offset)), n.Size); err != nil { + glog.V(4).Infof("failed to save in needle map %d: %v", n.Id, err) + } + return +} + +func (v *Volume) StreamRead(n *needle.Needle, writer io.Writer) (err error) { + + v.dataFileAccessLock.Lock() + defer v.dataFileAccessLock.Unlock() + + nv, ok := v.nm.Get(n.Id) + if !ok || nv.Offset.IsZero() { + return ErrorNotFound + } + + sr := &StreamReader{ + readerAt: v.DataBackend, + offset: nv.Offset.ToActualOffset(), + } + bufReader := bufio.NewReader(sr) + bufReader.Discard(NeedleHeaderSize) + sizeBuf := make([]byte, 4) + bufReader.Read(sizeBuf) + if _, err = writer.Write(sizeBuf); err != nil { + return err + } + dataSize := util.BytesToUint32(sizeBuf) + + _, err = io.Copy(writer, io.LimitReader(bufReader, int64(dataSize))) + + return +} + +type StreamReader struct { + offset int64 + readerAt io.ReaderAt +} + +func (sr *StreamReader) Read(p []byte) (n int, err error) { + n, err = sr.readerAt.ReadAt(p, sr.offset) + if err != nil { + return + } + sr.offset += int64(n) + return +} diff --git a/weed/storage/volume_vacuum.go b/weed/storage/volume_vacuum.go index 0ee1e61c6..be84f8a13 100644 --- a/weed/storage/volume_vacuum.go +++ b/weed/storage/volume_vacuum.go @@ -286,7 +286,7 @@ func (v *Volume) makeupDiff(newDatFileName, newIdxFileName, oldDatFileName, oldI if err != nil { return fmt.Errorf("ReadNeedleBlob %s key %d offset %d size %d failed: %v", oldDatFile.Name(), key, increIdxEntry.offset.ToActualOffset(), increIdxEntry.size, err) } - dstDatBackend.Append(needleBytes) + dstDatBackend.Write(needleBytes) util.Uint32toBytes(idxEntryBytes[8:12], uint32(offset/NeedlePaddingSize)) } else { //deleted needle //fakeDelNeedle 's default Data field is nil From 7413d59750686bc3fdc50ff7a687adfd002e1b63 Mon Sep 17 00:00:00 2001 From: Patrick Schmidt Date: Fri, 5 Mar 2021 12:50:58 +0100 Subject: [PATCH 028/284] Fix EC shard count logic This fixes the calculation of the amount of EC shards a node holds. Previously a global counter was increased, but also used inside the loop to apply disk usage deltas. This led to wrong absolute numbers. The fix is to apply only deltas of single EC shards per iteration. --- weed/topology/data_node_ec.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/weed/topology/data_node_ec.go b/weed/topology/data_node_ec.go index df1b6d658..330b16b24 100644 --- a/weed/topology/data_node_ec.go +++ b/weed/topology/data_node_ec.go @@ -25,7 +25,7 @@ func (dn *DataNode) UpdateEcShards(actualShards []*erasure_coding.EcVolumeInfo) existingEcShards := dn.GetEcShards() - // found out the newShards and deletedShards + // find out the newShards and deletedShards var newShardCount, deletedShardCount int for _, ecShards := range existingEcShards { @@ -56,20 +56,19 @@ func (dn *DataNode) UpdateEcShards(actualShards []*erasure_coding.EcVolumeInfo) disk.UpAdjustDiskUsageDelta(deltaDiskUsages) } + for _, ecShards := range actualShards { + if dn.hasEcShards(ecShards.VolumeId) { + continue + } + + newShards = append(newShards, ecShards) disk := dn.getOrCreateDisk(ecShards.DiskType) deltaDiskUsages := newDiskUsages() deltaDiskUsage := deltaDiskUsages.getOrCreateDisk(types.ToDiskType(ecShards.DiskType)) - - if !dn.hasEcShards(ecShards.VolumeId) { - newShards = append(newShards, ecShards) - newShardCount += ecShards.ShardIdCount() - } - - deltaDiskUsage.ecShardCount = int64(newShardCount) + deltaDiskUsage.ecShardCount = int64(ecShards.ShardIdCount()) disk.UpAdjustDiskUsageDelta(deltaDiskUsages) - } if len(newShards) > 0 || len(deletedShards) > 0 { From 3a96461be368cdd69a52de2ba4fb39507f2ac468 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 6 Mar 2021 12:32:54 -0800 Subject: [PATCH 029/284] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4a13f09d9..737338d7a 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,7 @@ SeaweedFS can work as a distributed [Key-Large-Value store][KeyLargeValueStore]. * Support ETag, Accept-Range, Last-Modified, etc. * Support in-memory/leveldb/readonly mode tuning for memory/performance balance. * Support rebalancing the writable and readonly volumes. +* [Customizable Multiple Storage Tiers][TieredStorage]: Customizable storage disk types to balance performance and cost. * [Transparent cloud integration][CloudTier]: unlimited capacity via tiered cloud storage for warm data. * [Erasure Coding for warm storage][ErasureCoding] Rack-Aware 10.4 erasure coding reduces storage cost and increases availability. @@ -152,6 +153,7 @@ SeaweedFS can work as a distributed [Key-Large-Value store][KeyLargeValueStore]. [Hadoop]: https://github.com/chrislusf/seaweedfs/wiki/Hadoop-Compatible-File-System [WebDAV]: https://github.com/chrislusf/seaweedfs/wiki/WebDAV [ErasureCoding]: https://github.com/chrislusf/seaweedfs/wiki/Erasure-coding-for-warm-storage +[TieredStorage]: https://github.com/chrislusf/seaweedfs/wiki/Tiered-Storage [CloudTier]: https://github.com/chrislusf/seaweedfs/wiki/Cloud-Tier [FilerDataEncryption]: https://github.com/chrislusf/seaweedfs/wiki/Filer-Data-Encryption [FilerTTL]: https://github.com/chrislusf/seaweedfs/wiki/Filer-Stores From 1444e9d2758ab1f6adeb16a656c1c1cea4292145 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 6 Mar 2021 14:24:01 -0800 Subject: [PATCH 030/284] migrated multi host connection pool from godropbox package removing unneeded dependencies, which involved etcd versions. --- weed/wdclient/net2/base_connection_pool.go | 159 ++++++++ weed/wdclient/net2/connection_pool.go | 97 +++++ weed/wdclient/net2/doc.go | 6 + weed/wdclient/net2/ip.go | 177 +++++++++ weed/wdclient/net2/managed_connection.go | 185 ++++++++++ weed/wdclient/net2/port.go | 19 + weed/wdclient/resource_pool/doc.go | 5 + weed/wdclient/resource_pool/managed_handle.go | 97 +++++ .../resource_pool/multi_resource_pool.go | 200 ++++++++++ weed/wdclient/resource_pool/resource_pool.go | 96 +++++ weed/wdclient/resource_pool/semaphore.go | 154 ++++++++ .../resource_pool/simple_resource_pool.go | 343 ++++++++++++++++++ 12 files changed, 1538 insertions(+) create mode 100644 weed/wdclient/net2/base_connection_pool.go create mode 100644 weed/wdclient/net2/connection_pool.go create mode 100644 weed/wdclient/net2/doc.go create mode 100644 weed/wdclient/net2/ip.go create mode 100644 weed/wdclient/net2/managed_connection.go create mode 100644 weed/wdclient/net2/port.go create mode 100644 weed/wdclient/resource_pool/doc.go create mode 100644 weed/wdclient/resource_pool/managed_handle.go create mode 100644 weed/wdclient/resource_pool/multi_resource_pool.go create mode 100644 weed/wdclient/resource_pool/resource_pool.go create mode 100644 weed/wdclient/resource_pool/semaphore.go create mode 100644 weed/wdclient/resource_pool/simple_resource_pool.go diff --git a/weed/wdclient/net2/base_connection_pool.go b/weed/wdclient/net2/base_connection_pool.go new file mode 100644 index 000000000..5cc037d0f --- /dev/null +++ b/weed/wdclient/net2/base_connection_pool.go @@ -0,0 +1,159 @@ +package net2 + +import ( + "net" + "strings" + "time" + + rp "github.com/chrislusf/seaweedfs/weed/wdclient/resource_pool" +) + +const defaultDialTimeout = 1 * time.Second + +func defaultDialFunc(network string, address string) (net.Conn, error) { + return net.DialTimeout(network, address, defaultDialTimeout) +} + +func parseResourceLocation(resourceLocation string) ( + network string, + address string) { + + idx := strings.Index(resourceLocation, " ") + if idx >= 0 { + return resourceLocation[:idx], resourceLocation[idx+1:] + } + + return "", resourceLocation +} + +// A thin wrapper around the underlying resource pool. +type connectionPoolImpl struct { + options ConnectionOptions + + pool rp.ResourcePool +} + +// This returns a connection pool where all connections are connected +// to the same (network, address) +func newBaseConnectionPool( + options ConnectionOptions, + createPool func(rp.Options) rp.ResourcePool) ConnectionPool { + + dial := options.Dial + if dial == nil { + dial = defaultDialFunc + } + + openFunc := func(loc string) (interface{}, error) { + network, address := parseResourceLocation(loc) + return dial(network, address) + } + + closeFunc := func(handle interface{}) error { + return handle.(net.Conn).Close() + } + + poolOptions := rp.Options{ + MaxActiveHandles: options.MaxActiveConnections, + MaxIdleHandles: options.MaxIdleConnections, + MaxIdleTime: options.MaxIdleTime, + OpenMaxConcurrency: options.DialMaxConcurrency, + Open: openFunc, + Close: closeFunc, + NowFunc: options.NowFunc, + } + + return &connectionPoolImpl{ + options: options, + pool: createPool(poolOptions), + } +} + +// This returns a connection pool where all connections are connected +// to the same (network, address) +func NewSimpleConnectionPool(options ConnectionOptions) ConnectionPool { + return newBaseConnectionPool(options, rp.NewSimpleResourcePool) +} + +// This returns a connection pool that manages multiple (network, address) +// entries. The connections to each (network, address) entry acts +// independently. For example ("tcp", "localhost:11211") could act as memcache +// shard 0 and ("tcp", "localhost:11212") could act as memcache shard 1. +func NewMultiConnectionPool(options ConnectionOptions) ConnectionPool { + return newBaseConnectionPool( + options, + func(poolOptions rp.Options) rp.ResourcePool { + return rp.NewMultiResourcePool(poolOptions, nil) + }) +} + +// See ConnectionPool for documentation. +func (p *connectionPoolImpl) NumActive() int32 { + return p.pool.NumActive() +} + +// See ConnectionPool for documentation. +func (p *connectionPoolImpl) ActiveHighWaterMark() int32 { + return p.pool.ActiveHighWaterMark() +} + +// This returns the number of alive idle connections. This method is not part +// of ConnectionPool's API. It is used only for testing. +func (p *connectionPoolImpl) NumIdle() int { + return p.pool.NumIdle() +} + +// BaseConnectionPool can only register a single (network, address) entry. +// Register should be call before any Get calls. +func (p *connectionPoolImpl) Register(network string, address string) error { + return p.pool.Register(network + " " + address) +} + +// BaseConnectionPool has nothing to do on Unregister. +func (p *connectionPoolImpl) Unregister(network string, address string) error { + return nil +} + +func (p *connectionPoolImpl) ListRegistered() []NetworkAddress { + result := make([]NetworkAddress, 0, 1) + for _, location := range p.pool.ListRegistered() { + network, address := parseResourceLocation(location) + + result = append( + result, + NetworkAddress{ + Network: network, + Address: address, + }) + } + return result +} + +// This gets an active connection from the connection pool. Note that network +// and address arguments are ignored (The connections with point to the +// network/address provided by the first Register call). +func (p *connectionPoolImpl) Get( + network string, + address string) (ManagedConn, error) { + + handle, err := p.pool.Get(network + " " + address) + if err != nil { + return nil, err + } + return NewManagedConn(network, address, handle, p, p.options), nil +} + +// See ConnectionPool for documentation. +func (p *connectionPoolImpl) Release(conn ManagedConn) error { + return conn.ReleaseConnection() +} + +// See ConnectionPool for documentation. +func (p *connectionPoolImpl) Discard(conn ManagedConn) error { + return conn.DiscardConnection() +} + +// See ConnectionPool for documentation. +func (p *connectionPoolImpl) EnterLameDuckMode() { + p.pool.EnterLameDuckMode() +} diff --git a/weed/wdclient/net2/connection_pool.go b/weed/wdclient/net2/connection_pool.go new file mode 100644 index 000000000..5b8d4d232 --- /dev/null +++ b/weed/wdclient/net2/connection_pool.go @@ -0,0 +1,97 @@ +package net2 + +import ( + "net" + "time" +) + +type ConnectionOptions struct { + // The maximum number of connections that can be active per host at any + // given time (A non-positive value indicates the number of connections + // is unbounded). + MaxActiveConnections int32 + + // The maximum number of idle connections per host that are kept alive by + // the connection pool. + MaxIdleConnections uint32 + + // The maximum amount of time an idle connection can alive (if specified). + MaxIdleTime *time.Duration + + // This limits the number of concurrent Dial calls (there's no limit when + // DialMaxConcurrency is non-positive). + DialMaxConcurrency int + + // Dial specifies the dial function for creating network connections. + // If Dial is nil, net.DialTimeout is used, with timeout set to 1 second. + Dial func(network string, address string) (net.Conn, error) + + // This specifies the now time function. When the function is non-nil, the + // connection pool will use the specified function instead of time.Now to + // generate the current time. + NowFunc func() time.Time + + // This specifies the timeout for any Read() operation. + // Note that setting this to 0 (i.e. not setting it) will make + // read operations block indefinitely. + ReadTimeout time.Duration + + // This specifies the timeout for any Write() operation. + // Note that setting this to 0 (i.e. not setting it) will make + // write operations block indefinitely. + WriteTimeout time.Duration +} + +func (o ConnectionOptions) getCurrentTime() time.Time { + if o.NowFunc == nil { + return time.Now() + } else { + return o.NowFunc() + } +} + +// A generic interface for managed connection pool. All connection pool +// implementations must be threadsafe. +type ConnectionPool interface { + // This returns the number of active connections that are on loan. + NumActive() int32 + + // This returns the highest number of active connections for the entire + // lifetime of the pool. + ActiveHighWaterMark() int32 + + // This returns the number of idle connections that are in the pool. + NumIdle() int + + // This associates (network, address) to the connection pool; afterwhich, + // the user can get connections to (network, address). + Register(network string, address string) error + + // This dissociate (network, address) from the connection pool; + // afterwhich, the user can no longer get connections to + // (network, address). + Unregister(network string, address string) error + + // This returns the list of registered (network, address) entries. + ListRegistered() []NetworkAddress + + // This gets an active connection from the connection pool. The connection + // will remain active until one of the following is called: + // 1. conn.ReleaseConnection() + // 2. conn.DiscardConnection() + // 3. pool.Release(conn) + // 4. pool.Discard(conn) + Get(network string, address string) (ManagedConn, error) + + // This releases an active connection back to the connection pool. + Release(conn ManagedConn) error + + // This discards an active connection from the connection pool. + Discard(conn ManagedConn) error + + // Enter the connection pool into lame duck mode. The connection pool + // will no longer return connections, and all idle connections are closed + // immediately (including active connections that are released back to the + // pool afterward). + EnterLameDuckMode() +} diff --git a/weed/wdclient/net2/doc.go b/weed/wdclient/net2/doc.go new file mode 100644 index 000000000..f4d6552e4 --- /dev/null +++ b/weed/wdclient/net2/doc.go @@ -0,0 +1,6 @@ +// net2 is a collection of functions meant to supplement the capabilities +// provided by the standard "net" package. +package net2 + +// copied from https://github.com/dropbox/godropbox/tree/master/net2 +// removed other dependencies \ No newline at end of file diff --git a/weed/wdclient/net2/ip.go b/weed/wdclient/net2/ip.go new file mode 100644 index 000000000..60e46342f --- /dev/null +++ b/weed/wdclient/net2/ip.go @@ -0,0 +1,177 @@ +package net2 + +import ( + "fmt" + "log" + "net" + "os" + "strings" + "sync" +) + +var myHostname string +var myHostnameOnce sync.Once + +// Like os.Hostname but caches first successful result, making it cheap to call it +// over and over. +// It will also crash whole process if fetching Hostname fails! +func MyHostname() string { + myHostnameOnce.Do(func() { + var err error + myHostname, err = os.Hostname() + if err != nil { + log.Fatal(err) + } + }) + return myHostname +} + +var myIp4 *net.IPAddr +var myIp4Once sync.Once + +// Resolves `MyHostname()` to an Ip4 address. Caches first successful result, making it +// cheap to call it over and over. +// It will also crash whole process if resolving the IP fails! +func MyIp4() *net.IPAddr { + myIp4Once.Do(func() { + var err error + myIp4, err = net.ResolveIPAddr("ip4", MyHostname()) + if err != nil { + log.Fatal(err) + } + }) + return myIp4 +} + +var myIp6 *net.IPAddr +var myIp6Once sync.Once + +// Resolves `MyHostname()` to an Ip6 address. Caches first successful result, making it +// cheap to call it over and over. +// It will also crash whole process if resolving the IP fails! +func MyIp6() *net.IPAddr { + myIp6Once.Do(func() { + var err error + myIp6, err = net.ResolveIPAddr("ip6", MyHostname()) + if err != nil { + log.Fatal(err) + } + }) + return myIp6 +} + +// This returns the list of local ip addresses which other hosts can connect +// to (NOTE: Loopback ip is ignored). +// Also resolves Hostname to an address and adds it to the list too, so +// IPs from /etc/hosts can work too. +func GetLocalIPs() ([]*net.IP, error) { + hostname, err := os.Hostname() + if err != nil { + return nil, fmt.Errorf("Failed to lookup hostname: %v", err) + } + // Resolves IP Address from Hostname, this way overrides in /etc/hosts + // can work too for IP resolution. + ipInfo, err := net.ResolveIPAddr("ip4", hostname) + if err != nil { + return nil, fmt.Errorf("Failed to resolve ip: %v", err) + } + ips := []*net.IP{&ipInfo.IP} + + // TODO(zviad): Is rest of the code really necessary? + addrs, err := net.InterfaceAddrs() + if err != nil { + return nil, fmt.Errorf( "Failed to get interface addresses: %v", err) + } + for _, addr := range addrs { + ipnet, ok := addr.(*net.IPNet) + if !ok { + continue + } + + if ipnet.IP.IsLoopback() { + continue + } + + ips = append(ips, &ipnet.IP) + } + return ips, nil +} + +var localhostIPNets []*net.IPNet + +func init() { + for _, mask := range []string{"127.0.0.1/8", "::1/128"} { + _, ipnet, err := net.ParseCIDR(mask) + if err != nil { + panic(err) + } + localhostIPNets = append(localhostIPNets, ipnet) + } +} + +func IsLocalhostIp(ipStr string) bool { + ip := net.ParseIP(ipStr) + if ip == nil { + return false + } + for _, ipnet := range localhostIPNets { + if ipnet.Contains(ip) { + return true + } + } + return false +} + +// Given a host string, return true if the host is an ip (v4/v6) localhost. +func IsLocalhost(host string) bool { + return IsLocalhostIp(host) || + host == "localhost" || + host == "ip6-localhost" || + host == "ipv6-localhost" +} + +// Resolves hostnames in addresses to actual IP4 addresses. Skips all invalid addresses +// and all addresses that can't be resolved. +// `addrs` are assumed to be of form: [":", ...] +// Returns an error in addition to resolved addresses if not all resolutions succeed. +func ResolveIP4s(addrs []string) ([]string, error) { + resolvedAddrs := make([]string, 0, len(addrs)) + var lastErr error + + for _, server := range addrs { + hostPort := strings.Split(server, ":") + if len(hostPort) != 2 { + lastErr = fmt.Errorf("Skipping invalid address: %s", server) + continue + } + + ip, err := net.ResolveIPAddr("ip4", hostPort[0]) + if err != nil { + lastErr = err + continue + } + resolvedAddrs = append(resolvedAddrs, ip.IP.String()+":"+hostPort[1]) + } + return resolvedAddrs, lastErr +} + +func LookupValidAddrs() (map[string]bool, error) { + hostName, err := os.Hostname() + if err != nil { + return nil, err + } + addrs, err := net.LookupHost(hostName) + if err != nil { + return nil, err + } + validAddrs := make(map[string]bool) + validAddrs[hostName] = true + for _, addr := range addrs { + validAddrs[addr] = true + } + // Special case localhost/127.0.0.1 so that this works on devVMs. It should + // have no affect in production. + validAddrs["127.0.0.1"] = true + validAddrs["localhost"] = true + return validAddrs, nil +} diff --git a/weed/wdclient/net2/managed_connection.go b/weed/wdclient/net2/managed_connection.go new file mode 100644 index 000000000..a886210d1 --- /dev/null +++ b/weed/wdclient/net2/managed_connection.go @@ -0,0 +1,185 @@ +package net2 + +import ( + "fmt" + "net" + "time" + + "errors" + "github.com/chrislusf/seaweedfs/weed/wdclient/resource_pool" +) + +// Dial's arguments. +type NetworkAddress struct { + Network string + Address string +} + +// A connection managed by a connection pool. NOTE: SetDeadline, +// SetReadDeadline and SetWriteDeadline are disabled for managed connections. +// (The deadlines are set by the connection pool). +type ManagedConn interface { + net.Conn + + // This returns the original (network, address) entry used for creating + // the connection. + Key() NetworkAddress + + // This returns the underlying net.Conn implementation. + RawConn() net.Conn + + // This returns the connection pool which owns this connection. + Owner() ConnectionPool + + // This indictes a user is done with the connection and releases the + // connection back to the connection pool. + ReleaseConnection() error + + // This indicates the connection is an invalid state, and that the + // connection should be discarded from the connection pool. + DiscardConnection() error +} + +// A physical implementation of ManagedConn +type managedConnImpl struct { + addr NetworkAddress + handle resource_pool.ManagedHandle + pool ConnectionPool + options ConnectionOptions +} + +// This creates a managed connection wrapper. +func NewManagedConn( + network string, + address string, + handle resource_pool.ManagedHandle, + pool ConnectionPool, + options ConnectionOptions) ManagedConn { + + addr := NetworkAddress{ + Network: network, + Address: address, + } + + return &managedConnImpl{ + addr: addr, + handle: handle, + pool: pool, + options: options, + } +} + +func (c *managedConnImpl) rawConn() (net.Conn, error) { + h, err := c.handle.Handle() + return h.(net.Conn), err +} + +// See ManagedConn for documentation. +func (c *managedConnImpl) RawConn() net.Conn { + h, _ := c.handle.Handle() + return h.(net.Conn) +} + +// See ManagedConn for documentation. +func (c *managedConnImpl) Key() NetworkAddress { + return c.addr +} + +// See ManagedConn for documentation. +func (c *managedConnImpl) Owner() ConnectionPool { + return c.pool +} + +// See ManagedConn for documentation. +func (c *managedConnImpl) ReleaseConnection() error { + return c.handle.Release() +} + +// See ManagedConn for documentation. +func (c *managedConnImpl) DiscardConnection() error { + return c.handle.Discard() +} + +// See net.Conn for documentation +func (c *managedConnImpl) Read(b []byte) (n int, err error) { + conn, err := c.rawConn() + if err != nil { + return 0, err + } + + if c.options.ReadTimeout > 0 { + deadline := c.options.getCurrentTime().Add(c.options.ReadTimeout) + _ = conn.SetReadDeadline(deadline) + } + n, err = conn.Read(b) + if err != nil { + var localAddr string + if conn.LocalAddr() != nil { + localAddr = conn.LocalAddr().String() + } else { + localAddr = "(nil)" + } + + var remoteAddr string + if conn.RemoteAddr() != nil { + remoteAddr = conn.RemoteAddr().String() + } else { + remoteAddr = "(nil)" + } + err = fmt.Errorf("Read error from host: %s <-> %s: %v", localAddr, remoteAddr, err) + } + return +} + +// See net.Conn for documentation +func (c *managedConnImpl) Write(b []byte) (n int, err error) { + conn, err := c.rawConn() + if err != nil { + return 0, err + } + + if c.options.WriteTimeout > 0 { + deadline := c.options.getCurrentTime().Add(c.options.WriteTimeout) + _ = conn.SetWriteDeadline(deadline) + } + n, err = conn.Write(b) + if err != nil { + err = fmt.Errorf("Write error: %v", err) + } + return +} + +// See net.Conn for documentation +func (c *managedConnImpl) Close() error { + return c.handle.Discard() +} + +// See net.Conn for documentation +func (c *managedConnImpl) LocalAddr() net.Addr { + conn, _ := c.rawConn() + return conn.LocalAddr() +} + +// See net.Conn for documentation +func (c *managedConnImpl) RemoteAddr() net.Addr { + conn, _ := c.rawConn() + return conn.RemoteAddr() +} + +// SetDeadline is disabled for managed connection (The deadline is set by +// us, with respect to the read/write timeouts specified in ConnectionOptions). +func (c *managedConnImpl) SetDeadline(t time.Time) error { + return errors.New("Cannot set deadline for managed connection") +} + +// SetReadDeadline is disabled for managed connection (The deadline is set by +// us with respect to the read timeout specified in ConnectionOptions). +func (c *managedConnImpl) SetReadDeadline(t time.Time) error { + return errors.New("Cannot set read deadline for managed connection") +} + +// SetWriteDeadline is disabled for managed connection (The deadline is set by +// us with respect to the write timeout specified in ConnectionOptions). +func (c *managedConnImpl) SetWriteDeadline(t time.Time) error { + return errors.New("Cannot set write deadline for managed connection") +} diff --git a/weed/wdclient/net2/port.go b/weed/wdclient/net2/port.go new file mode 100644 index 000000000..f83adba28 --- /dev/null +++ b/weed/wdclient/net2/port.go @@ -0,0 +1,19 @@ +package net2 + +import ( + "net" + "strconv" +) + +// Returns the port information. +func GetPort(addr net.Addr) (int, error) { + _, lport, err := net.SplitHostPort(addr.String()) + if err != nil { + return -1, err + } + lportInt, err := strconv.Atoi(lport) + if err != nil { + return -1, err + } + return lportInt, nil +} diff --git a/weed/wdclient/resource_pool/doc.go b/weed/wdclient/resource_pool/doc.go new file mode 100644 index 000000000..c17b17c6c --- /dev/null +++ b/weed/wdclient/resource_pool/doc.go @@ -0,0 +1,5 @@ +// A generic resource pool for managing resources such as network connections. +package resource_pool + +// copied from https://github.com/dropbox/godropbox/tree/master/resource_pool +// removed other dependencies \ No newline at end of file diff --git a/weed/wdclient/resource_pool/managed_handle.go b/weed/wdclient/resource_pool/managed_handle.go new file mode 100644 index 000000000..e1d82ca7b --- /dev/null +++ b/weed/wdclient/resource_pool/managed_handle.go @@ -0,0 +1,97 @@ +package resource_pool + +import ( + "sync/atomic" + + "errors" +) + +// A resource handle managed by a resource pool. +type ManagedHandle interface { + // This returns the handle's resource location. + ResourceLocation() string + + // This returns the underlying resource handle (or error if the handle + // is no longer active). + Handle() (interface{}, error) + + // This returns the resource pool which owns this handle. + Owner() ResourcePool + + // The releases the underlying resource handle to the caller and marks the + // managed handle as inactive. The caller is responsible for cleaning up + // the released handle. This returns nil if the managed handle no longer + // owns the resource. + ReleaseUnderlyingHandle() interface{} + + // This indictes a user is done with the handle and releases the handle + // back to the resource pool. + Release() error + + // This indicates the handle is an invalid state, and that the + // connection should be discarded from the connection pool. + Discard() error +} + +// A physical implementation of ManagedHandle +type managedHandleImpl struct { + location string + handle interface{} + pool ResourcePool + isActive int32 // atomic bool + options Options +} + +// This creates a managed handle wrapper. +func NewManagedHandle( + resourceLocation string, + handle interface{}, + pool ResourcePool, + options Options) ManagedHandle { + + h := &managedHandleImpl{ + location: resourceLocation, + handle: handle, + pool: pool, + options: options, + } + atomic.StoreInt32(&h.isActive, 1) + + return h +} + +// See ManagedHandle for documentation. +func (c *managedHandleImpl) ResourceLocation() string { + return c.location +} + +// See ManagedHandle for documentation. +func (c *managedHandleImpl) Handle() (interface{}, error) { + if atomic.LoadInt32(&c.isActive) == 0 { + return c.handle, errors.New("Resource handle is no longer valid") + } + return c.handle, nil +} + +// See ManagedHandle for documentation. +func (c *managedHandleImpl) Owner() ResourcePool { + return c.pool +} + +// See ManagedHandle for documentation. +func (c *managedHandleImpl) ReleaseUnderlyingHandle() interface{} { + if atomic.CompareAndSwapInt32(&c.isActive, 1, 0) { + return c.handle + } + return nil +} + +// See ManagedHandle for documentation. +func (c *managedHandleImpl) Release() error { + return c.pool.Release(c) +} + +// See ManagedHandle for documentation. +func (c *managedHandleImpl) Discard() error { + return c.pool.Discard(c) +} diff --git a/weed/wdclient/resource_pool/multi_resource_pool.go b/weed/wdclient/resource_pool/multi_resource_pool.go new file mode 100644 index 000000000..9ac25526d --- /dev/null +++ b/weed/wdclient/resource_pool/multi_resource_pool.go @@ -0,0 +1,200 @@ +package resource_pool + +import ( + "fmt" + "sync" + + "errors" +) + +// A resource pool implementation that manages multiple resource location +// entries. The handles to each resource location entry acts independently. +// For example "tcp localhost:11211" could act as memcache +// shard 0 and "tcp localhost:11212" could act as memcache shard 1. +type multiResourcePool struct { + options Options + + createPool func(Options) ResourcePool + + rwMutex sync.RWMutex + isLameDuck bool // guarded by rwMutex + // NOTE: the locationPools is guarded by rwMutex, but the pool entries + // are not. + locationPools map[string]ResourcePool +} + +// This returns a MultiResourcePool, which manages multiple +// resource location entries. The handles to each resource location +// entry acts independently. +// +// When createPool is nil, NewSimpleResourcePool is used as default. +func NewMultiResourcePool( + options Options, + createPool func(Options) ResourcePool) ResourcePool { + + if createPool == nil { + createPool = NewSimpleResourcePool + } + + return &multiResourcePool{ + options: options, + createPool: createPool, + rwMutex: sync.RWMutex{}, + isLameDuck: false, + locationPools: make(map[string]ResourcePool), + } +} + +// See ResourcePool for documentation. +func (p *multiResourcePool) NumActive() int32 { + total := int32(0) + + p.rwMutex.RLock() + defer p.rwMutex.RUnlock() + + for _, pool := range p.locationPools { + total += pool.NumActive() + } + return total +} + +// See ResourcePool for documentation. +func (p *multiResourcePool) ActiveHighWaterMark() int32 { + high := int32(0) + + p.rwMutex.RLock() + defer p.rwMutex.RUnlock() + + for _, pool := range p.locationPools { + val := pool.ActiveHighWaterMark() + if val > high { + high = val + } + } + return high +} + +// See ResourcePool for documentation. +func (p *multiResourcePool) NumIdle() int { + total := 0 + + p.rwMutex.RLock() + defer p.rwMutex.RUnlock() + + for _, pool := range p.locationPools { + total += pool.NumIdle() + } + return total +} + +// See ResourcePool for documentation. +func (p *multiResourcePool) Register(resourceLocation string) error { + if resourceLocation == "" { + return errors.New("Registering invalid resource location") + } + + p.rwMutex.Lock() + defer p.rwMutex.Unlock() + + if p.isLameDuck { + return fmt.Errorf( + "Cannot register %s to lame duck resource pool", + resourceLocation) + } + + if _, inMap := p.locationPools[resourceLocation]; inMap { + return nil + } + + pool := p.createPool(p.options) + if err := pool.Register(resourceLocation); err != nil { + return err + } + + p.locationPools[resourceLocation] = pool + return nil +} + +// See ResourcePool for documentation. +func (p *multiResourcePool) Unregister(resourceLocation string) error { + p.rwMutex.Lock() + defer p.rwMutex.Unlock() + + if pool, inMap := p.locationPools[resourceLocation]; inMap { + _ = pool.Unregister("") + pool.EnterLameDuckMode() + delete(p.locationPools, resourceLocation) + } + return nil +} + +func (p *multiResourcePool) ListRegistered() []string { + p.rwMutex.RLock() + defer p.rwMutex.RUnlock() + + result := make([]string, 0, len(p.locationPools)) + for key, _ := range p.locationPools { + result = append(result, key) + } + + return result +} + +// See ResourcePool for documentation. +func (p *multiResourcePool) Get( + resourceLocation string) (ManagedHandle, error) { + + pool := p.getPool(resourceLocation) + if pool == nil { + return nil, fmt.Errorf( + "%s is not registered in the resource pool", + resourceLocation) + } + return pool.Get(resourceLocation) +} + +// See ResourcePool for documentation. +func (p *multiResourcePool) Release(handle ManagedHandle) error { + pool := p.getPool(handle.ResourceLocation()) + if pool == nil { + return errors.New( + "Resource pool cannot take control of a handle owned " + + "by another resource pool") + } + + return pool.Release(handle) +} + +// See ResourcePool for documentation. +func (p *multiResourcePool) Discard(handle ManagedHandle) error { + pool := p.getPool(handle.ResourceLocation()) + if pool == nil { + return errors.New( + "Resource pool cannot take control of a handle owned " + + "by another resource pool") + } + + return pool.Discard(handle) +} + +// See ResourcePool for documentation. +func (p *multiResourcePool) EnterLameDuckMode() { + p.rwMutex.Lock() + defer p.rwMutex.Unlock() + + p.isLameDuck = true + + for _, pool := range p.locationPools { + pool.EnterLameDuckMode() + } +} + +func (p *multiResourcePool) getPool(resourceLocation string) ResourcePool { + p.rwMutex.RLock() + defer p.rwMutex.RUnlock() + + if pool, inMap := p.locationPools[resourceLocation]; inMap { + return pool + } + return nil +} diff --git a/weed/wdclient/resource_pool/resource_pool.go b/weed/wdclient/resource_pool/resource_pool.go new file mode 100644 index 000000000..26c433f50 --- /dev/null +++ b/weed/wdclient/resource_pool/resource_pool.go @@ -0,0 +1,96 @@ +package resource_pool + +import ( + "time" +) + +type Options struct { + // The maximum number of active resource handles per resource location. (A + // non-positive value indicates the number of active resource handles is + // unbounded). + MaxActiveHandles int32 + + // The maximum number of idle resource handles per resource location that + // are kept alive by the resource pool. + MaxIdleHandles uint32 + + // The maximum amount of time an idle resource handle can remain alive (if + // specified). + MaxIdleTime *time.Duration + + // This limits the number of concurrent Open calls (there's no limit when + // OpenMaxConcurrency is non-positive). + OpenMaxConcurrency int + + // This function creates a resource handle (e.g., a connection) for a + // resource location. The function must be thread-safe. + Open func(resourceLocation string) ( + handle interface{}, + err error) + + // This function destroys a resource handle and performs the necessary + // cleanup to free up resources. The function must be thread-safe. + Close func(handle interface{}) error + + // This specifies the now time function. When the function is non-nil, the + // resource pool will use the specified function instead of time.Now to + // generate the current time. + NowFunc func() time.Time +} + +func (o Options) getCurrentTime() time.Time { + if o.NowFunc == nil { + return time.Now() + } else { + return o.NowFunc() + } +} + +// A generic interface for managed resource pool. All resource pool +// implementations must be threadsafe. +type ResourcePool interface { + // This returns the number of active resource handles. + NumActive() int32 + + // This returns the highest number of actives handles for the entire + // lifetime of the pool. If the pool contains multiple sub-pools, the + // high water mark is the max of the sub-pools' high water marks. + ActiveHighWaterMark() int32 + + // This returns the number of alive idle handles. NOTE: This is only used + // for testing. + NumIdle() int + + // This associates a resource location to the resource pool; afterwhich, + // the user can get resource handles for the resource location. + Register(resourceLocation string) error + + // This dissociates a resource location from the resource pool; afterwhich, + // the user can no longer get resource handles for the resource location. + // If the given resource location corresponds to a sub-pool, the unregistered + // sub-pool will enter lame duck mode. + Unregister(resourceLocation string) error + + // This returns the list of registered resource location entries. + ListRegistered() []string + + // This gets an active resource handle from the resource pool. The + // handle will remain active until one of the following is called: + // 1. handle.Release() + // 2. handle.Discard() + // 3. pool.Release(handle) + // 4. pool.Discard(handle) + Get(key string) (ManagedHandle, error) + + // This releases an active resource handle back to the resource pool. + Release(handle ManagedHandle) error + + // This discards an active resource from the resource pool. + Discard(handle ManagedHandle) error + + // Enter the resource pool into lame duck mode. The resource pool + // will no longer return resource handles, and all idle resource handles + // are closed immediately (including active resource handles that are + // released back to the pool afterward). + EnterLameDuckMode() +} diff --git a/weed/wdclient/resource_pool/semaphore.go b/weed/wdclient/resource_pool/semaphore.go new file mode 100644 index 000000000..ff35d5bc5 --- /dev/null +++ b/weed/wdclient/resource_pool/semaphore.go @@ -0,0 +1,154 @@ +package resource_pool + +import ( + "fmt" + "sync" + "sync/atomic" + "time" +) + +type Semaphore interface { + // Increment the semaphore counter by one. + Release() + + // Decrement the semaphore counter by one, and block if counter < 0 + Acquire() + + // Decrement the semaphore counter by one, and block if counter < 0 + // Wait for up to the given duration. Returns true if did not timeout + TryAcquire(timeout time.Duration) bool +} + +// A simple counting Semaphore. +type boundedSemaphore struct { + slots chan struct{} +} + +// Create a bounded semaphore. The count parameter must be a positive number. +// NOTE: The bounded semaphore will panic if the user tries to Release +// beyond the specified count. +func NewBoundedSemaphore(count uint) Semaphore { + sem := &boundedSemaphore{ + slots: make(chan struct{}, int(count)), + } + for i := 0; i < cap(sem.slots); i++ { + sem.slots <- struct{}{} + } + return sem +} + +// Acquire returns on successful acquisition. +func (sem *boundedSemaphore) Acquire() { + <-sem.slots +} + +// TryAcquire returns true if it acquires a resource slot within the +// timeout, false otherwise. +func (sem *boundedSemaphore) TryAcquire(timeout time.Duration) bool { + if timeout > 0 { + // Wait until we get a slot or timeout expires. + tm := time.NewTimer(timeout) + defer tm.Stop() + select { + case <-sem.slots: + return true + case <-tm.C: + // Timeout expired. In very rare cases this might happen even if + // there is a slot available, e.g. GC pause after we create the timer + // and select randomly picked this one out of the two available channels. + // We should do one final immediate check below. + } + } + + // Return true if we have a slot available immediately and false otherwise. + select { + case <-sem.slots: + return true + default: + return false + } +} + +// Release the acquired semaphore. You must not release more than you +// have acquired. +func (sem *boundedSemaphore) Release() { + select { + case sem.slots <- struct{}{}: + default: + // slots is buffered. If a send blocks, it indicates a programming + // error. + panic(fmt.Errorf("too many releases for boundedSemaphore")) + } +} + +// This returns an unbound counting semaphore with the specified initial count. +// The semaphore counter can be arbitrary large (i.e., Release can be called +// unlimited amount of times). +// +// NOTE: In general, users should use bounded semaphore since it is more +// efficient than unbounded semaphore. +func NewUnboundedSemaphore(initialCount int) Semaphore { + res := &unboundedSemaphore{ + counter: int64(initialCount), + } + res.cond.L = &res.lock + return res +} + +type unboundedSemaphore struct { + lock sync.Mutex + cond sync.Cond + counter int64 +} + +func (s *unboundedSemaphore) Release() { + s.lock.Lock() + s.counter += 1 + if s.counter > 0 { + // Not broadcasting here since it's unlike we can satify all waiting + // goroutines. Instead, we will Signal again if there are left over + // quota after Acquire, in case of lost wakeups. + s.cond.Signal() + } + s.lock.Unlock() +} + +func (s *unboundedSemaphore) Acquire() { + s.lock.Lock() + for s.counter < 1 { + s.cond.Wait() + } + s.counter -= 1 + if s.counter > 0 { + s.cond.Signal() + } + s.lock.Unlock() +} + +func (s *unboundedSemaphore) TryAcquire(timeout time.Duration) bool { + done := make(chan bool, 1) + // Gate used to communicate between the threads and decide what the result + // is. If the main thread decides, we have timed out, otherwise we succeed. + decided := new(int32) + atomic.StoreInt32(decided, 0) + go func() { + s.Acquire() + if atomic.SwapInt32(decided, 1) == 0 { + // Acquire won the race + done <- true + } else { + // If we already decided the result, and this thread did not win + s.Release() + } + }() + select { + case <-done: + return true + case <-time.After(timeout): + if atomic.SwapInt32(decided, 1) == 1 { + // The other thread already decided the result + return true + } + return false + } +} diff --git a/weed/wdclient/resource_pool/simple_resource_pool.go b/weed/wdclient/resource_pool/simple_resource_pool.go new file mode 100644 index 000000000..b0c539100 --- /dev/null +++ b/weed/wdclient/resource_pool/simple_resource_pool.go @@ -0,0 +1,343 @@ +package resource_pool + +import ( + "errors" + "fmt" + "sync" + "sync/atomic" + "time" +) + +type idleHandle struct { + handle interface{} + keepUntil *time.Time +} + +type TooManyHandles struct { + location string +} + +func (t TooManyHandles) Error() string { + return fmt.Sprintf("Too many handles to %s", t.location) +} + +type OpenHandleError struct { + location string + err error +} + +func (o OpenHandleError) Error() string { + return fmt.Sprintf("Failed to open resource handle: %s (%v)", o.location, o.err) +} + +// A resource pool implementation where all handles are associated to the +// same resource location. +type simpleResourcePool struct { + options Options + + numActive *int32 // atomic counter + + activeHighWaterMark *int32 // atomic / monotonically increasing value + + openTokens Semaphore + + mutex sync.Mutex + location string // guard by mutex + idleHandles []*idleHandle // guarded by mutex + isLameDuck bool // guarded by mutex +} + +// This returns a SimpleResourcePool, where all handles are associated to a +// single resource location. +func NewSimpleResourcePool(options Options) ResourcePool { + numActive := new(int32) + atomic.StoreInt32(numActive, 0) + + activeHighWaterMark := new(int32) + atomic.StoreInt32(activeHighWaterMark, 0) + + var tokens Semaphore + if options.OpenMaxConcurrency > 0 { + tokens = NewBoundedSemaphore(uint(options.OpenMaxConcurrency)) + } + + return &simpleResourcePool{ + location: "", + options: options, + numActive: numActive, + activeHighWaterMark: activeHighWaterMark, + openTokens: tokens, + mutex: sync.Mutex{}, + idleHandles: make([]*idleHandle, 0, 0), + isLameDuck: false, + } +} + +// See ResourcePool for documentation. +func (p *simpleResourcePool) NumActive() int32 { + return atomic.LoadInt32(p.numActive) +} + +// See ResourcePool for documentation. +func (p *simpleResourcePool) ActiveHighWaterMark() int32 { + return atomic.LoadInt32(p.activeHighWaterMark) +} + +// See ResourcePool for documentation. +func (p *simpleResourcePool) NumIdle() int { + p.mutex.Lock() + defer p.mutex.Unlock() + return len(p.idleHandles) +} + +// SimpleResourcePool can only register a single (network, address) entry. +// Register should be call before any Get calls. +func (p *simpleResourcePool) Register(resourceLocation string) error { + if resourceLocation == "" { + return errors.New("Invalid resource location") + } + + p.mutex.Lock() + defer p.mutex.Unlock() + + if p.isLameDuck { + return fmt.Errorf( + "cannot register %s to lame duck resource pool", + resourceLocation) + } + + if p.location == "" { + p.location = resourceLocation + return nil + } + return errors.New("SimpleResourcePool can only register one location") +} + +// SimpleResourcePool will enter lame duck mode upon calling Unregister. +func (p *simpleResourcePool) Unregister(resourceLocation string) error { + p.EnterLameDuckMode() + return nil +} + +func (p *simpleResourcePool) ListRegistered() []string { + p.mutex.Lock() + defer p.mutex.Unlock() + + if p.location != "" { + return []string{p.location} + } + return []string{} +} + +func (p *simpleResourcePool) getLocation() (string, error) { + p.mutex.Lock() + defer p.mutex.Unlock() + + if p.location == "" { + return "", fmt.Errorf( + "resource location is not set for SimpleResourcePool") + } + + if p.isLameDuck { + return "", fmt.Errorf( + "lame duck resource pool cannot return handles to %s", + p.location) + } + + return p.location, nil +} + +// This gets an active resource from the resource pool. Note that the +// resourceLocation argument is ignored (The handles are associated to the +// resource location provided by the first Register call). +func (p *simpleResourcePool) Get(unused string) (ManagedHandle, error) { + activeCount := atomic.AddInt32(p.numActive, 1) + if p.options.MaxActiveHandles > 0 && + activeCount > p.options.MaxActiveHandles { + + atomic.AddInt32(p.numActive, -1) + return nil, TooManyHandles{p.location} + } + + highest := atomic.LoadInt32(p.activeHighWaterMark) + for activeCount > highest && + !atomic.CompareAndSwapInt32( + p.activeHighWaterMark, + highest, + activeCount) { + + highest = atomic.LoadInt32(p.activeHighWaterMark) + } + + if h := p.getIdleHandle(); h != nil { + return h, nil + } + + location, err := p.getLocation() + if err != nil { + atomic.AddInt32(p.numActive, -1) + return nil, err + } + + if p.openTokens != nil { + // Current implementation does not wait for tokens to become available. + // If that causes availability hits, we could increase the wait, + // similar to simple_pool.go. + if p.openTokens.TryAcquire(0) { + defer p.openTokens.Release() + } else { + // We could not immediately acquire a token. + // Instead of waiting + atomic.AddInt32(p.numActive, -1) + return nil, OpenHandleError{ + p.location, errors.New("Open Error: reached OpenMaxConcurrency")} + } + } + + handle, err := p.options.Open(location) + if err != nil { + atomic.AddInt32(p.numActive, -1) + return nil, OpenHandleError{p.location, err} + } + + return NewManagedHandle(p.location, handle, p, p.options), nil +} + +// See ResourcePool for documentation. +func (p *simpleResourcePool) Release(handle ManagedHandle) error { + if pool, ok := handle.Owner().(*simpleResourcePool); !ok || pool != p { + return errors.New( + "Resource pool cannot take control of a handle owned " + + "by another resource pool") + } + + h := handle.ReleaseUnderlyingHandle() + if h != nil { + // We can unref either before or after queuing the idle handle. + // The advantage of unref-ing before queuing is that there is + // a higher chance of successful Get when number of active handles + // is close to the limit (but potentially more handle creation). + // The advantage of queuing before unref-ing is that there's a + // higher chance of reusing handle (but potentially more Get failures). + atomic.AddInt32(p.numActive, -1) + p.queueIdleHandles(h) + } + + return nil +} + +// See ResourcePool for documentation. +func (p *simpleResourcePool) Discard(handle ManagedHandle) error { + if pool, ok := handle.Owner().(*simpleResourcePool); !ok || pool != p { + return errors.New( + "Resource pool cannot take control of a handle owned " + + "by another resource pool") + } + + h := handle.ReleaseUnderlyingHandle() + if h != nil { + atomic.AddInt32(p.numActive, -1) + if err := p.options.Close(h); err != nil { + return fmt.Errorf("failed to close resource handle: %v", err) + } + } + return nil +} + +// See ResourcePool for documentation. +func (p *simpleResourcePool) EnterLameDuckMode() { + p.mutex.Lock() + + toClose := p.idleHandles + p.isLameDuck = true + p.idleHandles = []*idleHandle{} + + p.mutex.Unlock() + + p.closeHandles(toClose) +} + +// This returns an idle resource, if there is one. +func (p *simpleResourcePool) getIdleHandle() ManagedHandle { + var toClose []*idleHandle + defer func() { + // NOTE: Must keep the closure around to late bind the toClose slice. + p.closeHandles(toClose) + }() + + now := p.options.getCurrentTime() + + p.mutex.Lock() + defer p.mutex.Unlock() + + var i int + for i = 0; i < len(p.idleHandles); i++ { + idle := p.idleHandles[i] + if idle.keepUntil == nil || now.Before(*idle.keepUntil) { + break + } + } + if i > 0 { + toClose = p.idleHandles[0:i] + } + + if i < len(p.idleHandles) { + idle := p.idleHandles[i] + p.idleHandles = p.idleHandles[i+1:] + return NewManagedHandle(p.location, idle.handle, p, p.options) + } + + if len(p.idleHandles) > 0 { + p.idleHandles = []*idleHandle{} + } + return nil +} + +// This adds an idle resource to the pool. +func (p *simpleResourcePool) queueIdleHandles(handle interface{}) { + var toClose []*idleHandle + defer func() { + // NOTE: Must keep the closure around to late bind the toClose slice. + p.closeHandles(toClose) + }() + + now := p.options.getCurrentTime() + var keepUntil *time.Time + if p.options.MaxIdleTime != nil { + // NOTE: Assign to temp variable first to work around compiler bug + x := now.Add(*p.options.MaxIdleTime) + keepUntil = &x + } + + p.mutex.Lock() + defer p.mutex.Unlock() + + if p.isLameDuck { + toClose = []*idleHandle{ + {handle: handle}, + } + return + } + + p.idleHandles = append( + p.idleHandles, + &idleHandle{ + handle: handle, + keepUntil: keepUntil, + }) + + nIdleHandles := uint32(len(p.idleHandles)) + if nIdleHandles > p.options.MaxIdleHandles { + handlesToClose := nIdleHandles - p.options.MaxIdleHandles + toClose = p.idleHandles[0:handlesToClose] + p.idleHandles = p.idleHandles[handlesToClose:nIdleHandles] + } +} + +// Closes resources, at this point it is assumed that this resources +// are no longer referenced from the main idleHandles slice. +func (p *simpleResourcePool) closeHandles(handles []*idleHandle) { + for _, handle := range handles { + _ = p.options.Close(handle.handle) + } +} From 38fc200e564e1086742c3ef908b7793be942356a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 6 Mar 2021 14:24:24 -0800 Subject: [PATCH 031/284] CRCWriter consistent with CRC --- weed/storage/needle/crc.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/weed/storage/needle/crc.go b/weed/storage/needle/crc.go index e1bac829a..22456faa2 100644 --- a/weed/storage/needle/crc.go +++ b/weed/storage/needle/crc.go @@ -2,7 +2,6 @@ package needle import ( "fmt" - "hash" "io" "github.com/klauspost/crc32" @@ -35,21 +34,21 @@ func (n *Needle) Etag() string { func NewCRCwriter(w io.Writer) *CRCwriter { return &CRCwriter{ - h: crc32.New(table), + crc: CRC(0), w: w, } } type CRCwriter struct { - h hash.Hash32 - w io.Writer + crc CRC + w io.Writer } func (c *CRCwriter) Write(p []byte) (n int, err error) { n, err = c.w.Write(p) // with each write ... - c.h.Write(p) // ... update the hash + c.crc = c.crc.Update(p) return } -func (c *CRCwriter) Sum() uint32 { return c.h.Sum32() } // final hash +func (c *CRCwriter) Sum() uint32 { return c.crc.Value() } // final hash From 8363be85486e97053cdac45e9d0a692fe76af02e Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 6 Mar 2021 14:25:05 -0800 Subject: [PATCH 032/284] trim out trailing return character --- weed/server/volume_server_tcp_handlers_write.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/weed/server/volume_server_tcp_handlers_write.go b/weed/server/volume_server_tcp_handlers_write.go index 7c2f1a77f..a009611da 100644 --- a/weed/server/volume_server_tcp_handlers_write.go +++ b/weed/server/volume_server_tcp_handlers_write.go @@ -6,6 +6,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/storage/needle" "github.com/chrislusf/seaweedfs/weed/util" + "io" "net" "strings" ) @@ -21,9 +22,12 @@ func (vs *VolumeServer) HandleTcpConnection(c net.Conn) { for { cmd, err := bufReader.ReadString('\n') if err != nil { - glog.Errorf("read command from %s: %v", c.RemoteAddr().String(), err) + if err != io.EOF { + glog.Errorf("read command from %s: %v", c.RemoteAddr().String(), err) + } return } + cmd = cmd[:len(cmd)-1] switch cmd[0] { case '+': fileId := cmd[1:] From e9eddfb8a2bf05fd5770825d54de655914942d4f Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 6 Mar 2021 14:25:21 -0800 Subject: [PATCH 033/284] remove wrong writes --- weed/storage/volume_stream_write.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/weed/storage/volume_stream_write.go b/weed/storage/volume_stream_write.go index f619de30b..955875aa2 100644 --- a/weed/storage/volume_stream_write.go +++ b/weed/storage/volume_stream_write.go @@ -48,8 +48,6 @@ func (v *Volume) StreamWrite(n *needle.Needle, data io.Reader, dataSize uint32) // data checksum util.Uint32toBytes(header[0:needle.NeedleChecksumSize], crcWriter.Sum()) - df.Write(header[0:needle.NeedleChecksumSize]) - // write timestamp, padding n.AppendAtNs = uint64(time.Now().UnixNano()) util.Uint64toBytes(header[needle.NeedleChecksumSize:needle.NeedleChecksumSize+TimestampSize], n.AppendAtNs) From 9d402ebe9f4913899ff14f904944a376dbe99439 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 6 Mar 2021 14:25:44 -0800 Subject: [PATCH 034/284] refactoring --- weed/pb/grpc_client_server.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/weed/pb/grpc_client_server.go b/weed/pb/grpc_client_server.go index c7a47a91c..9efcd9bdc 100644 --- a/weed/pb/grpc_client_server.go +++ b/weed/pb/grpc_client_server.go @@ -109,15 +109,19 @@ func WithCachedGrpcClient(fn func(*grpc.ClientConn) error, address string, opts } func ParseServerToGrpcAddress(server string) (serverGrpcAddress string, err error) { + return ParseServerAddress(server, 10000) +} + +func ParseServerAddress(server string, deltaPort int) (newServerAddress string, err error) { host, port, parseErr := hostAndPort(server) if parseErr != nil { return "", fmt.Errorf("server port parse error: %v", parseErr) } - grpcPort := int(port) + 10000 + newPort := int(port) + deltaPort - return fmt.Sprintf("%s:%d", host, grpcPort), nil + return fmt.Sprintf("%s:%d", host, newPort), nil } func hostAndPort(address string) (host string, port uint64, err error) { From 1bd880dcdb870b3a5939c2a8eda7b9be483d05af Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 6 Mar 2021 14:26:24 -0800 Subject: [PATCH 035/284] adds tcp writes benchmark --- weed/command/benchmark.go | 25 +++++++- weed/wdclient/volume_tcp_client.go | 97 ++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 weed/wdclient/volume_tcp_client.go diff --git a/weed/command/benchmark.go b/weed/command/benchmark.go index c1bc80c42..af0793c70 100644 --- a/weed/command/benchmark.go +++ b/weed/command/benchmark.go @@ -41,6 +41,7 @@ type BenchmarkOptions struct { grpcDialOption grpc.DialOption masterClient *wdclient.MasterClient fsync *bool + useTcp *bool } var ( @@ -67,6 +68,7 @@ func init() { b.cpuprofile = cmdBenchmark.Flag.String("cpuprofile", "", "cpu profile output file") b.maxCpu = cmdBenchmark.Flag.Int("maxCpu", 0, "maximum number of CPUs. 0 means all available CPUs") b.fsync = cmdBenchmark.Flag.Bool("fsync", false, "flush data to disk after write") + b.useTcp = cmdBenchmark.Flag.Bool("useTcp", false, "send data via tcp") sharedBytes = make([]byte, 1024) } @@ -223,6 +225,8 @@ func writeFiles(idChan chan int, fileIdLineChan chan string, s *stat) { random := rand.New(rand.NewSource(time.Now().UnixNano())) + volumeTcpClient := wdclient.NewVolumeTcpClient() + for id := range idChan { start := time.Now() fileSize := int64(*b.fileSize + random.Intn(64)) @@ -243,7 +247,15 @@ func writeFiles(idChan chan int, fileIdLineChan chan string, s *stat) { if !isSecure && assignResult.Auth != "" { isSecure = true } - if _, err := fp.Upload(0, b.masterClient.GetMaster, false, assignResult.Auth, b.grpcDialOption); err == nil { + if *b.useTcp { + if uploadByTcp(volumeTcpClient, fp) { + fileIdLineChan <- fp.Fid + s.completed++ + s.transferred += fileSize + } else { + s.failed++ + } + } else if _, err := fp.Upload(0, b.masterClient.GetMaster, false, assignResult.Auth, b.grpcDialOption); err == nil { if random.Intn(100) < *b.deletePercentage { s.total++ delayedDeleteChan <- &delayedFile{time.Now().Add(time.Second), fp} @@ -329,6 +341,17 @@ func writeFileIds(fileName string, fileIdLineChan chan string, finishChan chan b } } +func uploadByTcp(volumeTcpClient *wdclient.VolumeTcpClient, fp *operation.FilePart) bool { + + err := volumeTcpClient.PutFileChunk(fp.Server, fp.Fid, uint32(fp.FileSize), fp.Reader) + if err != nil { + glog.Errorf("upload chunk err: %v", err) + return false + } + + return true +} + func readFileIds(fileName string, fileIdLineChan chan string) { file, err := os.Open(fileName) // For read access. if err != nil { diff --git a/weed/wdclient/volume_tcp_client.go b/weed/wdclient/volume_tcp_client.go new file mode 100644 index 000000000..afebd71eb --- /dev/null +++ b/weed/wdclient/volume_tcp_client.go @@ -0,0 +1,97 @@ +package wdclient + +import ( + "bufio" + "bytes" + "fmt" + "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/pb" + "github.com/chrislusf/seaweedfs/weed/util" + "github.com/chrislusf/seaweedfs/weed/wdclient/net2" + "io" + "net" + "time" +) + +// VolumeTcpClient put/get/delete file chunks directly on volume servers without replication +type VolumeTcpClient struct { + cp net2.ConnectionPool +} + +type VolumeTcpConn struct { + net.Conn + bufWriter *bufio.Writer + bufReader *bufio.Reader +} + +func NewVolumeTcpClient() *VolumeTcpClient { + MaxIdleTime := 10 * time.Second + return &VolumeTcpClient{ + cp: net2.NewMultiConnectionPool(net2.ConnectionOptions{ + MaxActiveConnections: 16, + MaxIdleConnections: 1, + MaxIdleTime: &MaxIdleTime, + DialMaxConcurrency: 0, + Dial: func(network string, address string) (net.Conn, error) { + conn, err := net.Dial(network, address) + return &VolumeTcpConn{ + conn, + bufio.NewWriter(conn), + bufio.NewReader(conn), + }, err + }, + NowFunc: nil, + ReadTimeout: 0, + WriteTimeout: 0, + }), + } +} +func (c *VolumeTcpClient) PutFileChunk(volumeServerAddress string, fileId string, fileSize uint32, fileReader io.Reader) (err error) { + + tcpAddress, parseErr := pb.ParseServerAddress(volumeServerAddress, 20000) + if parseErr != nil { + return parseErr + } + + c.cp.Register("tcp", tcpAddress) + tcpConn, getErr := c.cp.Get("tcp", tcpAddress) + if getErr != nil { + return fmt.Errorf("get connection to %s: %v", tcpAddress, getErr) + } + conn := tcpConn.RawConn().(*VolumeTcpConn) + defer func() { + if err != nil { + tcpConn.DiscardConnection() + } else { + tcpConn.ReleaseConnection() + } + }() + + buf := []byte("+" + fileId + "\n") + _, err = conn.bufWriter.Write([]byte(buf)) + if err != nil { + return + } + util.Uint32toBytes(buf[0:4], fileSize) + _, err = conn.bufWriter.Write(buf[0:4]) + if err != nil { + return + } + _, err = io.Copy(conn.bufWriter, fileReader) + if err != nil { + return + } + conn.bufWriter.Write([]byte("!\n")) + conn.bufWriter.Flush() + + ret, _, err := conn.bufReader.ReadLine() + if err != nil { + glog.V(0).Infof("upload by tcp: %v", err) + return + } + if !bytes.HasPrefix(ret, []byte("+OK")) { + glog.V(0).Infof("upload by tcp: %v", string(ret)) + } + + return nil +} From bdfed16d42cc49b0a3c2e925a1784f12c986c768 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 7 Mar 2021 01:49:06 -0800 Subject: [PATCH 036/284] avoid nil exception fix https://github.com/chrislusf/seaweedfs/issues/1869 --- weed/storage/needle_map_leveldb.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/weed/storage/needle_map_leveldb.go b/weed/storage/needle_map_leveldb.go index 9716e9729..31c86d124 100644 --- a/weed/storage/needle_map_leveldb.go +++ b/weed/storage/needle_map_leveldb.go @@ -152,8 +152,10 @@ func (m *LevelDbNeedleMap) Close() { glog.Warningf("close index file %s failed: %v", indexFileName, err) } - if err := m.db.Close(); err != nil { - glog.Warningf("close levelDB failed: %v", err) + if m.db != nil { + if err := m.db.Close(); err != nil { + glog.Warningf("close levelDB failed: %v", err) + } } } From 726edab054208d1f2f8ab83c08687c1871bfb0a9 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 7 Mar 2021 11:03:09 -0800 Subject: [PATCH 037/284] avoid nil when closing an index fix https://github.com/chrislusf/seaweedfs/issues/1870 --- weed/storage/needle_map_sorted_file.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/weed/storage/needle_map_sorted_file.go b/weed/storage/needle_map_sorted_file.go index 3449ff9dc..662b90531 100644 --- a/weed/storage/needle_map_sorted_file.go +++ b/weed/storage/needle_map_sorted_file.go @@ -94,8 +94,12 @@ func (m *SortedFileNeedleMap) Delete(key NeedleId, offset Offset) error { } func (m *SortedFileNeedleMap) Close() { - m.indexFile.Close() - m.dbFile.Close() + if m.indexFile != nil { + m.indexFile.Close() + } + if m.dbFile != nil { + m.dbFile.Close() + } } func (m *SortedFileNeedleMap) Destroy() error { From df72dc206d9064daa79439ef9f3fb83f491eebd8 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 7 Mar 2021 11:26:15 -0800 Subject: [PATCH 038/284] stats collect chunk upload retry count --- weed/operation/upload_content.go | 2 ++ weed/server/filer_server_handlers_write_autochunk.go | 11 +++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/weed/operation/upload_content.go b/weed/operation/upload_content.go index 70428bb07..4bfc08425 100644 --- a/weed/operation/upload_content.go +++ b/weed/operation/upload_content.go @@ -31,6 +31,7 @@ type UploadResult struct { Mime string `json:"mime,omitempty"` Gzip uint32 `json:"gzip,omitempty"` ContentMd5 string `json:"contentMd5,omitempty"` + RetryCount int `json:"-"` } func (uploadResult *UploadResult) ToPbFileChunk(fileId string, offset int64) *filer_pb.FileChunk { @@ -94,6 +95,7 @@ func doUpload(uploadUrl string, filename string, cipher bool, reader io.Reader, func retriedUploadData(uploadUrl string, filename string, cipher bool, data []byte, isInputCompressed bool, mtype string, pairMap map[string]string, jwt security.EncodedJwt) (uploadResult *UploadResult, err error) { for i := 0; i < 3; i++ { + uploadResult.RetryCount = i uploadResult, err = doUploadData(uploadUrl, filename, cipher, data, isInputCompressed, mtype, pairMap, jwt) if err == nil { return diff --git a/weed/server/filer_server_handlers_write_autochunk.go b/weed/server/filer_server_handlers_write_autochunk.go index d3ce7e605..318399281 100644 --- a/weed/server/filer_server_handlers_write_autochunk.go +++ b/weed/server/filer_server_handlers_write_autochunk.go @@ -38,10 +38,10 @@ func (fs *FilerServer) autoChunk(ctx context.Context, w http.ResponseWriter, r * chunkSize := 1024 * 1024 * maxMB - stats.FilerRequestCounter.WithLabelValues("postAutoChunk").Inc() + stats.FilerRequestCounter.WithLabelValues("chunk").Inc() start := time.Now() defer func() { - stats.FilerRequestHistogram.WithLabelValues("postAutoChunk").Observe(time.Since(start).Seconds()) + stats.FilerRequestHistogram.WithLabelValues("chunk").Observe(time.Since(start).Seconds()) }() var reply *FilerPostResult @@ -302,13 +302,16 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque 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) { - stats.FilerRequestCounter.WithLabelValues("postAutoChunkUpload").Inc() + stats.FilerRequestCounter.WithLabelValues("chunkUpload").Inc() start := time.Now() defer func() { - stats.FilerRequestHistogram.WithLabelValues("postAutoChunkUpload").Observe(time.Since(start).Seconds()) + stats.FilerRequestHistogram.WithLabelValues("chunkUpload").Observe(time.Since(start).Seconds()) }() uploadResult, err, data := operation.Upload(urlLocation, fileName, fs.option.Cipher, limitedReader, false, contentType, pairMap, auth) + if uploadResult != nil && uploadResult.RetryCount > 0 { + stats.FilerRequestCounter.WithLabelValues("chunkUploadRetry").Add(float64(uploadResult.RetryCount)) + } return uploadResult, err, data } From 3b2a9c98efebdf0ef07666f6ad9a0b2169e342da Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 7 Mar 2021 11:45:35 -0800 Subject: [PATCH 039/284] fix nil --- weed/operation/upload_content.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/operation/upload_content.go b/weed/operation/upload_content.go index 4bfc08425..9957a04cd 100644 --- a/weed/operation/upload_content.go +++ b/weed/operation/upload_content.go @@ -95,9 +95,9 @@ func doUpload(uploadUrl string, filename string, cipher bool, reader io.Reader, func retriedUploadData(uploadUrl string, filename string, cipher bool, data []byte, isInputCompressed bool, mtype string, pairMap map[string]string, jwt security.EncodedJwt) (uploadResult *UploadResult, err error) { for i := 0; i < 3; i++ { - uploadResult.RetryCount = i uploadResult, err = doUploadData(uploadUrl, filename, cipher, data, isInputCompressed, mtype, pairMap, jwt) if err == nil { + uploadResult.RetryCount = i return } else { glog.Warningf("uploading to %s: %v", uploadUrl, err) From 60686a0bb7fe138bfc16649d6df16c06fcbf65df Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 7 Mar 2021 14:45:36 -0800 Subject: [PATCH 040/284] make tcp optional --- weed/command/server.go | 1 + weed/command/volume.go | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/weed/command/server.go b/weed/command/server.go index 64321b4d7..a39802412 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -111,6 +111,7 @@ func init() { 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") serverOptions.v.idxFolder = cmdServer.Flag.String("volume.dir.idx", "", "directory to store .idx files") + serverOptions.v.enableTcp = cmdServer.Flag.Bool("volume.tcp", false, " enable tcp port") s3Options.port = cmdServer.Flag.Int("s3.port", 8333, "s3 server http listen port") s3Options.domainName = cmdServer.Flag.String("s3.domainName", "", "suffix of the host name in comma separated list, {bucket}.{domainName}") diff --git a/weed/command/volume.go b/weed/command/volume.go index cf162a732..f49ece9dc 100644 --- a/weed/command/volume.go +++ b/weed/command/volume.go @@ -62,6 +62,7 @@ type VolumeServerOptions struct { preStopSeconds *int metricsHttpPort *int // pulseSeconds *int + enableTcp *bool } func init() { @@ -88,6 +89,7 @@ func init() { 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") + v.enableTcp = cmdVolume.Flag.Bool("tcp", false, " enable tcp port") } var cmdVolume = &Command{ @@ -252,7 +254,9 @@ func (v VolumeServerOptions) startVolumeServer(volumeFolders, maxVolumeCounts, v } // starting tcp server - go v.startTcpService(volumeServer) + if *v.enableTcp { + go v.startTcpService(volumeServer) + } // starting the cluster http server clusterHttpServer := v.startClusterHttpService(volumeMux) From d888e9a90fd90f25fd7f9be9b39bc68cb998fedd Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 7 Mar 2021 15:01:19 -0800 Subject: [PATCH 041/284] 2.30 --- 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 5be2e0f9d..0b4d1b249 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.29" -version: 2.29 +appVersion: "2.30" +version: 2.30 diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index 0d8459bc1..97095bd0f 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.29" - started using {.Chart.appVersion} + # imageTag: "2.30" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index 2a7e57c5d..80b209ad1 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, 29) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 30) COMMIT = "" ) From a1895179cdc8847254b4e543c64a44336703371f Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 7 Mar 2021 15:49:06 -0800 Subject: [PATCH 042/284] SeaweedFS Diagram.png --- note/Untitled Diagram.png | Bin 0 -> 769 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 note/Untitled Diagram.png diff --git a/note/Untitled Diagram.png b/note/Untitled Diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..da22c3425193430cefa6bb5eccf621e30914cfaf GIT binary patch literal 769 zcmYjP%Wj)M6eW>bRjIP9RJDt)kkUmE4EVJ)FB=m~u$>sQNeC~G4FiU;op{+@c3t)x zx~SBD=%PQ+|LG;TQibN;J7>-u?wpzD>+#_H?86zuFz3cloj^XR$D7v>KfU|)%rK`v zspit`F~(`cu%gmbEaI1WMOjg05%P(>b?X{ka(}*`$Q1rNa&Xu`iuO*gfKYRGQCZ=fG&Dit;AQxP?2g6VSm zP@|#-jvlRpz4&OBuNnP7Cz4}oqi{moS2qD1q*f};(kjm}o7=LUQfhBCcU zpg65{SGD+3KYKq9?wM1D VdBvQ3|MS}cm@%}m`a{0|@)u$S+kXH6 literal 0 HcmV?d00001 From 302dbb1b9c8abc636d2db0d29552e39e8d052f9b Mon Sep 17 00:00:00 2001 From: Yoni Nakache <45972051+LazyDBA247-Anyvision@users.noreply.github.com> Date: Mon, 8 Mar 2021 07:16:06 +0200 Subject: [PATCH 043/284] update pg to latest version currently, it is an old 2+ years driver --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index a200370fd..3c75a9cb5 100644 --- a/go.mod +++ b/go.mod @@ -48,7 +48,7 @@ require ( github.com/klauspost/crc32 v1.2.0 github.com/klauspost/reedsolomon v1.9.2 github.com/kurin/blazer v0.5.3 - github.com/lib/pq v1.2.0 + 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 From 6dc0f5375703d3aae7e57b6e7fbc9f47d113f196 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 7 Mar 2021 22:20:27 -0800 Subject: [PATCH 044/284] Update Untitled Diagram.png --- note/Untitled Diagram.png | Bin 769 -> 20769 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/Untitled Diagram.png b/note/Untitled Diagram.png index da22c3425193430cefa6bb5eccf621e30914cfaf..045f0e5c6d35b453137b5ad86fc4ec688e091b4d 100644 GIT binary patch literal 20769 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

&tUy>vCr&^% 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 MFfQo3NdKh&0h8)#{{R30 delta 409 zcmXAlPmh{V6vdw=HO(|`I%(3hi&?R47mvz$efCjAIq^b7R+^tD~wbI<+dBqzBKkEJga=GZfo>e-t!06;N252C&h{374;=1$(+U6no`FjiV< zqlQu&g)2_(uv)*7eq2KAwn=S}FERsLwxJ|3^r9|yy0EcD5C-{XXCzwgUG^=a=;E>k zhk?kcwSm0!yktSNz_XocnvBJC#BhQ&SotkYisv%9wu-)qiUr5@0&9EFKS`NAk3H9C zXBZ3Fl_+elWwI{(EE%t+9do{xTVgg?@hEmoBGqFUj-+mcb+!5{8%l1F{dIct+3rx8g1R f>I)UM?bnV!0c8N5fzs3OUlzqcl??Pvn0);M2a0;9 From 9d30d4223a0b99717f4c1ed2716c902768dc1bb5 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 7 Mar 2021 22:38:09 -0800 Subject: [PATCH 045/284] Added SeaweedFS_Architecture.png --- note/SeaweedFS_Architecture.png | Bin 0 -> 48147 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 note/SeaweedFS_Architecture.png diff --git a/note/SeaweedFS_Architecture.png b/note/SeaweedFS_Architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..9dffe2d199b61a69b23bb25f345039834578ffe9 GIT binary patch literal 48147 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 literal 0 HcmV?d00001 From 019f500c9cfe6ef6b28e841bc13a0d2611ad2126 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 7 Mar 2021 22:39:45 -0800 Subject: [PATCH 046/284] remove unused file --- note/Untitled Diagram.png | Bin 20769 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 note/Untitled Diagram.png diff --git a/note/Untitled Diagram.png b/note/Untitled Diagram.png deleted file mode 100644 index 045f0e5c6d35b453137b5ad86fc4ec688e091b4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20769 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

&tUy>vCr&^% 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 MFfQo3NdKh&0h8)#{{R30 From 05a7930c4b878d21de4e1e2da9ab6a3f737c712a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 7 Mar 2021 23:01:50 -0800 Subject: [PATCH 047/284] Update SeaweedFS_Architecture.png --- note/SeaweedFS_Architecture.png | Bin 48147 -> 52129 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/SeaweedFS_Architecture.png b/note/SeaweedFS_Architecture.png index 9dffe2d199b61a69b23bb25f345039834578ffe9..3a3577d66fc7b64b3a5bd17131925773c6935813 100644 GIT binary patch literal 52129 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 From aafb3706b87712d412fd889e596e35bba508d9c7 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 7 Mar 2021 23:05:47 -0800 Subject: [PATCH 048/284] Update SeaweedFS_Architecture.png --- note/SeaweedFS_Architecture.png | Bin 52129 -> 52959 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/SeaweedFS_Architecture.png b/note/SeaweedFS_Architecture.png index 3a3577d66fc7b64b3a5bd17131925773c6935813..10bb425f0a19815afebc14b9e729a78a660d67aa 100644 GIT binary patch literal 52959 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 z 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 literal 52129 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 c+V Date: Sun, 7 Mar 2021 23:19:51 -0800 Subject: [PATCH 049/284] Update SeaweedFS_Architecture.png --- note/SeaweedFS_Architecture.png | Bin 52959 -> 72969 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/SeaweedFS_Architecture.png b/note/SeaweedFS_Architecture.png index 10bb425f0a19815afebc14b9e729a78a660d67aa..ea3ee29171dea6be0011670ed220c0a2145041b4 100644 GIT binary patch literal 72969 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�s3j|8S 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 z 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 From 55ec837c0bb009642f8d9fe567c991a21c0ed6d7 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 7 Mar 2021 23:22:04 -0800 Subject: [PATCH 050/284] Update SeaweedFS_Architecture.png --- note/SeaweedFS_Architecture.png | Bin 72969 -> 72881 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/SeaweedFS_Architecture.png b/note/SeaweedFS_Architecture.png index ea3ee29171dea6be0011670ed220c0a2145041b4..f872b1ebaf57f23688e4b4e2a5e8324c0e6a0801 100644 GIT binary patch delta 22391 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 KcO~n%NB#qWf3@EL delta 22466 zcmb@tc{J2t{69Wq$x?*uAzPFfV;8cHZHBRpAz5d}J{Sx$$&0*OrRRv;tI9&8*{Q}xRxb~ zY8XKOk$~60SeTg`6M`{Fb5%#0rmeMw0}kb9O*Hd0q}Wn0XiZ~cs4*Do>}(N$BAII8 z{lamOpOLS%k7IST^~@Fx>| zLkL>_A-1Z@w*Fq`4sbBl$k$E-O!f;jSEhN`;Ulal78oOQ@QbNtXh^s@+$qq(LN(OT z+TSTM+&0WE!iM1KZ-g-kMN#b`H7les)xnwIV~GP3%)*V$JTPQab*mt1Xt1U#AzW39 zXzQnr^9r=5f#(zrRSyh(Wt6=P!Vs@P1s}0AD^E2)bfm2{Djb1D8QGWwXd(j9XkV3Z zV^1G2z!YI^>f?uYa`v#IkjxyyO*O16%!8bXUd|{uWM_g3QYTZq&Aq_-hT%y1ijLr~ zi2)@N8Q_632{0iM!FOM@w+Y&l>>o^}T3Yxb(Z0^sHf9=HVFUwHA8S*BCe6m*#>Uqt z)XCGX^EB1RgSV;u}J-ed<1#n#l!Q`r-&uZ|};8Y966f5Q+jOUn=>Wa4BHilrc| zj4V9ukiOob9--g&=?y-XLU#4AZ3$CGmHntCjySc89L!{P6%rt9VDC_mA z(bBM1CZcR9_6A^SEsTan2*uk#!-nE#10ldjBQiBu3y1Wk;^7D_oSJWhu`$pmLnkj= zM@MTrBdn%nB*N4w7>qQ-TdSEEkZr+7M{5!oW2_#ki4AlxC9By6qtpyBWn}nzNlV z!I$9gLEj6;$J@hN)h`sOg0sNT94%;`D7$L~s+b!a z*&33FL8fRl%>qyIva*U)^`(R&O&pLK9>E$WDh}Q@CL~J_bda|V{gm2z;{q%w#wJKl zRU3*iO4HUB8SaRss2Ncrf&=krb6-2HFjFgIxQ}TFq!D5l?CWo?Y6Fk73kyL;fazK` zq|m^i5R|oFB;JS$_=OB|#E}7W4TC}`mRKJjBTE{c`I_d&1_*e#s!1?9BEnP)VMHWg zor63r94*4l9My=Se)i#7PMQ=4nuQk_jUZ@*ggJu`NFR)Hq^+|S$u5E*10f7OeXUG1 ziJCq%62`>RR3+SqO2&X;1bDcOl_6P~5T+cC0Rlq?Tlz&rXnIFlsT+n{Q^PdDPsYkd zD4Y!*O)@n^Q&lysiJCUyNG&U6+h992FDtr~u^P&Oz8(}~jHbB>217FQN8rN!?C=OX zxN#&Z+#dren*>GD?G45zl4egf)Y7u>#ad|wk&SF9aAU^^C$A7Z9%o}uv?W_%s9FRH z#e?WYB-6KVM+`NzuyaJ<5o%aR3lk%UNP9C&xVg85eXuH7McIc8#ARgcfi=bX;DhZw zFf?Ck7}5YspBb#B3p@#Nkw4(z;SuGf2>tSa^A_Y(! zO+o{G{ME@|Ek`RaJe~2rS{52UP9X+rv=-= zaAS;W0E%oAPIB~DakK{yu)!7%;QSzQCZsTHni0V#kQx#~G{OQw6C72YOi7j$OG{th z2prbV0fAMHw4z&gM`JTQ7LUbRU~L@?=)0p*?HvO>X>@a?VrvVxu`qQq_M+QBQxeh2 zK-JWM0#SpkkWSv}I1}#>D^D-FCl5yXqkxoHc7k!WDi;A$FvcB)8{ubQI+)=Ycl`69Uu> z)o64*rZ4SHv9crJl!+ur1%uVFwu)5OdKfw78Xc?vkjn;V(y6d3&T?hPFf^W zHLXBT92G$&T2nPbk;*hr4V1Emkt*3hJ<@|3p|0X*hQ~Q5TX+Ynm^!13y}T%aq2N8X zUK#&fHQ&Emo^S1P)X{p-d4UKFqa2lqe zVODhEI)&m8WG8E~2HYgXGQg7(s*d;5vJFvDHt=^usL=J%kp2%%3*lvDV0{u17;Nih z8G-jQaa6H!KsZJiXsVDAIFvoz!)mJ7sM625fu@X#aY`VEIMYvsD7nf+4&GN#$Me*2 z=_l0^gWFgV6MGH!=PiNUl+@N$$7HXZk z@%BS>Ft7a7Xtn>ZSG?BlgZ1zG=VRE4Hs1bcvlB9#n^SSeYpd79Yt#WQ_%azf%8aWB z(AC2|<9UD))V;9L_PFNr4LfVyYGrc`zlj5^hvk|~R?p_J)^uI}CH2>HtUsq@eQWzF z`cK#hOMW3?vXM>TB!fqhRkkpp|4#P&u%K>CwD}hS_Ngv$j-Ml3S-<9=t(R=>ebU_F zT|V|2Eftr=8%mDXWHWweB{cTx5p?)Yz#5}@=zvRwJHzJ-%en#MjSQ@oTzQVJ7jB9T z@fy)03?`P2B~26ruF(#SdCl$GmVJ6|N;TZ9(k<)f_Z{p3o_=ROTl5onb z_AxH+!V%3_xl#GJtT#5H%Yy9EGvg z*a^KBsp$Sr2=4Jvoq=Tlll(_#NAu?O~ez$7?vQaEU)*Qhn@PeZ!;rjmD$9 zcZJKGtJw!sp8K|GwQhyUyEi80-G_vu6OLGD2%Y_MwTozqpa@s#$ zz4*fZ#%aOyE z)9$xo1gC;=LQ93i^B(YTNuH{({?-7C*d9ORjS)tFKbFxd-?*_cm$jwwb3#P^+avXN z8#bv;uI&xl7k>X}eQ|M%uX*50oMu!p)6t_=n&(OOSnR|4dSNv^@$Fa%!w1|@nD()o zEC*19e7J6+jG4K$wNYW)t+F5dKJQ8nk;&x#C+E))t~q5Wo_DYLl+{qHe0H~dGtJSy zWoBilt?$2~A=STXwL9;YaeL6h`(4|c6}aw-f&HRFex-(V8=*wFiCQqm}X$k_{RLO)^|Ew zo94Q7MC#vY!AzCRHyl6nM0T%y+{F%Axw zAD^o^IkGrXd7=!vkW?nX&;PKjj59Mc^V?Y6YB|4eUyiP3*f(zA1g?H~e6FaqtxGH9F-u{xXlWWv3lY7warm4D+3XzkY zogE%Hs!G_Yo>77}IX*|NqPy>D@oJ0($DPdG+w6nB+&Z)L=YHc*5u{Th2U9VKmFBzl zrO+m2c>b-}1mAMc1x! ziDNGv8<{Js?6r-&b(r*|{`<)p^RK+tIuAG8afZ>_f}{d;-hwt0%I$M>N}aN&f+<6*bY?$+{LV~#W66jnVL zF&-`eZ0+hPZc`D>TiLdSJy{w?V)p;Fc@&)Rp6kv2(-Rb(#}s^Ie`oI;lt%A3W+FRmS#?Yn>bkchfm?C^;9{R9rhTK$Ed+cSABM;L@g zwIhGJ-yU8-pFI+fEgwvpMD|LF-DX{GTs_>Y`IWQr@AuN$t)+&v)%a~ap0U)_)XAx< z;%_?BP91$_XAS8(XaymAHON-?HG*=;(MiYK$fP7zJ+fZoYVVn+_zoVzS*>B6Ka+9o zy}h^oZp+M>YRz?ST8dp+pC4o`%BBcEX;{*p87r-pxeMYimc-m!@$5`LC|kXCp>vd_ z@rD|9a+?B1;sv8(h9w&uzxgFzDV1X|LF03=OR=<162y_g>3FV&G`@#7R;-=77uvhW zq*2WkP!Tq78@BKPUFVUpI2{|i?W9EUIoT3xA@;pc-T+^UeVjUJO>%jqxWeaf>4i-m@_pBJ z5gUnj%<81EYnDn)VHtz-KgbWC`K)UnVf8rK=VLRjDkO#ekuSOjT`J0O?nH+y%|@} zzsqTsUhGIYacX`@w>Pk6yzrh#^>gDvtA+GzT@7b{Ha2WdSy|cTN@9=jsl8uy7zrV! ze2uBqzO#;(QnN_)^X(s(Kx~1Xf0X#Z|Cs`=LcdNcSp+7kOqpoCoEKWuC+&#Q$jvd=j6SH&TjuSlKGb6Wwy(&=u*7Bn{275h1k5b zhDi|7uu@KwFu5hudJO)|CqheC5w9V(!l31n4hf{Mz=8q*^MG`BW<};IW z@LDIjBDb=IKURu6q2(v3pvf zP(}0(ZTqYE9_ESEidf-?bRQ7Uiu@icezY@jaS*LBeqp(3!>|0T1G=+2-j8V-zq2*5 zC$?g2P2-ksY47WEq?zF5?li`S{+%zPN4^d#jkNXeQYl>R=sHgC;xiBQFUDondo|5S zo@#q9sVhlFX+7sWo+8FoC)f2mNlXZ$vddSpo4d})Pd`mp^Zy{%CM|82tYga07Cim( z!b4T5*lUfYyh4`*gjQttWUaAMmE|3SjW=%GklIW+Q9fWPZ8SJNA=!j|Yhl+dwS2%_ zOr|&qrhuq2Ry%ZA=z+c{^HTF(^d5&&WAND+)`bv3db-4-LDt*eXx@9g_OTu6SEYWF z;?k9DO+d*>EDLm2sAx5t^j`NoF=vx$gYL~vGGP>_;v}0CgoK1TH=mP&?P}hhxx1RN zX3=Hzv|Y04Bbk$$E5(rZAzkj%eA1W7Ii&yT1|*W^)J=vHQaD3BQ8 zH{Fq|kl{*`pY6?#zpzwi$`-i<0rCpo8qlnBF8+2RWZjScJKr8GUl)?WvGVkiNF8@q zPh(@Zl0bdl)q?kjNc330kxQyg65mP8R5lw(1DgCR>9gdB>lNLh^Y~AB-XF(eitvC80?UOQ@z`>ks;NE>l`6x3p^T1?tnJHC`n*Bs% ztbNnAw|V7o-aWUOZHc+pX2DXi*Sr1Xxu|$trcTV}kIKH(2gIbS#sj4abC2rVZV=81 zb;>TQeKXfLC$BI0 zjOLgTg@=;d)IQml$0x4N4?Rj5I49-xLZ;$ll`k(!Hiev`XnjPgwc}meKt8LPA{o*6 zy<4Tv-nFWE`Nfv7=vaF{2bD+eZOUiCO?ieCU@_;XJ5Jo+hT@%X>X@f4;(g9fe>#Ie zp|2#H$4D>N-;?Vxli;C7$dMD<6KmQ9BiMGOBTLUzKVQ4j!HZ(6!r!@~BcE1OZdxRt zB5X{2lp-cWy?ata3W360dC>loN0G0;K4vVDOAy{7aFD5c{d6gR`CxdQ2-OD>^5vD3 z=%?p_c2`=FmmrZ$oJsE|a!&f{JsrU$u?Q#W+N7W_Ww@t?^GO-5?jy)64IPqPNz(0) zM8;I7w`F`gyqPRO%i*1gfPvVTcCAxntCY{V^%K^mLE|Oi4OglL&73}l=6!HRKa3&} ziM`FhjrFCRkadwu1^Ul5%O156ZlJV#Tv8U?MRmYhw3z zjfGP3+JEhrO=MXTAGni$rOWUb4?UI|QAFsSk3LJDHk-LG#mi&XFGJ9_x%-xbgeN|% zU!FF%#`^h{kZ-mRjgs4rx87_llHN>u;LX!0nqAoKJX90pMi61UGHqV=u|rvMd0pCQ z%S$NboIXuf?4r)vJLZ|0nZ1ptk9iY)erccAs7(@^e{#OzBzuy_%YhUTHWFUeLg?km zE*^*xYd@n( zej2YZa86RG@WU~(gf%w-m(kcw3k#N-ASNDXOUjItY&#i!x;80-HocSGUZDz6l^t9M zGBOrtiq@jrFV`$>2;#B#+wrWXTkYH&^XE&po+JcFHDQuG0`^^o8HTT}BT;p_P@gf$ zt7%or8a^XyK;o8+XYxTb8t1r+okCOV|F#_9+LkOQdr4@>nf5UWEK^$6q$xF1wNmOn6dsYIGpPHB6JSw?Hp`zJC|>2s7OPI zS}NXoij(GAx%7f_CRxYKJ^Z1`r9*6n;FtW>Z^wBKnXekZO@%VPT5O)7{3sS2@=iML z`{mO!f+fMiN0HBrg`v)=dH3(ahE{g(;dkj7!@hD8Vky4&rP_jStEW2kKPQcsL>Zx8 zoaUb=+zL3+_6~my%8I&*dNK9Bf7Q{+DHBnK6>D#=!}?Ev@&hP3@GkBJki@NHMXnwa z`Q6?~UDbT5ualOk4$@)45mLjF} zBA$6^0_&M1eH!hr|JOGO4Pm|aw4PE!CXHFAo9#f#4>EdH#o$kYH4YbdH|IjfNzg{> z8~(K6`8Vw3y{~MqN-I?+x9z}7-Tmdy|pM- zK72;7C0%e9q-=tar|bpWr=%iIQgV~Yqnd50o5-)pMfameU%^b9(q7%$e{YO7^YoQp z>E}qlm>FZ0VJ{Ml6sg&_4){Hj5xPw`_#@6Xo@o*Pz4qJ;cym+8SM*^z?&#YwTRO@5 zt8DGu_nj(<=C>12XN7OK$l7YU7G;&+<=t)nb(97E`-+`&IkvG_l>yj8~lM+zz(nqT2M_8 zz4$7t^$Ghh{clvm_%0q;mf6Lci6ue3sK|%uahrv7Dj3*b8BaDWzi0!TJq2>)&TOl> zA!PL1!l%?P;q^~136D3+e*)oGg1Tgazyh*iJUXI*vN%9b>8`F#1Huiznh<~ek0|zz z(i8k?wm(@x&$_ zBn3GsrH>x@&aZBkJ;1cI=L zKR=L`!@MuA*jhGt?RAmUy#Ky^J!lpj>bBV2!|+oBc68|BKar|pW1v>F7jxa&{Z)-m z1#8EYFZ_@;8X~d&45?xZx$r;RJ`ZRK;M%9Fe~8hPRU_%EWw4aN;fc4t--W04#p+`m z)0%)hnf#hge4;)h@UHm>5jyBAk99NkXFRa-bmOBh!^lapw>{F$0$vy^&3o`Zl-oEl z^!rQj%UEfDK?SHPDQdAU>T2t zdb|aFQ4_}XLnP_0mBY7CBBz_Q{+FG5d(=I+?G3#!8N=9fTq3r!SdMF(C8jiQ>}uA& zEz;*bHY0k5?QU4#eG-(7Vo zI4szXxdpprV7*y!V&dsL(s(7F{^W~n%cLx+3Uy~+g3%`WjCUS|@9rRB@qZFTo(ug` z&znGUZ@z`N{rgr7#dKeyxGnbHhuw*^H{9{N5cJ2O?+Sb9S^9HxIj|txscaLv5OW!0 z&4Rx&NyMV0uZ0Y;=+-d&5p219vi(#gowG5FY?5HG!O0sVbgPl8%rO6Gv-r1BHp2My zvwMdp7qp?Xad!ItWwTDA^wA-F?!mmKF0v4MfAZU-i4w?5!t>QyH0rSyJj~L+D0;SE zRb6_Y%;F3{G)*}~YX94{r!h<#Z?k5dt`v4OcU7n=?(2nqEREwEO4e@u${`VY!m<8Y z-bN#=&gI)+(e2^6RVUtR𝔗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 VF6&DkiRvZrV{T%#Bh%P5=s%2W8?gWY From 35a4253ef36f79dc68a97682d404064369973833 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 7 Mar 2021 23:25:33 -0800 Subject: [PATCH 051/284] from diagrams.net --- note/SeaweedFS_Architecture.png | Bin 72881 -> 72883 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/SeaweedFS_Architecture.png b/note/SeaweedFS_Architecture.png index f872b1ebaf57f23688e4b4e2a5e8324c0e6a0801..e17aa504b94addea7cf1b7a5491674d1cc2fe304 100644 GIT binary patch literal 72883 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

Nr$v}H2}%K#%}JX7lSQGL&w<3I7HOY?Af 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 z�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

XhiooVS3qG_ym;>#Rw)F9RtH24@v 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 B`N9AI From c2ad66e4bf4cd7fc69dc4d4a16a87870689448c5 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 7 Mar 2021 23:50:54 -0800 Subject: [PATCH 052/284] Update go.sum --- go.sum | 2 ++ 1 file changed, 2 insertions(+) diff --git a/go.sum b/go.sum index cf4ef4f98..8c7e3ac3f 100644 --- a/go.sum +++ b/go.sum @@ -496,6 +496,8 @@ github.com/kurin/blazer v0.5.3/go.mod h1:4FCXMUWo9DllR2Do4TtBd377ezyAJ51vB5uTBjt 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= From c6d3735605b9e643c1b1c8c4c9c35bc467c27c5e Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Mon, 8 Mar 2021 13:16:17 +0500 Subject: [PATCH 053/284] permitCommonNames https://github.com/chrislusf/seaweedfs/issues/1841 https://jbrandhorst.com/post/grpc-auth/ --- weed/command/master.go | 1 - weed/security/tls.go | 51 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/weed/command/master.go b/weed/command/master.go index d569919cd..fb58cfefd 100644 --- a/weed/command/master.go +++ b/weed/command/master.go @@ -138,7 +138,6 @@ func startMaster(masterOption MasterOptions, masterWhiteList []string) { if err != nil { glog.Fatalf("master failed to listen on grpc port %d: %v", grpcPort, err) } - // Create your protocol servers. grpcS := pb.NewGrpcServer(security.LoadServerTLS(util.GetViper(), "grpc.master")) master_pb.RegisterSeaweedServer(grpcS, ms) protobuf.RegisterRaftServer(grpcS, raftServer) diff --git a/weed/security/tls.go b/weed/security/tls.go index b4bf84e2d..437d658a8 100644 --- a/weed/security/tls.go +++ b/weed/security/tls.go @@ -1,9 +1,14 @@ package security import ( + "context" "crypto/tls" "crypto/x509" "github.com/chrislusf/seaweedfs/weed/util" + grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/peer" + "google.golang.org/grpc/status" "io/ioutil" "google.golang.org/grpc" @@ -12,21 +17,25 @@ import ( "github.com/chrislusf/seaweedfs/weed/glog" ) -func LoadServerTLS(config *util.ViperProxy, component string) grpc.ServerOption { +type Authenticator struct { + PermitCommonNames map[string]bool +} + +func LoadServerTLS(config *util.ViperProxy, component string) (grpc.ServerOption, grpc.ServerOption) { if config == nil { - return nil + return nil, nil } // load cert/key, ca cert cert, err := tls.LoadX509KeyPair(config.GetString(component+".cert"), config.GetString(component+".key")) if err != nil { glog.V(1).Infof("load cert/key error: %v", err) - return nil + return nil, nil } caCert, err := ioutil.ReadFile(config.GetString("grpc.ca")) if err != nil { glog.V(1).Infof("read ca cert file error: %v", err) - return nil + return nil, nil } caCertPool := x509.NewCertPool() caCertPool.AppendCertsFromPEM(caCert) @@ -35,8 +44,19 @@ func LoadServerTLS(config *util.ViperProxy, component string) grpc.ServerOption ClientCAs: caCertPool, ClientAuth: tls.RequireAndVerifyClientCert, }) + permitCommonNames := config.GetStringSlice(component + "permitCommonNames") - return grpc.Creds(ta) + if len(permitCommonNames) > 0 { + permitCommonNamesMap := make(map[string]bool) + for _, s := range util.GetViper().GetStringSlice(component + "permitCommonNames") { + permitCommonNamesMap[s] = true + } + auther := Authenticator{ + PermitCommonNames: permitCommonNamesMap, + } + return grpc.Creds(ta), grpc.UnaryInterceptor(grpc_auth.UnaryServerInterceptor(auther.Authenticate)) + } + return grpc.Creds(ta), nil } func LoadClientTLS(config *util.ViperProxy, component string) grpc.DialOption { @@ -70,3 +90,24 @@ func LoadClientTLS(config *util.ViperProxy, component string) grpc.DialOption { }) return grpc.WithTransportCredentials(ta) } + +func (a Authenticator) Authenticate(ctx context.Context) (newCtx context.Context, err error) { + p, ok := peer.FromContext(ctx) + if !ok { + return ctx, status.Error(codes.Unauthenticated, "no peer found") + } + + tlsAuth, ok := p.AuthInfo.(credentials.TLSInfo) + if !ok { + return ctx, status.Error(codes.Unauthenticated, "unexpected peer transport credentials") + } + + if len(tlsAuth.State.VerifiedChains) == 0 || len(tlsAuth.State.VerifiedChains[0]) == 0 { + return ctx, status.Error(codes.Unauthenticated, "could not verify peer certificate") + } + + if _, ok := a.PermitCommonNames[tlsAuth.State.VerifiedChains[0][0].Subject.CommonName]; !ok { + return ctx, status.Error(codes.Unauthenticated, "invalid subject common name") + } + return ctx, nil +} From 592af77f9c5804d25f1e2de6a8f7779ccfe7d2f1 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 8 Mar 2021 00:40:48 -0800 Subject: [PATCH 054/284] Update SeaweedFS_Architecture.png --- note/SeaweedFS_Architecture.png | Bin 72883 -> 72954 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/SeaweedFS_Architecture.png b/note/SeaweedFS_Architecture.png index e17aa504b94addea7cf1b7a5491674d1cc2fe304..2c6de5ef6dd8eed14c96cbda6de3f878b0c8aa0d 100644 GIT binary patch literal 72954 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

    }RQaXw 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
      }RQaXw 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 vaCbz$LVkli1^4(WB|`IG-)24{I5>Uw?d`d_)Tw Date: Mon, 8 Mar 2021 00:59:36 -0800 Subject: [PATCH 056/284] Update SeaweedFS_Architecture.png --- note/SeaweedFS_Architecture.png | Bin 75867 -> 75867 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/SeaweedFS_Architecture.png b/note/SeaweedFS_Architecture.png index 6d8ea5f84a1d63630374c4cc15235afac69b7a5e..de27a5f534b06b034a6b37d683ee20482e394486 100644 GIT binary patch delta 58 zcmcb8f#voEmI?K2#%6kkmZlS1w}=D>Mg)Zyx*0`A1*POv73cb!niXyKWwhmDvDm!h OQF9;n_C9XLvoZjSi4~Xt delta 58 zcmcb8f#voEmI?K21{QjTrsfk{w}_+`nVa~Uhv&Ezh8b1(JC+8Sxp{B)WwhmDk?H#^ O-`vN&y^ovmtPB8jhZI2o From 190fada1ef079186b6bc62feda5d571c5aaa274a Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Mon, 8 Mar 2021 21:39:44 +0500 Subject: [PATCH 057/284] TLS allowed commonNames --- docker/Makefile | 17 ++++++++++++++++- docker/compose/dev.env | 0 docker/compose/local-dev-compose.yml | 28 ++++++++++++++++++++++++---- docker/compose/tls.env | 13 +++++++++++++ weed/command/scaffold.go | 5 ++++- weed/security/tls.go | 11 +++++++---- 6 files changed, 64 insertions(+), 10 deletions(-) create mode 100644 docker/compose/dev.env create mode 100644 docker/compose/tls.env diff --git a/docker/Makefile b/docker/Makefile index 67ee9acdf..c589fea83 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -5,7 +5,7 @@ all: gen gen: dev build: - cd ../weed; GOOS=linux go build; mv weed ../docker/ + cd ../weed; CGO_ENABLED=0 GOOS=linux go build -ldflags "-extldflags -static"; mv weed ../docker/ docker build --no-cache -t chrislusf/seaweedfs:local -f Dockerfile.local . rm ./weed @@ -15,6 +15,9 @@ s3tests_build: dev: build docker-compose -f compose/local-dev-compose.yml -p seaweedfs up +dev_tls: build certstrap + ENV_FILE="tls.env" docker-compose -f compose/local-dev-compose.yml -p seaweedfs up + dev_mount: build docker-compose -f compose/local-mount-compose.yml -p seaweedfs up @@ -41,3 +44,15 @@ filer_etcd: build clean: rm ./weed + +certstrap: + go get github.com/square/certstrap + certstrap --depot-path compose/tls init --passphrase "" --common-name "SeaweedFS CA" || true + certstrap --depot-path compose/tls request-cert --passphrase "" --common-name volume01 || true + certstrap --depot-path compose/tls request-cert --passphrase "" --common-name master01 || true + certstrap --depot-path compose/tls request-cert --passphrase "" --common-name filer01 || true + certstrap --depot-path compose/tls request-cert --passphrase "" --common-name client01 || true + certstrap --depot-path compose/tls sign --CA "SeaweedFS CA" volume01 || true + certstrap --depot-path compose/tls sign --CA "SeaweedFS CA" master01 || true + certstrap --depot-path compose/tls sign --CA "SeaweedFS CA" filer01 || true + certstrap --depot-path compose/tls sign --CA "SeaweedFS CA" client01 || true \ No newline at end of file diff --git a/docker/compose/dev.env b/docker/compose/dev.env new file mode 100644 index 000000000..e69de29bb diff --git a/docker/compose/local-dev-compose.yml b/docker/compose/local-dev-compose.yml index 18cccab3e..05103a7fc 100644 --- a/docker/compose/local-dev-compose.yml +++ b/docker/compose/local-dev-compose.yml @@ -6,33 +6,49 @@ services: ports: - 9333:9333 - 19333:19333 - command: "master -ip=master" + command: "-v=1 master -ip=master" + volumes: + - ./tls:/etc/seaweedfs/tls + env_file: + - ${ENV_FILE:-dev.env} volume: image: chrislusf/seaweedfs:local ports: - 8080:8080 - 18080:18080 - command: "volume -mserver=master:9333 -port=8080 -ip=volume -preStopSeconds=1" + command: "-v=1 volume -mserver=master:9333 -port=8080 -ip=volume -preStopSeconds=1" depends_on: - master + volumes: + - ./tls:/etc/seaweedfs/tls + env_file: + - ${ENV_FILE:-dev.env} filer: image: chrislusf/seaweedfs:local ports: - 8888:8888 - 18888:18888 - command: 'filer -master="master:9333"' + command: '-v=1 filer -master="master:9333"' depends_on: - master - volume + volumes: + - ./tls:/etc/seaweedfs/tls + env_file: + - ${ENV_FILE:-dev.env} s3: image: chrislusf/seaweedfs:local ports: - 8333:8333 - command: 's3 -filer="filer:8888"' + command: '-v=1 s3 -filer="filer:8888"' depends_on: - master - volume - filer + volumes: + - ./tls:/etc/seaweedfs/tls + env_file: + - ${ENV_FILE:-dev.env} mount: image: chrislusf/seaweedfs:local privileged: true @@ -40,6 +56,10 @@ services: - SYS_ADMIN mem_limit: 4096m command: '-v=4 mount -filer="filer:8888" -dirAutoCreate -dir=/mnt/seaweedfs -cacheCapacityMB=100 -concurrentWriters=128' + volumes: + - ./tls:/etc/seaweedfs/tls + env_file: + - ${ENV_FILE:-dev.env} depends_on: - master - volume diff --git a/docker/compose/tls.env b/docker/compose/tls.env new file mode 100644 index 000000000..220642919 --- /dev/null +++ b/docker/compose/tls.env @@ -0,0 +1,13 @@ +WEED_GRPC_CA=/etc/seaweedfs/tls/SeaweedFS_CA.crt +WEED_GRPC_MASTER_CERT=/etc/seaweedfs/tls/master01.crt +WEED_GRPC_MASTER_KEY=/etc/seaweedfs/tls/master01.key +WEED_GRPC_VOLUME_CERT=/etc/seaweedfs/tls/volume01.crt +WEED_GRPC_VOLUME_KEY=/etc/seaweedfs/tls/volume01.key +WEED_GRPC_FILER_CERT=/etc/seaweedfs/tls/filer01.crt +WEED_GRPC_FILER_KEY=/etc/seaweedfs/tls/filer01.key +WEED_GRPC_CLIENT_CERT=/etc/seaweedfs/tls/client01.crt +WEED_GRPC_CLIENT_KEY=/etc/seaweedfs/tls/client01.key +WEED_GRPC_MASTER_ALLOWED_COMMONNAMES="volume01 master01 filer01 client01" +WEED_GRPC_VOLUME_ALLOWED_COMMONNAMES="volume01 master01 filer01 client01" +WEED_GRPC_FILER_ALLOWED_COMMONNAMES="volume01 master01 filer01 client01" +WEED_GRPC_CLIENT_ALLOWED_COMMONNAMES="volume01 master01 filer01 client01" \ No newline at end of file diff --git a/weed/command/scaffold.go b/weed/command/scaffold.go index c2d53e4bd..79f827af5 100644 --- a/weed/command/scaffold.go +++ b/weed/command/scaffold.go @@ -444,18 +444,22 @@ ca = "" [grpc.volume] cert = "" key = "" +allowed_commonNames = "" [grpc.master] cert = "" key = "" +allowed_commonNames = "" [grpc.filer] cert = "" key = "" +allowed_commonNames = "" [grpc.msg_broker] cert = "" key = "" +allowed_commonNames = "" # use this for any place needs a grpc client # i.e., "weed backup|benchmark|filer.copy|filer.replicate|mount|s3|upload" @@ -463,7 +467,6 @@ key = "" cert = "" key = "" - # volume server https options # Note: work in progress! # this does not work with other clients, e.g., "weed filer|mount" etc, yet. diff --git a/weed/security/tls.go b/weed/security/tls.go index 437d658a8..b38745fbf 100644 --- a/weed/security/tls.go +++ b/weed/security/tls.go @@ -29,12 +29,15 @@ func LoadServerTLS(config *util.ViperProxy, component string) (grpc.ServerOption // load cert/key, ca cert cert, err := tls.LoadX509KeyPair(config.GetString(component+".cert"), config.GetString(component+".key")) if err != nil { - glog.V(1).Infof("load cert/key error: %v", err) + glog.V(1).Infof("load cert: %s / key: %s error: %v", + config.GetString(component+".cert"), + config.GetString(component+".key"), + err) return nil, nil } caCert, err := ioutil.ReadFile(config.GetString("grpc.ca")) if err != nil { - glog.V(1).Infof("read ca cert file error: %v", err) + glog.V(1).Infof("read ca cert file %s error: %v", config.GetString("grpc.ca"), err) return nil, nil } caCertPool := x509.NewCertPool() @@ -44,11 +47,11 @@ func LoadServerTLS(config *util.ViperProxy, component string) (grpc.ServerOption ClientCAs: caCertPool, ClientAuth: tls.RequireAndVerifyClientCert, }) - permitCommonNames := config.GetStringSlice(component + "permitCommonNames") + permitCommonNames := config.GetStringSlice(component + ".allowed_commonNames") if len(permitCommonNames) > 0 { permitCommonNamesMap := make(map[string]bool) - for _, s := range util.GetViper().GetStringSlice(component + "permitCommonNames") { + for _, s := range permitCommonNames { permitCommonNamesMap[s] = true } auther := Authenticator{ From 5b1682092428a5288be20d433012632759ec406a Mon Sep 17 00:00:00 2001 From: qieqieplus Date: Tue, 9 Mar 2021 18:49:45 +0800 Subject: [PATCH 058/284] fix: collection stats won't update if all volumes expired at same iteration --- weed/storage/store.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/weed/storage/store.go b/weed/storage/store.go index 47829666a..a67c43a90 100644 --- a/weed/storage/store.go +++ b/weed/storage/store.go @@ -220,20 +220,30 @@ func (s *Store) CollectHeartbeat() *master_pb.Heartbeat { if maxFileKey < curMaxFileKey { maxFileKey = curMaxFileKey } + deleteVolume := false if !v.expired(volumeMessage.Size, s.GetVolumeSizeLimit()) { volumeMessages = append(volumeMessages, volumeMessage) } else { if v.expiredLongEnough(MAX_TTL_VOLUME_REMOVAL_DELAY) { deleteVids = append(deleteVids, v.Id) + deleteVolume = true } else { glog.V(0).Infof("volume %d is expired", v.Id) } if v.lastIoError != nil { deleteVids = append(deleteVids, v.Id) + deleteVolume = true glog.Warningf("volume %d has IO error: %v", v.Id, v.lastIoError) } } - collectionVolumeSize[v.Collection] += volumeMessage.Size + + if _, exist := collectionVolumeSize[v.Collection]; !exist { + collectionVolumeSize[v.Collection] = 0 + } + if !deleteVolume { + collectionVolumeSize[v.Collection] += volumeMessage.Size + } + if _, exist := collectionVolumeReadOnlyCount[v.Collection]; !exist { collectionVolumeReadOnlyCount[v.Collection] = map[string]uint8{ "IsReadOnly": 0, @@ -242,7 +252,7 @@ func (s *Store) CollectHeartbeat() *master_pb.Heartbeat { "isDiskSpaceLow": 0, } } - if v.IsReadOnly() { + if !deleteVolume && v.IsReadOnly() { collectionVolumeReadOnlyCount[v.Collection]["IsReadOnly"] += 1 if v.noWriteOrDelete { collectionVolumeReadOnlyCount[v.Collection]["noWriteOrDelete"] += 1 @@ -267,7 +277,7 @@ func (s *Store) CollectHeartbeat() *master_pb.Heartbeat { glog.V(0).Infof("volume %d is deleted", vid) } } else { - glog.V(0).Infof("delete volume %d: %v", vid, err) + glog.Warningf("delete volume %d: %v", vid, err) } } location.volumesLock.Unlock() From 387c6f42185911db6b9fae5981d2350a5a47bd48 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 9 Mar 2021 10:07:22 -0800 Subject: [PATCH 059/284] Revert "delete the folder object in multi_object_delete" This reverts commit 2e89c8c9aee141e0ca471644639c970ebaf1dcaa. --- weed/s3api/s3api_object_handlers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index 55199d4eb..19d85c495 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -185,7 +185,7 @@ func (s3a *S3ApiServer) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *h for _, object := range deleteObjects.Objects { lastSeparator := strings.LastIndex(object.ObjectName, "/") - parentDirectoryPath, entryName, isDeleteData, isRecursive := "", object.ObjectName, true, true + parentDirectoryPath, entryName, isDeleteData, isRecursive := "", object.ObjectName, true, false if lastSeparator > 0 && lastSeparator+1 < len(object.ObjectName) { entryName = object.ObjectName[lastSeparator+1:] parentDirectoryPath = "/" + object.ObjectName[:lastSeparator] From 828f6e9f4d634bf05d0677a4ef014eae7aa92b0e Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 9 Mar 2021 12:09:32 -0800 Subject: [PATCH 060/284] volume: auto add missing vif files fix https://github.com/chrislusf/seaweedfs/issues/1878 --- weed/pb/volume_info.go | 29 ++++++++++++++++-------- weed/storage/erasure_coding/ec_volume.go | 2 +- weed/storage/store.go | 2 +- weed/storage/volume_tier.go | 6 ++--- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/weed/pb/volume_info.go b/weed/pb/volume_info.go index c4f733f5c..cae9e018f 100644 --- a/weed/pb/volume_info.go +++ b/weed/pb/volume_info.go @@ -15,40 +15,49 @@ import ( ) // MaybeLoadVolumeInfo load the file data as *volume_server_pb.VolumeInfo, the returned volumeInfo will not be nil -func MaybeLoadVolumeInfo(fileName string) (*volume_server_pb.VolumeInfo, bool, error) { +func MaybeLoadVolumeInfo(fileName string) (volumeInfo *volume_server_pb.VolumeInfo, hasRemoteFile bool, hasVolumeInfoFile bool, err error) { - volumeInfo := &volume_server_pb.VolumeInfo{} + volumeInfo = &volume_server_pb.VolumeInfo{} glog.V(1).Infof("maybeLoadVolumeInfo checks %s", fileName) if exists, canRead, _, _, _ := util.CheckFile(fileName); !exists || !canRead { if !exists { - return volumeInfo, false, nil + return } + hasVolumeInfoFile = true if !canRead { glog.Warningf("can not read %s", fileName) - return volumeInfo, false, fmt.Errorf("can not read %s", fileName) + err = fmt.Errorf("can not read %s", fileName) + return } - return volumeInfo, false, nil + return } + hasVolumeInfoFile = true + glog.V(1).Infof("maybeLoadVolumeInfo reads %s", fileName) tierData, readErr := ioutil.ReadFile(fileName) if readErr != nil { glog.Warningf("fail to read %s : %v", fileName, readErr) - return volumeInfo, false, fmt.Errorf("fail to read %s : %v", fileName, readErr) + err = fmt.Errorf("fail to read %s : %v", fileName, readErr) + return + } glog.V(1).Infof("maybeLoadVolumeInfo Unmarshal volume info %v", fileName) - if err := jsonpb.Unmarshal(bytes.NewReader(tierData), volumeInfo); err != nil { + if err = jsonpb.Unmarshal(bytes.NewReader(tierData), volumeInfo); err != nil { glog.Warningf("unmarshal error: %v", err) - return volumeInfo, false, fmt.Errorf("unmarshal error: %v", err) + err = fmt.Errorf("unmarshal error: %v", err) + return } if len(volumeInfo.GetFiles()) == 0 { - return volumeInfo, false, nil + return } - return volumeInfo, true, nil + hasRemoteFile = true + + return } func SaveVolumeInfo(fileName string, volumeInfo *volume_server_pb.VolumeInfo) error { diff --git a/weed/storage/erasure_coding/ec_volume.go b/weed/storage/erasure_coding/ec_volume.go index 85d6a5fc8..171db92a4 100644 --- a/weed/storage/erasure_coding/ec_volume.go +++ b/weed/storage/erasure_coding/ec_volume.go @@ -63,7 +63,7 @@ func NewEcVolume(diskType types.DiskType, dir string, dirIdx string, collection // read volume info ev.Version = needle.Version3 - if volumeInfo, found, _ := pb.MaybeLoadVolumeInfo(dataBaseFileName + ".vif"); found { + if volumeInfo, _, found, _ := pb.MaybeLoadVolumeInfo(dataBaseFileName + ".vif"); found { ev.Version = needle.Version(volumeInfo.Version) } else { pb.SaveVolumeInfo(dataBaseFileName+".vif", &volume_server_pb.VolumeInfo{Version: uint32(ev.Version)}) diff --git a/weed/storage/store.go b/weed/storage/store.go index a67c43a90..fb33a708c 100644 --- a/weed/storage/store.go +++ b/weed/storage/store.go @@ -456,7 +456,7 @@ func (s *Store) ConfigureVolume(i needle.VolumeId, replication string) error { // load, modify, save baseFileName := strings.TrimSuffix(fileInfo.Name(), filepath.Ext(fileInfo.Name())) vifFile := filepath.Join(location.Directory, baseFileName+".vif") - volumeInfo, _, err := pb.MaybeLoadVolumeInfo(vifFile) + volumeInfo, _, _, err := pb.MaybeLoadVolumeInfo(vifFile) if err != nil { return fmt.Errorf("volume %d fail to load vif", i) } diff --git a/weed/storage/volume_tier.go b/weed/storage/volume_tier.go index da93221b2..23160906b 100644 --- a/weed/storage/volume_tier.go +++ b/weed/storage/volume_tier.go @@ -16,7 +16,7 @@ func (v *Volume) GetVolumeInfo() *volume_server_pb.VolumeInfo { func (v *Volume) maybeLoadVolumeInfo() (found bool) { var err error - v.volumeInfo, v.hasRemoteFile, err = pb.MaybeLoadVolumeInfo(v.FileName(".vif")) + v.volumeInfo, v.hasRemoteFile, found, err = pb.MaybeLoadVolumeInfo(v.FileName(".vif")) if v.volumeInfo.Version == 0 { v.volumeInfo.Version = uint32(needle.CurrentVersion) @@ -29,10 +29,10 @@ func (v *Volume) maybeLoadVolumeInfo() (found bool) { if err != nil { glog.Warningf("load volume %d.vif file: %v", v.Id, err) - return false + return } - return true + return } From f5b5e4da2d3e201aaf6873d53ce952c844f362f6 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 9 Mar 2021 12:52:16 -0800 Subject: [PATCH 061/284] 2.31 --- 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 0b4d1b249..c19a964d3 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.30" -version: 2.30 +appVersion: "2.31" +version: 2.31 diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index 97095bd0f..a5813b8b3 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.30" - started using {.Chart.appVersion} + # imageTag: "2.31" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index 80b209ad1..1cd2f160a 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, 30) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 31) COMMIT = "" ) From 9d8ca513d93cf92735a34d79dc2e29c660cfada7 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 9 Mar 2021 13:21:26 -0800 Subject: [PATCH 062/284] refactor --- weed/filer/filer_on_meta_event.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/weed/filer/filer_on_meta_event.go b/weed/filer/filer_on_meta_event.go index 295a5039e..b29324b61 100644 --- a/weed/filer/filer_on_meta_event.go +++ b/weed/filer/filer_on_meta_event.go @@ -11,6 +11,10 @@ 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) +} + +func (f *Filer) maybeReloadFilerConfiguration(event *filer_pb.SubscribeMetadataResponse) { if DirectoryEtcSeaweedFS != event.Directory { if DirectoryEtcSeaweedFS != event.EventNotification.NewParentPath { return @@ -26,7 +30,6 @@ func (f *Filer) onMetadataChangeEvent(event *filer_pb.SubscribeMetadataResponse) if entry.Name == FilerConfName { f.reloadFilerConfiguration(entry) } - } func (f *Filer) readEntry(chunks []*filer_pb.FileChunk) ([]byte, error) { From 5be83dd4a9ed7043f7d6f69a06b999e50b98ca60 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 9 Mar 2021 14:13:48 -0800 Subject: [PATCH 063/284] add comments --- weed/filer/meta_aggregator.go | 1 + 1 file changed, 1 insertion(+) diff --git a/weed/filer/meta_aggregator.go b/weed/filer/meta_aggregator.go index 9437e9992..5c368a57e 100644 --- a/weed/filer/meta_aggregator.go +++ b/weed/filer/meta_aggregator.go @@ -69,6 +69,7 @@ func (ma *MetaAggregator) subscribeToOneFiler(f *Filer, self string, peer string peerSignature, err = ma.readFilerStoreSignature(peer) } + // when filer store is not shared by multiple filers if peerSignature != f.Signature { if prevTsNs, err := ma.readOffset(f, peer, peerSignature); err == nil { lastTsNs = prevTsNs From bf5b795717f4bca3887e0826d4f5551b1499d79d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 9 Mar 2021 16:49:05 -0800 Subject: [PATCH 064/284] fix outdated cron job scripts fix https://github.com/chrislusf/seaweedfs/issues/1881 --- docker/entrypoint.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 5a858d993..a5a240575 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -60,9 +60,9 @@ case "$1" in 'cronjob') MASTER=${WEED_MASTER-localhost:9333} FIX_REPLICATION_CRON_SCHEDULE=${CRON_SCHEDULE-*/7 * * * * *} - echo "$FIX_REPLICATION_CRON_SCHEDULE" 'echo "volume.fix.replication" | weed shell -master='$MASTER > /crontab + echo "$FIX_REPLICATION_CRON_SCHEDULE" 'echo "lock; volume.fix.replication; unlock" | weed shell -master='$MASTER > /crontab BALANCING_CRON_SCHEDULE=${CRON_SCHEDULE-25 * * * * *} - echo "$BALANCING_CRON_SCHEDULE" 'echo "volume.balance -c ALL -force" | weed shell -master='$MASTER >> /crontab + echo "$BALANCING_CRON_SCHEDULE" 'echo "lock; volume.balance -collection ALL_COLLECTIONS -force; unlock" | weed shell -master='$MASTER >> /crontab echo "Running Crontab:" cat /crontab exec supercronic /crontab From 5ba4b479f8955cd6e8cb3235753d54948a8cacf2 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 9 Mar 2021 23:08:38 -0800 Subject: [PATCH 065/284] properly lock file.entry object fix https://github.com/chrislusf/seaweedfs/issues/1882 --- weed/filesys/dir_link.go | 27 +++++++++------- weed/filesys/dirty_page.go | 9 ++++-- weed/filesys/file.go | 27 +++++++++++++--- weed/filesys/filehandle.go | 66 +++++++++++++++++++++++--------------- weed/filesys/fscache.go | 5 +-- 5 files changed, 89 insertions(+), 45 deletions(-) diff --git a/weed/filesys/dir_link.go b/weed/filesys/dir_link.go index 29391faeb..606e52fcb 100644 --- a/weed/filesys/dir_link.go +++ b/weed/filesys/dir_link.go @@ -35,15 +35,20 @@ func (dir *Dir) Link(ctx context.Context, req *fuse.LinkRequest, old fs.Node) (f return nil, err } - // update old file to hardlink mode - if len(oldFile.entry.HardLinkId) == 0 { - oldFile.entry.HardLinkId = append(util.RandomBytes(16), HARD_LINK_MARKER) - oldFile.entry.HardLinkCounter = 1 + oldEntry := oldFile.getEntry() + if oldEntry == nil { + return nil, fuse.EIO } - oldFile.entry.HardLinkCounter++ + + // update old file to hardlink mode + if len(oldEntry.HardLinkId) == 0 { + oldEntry.HardLinkId = append(util.RandomBytes(16), HARD_LINK_MARKER) + oldEntry.HardLinkCounter = 1 + } + oldEntry.HardLinkCounter++ updateOldEntryRequest := &filer_pb.UpdateEntryRequest{ Directory: oldFile.dir.FullPath(), - Entry: oldFile.entry, + Entry: oldEntry, Signatures: []int32{dir.wfs.signature}, } @@ -53,11 +58,11 @@ func (dir *Dir) Link(ctx context.Context, req *fuse.LinkRequest, old fs.Node) (f Entry: &filer_pb.Entry{ Name: req.NewName, IsDirectory: false, - Attributes: oldFile.entry.Attributes, - Chunks: oldFile.entry.Chunks, - Extended: oldFile.entry.Extended, - HardLinkId: oldFile.entry.HardLinkId, - HardLinkCounter: oldFile.entry.HardLinkCounter, + Attributes: oldEntry.Attributes, + Chunks: oldEntry.Chunks, + Extended: oldEntry.Extended, + HardLinkId: oldEntry.HardLinkId, + HardLinkCounter: oldEntry.HardLinkCounter, }, Signatures: []int32{dir.wfs.signature}, } diff --git a/weed/filesys/dirty_page.go b/weed/filesys/dirty_page.go index f05a3a56a..8888cff96 100644 --- a/weed/filesys/dirty_page.go +++ b/weed/filesys/dirty_page.go @@ -30,7 +30,7 @@ func newDirtyPages(file *File) *ContinuousDirtyPages { func (pages *ContinuousDirtyPages) AddPage(offset int64, data []byte) { - glog.V(4).Infof("%s AddPage [%d,%d) of %d bytes", pages.f.fullpath(), offset, offset+int64(len(data)), pages.f.entry.Attributes.FileSize) + glog.V(4).Infof("%s AddPage [%d,%d)", pages.f.fullpath(), offset, offset+int64(len(data))) if len(data) > int(pages.f.wfs.option.ChunkSizeLimit) { // this is more than what buffer can hold. @@ -69,7 +69,12 @@ func (pages *ContinuousDirtyPages) saveExistingLargestPageToStorage() (hasSavedD return false } - fileSize := int64(pages.f.entry.Attributes.FileSize) + entry := pages.f.getEntry() + if entry == nil { + return false + } + + fileSize := int64(entry.Attributes.FileSize) chunkSize := min(maxList.Size(), fileSize-maxList.Offset()) if chunkSize == 0 { diff --git a/weed/filesys/file.go b/weed/filesys/file.go index bd722b31f..5931dd2ff 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -5,6 +5,7 @@ import ( "io" "os" "sort" + "sync" "time" "github.com/seaweedfs/fuse" @@ -33,6 +34,7 @@ type File struct { dir *Dir wfs *WFS entry *filer_pb.Entry + entryLock sync.RWMutex entryViewCache []filer.VisibleInterval isOpen int reader io.ReaderAt @@ -47,7 +49,7 @@ func (file *File) Attr(ctx context.Context, attr *fuse.Attr) (err error) { glog.V(4).Infof("file Attr %s, open:%v existing:%v", file.fullpath(), file.isOpen, attr) - entry := file.entry + entry := file.getEntry() if file.isOpen <= 0 || entry == nil { if entry, err = file.maybeLoadEntry(ctx); err != nil { return err @@ -258,7 +260,7 @@ func (file *File) Forget() { } func (file *File) maybeLoadEntry(ctx context.Context) (entry *filer_pb.Entry, err error) { - entry = file.entry + entry = file.getEntry() if file.isOpen > 0 { return entry, nil } @@ -299,8 +301,13 @@ func (file *File) addChunks(chunks []*filer_pb.FileChunk) { } } + entry := file.getEntry() + if entry == nil { + return + } + // pick out-of-order chunks from existing chunks - for _, chunk := range file.entry.Chunks { + for _, chunk := range entry.Chunks { if lessThan(earliestChunk, chunk) { chunks = append(chunks, chunk) } @@ -318,18 +325,22 @@ func (file *File) addChunks(chunks []*filer_pb.FileChunk) { file.reader = nil - glog.V(4).Infof("%s existing %d chunks adds %d more", file.fullpath(), len(file.entry.Chunks), len(chunks)) + glog.V(4).Infof("%s existing %d chunks adds %d more", file.fullpath(), len(entry.Chunks), len(chunks)) - file.entry.Chunks = append(file.entry.Chunks, newChunks...) + entry.Chunks = append(entry.Chunks, newChunks...) } func (file *File) setEntry(entry *filer_pb.Entry) { + file.entryLock.Lock() + defer file.entryLock.Unlock() file.entry = entry file.entryViewCache, _ = filer.NonOverlappingVisibleIntervals(file.wfs.LookupFn(), entry.Chunks) file.reader = nil } func (file *File) clearEntry() { + file.entryLock.Lock() + defer file.entryLock.Unlock() file.entry = nil file.entryViewCache = nil file.reader = nil @@ -359,3 +370,9 @@ func (file *File) saveEntry(entry *filer_pb.Entry) error { return nil }) } + +func (file *File) getEntry() *filer_pb.Entry { + file.entryLock.RLock() + defer file.entryLock.RUnlock() + return file.entry +} diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index fb073c9cd..adec1cd70 100644 --- a/weed/filesys/filehandle.go +++ b/weed/filesys/filehandle.go @@ -40,8 +40,9 @@ func newFileHandle(file *File, uid, gid uint32) *FileHandle { Uid: uid, Gid: gid, } - if fh.f.entry != nil { - fh.f.entry.Attributes.FileSize = filer.FileSize(fh.f.entry) + entry := fh.f.getEntry() + if entry != nil { + entry.Attributes.FileSize = filer.FileSize(entry) } return fh @@ -104,22 +105,27 @@ func (fh *FileHandle) readFromDirtyPages(buff []byte, startOffset int64) (maxSto func (fh *FileHandle) readFromChunks(buff []byte, offset int64) (int64, error) { - fileSize := int64(filer.FileSize(fh.f.entry)) + entry := fh.f.getEntry() + if entry == nil { + return 0, io.EOF + } + + fileSize := int64(filer.FileSize(entry)) if fileSize == 0 { glog.V(1).Infof("empty fh %v", fh.f.fullpath()) return 0, io.EOF } - if offset+int64(len(buff)) <= int64(len(fh.f.entry.Content)) { - totalRead := copy(buff, fh.f.entry.Content[offset:]) + if offset+int64(len(buff)) <= int64(len(entry.Content)) { + totalRead := copy(buff, entry.Content[offset:]) glog.V(4).Infof("file handle read cached %s [%d,%d] %d", fh.f.fullpath(), offset, offset+int64(totalRead), totalRead) return int64(totalRead), nil } var chunkResolveErr error if fh.f.entryViewCache == nil { - fh.f.entryViewCache, chunkResolveErr = filer.NonOverlappingVisibleIntervals(fh.f.wfs.LookupFn(), fh.f.entry.Chunks) + fh.f.entryViewCache, chunkResolveErr = filer.NonOverlappingVisibleIntervals(fh.f.wfs.LookupFn(), entry.Chunks) if chunkResolveErr != nil { return 0, fmt.Errorf("fail to resolve chunk manifest: %v", chunkResolveErr) } @@ -158,8 +164,13 @@ func (fh *FileHandle) Write(ctx context.Context, req *fuse.WriteRequest, resp *f copy(data, req.Data) } - fh.f.entry.Content = nil - fh.f.entry.Attributes.FileSize = uint64(max(req.Offset+int64(len(data)), int64(fh.f.entry.Attributes.FileSize))) + entry := fh.f.getEntry() + if entry == nil { + return fuse.EIO + } + + entry.Content = nil + entry.Attributes.FileSize = uint64(max(req.Offset+int64(len(data)), int64(entry.Attributes.FileSize))) glog.V(4).Infof("%v write [%d,%d) %d", fh.f.fullpath(), req.Offset, req.Offset+int64(len(req.Data)), len(req.Data)) fh.dirtyPages.AddPage(req.Offset, data) @@ -242,35 +253,40 @@ func (fh *FileHandle) doFlush(ctx context.Context, header fuse.Header) error { err := fh.f.wfs.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { - if fh.f.entry.Attributes != nil { - fh.f.entry.Attributes.Mime = fh.contentType - if fh.f.entry.Attributes.Uid == 0 { - fh.f.entry.Attributes.Uid = header.Uid + entry := fh.f.getEntry() + if entry == nil { + return nil + } + + if entry.Attributes != nil { + entry.Attributes.Mime = fh.contentType + if entry.Attributes.Uid == 0 { + entry.Attributes.Uid = header.Uid } - if fh.f.entry.Attributes.Gid == 0 { - fh.f.entry.Attributes.Gid = header.Gid + if entry.Attributes.Gid == 0 { + entry.Attributes.Gid = header.Gid } - if fh.f.entry.Attributes.Crtime == 0 { - fh.f.entry.Attributes.Crtime = time.Now().Unix() + if entry.Attributes.Crtime == 0 { + entry.Attributes.Crtime = time.Now().Unix() } - fh.f.entry.Attributes.Mtime = time.Now().Unix() - fh.f.entry.Attributes.FileMode = uint32(os.FileMode(fh.f.entry.Attributes.FileMode) &^ fh.f.wfs.option.Umask) - fh.f.entry.Attributes.Collection = fh.dirtyPages.collection - fh.f.entry.Attributes.Replication = fh.dirtyPages.replication + entry.Attributes.Mtime = time.Now().Unix() + entry.Attributes.FileMode = uint32(os.FileMode(entry.Attributes.FileMode) &^ fh.f.wfs.option.Umask) + entry.Attributes.Collection = fh.dirtyPages.collection + entry.Attributes.Replication = fh.dirtyPages.replication } request := &filer_pb.CreateEntryRequest{ Directory: fh.f.dir.FullPath(), - Entry: fh.f.entry, + Entry: entry, Signatures: []int32{fh.f.wfs.signature}, } - glog.V(4).Infof("%s set chunks: %v", fh.f.fullpath(), len(fh.f.entry.Chunks)) - for i, chunk := range fh.f.entry.Chunks { + glog.V(4).Infof("%s set chunks: %v", fh.f.fullpath(), len(entry.Chunks)) + for i, chunk := range entry.Chunks { glog.V(4).Infof("%s chunks %d: %v [%d,%d)", fh.f.fullpath(), i, chunk.GetFileIdString(), chunk.Offset, chunk.Offset+int64(chunk.Size)) } - manifestChunks, nonManifestChunks := filer.SeparateManifestChunks(fh.f.entry.Chunks) + manifestChunks, nonManifestChunks := filer.SeparateManifestChunks(entry.Chunks) chunks, _ := filer.CompactFileChunks(fh.f.wfs.LookupFn(), nonManifestChunks) chunks, manifestErr := filer.MaybeManifestize(fh.f.wfs.saveDataAsChunk(fh.f.fullpath()), chunks) @@ -278,7 +294,7 @@ func (fh *FileHandle) doFlush(ctx context.Context, header fuse.Header) error { // not good, but should be ok glog.V(0).Infof("MaybeManifestize: %v", manifestErr) } - fh.f.entry.Chunks = append(chunks, manifestChunks...) + entry.Chunks = append(chunks, manifestChunks...) fh.f.wfs.mapPbIdFromLocalToFiler(request.Entry) defer fh.f.wfs.mapPbIdFromFilerToLocal(request.Entry) diff --git a/weed/filesys/fscache.go b/weed/filesys/fscache.go index fdec8253c..6b1012090 100644 --- a/weed/filesys/fscache.go +++ b/weed/filesys/fscache.go @@ -124,8 +124,9 @@ func (c *FsCache) Move(oldPath util.FullPath, newPath util.FullPath) *FsNode { } if f, ok := src.node.(*File); ok { f.Name = target.name - if f.entry != nil { - f.entry.Name = f.Name + entry := f.getEntry() + if entry != nil { + entry.Name = f.Name } } parent.disconnectChild(target) From 737bde5ab7bcd83002127ccc0adf07839602f714 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 9 Mar 2021 23:23:01 -0800 Subject: [PATCH 066/284] refactoring, remove duplicated code --- weed/storage/volume_read_write.go | 60 ++----------------------------- 1 file changed, 2 insertions(+), 58 deletions(-) diff --git a/weed/storage/volume_read_write.go b/weed/storage/volume_read_write.go index 07376bc88..1853e458a 100644 --- a/weed/storage/volume_read_write.go +++ b/weed/storage/volume_read_write.go @@ -104,47 +104,8 @@ func (v *Volume) syncWrite(n *needle.Needle) (offset uint64, size Size, isUnchan err = fmt.Errorf("volume size limit %d exceeded! current size is %d", MaxPossibleVolumeSize, v.nm.ContentSize()) return } - if v.isFileUnchanged(n) { - size = Size(n.DataSize) - isUnchanged = true - return - } - // check whether existing needle cookie matches - nv, ok := v.nm.Get(n.Id) - if ok { - existingNeedle, _, _, existingNeedleReadErr := needle.ReadNeedleHeader(v.DataBackend, v.Version(), nv.Offset.ToActualOffset()) - if existingNeedleReadErr != nil { - err = fmt.Errorf("reading existing needle: %v", existingNeedleReadErr) - return - } - if existingNeedle.Cookie != n.Cookie { - glog.V(0).Infof("write cookie mismatch: existing %x, new %x", existingNeedle.Cookie, n.Cookie) - err = fmt.Errorf("mismatching cookie %x", n.Cookie) - return - } - } - - // append to dat file - n.AppendAtNs = uint64(time.Now().UnixNano()) - offset, size, _, err = n.Append(v.DataBackend, v.Version()) - v.checkReadWriteError(err) - if err != nil { - return - } - - v.lastAppendAtNs = n.AppendAtNs - - // add to needle map - if !ok || uint64(nv.Offset.ToActualOffset()) < offset { - if err = v.nm.Put(n.Id, ToOffset(int64(offset)), n.Size); err != nil { - glog.V(4).Infof("failed to save in needle map %d: %v", n.Id, err) - } - } - if v.lastModifiedTsSeconds < n.LastModified { - v.lastModifiedTsSeconds = n.LastModified - } - return + return v.doWriteRequest(n) } func (v *Volume) writeNeedle2(n *needle.Needle, fsync bool) (offset uint64, size Size, isUnchanged bool, err error) { @@ -223,24 +184,7 @@ func (v *Volume) syncDelete(n *needle.Needle) (Size, error) { return 0, err } - nv, ok := v.nm.Get(n.Id) - // fmt.Println("key", n.Id, "volume offset", nv.Offset, "data_size", n.Size, "cached size", nv.Size) - if ok && nv.Size.IsValid() { - size := nv.Size - n.Data = nil - n.AppendAtNs = uint64(time.Now().UnixNano()) - offset, _, _, err := n.Append(v.DataBackend, v.Version()) - v.checkReadWriteError(err) - if err != nil { - return size, err - } - v.lastAppendAtNs = n.AppendAtNs - if err = v.nm.Delete(n.Id, ToOffset(int64(offset))); err != nil { - return size, err - } - return size, err - } - return 0, nil + return v.doDeleteRequest(n) } func (v *Volume) deleteNeedle2(n *needle.Needle) (Size, error) { From 0e02f7e258b86b12faa8636b8c8538539c0cad67 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Wed, 10 Mar 2021 12:42:44 +0500 Subject: [PATCH 067/284] comma-separated SSL certificate common names --- docker/compose/tls.env | 8 ++++---- weed/security/tls.go | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docker/compose/tls.env b/docker/compose/tls.env index 220642919..126b48e47 100644 --- a/docker/compose/tls.env +++ b/docker/compose/tls.env @@ -7,7 +7,7 @@ WEED_GRPC_FILER_CERT=/etc/seaweedfs/tls/filer01.crt WEED_GRPC_FILER_KEY=/etc/seaweedfs/tls/filer01.key WEED_GRPC_CLIENT_CERT=/etc/seaweedfs/tls/client01.crt WEED_GRPC_CLIENT_KEY=/etc/seaweedfs/tls/client01.key -WEED_GRPC_MASTER_ALLOWED_COMMONNAMES="volume01 master01 filer01 client01" -WEED_GRPC_VOLUME_ALLOWED_COMMONNAMES="volume01 master01 filer01 client01" -WEED_GRPC_FILER_ALLOWED_COMMONNAMES="volume01 master01 filer01 client01" -WEED_GRPC_CLIENT_ALLOWED_COMMONNAMES="volume01 master01 filer01 client01" \ No newline at end of file +WEED_GRPC_MASTER_ALLOWED_COMMONNAMES="volume01,master01,filer01,client01" +WEED_GRPC_VOLUME_ALLOWED_COMMONNAMES="volume01,master01,filer01,client01" +WEED_GRPC_FILER_ALLOWED_COMMONNAMES="volume01,master01,filer01,client01" +WEED_GRPC_CLIENT_ALLOWED_COMMONNAMES="volume01,master01,filer01,client01" \ No newline at end of file diff --git a/weed/security/tls.go b/weed/security/tls.go index b38745fbf..2550559bc 100644 --- a/weed/security/tls.go +++ b/weed/security/tls.go @@ -10,6 +10,7 @@ import ( "google.golang.org/grpc/peer" "google.golang.org/grpc/status" "io/ioutil" + "strings" "google.golang.org/grpc" "google.golang.org/grpc/credentials" @@ -48,7 +49,7 @@ func LoadServerTLS(config *util.ViperProxy, component string) (grpc.ServerOption ClientAuth: tls.RequireAndVerifyClientCert, }) - permitCommonNames := config.GetStringSlice(component + ".allowed_commonNames") + permitCommonNames := strings.Split(config.GetString(component+".allowed_commonNames"), ",") if len(permitCommonNames) > 0 { permitCommonNamesMap := make(map[string]bool) for _, s := range permitCommonNames { From 4bf93d6e63d6e13355ee1cb989e571c9fc6b3507 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Wed, 10 Mar 2021 12:43:13 +0500 Subject: [PATCH 068/284] comma-separated --- weed/command/scaffold.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/weed/command/scaffold.go b/weed/command/scaffold.go index 79f827af5..6893190a8 100644 --- a/weed/command/scaffold.go +++ b/weed/command/scaffold.go @@ -444,22 +444,22 @@ ca = "" [grpc.volume] cert = "" key = "" -allowed_commonNames = "" +allowed_commonNames = "" # comma-separated SSL certificate common names [grpc.master] cert = "" key = "" -allowed_commonNames = "" +allowed_commonNames = "" # comma-separated SSL certificate common names [grpc.filer] cert = "" key = "" -allowed_commonNames = "" +allowed_commonNames = "" # comma-separated SSL certificate common names [grpc.msg_broker] cert = "" key = "" -allowed_commonNames = "" +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" From 831953c55c04e8fca50bffd1c45197ea065e6b60 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Wed, 10 Mar 2021 14:02:13 +0500 Subject: [PATCH 069/284] allowed wildcard domain --- docker/Makefile | 16 ++++++++-------- docker/compose/tls.env | 21 +++++++++------------ weed/command/scaffold.go | 1 + weed/security/tls.go | 28 +++++++++++++++++----------- 4 files changed, 35 insertions(+), 31 deletions(-) diff --git a/docker/Makefile b/docker/Makefile index c589fea83..345eac272 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -48,11 +48,11 @@ clean: certstrap: go get github.com/square/certstrap certstrap --depot-path compose/tls init --passphrase "" --common-name "SeaweedFS CA" || true - certstrap --depot-path compose/tls request-cert --passphrase "" --common-name volume01 || true - certstrap --depot-path compose/tls request-cert --passphrase "" --common-name master01 || true - certstrap --depot-path compose/tls request-cert --passphrase "" --common-name filer01 || true - certstrap --depot-path compose/tls request-cert --passphrase "" --common-name client01 || true - certstrap --depot-path compose/tls sign --CA "SeaweedFS CA" volume01 || true - certstrap --depot-path compose/tls sign --CA "SeaweedFS CA" master01 || true - certstrap --depot-path compose/tls sign --CA "SeaweedFS CA" filer01 || true - certstrap --depot-path compose/tls sign --CA "SeaweedFS CA" client01 || true \ No newline at end of file + certstrap --depot-path compose/tls request-cert --passphrase "" --common-name volume01.dev || true + certstrap --depot-path compose/tls request-cert --passphrase "" --common-name master01.dev || true + certstrap --depot-path compose/tls request-cert --passphrase "" --common-name filer01.dev || true + certstrap --depot-path compose/tls request-cert --passphrase "" --common-name client01.dev || true + certstrap --depot-path compose/tls sign --CA "SeaweedFS CA" volume01.dev || true + certstrap --depot-path compose/tls sign --CA "SeaweedFS CA" master01.dev || true + certstrap --depot-path compose/tls sign --CA "SeaweedFS CA" filer01.dev || true + certstrap --depot-path compose/tls sign --CA "SeaweedFS CA" client01.dev || true \ No newline at end of file diff --git a/docker/compose/tls.env b/docker/compose/tls.env index 126b48e47..e03f42e95 100644 --- a/docker/compose/tls.env +++ b/docker/compose/tls.env @@ -1,13 +1,10 @@ WEED_GRPC_CA=/etc/seaweedfs/tls/SeaweedFS_CA.crt -WEED_GRPC_MASTER_CERT=/etc/seaweedfs/tls/master01.crt -WEED_GRPC_MASTER_KEY=/etc/seaweedfs/tls/master01.key -WEED_GRPC_VOLUME_CERT=/etc/seaweedfs/tls/volume01.crt -WEED_GRPC_VOLUME_KEY=/etc/seaweedfs/tls/volume01.key -WEED_GRPC_FILER_CERT=/etc/seaweedfs/tls/filer01.crt -WEED_GRPC_FILER_KEY=/etc/seaweedfs/tls/filer01.key -WEED_GRPC_CLIENT_CERT=/etc/seaweedfs/tls/client01.crt -WEED_GRPC_CLIENT_KEY=/etc/seaweedfs/tls/client01.key -WEED_GRPC_MASTER_ALLOWED_COMMONNAMES="volume01,master01,filer01,client01" -WEED_GRPC_VOLUME_ALLOWED_COMMONNAMES="volume01,master01,filer01,client01" -WEED_GRPC_FILER_ALLOWED_COMMONNAMES="volume01,master01,filer01,client01" -WEED_GRPC_CLIENT_ALLOWED_COMMONNAMES="volume01,master01,filer01,client01" \ No newline at end of file +WEED_GRPC_ALLOWED_WILDCARD_DOMAIN=".dev" +WEED_GRPC_MASTER_CERT=/etc/seaweedfs/tls/master01.dev.crt +WEED_GRPC_MASTER_KEY=/etc/seaweedfs/tls/master01.dev.key +WEED_GRPC_VOLUME_CERT=/etc/seaweedfs/tls/volume01.dev.crt +WEED_GRPC_VOLUME_KEY=/etc/seaweedfs/tls/volume01.dev.key +WEED_GRPC_FILER_CERT=/etc/seaweedfs/tls/filer01.dev.crt +WEED_GRPC_FILER_KEY=/etc/seaweedfs/tls/filer01.dev.key +WEED_GRPC_CLIENT_CERT=/etc/seaweedfs/tls/client01.dev.crt +WEED_GRPC_CLIENT_KEY=/etc/seaweedfs/tls/client01.dev.key \ No newline at end of file diff --git a/weed/command/scaffold.go b/weed/command/scaffold.go index 6893190a8..1e81d4d58 100644 --- a/weed/command/scaffold.go +++ b/weed/command/scaffold.go @@ -440,6 +440,7 @@ expires_after_seconds = 10 # seconds # the host name is not checked, so the PERM files can be shared. [grpc] ca = "" +allowed_wildcard_domain = "" # .mycompany.com [grpc.volume] cert = "" diff --git a/weed/security/tls.go b/weed/security/tls.go index 2550559bc..59714d103 100644 --- a/weed/security/tls.go +++ b/weed/security/tls.go @@ -19,7 +19,8 @@ import ( ) type Authenticator struct { - PermitCommonNames map[string]bool + AllowedWildcardDomain string + AllowedCommonNames map[string]bool } func LoadServerTLS(config *util.ViperProxy, component string) (grpc.ServerOption, grpc.ServerOption) { @@ -49,14 +50,16 @@ func LoadServerTLS(config *util.ViperProxy, component string) (grpc.ServerOption ClientAuth: tls.RequireAndVerifyClientCert, }) - permitCommonNames := strings.Split(config.GetString(component+".allowed_commonNames"), ",") - if len(permitCommonNames) > 0 { - permitCommonNamesMap := make(map[string]bool) - for _, s := range permitCommonNames { - permitCommonNamesMap[s] = true + allowedCommonNames := strings.Split(config.GetString(component+".allowed_commonNames"), ",") + allowedWildcardDomain := config.GetString("grpc.allowed_wildcard_domain") + if len(allowedCommonNames) > 0 || allowedWildcardDomain != "" { + allowedCommonNamesMap := make(map[string]bool) + for _, s := range allowedCommonNames { + allowedCommonNamesMap[s] = true } auther := Authenticator{ - PermitCommonNames: permitCommonNamesMap, + AllowedCommonNames: allowedCommonNamesMap, + AllowedWildcardDomain: allowedWildcardDomain, } return grpc.Creds(ta), grpc.UnaryInterceptor(grpc_auth.UnaryServerInterceptor(auther.Authenticate)) } @@ -109,9 +112,12 @@ func (a Authenticator) Authenticate(ctx context.Context) (newCtx context.Context if len(tlsAuth.State.VerifiedChains) == 0 || len(tlsAuth.State.VerifiedChains[0]) == 0 { return ctx, status.Error(codes.Unauthenticated, "could not verify peer certificate") } - - if _, ok := a.PermitCommonNames[tlsAuth.State.VerifiedChains[0][0].Subject.CommonName]; !ok { - return ctx, status.Error(codes.Unauthenticated, "invalid subject common name") + commonName := tlsAuth.State.VerifiedChains[0][0].Subject.CommonName + if a.AllowedWildcardDomain != "" && strings.HasSuffix(commonName, a.AllowedWildcardDomain) { + return ctx, nil } - return ctx, nil + if _, ok := a.AllowedCommonNames[commonName]; ok { + return ctx, nil + } + return ctx, status.Error(codes.Unauthenticated, "invalid subject common name") } From 348e21a08ccc52f6837613e7765e9d815850bd6c Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Wed, 10 Mar 2021 14:42:39 +0500 Subject: [PATCH 070/284] add comments --- docker/compose/tls.env | 6 +++++- weed/command/scaffold.go | 1 + weed/security/tls.go | 11 ++++++----- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/docker/compose/tls.env b/docker/compose/tls.env index e03f42e95..a82954c4f 100644 --- a/docker/compose/tls.env +++ b/docker/compose/tls.env @@ -7,4 +7,8 @@ WEED_GRPC_VOLUME_KEY=/etc/seaweedfs/tls/volume01.dev.key WEED_GRPC_FILER_CERT=/etc/seaweedfs/tls/filer01.dev.crt WEED_GRPC_FILER_KEY=/etc/seaweedfs/tls/filer01.dev.key WEED_GRPC_CLIENT_CERT=/etc/seaweedfs/tls/client01.dev.crt -WEED_GRPC_CLIENT_KEY=/etc/seaweedfs/tls/client01.dev.key \ No newline at end of file +WEED_GRPC_CLIENT_KEY=/etc/seaweedfs/tls/client01.dev.key +WEED_GRPC_MASTER_ALLOWED_COMMONNAMES="volume01.dev,master01.dev,filer01.dev,client01.dev" +WEED_GRPC_VOLUME_ALLOWED_COMMONNAMES="volume01.dev,master01.dev,filer01.dev,client01.dev" +WEED_GRPC_FILER_ALLOWED_COMMONNAMES="volume01.dev,master01.dev,filer01.dev,client01.dev" +WEED_GRPC_CLIENT_ALLOWED_COMMONNAMES="volume01.dev,master01.dev,filer01.dev,client01.dev" \ No newline at end of file diff --git a/weed/command/scaffold.go b/weed/command/scaffold.go index 1e81d4d58..07d448042 100644 --- a/weed/command/scaffold.go +++ b/weed/command/scaffold.go @@ -440,6 +440,7 @@ expires_after_seconds = 10 # seconds # 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] diff --git a/weed/security/tls.go b/weed/security/tls.go index 59714d103..7d3ffcdca 100644 --- a/weed/security/tls.go +++ b/weed/security/tls.go @@ -50,11 +50,11 @@ func LoadServerTLS(config *util.ViperProxy, component string) (grpc.ServerOption ClientAuth: tls.RequireAndVerifyClientCert, }) - allowedCommonNames := strings.Split(config.GetString(component+".allowed_commonNames"), ",") + allowedCommonNames := config.GetString(component + ".allowed_commonNames") allowedWildcardDomain := config.GetString("grpc.allowed_wildcard_domain") - if len(allowedCommonNames) > 0 || allowedWildcardDomain != "" { + if allowedCommonNames != "" || allowedWildcardDomain != "" { allowedCommonNamesMap := make(map[string]bool) - for _, s := range allowedCommonNames { + for _, s := range strings.Split(allowedCommonNames, ",") { allowedCommonNamesMap[s] = true } auther := Authenticator{ @@ -108,10 +108,10 @@ func (a Authenticator) Authenticate(ctx context.Context) (newCtx context.Context if !ok { return ctx, status.Error(codes.Unauthenticated, "unexpected peer transport credentials") } - if len(tlsAuth.State.VerifiedChains) == 0 || len(tlsAuth.State.VerifiedChains[0]) == 0 { return ctx, status.Error(codes.Unauthenticated, "could not verify peer certificate") } + commonName := tlsAuth.State.VerifiedChains[0][0].Subject.CommonName if a.AllowedWildcardDomain != "" && strings.HasSuffix(commonName, a.AllowedWildcardDomain) { return ctx, nil @@ -119,5 +119,6 @@ func (a Authenticator) Authenticate(ctx context.Context) (newCtx context.Context if _, ok := a.AllowedCommonNames[commonName]; ok { return ctx, nil } - return ctx, status.Error(codes.Unauthenticated, "invalid subject common name") + + return ctx, status.Errorf(codes.Unauthenticated, "invalid subject common name: %s", commonName) } From 15b018da3443be3c828c28917531e008db955ce5 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Wed, 10 Mar 2021 19:41:35 +0500 Subject: [PATCH 071/284] s3 delete-objects pass OK for fail to delete non-empty folder --- weed/filer/filer_delete_entry.go | 6 +++++- weed/s3api/s3api_object_handlers.go | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/weed/filer/filer_delete_entry.go b/weed/filer/filer_delete_entry.go index 50a669f40..bedf2f4d1 100644 --- a/weed/filer/filer_delete_entry.go +++ b/weed/filer/filer_delete_entry.go @@ -11,6 +11,10 @@ import ( type HardLinkId []byte +const ( + MsgFailDelNonEmptyFolder = "fail to delete non-empty folder" +) + func (f *Filer) DeleteEntryMetaAndData(ctx context.Context, p util.FullPath, isRecursive, ignoreRecursiveError, shouldDeleteChunks, isFromOtherCluster bool, signatures []int32) (err error) { if p == "/" { return nil @@ -77,7 +81,7 @@ func (f *Filer) doBatchDeleteFolderMetaAndData(ctx context.Context, entry *Entry if lastFileName == "" && !isRecursive && len(entries) > 0 { // only for first iteration in the loop glog.Errorf("deleting a folder %s has children: %+v ...", entry.FullPath, entries[0].Name()) - return nil, nil, fmt.Errorf("fail to delete non-empty folder: %s", entry.FullPath) + return nil, nil, fmt.Errorf("%s: %s", MsgFailDelNonEmptyFolder, entry.FullPath) } for _, sub := range entries { diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index 19d85c495..4bdc96d38 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -15,6 +15,7 @@ import ( "github.com/gorilla/mux" + "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" weed_server "github.com/chrislusf/seaweedfs/weed/server" @@ -193,7 +194,7 @@ func (s3a *S3ApiServer) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *h parentDirectoryPath = fmt.Sprintf("%s/%s%s", s3a.option.BucketsPath, bucket, parentDirectoryPath) err := doDeleteEntry(client, parentDirectoryPath, entryName, isDeleteData, isRecursive) - if err == nil { + if err == nil || strings.Contains(err.Error(), filer.MsgFailDelNonEmptyFolder) { directoriesWithDeletion[parentDirectoryPath]++ deletedObjects = append(deletedObjects, object) } else { From bb3af2d70b73a02e79e47ba13ba6178d7fe3b562 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Wed, 10 Mar 2021 19:52:41 +0500 Subject: [PATCH 072/284] no directoriesWithDeletion --- weed/s3api/s3api_object_handlers.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index 4bdc96d38..03b8b3628 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -5,6 +5,7 @@ import ( "encoding/json" "encoding/xml" "fmt" + "github.com/chrislusf/seaweedfs/weed/filer" "io" "io/ioutil" "net/http" @@ -15,7 +16,6 @@ import ( "github.com/gorilla/mux" - "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" weed_server "github.com/chrislusf/seaweedfs/weed/server" @@ -194,9 +194,11 @@ func (s3a *S3ApiServer) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *h parentDirectoryPath = fmt.Sprintf("%s/%s%s", s3a.option.BucketsPath, bucket, parentDirectoryPath) err := doDeleteEntry(client, parentDirectoryPath, entryName, isDeleteData, isRecursive) - if err == nil || strings.Contains(err.Error(), filer.MsgFailDelNonEmptyFolder) { + if err == nil { directoriesWithDeletion[parentDirectoryPath]++ deletedObjects = append(deletedObjects, object) + } else if strings.Contains(err.Error(), filer.MsgFailDelNonEmptyFolder) { + deletedObjects = append(deletedObjects, object) } else { delete(directoriesWithDeletion, parentDirectoryPath) deleteErrors = append(deleteErrors, DeleteError{ From 216de41ed9dbbbdff9d9f3dae7c53bdf225a5865 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 10 Mar 2021 12:17:04 -0800 Subject: [PATCH 073/284] build static binary in docker images fix https://github.com/chrislusf/seaweedfs/issues/1856 --- docker/Dockerfile.go_build | 2 +- docker/Dockerfile.go_build_large | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile.go_build b/docker/Dockerfile.go_build index 64105ee29..1adf0f5ef 100644 --- a/docker/Dockerfile.go_build +++ b/docker/Dockerfile.go_build @@ -6,7 +6,7 @@ ARG BRANCH=${BRANCH:-master} RUN cd /go/src/github.com/chrislusf/seaweedfs && git checkout $BRANCH RUN cd /go/src/github.com/chrislusf/seaweedfs/weed \ && export LDFLAGS="-X github.com/chrislusf/seaweedfs/weed/util.COMMIT=$(git rev-parse --short HEAD)" \ - && go install -ldflags "${LDFLAGS}" + && CGO_ENABLED=0 go install -ldflags "-extldflags -static ${LDFLAGS}" FROM alpine AS final LABEL author="Chris Lu" diff --git a/docker/Dockerfile.go_build_large b/docker/Dockerfile.go_build_large index 39f45cbde..48af3381d 100644 --- a/docker/Dockerfile.go_build_large +++ b/docker/Dockerfile.go_build_large @@ -6,7 +6,7 @@ ARG BRANCH=${BRANCH:-master} RUN cd /go/src/github.com/chrislusf/seaweedfs && git checkout $BRANCH RUN cd /go/src/github.com/chrislusf/seaweedfs/weed \ && export LDFLAGS="-X github.com/chrislusf/seaweedfs/weed/util.COMMIT=$(git rev-parse --short HEAD)" \ - && go install -tags 5BytesOffset -ldflags "${LDFLAGS}" + && CGO_ENABLED=0 go install -tags 5BytesOffset -ldflags "-extldflags -static ${LDFLAGS}" FROM alpine AS final LABEL author="Chris Lu" From 6d729fa74221485ee7d6cfae472c91e0065efbeb Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 10 Mar 2021 12:22:58 -0800 Subject: [PATCH 074/284] Update go.mod --- go.mod | 1 + 1 file changed, 1 insertion(+) diff --git a/go.mod b/go.mod index 3c75a9cb5..f7b869281 100644 --- a/go.mod +++ b/go.mod @@ -38,6 +38,7 @@ require ( github.com/google/uuid v1.1.1 github.com/gorilla/mux v1.7.4 github.com/gorilla/websocket v1.4.1 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 // indirect github.com/grpc-ecosystem/grpc-gateway v1.11.0 // indirect github.com/jcmturner/gofork v1.0.0 // indirect github.com/json-iterator/go v1.1.10 From ca546f47e173a33e0d6503ee0a5add97e2ba6d93 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 10 Mar 2021 13:19:28 -0800 Subject: [PATCH 075/284] s3: escape object key if containing special characters fix https://github.com/chrislusf/seaweedfs/issues/1884 --- weed/s3api/s3api_object_handlers.go | 12 +++++++++++- weed/s3api/s3api_object_handlers_postpolicy.go | 3 +-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index 19d85c495..866d85822 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -8,6 +8,7 @@ import ( "io" "io/ioutil" "net/http" + "net/url" "sort" "strings" @@ -69,7 +70,7 @@ func (s3a *S3ApiServer) PutObjectHandler(w http.ResponseWriter, r *http.Request) return } } else { - uploadUrl := fmt.Sprintf("http://%s%s/%s%s", s3a.option.Filer, s3a.option.BucketsPath, bucket, object) + uploadUrl := s3a.buildUploadUrl(bucket, object) etag, errCode := s3a.putToFiler(r, uploadUrl, dataReader) @@ -84,6 +85,15 @@ func (s3a *S3ApiServer) PutObjectHandler(w http.ResponseWriter, r *http.Request) writeSuccessResponseEmpty(w) } +func (s3a *S3ApiServer) buildUploadUrl(bucket string, object string) string { + var escapedParts []string + for _, part := range strings.Split(object, "/") { + escapedParts = append(escapedParts, url.PathEscape(part)) + } + object = strings.Join(escapedParts, "/") + return fmt.Sprintf("http://%s%s/%s%s", s3a.option.Filer, s3a.option.BucketsPath, bucket, object) +} + func (s3a *S3ApiServer) GetObjectHandler(w http.ResponseWriter, r *http.Request) { bucket, object := getBucketAndObject(r) diff --git a/weed/s3api/s3api_object_handlers_postpolicy.go b/weed/s3api/s3api_object_handlers_postpolicy.go index 044e732db..383eac943 100644 --- a/weed/s3api/s3api_object_handlers_postpolicy.go +++ b/weed/s3api/s3api_object_handlers_postpolicy.go @@ -4,7 +4,6 @@ import ( "bytes" "encoding/base64" "errors" - "fmt" "github.com/chrislusf/seaweedfs/weed/s3api/policy" "github.com/chrislusf/seaweedfs/weed/s3api/s3err" "github.com/dustin/go-humanize" @@ -110,7 +109,7 @@ func (s3a *S3ApiServer) PostPolicyBucketHandler(w http.ResponseWriter, r *http.R } } - uploadUrl := fmt.Sprintf("http://%s%s/%s/%s", s3a.option.Filer, s3a.option.BucketsPath, bucket, object) + uploadUrl := s3a.buildUploadUrl(bucket, object) etag, errCode := s3a.putToFiler(r, uploadUrl, fileBody) From 42d7e6fae674d2cd0ebf18e73943e1e1d2ce009d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 10 Mar 2021 15:59:44 -0800 Subject: [PATCH 076/284] Update SeaweedFS_Architecture.png --- note/SeaweedFS_Architecture.png | Bin 75867 -> 92326 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/SeaweedFS_Architecture.png b/note/SeaweedFS_Architecture.png index de27a5f534b06b034a6b37d683ee20482e394486..3d48158274064fa12134d1e2e47d3457e72b63de 100644 GIT binary patch literal 92326 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 z ul`6-D!SCBZlqBWA^fAnYlq4#-rVDCgLsA>bO7-mG_S^hL4~YfWuS!$e|M% zP;2|3#zyO%0fz}6ZCGv7QJ%o-;1K0&BsGe1Mt^~j(&RHc&F~a@FFPj3#mVjz72o+Q z_dnb{x}ySc-dt>}&)Y4@lHA)v2xZwO4gi3#-zDu)G->RlNT$0mWtv< zMrK1K8`QcsgjXw$z{RoJVl`?s*iPRYoPjNBczc)sstj9%KJZ3P)pD%1FE3799a{f! zS@F;Bh3>us6`jX%VC%kzAY5db`S)KoQo{NNe_;tvekRy7qCBjB8U&N^vo8lwGBw~W zBU8q#gf!T_&@AX4i)ELtJ$T_u{Ss8#XUdm#+RN*S^Ck_3jjGw1bwZg*;4zJqf+sJJ z9jw%{6mr8KfTnK&P*2RLbG3d$Oh~kL0BTMrJ@;G)Hxsd=i0+!GH*?D9w%1@cbbSGO z`+c8cbg2dSxH)eVQ>ARLz7%)}W!Cyuc60Y1WIg%%Doa@G2^4b9L#v~1h;emb8A8>I zO{dpA6vdXVuQC!&H7BzWbk`n|>h%BbtOGBXU;?|c=I>l1n|`ChEXgSoYJcZ?~$ z4GUhX0i~mRr64UPRDQK)fUE~GtCNioq!4vo!LC^k#eoO+?$vidiR%jZjHM7!Jahgx zt=wv-vCZe&kV%S{UtH3=`I3afd+L{Sdif&chOA-)l4ioX!Z{Th=|k&QnvVzNR4ol( z+wri)k25yKZD95?JRLNB;d$TuI#WxG^2L?v!224-N8zD*sUcu-KdJhF)kpztdTEH$ z(0=vzLVI^%&al_l*G!iLV-@|Olx>?Tw?&mPDk&;sr`W37){Y z8y8wteoRbE#L3Min^-*%=Zz5ha)Q5DK-+S3bae88dUSHiI^WWjRd1%;3nr01S;F>V zI}?x0X{yMgZxpKKSo@__VT+3tg>8^`o2IBP-+U zMYQZjPG1P`a(`qZ3UYegN8z0Jmm`Is2Kq~(xD`<4*M>qUuG#AGGWswPjF82)k4o

      _lZ}=2Mr1^U9Jm-V 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

      DgeA!UM@`dQm@=9| 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 From d91964904c3365da111aa195ef8f6d8ea0805a36 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 10 Mar 2021 16:04:16 -0800 Subject: [PATCH 077/284] Update SeaweedFS_Architecture.png --- note/SeaweedFS_Architecture.png | Bin 92326 -> 92018 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/SeaweedFS_Architecture.png b/note/SeaweedFS_Architecture.png index 3d48158274064fa12134d1e2e47d3457e72b63de..f960dc3e190da1e2917d5df243fc5e7dc5ad3b5a 100644 GIT binary patch literal 92018 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

      CLI{BS*m60!*>dKyl@Gk^hhDxteD%R>u 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 b#BX8B&5MnxU847(;Gc%7wo2Yf%bWinr0kbu literal 92326 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 z ul`6-D!SCBZlqBWA^fAnYlq4#-rVDCgLsA>bO7-mG_S^hL4~YfWuS!$e|M% zP;2|3#zyO%0fz}6ZCGv7QJ%o-;1K0&BsGe1Mt^~j(&RHc&F~a@FFPj3#mVjz72o+Q z_dnb{x}ySc-dt>}&)Y4@lHA)v2xZwO4gi3#-zDu)G->RlNT$0mWtv< zMrK1K8`QcsgjXw$z{RoJVl`?s*iPRYoPjNBczc)sstj9%KJZ3P)pD%1FE3799a{f! zS@F;Bh3>us6`jX%VC%kzAY5db`S)KoQo{NNe_;tvekRy7qCBjB8U&N^vo8lwGBw~W zBU8q#gf!T_&@AX4i)ELtJ$T_u{Ss8#XUdm#+RN*S^Ck_3jjGw1bwZg*;4zJqf+sJJ z9jw%{6mr8KfTnK&P*2RLbG3d$Oh~kL0BTMrJ@;G)Hxsd=i0+!GH*?D9w%1@cbbSGO z`+c8cbg2dSxH)eVQ>ARLz7%)}W!Cyuc60Y1WIg%%Doa@G2^4b9L#v~1h;emb8A8>I zO{dpA6vdXVuQC!&H7BzWbk`n|>h%BbtOGBXU;?|c=I>l1n|`ChEXgSoYJcZ?~$ z4GUhX0i~mRr64UPRDQK)fUE~GtCNioq!4vo!LC^k#eoO+?$vidiR%jZjHM7!Jahgx zt=wv-vCZe&kV%S{UtH3=`I3afd+L{Sdif&chOA-)l4ioX!Z{Th=|k&QnvVzNR4ol( z+wri)k25yKZD95?JRLNB;d$TuI#WxG^2L?v!224-N8zD*sUcu-KdJhF)kpztdTEH$ z(0=vzLVI^%&al_l*G!iLV-@|Olx>?Tw?&mPDk&;sr`W37){Y z8y8wteoRbE#L3Min^-*%=Zz5ha)Q5DK-+S3bae88dUSHiI^WWjRd1%;3nr01S;F>V zI}?x0X{yMgZxpKKSo@__VT+3tg>8^`o2IBP-+U zMYQZjPG1P`a(`qZ3UYegN8z0Jmm`Is2Kq~(xD`<4*M>qUuG#AGGWswPjF82)k4o

      _lZ}=2Mr1^U9Jm-V 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 ljusfL3-fyV|2gJwNu%W&)40z%^a%XX*3dul Date: Wed, 10 Mar 2021 17:13:01 -0800 Subject: [PATCH 078/284] fix error printing --- weed/server/filer_server_handlers_read.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/weed/server/filer_server_handlers_read.go b/weed/server/filer_server_handlers_read.go index e210f4bdf..892a732f7 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -156,7 +156,9 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, } if offset+size <= int64(len(entry.Content)) { _, err := writer.Write(entry.Content[offset : offset+size]) - glog.Errorf("failed to write entry content: %v", err) + if err != nil { + glog.Errorf("failed to write entry content: %v", err) + } return err } return filer.StreamContent(fs.filer.MasterClient, writer, entry.Chunks, offset, size) From 6ecf5407201f803e2bf260325faf0deb8629c0e2 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 10 Mar 2021 17:17:06 -0800 Subject: [PATCH 079/284] Update release.yml --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0681f3dac..2a5e66a6e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -40,6 +40,7 @@ jobs: goarch: ${{ matrix.goarch }} release_tag: dev overwrite: true + pre_command: export CGO_ENABLED=0 build_flags: -tags 5BytesOffset # optional, default is ldflags: -extldflags -static -X github.com/chrislusf/seaweedfs/weed/util.COMMIT=${{github.sha}} # Where to run `go build .` @@ -55,6 +56,7 @@ jobs: goarch: ${{ matrix.goarch }} release_tag: dev overwrite: true + pre_command: export CGO_ENABLED=0 ldflags: -extldflags -static -X github.com/chrislusf/seaweedfs/weed/util.COMMIT=${{github.sha}} # Where to run `go build .` project_path: weed From bfb4e3e5cb485c43935d5b9695f257fce515cd67 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 10 Mar 2021 20:46:18 -0800 Subject: [PATCH 080/284] Added SeaweedFS_XDR.png --- note/SeaweedFS_XDR.png | Bin 0 -> 48412 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 note/SeaweedFS_XDR.png diff --git a/note/SeaweedFS_XDR.png b/note/SeaweedFS_XDR.png new file mode 100644 index 0000000000000000000000000000000000000000..de1b0f358f4ce06769ec652174ea703c1c2c25d4 GIT binary patch literal 48412 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 a%Nq}muj?}z36pogzspK$7jhJDJpM1fw7a Date: Wed, 10 Mar 2021 20:56:40 -0800 Subject: [PATCH 081/284] Update SeaweedFS_XDR.png --- note/SeaweedFS_XDR.png | Bin 48412 -> 63281 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/SeaweedFS_XDR.png b/note/SeaweedFS_XDR.png index de1b0f358f4ce06769ec652174ea703c1c2c25d4..24e468a62729e0d6461d6e780227215084c157df 100644 GIT binary patch literal 63281 zcmeFZX*`te8#j)oQj{%JN+K%z7~2$CX0eX3j6M4@wwW=EWyTVfy+n#sNGe-MWZx=E z$xb~oK-uz!Zub$7ZK54FNuIpTm<9jUUv4}A=(Au~6@Lnb+rhPiv zNMj}@2%U+EMUizExT6wEm}X+y8$m%?PzZsp?p`iTqA|m$C zCk=0JFBfwcM?H721hfK7NgAdIZlBWA#$ohDxpHB7i$+ zWo2nuX?d8OyfhTfSiOmZtAmgGe}-Y)bfGxl|JjbeslKkep{|FXhPwhyQOns}3HN&& z{w_Yg?j+*x$Ds1k;P3A*C{%Bk-*@ru6gNLd#$6Z+Q1lu+H| z#gTMzMhY-pMGvh2D?bc)*vV1TRW{I=Xl9BrG%$tXJoN}PBROL$-9Sq-9V=r?7)F!k zrv>%U()Ix3TAC}E`e|GEVR0T93lv^g*})S=4fLj9yrJ#{IV)c?H-wRus{<9~szt*o zK&|xM3RF}u1gO+>0|Vkc-LY`A2g%G)N5S99D3EMqpcH6k2`5nu zHK~CFf)04b#lXoNtEVYXF}GmA%fbg`rK9WZtL0$fZa^{*RB-pf0W#|&T}-`kR19Ma z9wwS-Uvn>cf+NKTs_E$s4Zvuj@fZu364t`Q1nT3!AQ-`w>I3=FFm^NsL_%Xc@Mfmk#$I@&5{`hh!T@M%>Y>R2R;~eZ7Rn6LU}b%@0z4?@jFH?; z33z=9L0R9?3T0{`OH;7auq0uOuugi$Kw8mQj4aK`Tg%hZ*dfqJR#wAb*AN9W(NqkS zcXifP_NU@>jgj7FFpROUyt#!u7VnC3b2az$@i(({v{2U3$GX8xD7pba<)ED?C@2kM zu8q?+!v@HjqXTf}7=H@~C7^KpC?p4OPqYUWEQql@lAoprW7Bv!gsYXDF~x|ChLWue zb>xh6fbgR|^l z@?HpYEHV(PMAo4wVmyG1X?j^&x)2@Ab(LsTMFYcM#K!=2MbgrzK~VsK?!H(Dw3Q~@ z%n@boA*ZE-HbVvyP2Bb5P*8tEcLfAS3GSooit-@fO`tAlsE?~WQXYd<@S-SF^c84$ zBnho#$yiRHBNXl7K|^_K5Wtlt(0ZCEKv^`w6odCiGp=CD;L;Cf0&E6a-olvTg*Nur z^HWeT_i;yQk#s2DBnPx5i9mpPKwT)#o|S~|}cOYRL0(~v9Zd&qk za!^kt@H7RdZ$R>PG&aIG5GY=96c;^hS;IhI19w?vUt>qA51!(s=Zc{i>G`2GO$~7v zC!(^G0Y)DRHBi*^BDpFs5J%M~p}oujoQ-wSmJCcFJRB_u9(VvT7);Ak)=-zAtV4B% zYlE*$<%tBCg0oVfyS#@N7Osg8AUON@y6Bo>y^IX0x)ci?vJp;)AZvov)By?xZD`?% z!y@rsP!d7TnXKqZQS{UxY6Fh~twpk;8bS4t2L3n=C7L76Nm*Z)Lbmj$1VSCC6kSb( zyb=)~5P%8LM9EqjD_Y`>{fvM!qv?e<^u(E)Ia0OJ&W65l7ho^V+;o9pqH(^;I?m=e zV-pPu8taR*)PZ|41PN^gM>)A!8v5Z0C}V`5vX4JO%Mhlg>*3~NXlfj&)eQh8pefhj-U<^Fjq^Ab|^n)fm{PPn&CRVGWzCEgkSHpKDsO3QspAhfR5FnD^VQSwgzHd!Otn0XbzBW$3Rr}@ zixnC}Mmw29HN7!77?A-@MKVgm0vc$Aq7tc$q1_2UMvRRujd8l}-hQrr2p1oiu0Pn5 zo{=Vy33PxH!>xfaJd=O@p#eRYp0>L3s>J3b{cJiVQ@N#Z)mHbSV4Ts0Aoo3m)>%ak7?kf-tsF23>J%$=P z19al9`)~X93)Z>b8q~2-9fV=iO0*oR^5#N_*y#|unQ3xhr+AFE1Q%RVMrK}{%e{io zUv}HN%qzFbZ}#KfrlzKe8t5fUAtq)uuI9G3A=|p(RViL^oJB@b(o$5k4FG@w?v&T!~%S;zNIRRlxkQb$MY| zo~hpA($YiYhq~93lAJo&BO{q08@l%WWrU~honog?ok}pxH+%EcrN#O4i-WU0odnk8rqyS=Y3wZbV|? z4GFEQF{JyE$2q?zsF$k9%gB&yH8h@kYP>~YqJvV#Cnju6&Yuq+na<8gAFTA99PBG2 z#Dz_Mj(dya)ZWcfHDZu)&PEJ#d%3-zRBv-PEo~Fw;P81&cv17r&nS*xBw{RpiKURc z;)I&o_U&)|>!sO;ra~Ge%@7mjE9B8Sc9p^P=JQYgV@730#n`DwH5Hd0~6?ILB4% zfqdhKZ7;>p}Bbtmsx`>n6cmJ?fVD>x~6^?2vb?|Y^GXXi}e z6|4zSuOi~20G&Blr_2T=3M*dlQ{7ZXZJWT#PiqNM#~lz+`wIYU$C$+*{gMs==31L_ z(r}%CYkRtC_Pu-evZB4>3r=D+{t+Lr+@H6Ys5#dzU2^Aarm)be=Uh^3%C=f$>hCUn zvb*4?Ybtm+zrtJr;F6XiZF6|Pph|_~qum_aU=`ck72nGG6|Wsr3)OLOaIogGoVU{} zX8#L&p}pZAR4TQz%KuxRcgH=A@yr@&&ag1jo*wGd=!+LGoJRh=>TSM>9$%Av^vv_-Ph1LE6^pq*CR|N9#9; zBuyPWkTfMS;i0s*(a>Y!IQ5{miY1VcKj#`}W#w(T}++2m4RC#0Jsa z+-E-)v>$~!B5(FYj-6(#cK2g1yX6uFn;RqFYP zIM}YXt)R=P}JY}qXBX=zc6$AcjZd<|0BPH7&t9?rkK)+Sz4z&O)R9G2YL4B@ zOEy3)2t#V#A_BPR;^u`lYfb!ikIC<#uTMBCg)kQW^LoR(RM^C5oQ!P=&=;y9?n3B4 z&;}D30&!Q6srxx9IG%ZEgL~u*N3In}MALg}9GWZRC)o2T{-pE`e$34$cGr^&m2 z5aOb;9{G>ftUC_Ka>vk~73^G*xmNX48{(LM(ASQ@voS%Hm6bb5H4A9L6t`P1S}VX> z#rI5QKEh{&_&XRG8HI{}vnT#Xe7CuTI3@@{DnF!#@l$h524=f~_0xJCf7DtkEpt== z=$u|i8+`JvAHYv)daaUhiOz`Xzx?6+z7uE^yUWZXVBbj){mIO;jkPs3HI>&?7PU*- z($3yljw)tg;=zrE2RcdP0IC`078X4!4v;xzRbXh`q-{%zq92axixdDdW{+dtG_xKQ?GO)`aJk!ij4g*YlV0=V*P~(jwpsj7?f+ZBW2Z1bDysAWN3kwPc_Q zuSrQteoclNjGg*3!1p}>6d4c}7#I<|=hj<<>A;<{UOi7-3#^_kb{!XENM?dAONndi z^>ZO>-nnS;OAQ16!rNIAY~sp3)p&$Z7USI#AYvP@Z=5#yk!M{_MDKV-1(Ymdm9#F? zKjZ)P=OpluJYAC~1KIvat1%Xc`wFyy1?b%%mPd;nkN5J5d)-zd4b7S6&pb?&XK*Z4 z!+vvZ<-=pklKOJ5UgOg+l~;Oy#A4(apukql&Sdc55SQ%DC|4Ieo@7_%W$ABV5Faok z%LDcret^gOJi=DG>5=STd1zJ!Zyw_JIRXqkvJoekS3Z&a_Z#Fm?8Uf40BdxJzGU7|(DN(*(neh<0m4aVIiz?6 z41ZnJUYG+lpr~H26houb+ww~sug zPPt2o)?3;v8uAavr!95pe5hSt^=VHFs8+s2N2D_BRLwOJSe5?BHMOk-wl!Pf-d4{y zpE*`;#CA(mtL%6g!P8UYpA`(Vzj2`5MpT9)M8o6b<3rloVtn1|7aM?8`bQrCo7kv2 zp9;&0gFIGQ{-F0@AoF&V?FrsflH^3^o9Co>gNL2H`PZOW|SL({%c0(8D_No z?jf5K!0!`&ryRBB+Tpp_es=iHjq+v$Vv3VK8XOZiU9f4Fx#425%W`S; zVY_zR;}Dig6hB$!k}d8$h${U;a03ar2OE4`Ut>}mqyR@q%?PJ2E~C%e*HxsX-hSh6 zma1Y{U{xN{At##V$m?SlZp5DqNcJ^n&xZ8zj3%D!eOjh%TQq3>s76g^zw$`f0W0q9 zEb=VQ<9<{$=$9((O1sYPP~jUVF`E>`O6^R zB#HQ*M2&>+K6b+$Ua#E}C2inwqhQEMlE+6{fbSSnE{qO||u$gwQPCyfkmhJQz(;KIpp9;}+qj9PGd zmq$Rf+P-%}`DPd!A+^Epw}Zd`XjG>X0J0A-F#>P@tUp&ItRm&ik9T(=z|lN0QaRw) zoxL@a78h!v&v3rt%(+FlkKcQtKYTra zds_F{4oIYHnwW%np}g$V%Hv%0cf~HwfAGi|!89sZq%E{3A!_ZEm#FAsa3yTKd^mI| z(daz}%J8{RlWjcbL>unU6g3FVtx5=5?D(V5gAJI-?UT$eYMLR&Ghp}B9YyGGNm z4e9B}Tw{v!2(HmryIO(2Ej#uHjp3!jVEtyF-yOk&R}OeKsy3<~tBt>PU5J^l8}j_n zOk@R~Rr2NE{VtyX&!>|yK}C$`9sl?I|LF672@myBdG!XVBJ%-NwK&q5df(~|xm5v6 z#m~Oe3oUFyqlN)re!O!k0zKRv~!z+7+AteK7ssI9$`RvFkQSHQ_U^JvGU$J zydtV%GV2qU3HOPSPpD^Y?pnItJ3POQn!dC>`L-yjE^!zyeLa4RnAo~gzbHt3^Cx8xc3}$eQZ$LaIK9;#s@iZ`^MUw=qqaX<`bfw4`oE} z`B!rS^ZEiP{RIQabw+gaMdaUwaWsY<8gKB4XVe``03&w1#KkAA<1go3FM{1mS9!!QRiPH!0Z=?U5sD!S9 z=^m23J9`xt4UbKL166d;bWM+QEGg6m*MBZ3;%iXwQrZi{Oe@h|Lc53DSnT%O#d7?1 z&==dDvh%$2%f7txGk)%(5@MlJEw9?I^9q z$R94aT2o4oFkZTa_E~&T{rI?Ute$gli>GL{X8c|F?B}DSLwlS^*VpjnKWvz|=)wHl z>>xbx4`D-r?wy>RvbWCtrSE)%=8n&;PWd(7fb99{XQVpwTc^+N)H*Wq0XJm-ZuR*Y_N(K+eC%V!*QFEVzO?3aml@At{?Dmp!1T5b6QUYPpz zea(;o^6As3<5N*VZzgxxCd}KdSx9e;O+aE&zX83PER*$D56d&mlPh!UfdGbHb^ohZ z!zorcI=rs3#%i5=4`F!Uam%$)t;Ke`*@wL=Hjm$`Hr7Jyl8vj#)`it7hd?mlA78Ff z12|RtEmUTH$221TLz@Sk_xnah$6P+-2DIe4vmwh@<~lP|B?XjBT!-a!tp?uPSPf9m zjoMzE*Rcdi5_WYL?Z5U(0C2WPdErJoi2tvh5@I0h9PKDnRD(t1JWj285e_7F=>n-m zYT%T}QnlWC;wRlp>95~B8fKdq6Xa-ldu{TY(1(%xV-r1@n+19bbrlOcEzc~9lud~J ztV058GbyYe`Io~BTC#$21MyvYKO22|54Uy;NN1h9l?x{@<~g7U+|kC`g)s$^;wO(!Lv~iB zZl7l$Jv9;rJa?1!9gg#O3K{%%%$_U*aSWGQ%9SZBP*QK_3zfIee)+ zpzwU9T;yx+pv!mL?%b7*zRMGowe=}ZMc(qF^bf6pC4+(LCzB{?wDh8(O*JJ^+NO;{ z5cK*H>HCz~$q18tuX?i+1Y4L_Umss=C8uy_{S9W99{0|U9!R{WWP*B-rbE8=@A$#^ z0E!3)cr|Vlc<8)zk57eC{L53H9USTjUpe)P?GZ8I;n?W+Ft85)_{dxaot=WQdLdW-r8Dg090ue? zAGQDVdJT!=lX}`%cE)e!!~qS}*@Du%`VN+r4>^f)l&K}TkXP&=+fp{*v(!r76Wk*? zx^wcfZJ6Ad;+!gseB}a*^c*}*?K$6Cn?yu2tM$~K)FV*ZUlmd+EQ>-KTp4{YD!h1q z^Gg1xAUsV8Zo>($-jovI@Vn#2J$8I9l?No3kI4`P^DNDFrkM&vRRWvm$<@6s5 z7iPETytJ@+T=R1y_9Lf-`Ol`4O$S7>m&CH!gz@F|%Hx?t9*m<31Kg^-Js&~*)ueR! z>kdNZ(&F;)3Vic@eSfKYXZ++?DIv%1-&z1JdTG*@n8Vc4OQ7cpMocngtk~@CJ)zME3%+!zhFo`-N#fBk$)vaE<9{6ZOuex z7k)A}I=#L8Jtr)o_*UfnK68v^_9e&sIW?ejA74_O*Kf2 zxBt3z>-`zU_v5ehe1W`XKa*OVPQI>9D3w|axp4&ZmvhW^+&!&)%eXGK;of_^M@ezo zMY1iQdS9fcmrQz%XF605H6z|2LRJgtB}UOfxmB-8Q;%_{v`((Jt*w>bI!4U&N!y#t8_lEB0rx0#@e9KLLvU-6(WvVywvy@;P zv1m_p5MT_khMkM9nc#7z?CZyC>T`Np3d3dN%^w8*>bARKLy-b`T`e3XUzE70FSg)l zTy9lNUhZz? zTRVdmvY6sr-Lm=l9~o2zGI;yAQIYYjUbVi9L!7UNXFpnJS7hHGR(M!3n_Hn}FloSG zZtu4u0cuV^GU*@(Sw>+reQ$u3$7B4cduQyK&4A6xmZBOD)86S`R!|1gTYOXL5E(n! zv9u)^w6SMavc4_tjAi%5&jpWxnrPXQ!bZDD-c9=X7X9_@Z`QUjRPmg*mV#XqtNh6x z&Ee`diI0^2C@fh6bq;Bc7}~@OS8KO88bZY4^8xzu-C9J;lP(woezibfRF?D)^DP>d z$B01%N7DmFZHMbp-rnxsw#~_8(*O$Nfl=0_f^X$XC$VMX^yT4d|89?O7s@B_cWOw;weKD%m$mI$*H)D-e4*YJH17PBFiJhr$rZ3()s}(Xk77UUs z2KHjdvzjIOn#A+&OBn{Zdl6YX5DI>|V{`LtJ7% z8CD1C!Zh~x?0Jw?{u!!vh$}tKC5~3~TGl{&U{**t15F*uso=j<;BrpWAmv=8@6&nB z!0jCZf+q&e*iUl!33#!L5u^uBInCONt4WG+_}L6tm%0^8TGhB|Su8&q=rHStIJ%@g zH~;8zusA-~f4VX>u~F5F53Bt8aK1&x*@fk#2U{;Ebqf5W8v7z9*|{tf{K7XVFFhBZ z_w(#)wRg4PXsk{6eDz3oaJNVxte0=?)$N5FMt{PQwT)VMfTrO=CPntytFD&6eJ zSKL5n##yJSu{;J!F$Vm|HfT*8SyfZ;Fu!ybN6{LkZXb@U`T$eV|nGdpTq z(aHa#M*HnrK~#T&u0W9_nd8o2oTkd%q_heiNs{8V|vx3ZkEptvde zrSIU`N(TR%v{fTtk1{|o|2pj6JD@3(M5k=GWk`V^fQ#c@^$ zNgHaE!h7f6f#}?+qu6Q5N$KnpXDpN7EPs-!Ec!GpWioW<#O@>B>T(F`&?k_aK2e#dch{Ewy;l zFVK&r^TW=6RAV^1uy?G~OxnTccvU?tSf+J*%dg{I-+J&>bG`(lf-IMNjv(VXLRm1`bBwK;hUC+~({A5ZVa?XO-rZyw_CWD4?SV5#Z= z=9bK{U0)y9Cg4FlZmR2T@Tjo$xTnD9+?(-I)h$VPqvrl~N}P9v7nbD&ctHZR`tIB2 zN&nCUPOk4a>s!}VmP?aPlt{iH*l@E zv9gj`!SDFKk8f4_^v*Un>#6lqF5hn*{MUG>@hA`Tt;AokA2+n_vcBcGn-iRz&Ij!@ zNsh9m#f+EsnD4)kpwjisJ{g)IxM!s`Eb-}Pzv<%Ql8iPeKB~R-aRm;TmmU|?nT<`E zhMn_0YT&-(hw^qX!&Pcra^X-@V!D$RCBfD9UhC>+%=PQsl@syda<1pHj$d6FEOK7(O?n7Y%Rciqmrh9Nr6k%bg6wF^iRF5;OsVR` z{nvkfFlsGtov1vt|6g8@aCO+R+e!(yirm_IAT_f&&Qq?!3*5f@TB?Z*HSSB{E>>Fr z$IClc4xKgIKbKE+)9cNm+AMbTaG^tdv;^1M%%28MIm7AaTM?H6PTc4;;-R|fHrBd# z;*tCAS#zB40Q(pfR7^RVh*YlTb(&OG+xUK|X5q`7#m`r;6O#|sn$-l9Qg4ZgydEg< z5zYNH@+Y1@-mrs%U1c}eg2pMU`65lb*Q~w=&LHcWb`k9Vgu6F%)H$|{jfxy@QLVi+ zueR`_rR&EgGK7IqQjS{e;OX}er1_6Xldm*B zM+(kVR!o|OjU7Fi`nEQ3(r0#+Qr;_N;BqyqUMI5>A=J!Ed&mXiq*aLOcSidIa7(6F zzCReED4jPp~?3yd6ey7}By0X5rK*FL@ACiO`v4NG1%8e&|pn-F;V#f#G4VhQ4_hJ(jvCL*Xm;-qG#D{0m{MxSK^&)jCYTo{1n zd;&Ymw$xdZW4@ zHyLS>#&f=OLWF8CWf677Mp~nP4uKn*>iJ8W{iJ6e?Y*H-P_@|`j$TLn0~v}ObxmIw zZc|ag4{3X^^PNF3kjkJ*&!wVpYg2dqM)s`+DhD}nm8jpNu!!-QW_*{P=Uk1Cw(tCP z1`2V6G1BtCw)O-TerCUs%vtuffU+EVa9Ac)eC}baiOQ-GXL}LQ%egfETl_4?8M*)V zrdpvJ)4PgGm7^7xx+B%|_S~|-nS3+3yo!AiQMaU9Ot>ty+`63k?G}VtjXUSGaCuyG zXt_s>HZPaEq;P#)^pfFcP;YztTf-@?J!x0rw#Z%U@1b5GOc0DvC)IT8s@5_q)r1h@ zXfms>`Wp8w;08oEt_q$in?U0mc{sf}GkeZg0H>OF$uNtEl3)EGIE z2EnQ~fGP!Q&g5viCGz35^mi-~t;IaiQNCZZ7EeIlaWddk+_hpP^AuHA#)Y<>?s-~0 zu#$R+ljXUXAr=|B*H?p-MLaFMGdk$`e(8@0p$JHPDXMl!r009F)J$!f=DI%STW$sZ zZH(L4tE6K)$#I^Xgm^yKxu`Jr-;7W-UCeI(`A$Cn=olTSQ1j6BuvV8SNv^i^T8KU* z+?W+`X2-5-a8$7|jvdS*WMU<50z!mopXFNZV%C)SUdoNNj*mX_?Wb3G^y6pS`V)dA z4nTsKu&wKu^5Jye&o5)ja0x2NszKVDRNKx( zZ(aBP2x{(Cn37ZFa|nO~2I#X(3Dd zemHZ%TZanit_Lhm#x$o2-}g1+;VS4bJ?`@$TC#ZE?CH*^4#O5CvMChb>48!WknJk1 zk4t0@1K5sA>dbayv<%Y@?Am>!KW%F`!c`lGSzDU5r@+wbfBi40&xIxSL+FI#4EMF4GnG zGPFXTjNMlIdYFq^dcZF98LBv8>e01=a+J&_T>v${i>tR~uIR-u?BSJ%EDzJWyC1R> zH&Ns6Tt?NQoQVlNMb_8ooQVbTb+mJn5%FsIoZ0usNb&U`_EIS0QkUiRUV6EBZ!AZQ zcD-@Bxxn({mqjX9&YEa65LmMN?x&j^^VBxYM}^jbb>hl>76M5ZrGx@R^qI1)ZrfJLRsBK|K4I z)8WgWvJQG-wi)yg#2C?VqavHdzVzjSX_v=w;o<(mvrV<$hr#Kh{8gY{Q7C<~M~P*4 z;+DF^jOI<`1cQUT%cZqmY$5BHV}e{zo|$92975)x)>D%C*K93(o~QG1~3g-5&utB2WA*DJC^OcR1YTL{mbF7_$4 z7e=de9Jier&R5&!;!@qEUak>EJp8e}v?|c6s?Pc6O@9cj=YBfTiGx(7YEwS!(M@`! zh;32@wy)?A)$Lz#{AG(uC8_Tn=eGp>K>?$27W(P~arzVZ+U%YG)BY(>WX-19iZ7>e zJ->e8h;T+MJD`9__%AVS6kgsG85b0S z8ecv2qy*($J$7htE~wHbrrZcAT~kZ^t#Oa8)+(9YD1EadWA@HoQaJ?N3}aWL|np39kHpx`1`+g2Xf9 zB6mm;uA}o9FCA9P(9WHx3xnKmre8?VFE;$2im4=8_gGrV{+i>*IPfG%M?TgY2B5s{ z_VJn(p)Es&3^R!crCM!uiPfCKHwpa0mj);%1D#Uy21W)FENn+4SAr{F#jDNM&yuv# zMs0t7{PEbJ@IsYiZp}%%<;r%Vq&KTG^gm`daey?u)UKcs+TrjAa#d`~}r{ z(p@K&0;aAdR=?V*iJw8L$2v}P^Wo*4p#z8ep62&|b>n0`!>rU)yZ)^pyI5|IjXDTd;5fSo7mDR;Z^HTxrPA)z zo3TWe^?WKLb?&=b#812&m+*GnWIf!QT$CR@)tZsXN4%6S`txeEa+4-L!d^0TfgNIu zQE$J8WB7V!$Gm89{@Pu>vGm-sUYVt!Uxt$7?0S+Ciw(qz+I=`0eT4}fXoIQCtB5xj7 zYOW!Ja{=-{&9_y4)F~n^DD$oA1Hu@84e1s*7wrGFz$dqqg8iWYVo#;^nXXt><21w;x+m>^Ku+e?*C2oH4UM z3^7It*&z#`k^(-?$Cea$N7LF0CUT#4&o9w{-?kUc@Y~8OcKsJNr$%ir(Q1EZouR=|IqngICxt(}FRWtQ4EcGrgf=u}86RpuE{KeNEWNWi z(V_f{nE2duZ?O1*$UY`6YR?t|&y_m$Q(xlX$}Zc(kQ%Xj!$pP<(?hlHehaeh3hMLB zVmWtg)YgLO(ydMa`>+cnS+#u((}BG3Bs zYS^98^tDG(^D?K#HqM58G3R>UBCmPTOn5Xs-Zv_G;Lwf^6V!O^lgTz-u3E2`y_A~j zms`?CWNg%)qMSd8M%uOIq#qA*yMb6-6-zG+`h6ie4OFlC6%1Y zqRp16^R7{02Nkk)aqxnk|@2;qG5VL`}C>NF0 z#5dx~Uhz>(?V7(%It&$Zt2jq&OZfHDv7$zN=1IuFaeGH2zt>N%97B~ax+{QCulB|m z=jz@5RXM@KOhWcy4XMJ5cbx>h-C|X^EIsYdMP3d|fh=3F7IdA3zj#pf&=#dyVDT^& z3s{jV<3DS$^zjckl&G&|czwwV_v7?u8&mru@CfBQ2D3 zoF`0{6H+5`kH0J@=hK-NH)MM551pTX=OD%fW%w?lTk%avojVhKN1cE34|r=_^sTL+ zBt``3>;dj0E~~M;i;FEq+9}d_-A~fA&sNhI{!?BC>=c!|Ja@uvIlZqjV5vGgdMx+B zg9j(JY?s5-M8RSB_;vUtPk`v@348C38ErIZ60M>(|_vdt`=(T-@*q%nl7O zxU#oaXhe|VVVoQt8g1HIop*T*!dEBhqpx1TD-TWW3m<13^^?lQ7q~d-+<2|_MpmIY z(N|Y(!IAPLq;%98rCNKmuXmZ>ftH@WCArkdEq3~9*sn<{Q)H6w8Z_13BOAo;tvwD} zAi*?bvP|-9ev%f?I_uT_#1kMSbKZ5gS9}`Y9Sde$wLHko@`e$662lw$)FMW0jf@hf z&inw)sBb{`sK@3F33KU3&p#E}$$+fNbv`L8ZG-r^NQF;kk1dY(my=RJ*Q}-QmoHy* zzx6#!N;hOX2>NYES34`nV>TP7BqeWvrb|>FF4wX3nGR^29Y5>=9d2r9HYmY~VQtU!cXQ$KhHdZGy zo_?|ovfRcoPk*!~-Q3=oR5RM0dd4rWlr(I+wKgmBroH{zTCg0)GKfNe?xU0Qb?b!` z(A30z;8^I-&(4vhYs9|NH{5%lVbWDB&-iz-aczGpte!hV{aXBb{6Uhzb@2=q8j0ocfBvJ&_OTq&7k>O^ELYX zv2L+?6;Pg&qHVt$B9|VvrKp>~yo}$LJxnX{%`q;L9n)E53o|0O+Z8(Q1L?BxZLVKM zwF{A;%HR;AtL3)tE%CXd-VMxVE1!CboeC}xK^N7oeTPqg2Iul%(D3R5dhc$y-%lAG z!m4ea0G+Qspyc#051mGzlX@Asum5w2*4 zt@Ng?EqS6Pr3EyZy2e~%gj(GOK-zNkn*(T-6S@akR)QZlA{EIV+XC*=9hMopsykOJ zQs%f`se!MB0gq0N3d%5A<%$_bIrp+94u`wX>j^kixk0a|p?}sBK>M1{*j1&sfLSu2 z&p0s&d(IM|Ocb9{!0!+n47!f*vvgULYDJg6w3dj|OY66$_>6gU}_)!)kQtlT9Yh5zVrdg#)U%s2oZy&0so^)t(~_a|t6)V{Q9 z-}v^{{PyF@XL;Xe@{9O*h5g!~POmKbT|pVT`ynObT}g{44S6-Qo!QqW5P>FK*iB@~Y^_0Ha#)$?`L z=PB<|eA|UK)mA?|&nuh*&6oEd+f;viI+-3c*K1Up`_=RWXtca8@A*-G7l)u%?Md9+ z!$pDi0nTPOmLO$hZJxu4`y(JPO}FHCaLH;#!&g2p}e-`!7#SPvjTa`L$lFld;E zlU9}4*4Fi_Uj+0Xn;2ns7QVeHG4Gsg>wU(#IpJu(8h{r9zR<`s0ditbASZYUrPDt; zq^!%DJ2DXuL2qC36BwaS-u+Wyny6gFt6txBRhL&+4t<0Nh;K~Qh##I#?gS{u)opJD zt!^x}PrP80DSg#lDHyVBr1#Z_*wT&XP}}g%ufj~?GzcJuoXl}7WI0h(^Ju^T`QxPc z(~ymY*H0~u{M!#rNvVd{l@{sZ)amVd1QrS?*vG26M;Pv&cu4C1b~ z6|fY<)~?;%o4=+HN&^DCxCEh&mqi=$u8AM84PIzU{+?T$i_5(}k+O)hohhobE2>+| z1LZxtlWoAlC&~tJq0^}XEU8-d$D(q|mo7>??c!Sjc`eECm4jrNCz&t3fyf?W#6UqK zny{uFxa#;Nw2=Fw>1Oxbo9+->_9^hr;#iFnb*v>v(_`_IcYWhmYGR$OsE?dH{ZjVo z&@7|C4~@&Qfi$zbd$q)aHvuD(WgqaHyP-17DyQ#?&$&Jmu@R~zJ2z|*3)zgZmm5K^f`iGlFLwH8GZGz%N}Q1{Jr$q zZ2vs(+-;nZUXv8B(#jDPg4K$dp`m?D^5=dZ(^DqL5H|zGALUK)ato)G^D(!vdx6dUG`m%8tC0`2kRpk@A<#bu;2?~!L|)Gw*Y>bdtlwFi7-qs4dSajw6E zwOc&K$#=a~A&3X2`}es6O2lWK$8mn#iy>IG=7K;@AWb9gT$bro(9QpVcehJn=ut|C z2B<*U_yALa$VI7#Sa(&6Uu;?OG9n?rjA#pBx#%CnZYYD_h|!4neR#n_0zrkGwghmx zx^XOf2b1#^bDlhU(FJ}DLx9(N)8eTsu(oKOfld!a-lo#roUHpvW|!RktUDiJq#UsM zJ*C115(||4Y+_=!c$Lynpc6m4O#Q}F(YfhlYynFrpY+^O{~iZ3lwHpB4~GK7_3b6O=o$Fa1FkSpde(jf0_@+n^Q{r{&VbFd0FjDSw9egrBf1v+yWj|wH6WR z0)sfpmvl2(aSmP;(<_|?^@({)nk;E%NWoz5UZrRG71{mSr0Q>qEmsm69$kF2RtW9h zt9jHDl#?ZY=gZ4sj|mdDk0heaGz`ke^BQtS)65RqdOzR!vFC79O^u4)K&L>2Lfsni zvR4-wH)Y~rn7>NNe;Rv5{AZqaj%INkn^y~FLMgqH@%tGL_ue0J;i}pEz_()ihLwAI z`oyR$?GXIH#zv|0vPyfEy{K+rV6NhPFC%qBo zbM7}Yh<<*=7Sm$gCIJFX@eVP?G!c`}w1T!(^~JVNbrzHqSeKVILJRhHeyeC(+R{|f z98F&`j`b$bcOW>PwMDZj9Q6b_STn!0*cgvXv4(AcbG+u~jq)l$IE!XBa)(ss9^)V$ zn|n+=IHFOt0Nq)#aCdTjI!v5>=EsCL8C%{W?xcDN8^U4Ai3as!);CSRtIR$w@qcPU zI$_3anlJdQPi{kVU+qJBv`GAuJl>UobEr{=Kcj1B?&=NWU^>P`9f)>%8b+>06M^>pydBAS~MMG6Y)#IJjF zzJ0Z^5iAaD`a?XC^?^+IOE07O`~M$bUjbBQ7qttAgMf&Xlt@S_NJ&W}DUH$~DJc!o z4NA9Ck}A^ObpYuG>F!3l`|hLg{r{c0bDcBa==os3J67$rp7p$_jI!mTFwTLI%i!I6 z)=ck&LVkdF6x`E589dAZP)4+={*~8;1b#Q?fV;9itjj`2Y-Xc6^Q)GN~n&M=gtn$6%$)j{L0c92;>ARoEF1B zY17Ft%%Pq;Ne@JVpRUGaV5Ou%uD5L9bjUE5(B<-Q#DRQxvzE^JQ_ldp+icF{Ko)E6 zbA<>g`b|>j)yEruxPUaQbCF@+{(%bj5m=6%Zwv za{2=4`N$Yc7!;7p;pousamx8?Ws2sq)^gd4A11Pu9ZZm8?9_pdx8V|5S4=4F@nH3SA*E}W2^&D7#fj9agC`U{0yN1=FG#|`PMMG^qsYQx@ z<3RZ>?3=22|Nfn*5SszV>=XP<8?ezZQI&Gz4bdl6&C2wcLu5;t6VasAIz69!|XdBrI&aW8*bZ zkTinL2XF#|5d6kdMoDfKwb0GKcg@LFd(-^;htv3x0OtjpE1gs zYxwBpF+MCj6~ygqxpywJCHV`g9LsfgNWf4B=~HUnYdvN za^|)SR%9{J^}lET&S8*$mHi@X;=^I&10!^p!dXpEW(Yd_{Qbuyz_WOuCFlk@lTaZ1 zMt`n2IDpP-yasQ|ge?R)0MUAS<996n$M2-=gOF?d*W?vtN>o&pn@Tp_;rB0q7D8j< zL#a9|b_C1fW;v~++ZqXrTBC$kouzV~0IDf(F;UP9PJ z7T3>YSsugk$`ky}WD7~8F%eM#kp|3ALlj1%yM;gDodk-^NkmU}o`YrhRFwZ1 z5}xlVHJAX*9PkzOSctijuOsrq{1yF~TcH|@=f^adaJahH0hQHHhIJCG?Xu+B>;i~F3i%)anBZ#Lls}PZI4gHM&BJ1=DMj8vp zFO!c#JHT|5*Eb241C^Ogqmr(2Fv{Xpw<*BH2y~x60CM^WZfNO_y>UIB!MVn0;5oK2 z5nm}xNcz~2t22+jK5pc9RTVW1+D*lS#@|c#&$$DG6_tYIK*dG*nnSy6A|`ExO`^afN0J<4*(@*EeQ&G zjKK6<@v*wVglZoD6_o`l0wV}2HTZLZIFXFjRZPd*lPBrBK-g%l}ZVvvU~y5M9Vl>f*+7-Y?hum{nrC#_Fl8!^m{5nWqH6 zU>CUPf4BXgQtUH(N+W|+2EkXUO{ypJ6>GH98c`gE%I~(8u{;q?!@uyCEyU|S&|9&O znKOl=eC~0xZg2aY#F}6qLK$m;;{JpKhbXpo8~#hz6f#>+(nF@qzHK+5;^x^+7G-lP z_ruYpO+qQf0Q)4+IH8K|^hU(6={Z)fAh|4P$gzejSc7Tv{gaOVg{gYDnjyj^4ce80 z4h3zqM!JU}J$o1XPOOf~J}ka%_5hsMbMN}NvWyXa?{cPzC}(X0C|ZIv9_YSNj4;vy z1N{7FubyH&{S3MzGO7OF&jq>?BcNF?%Kof}M9*#V0EoM9FxAHapb9S#0d&){Zm9UM zAwFp#lfa-0g&4|94ulO+9}ZW$5C_8cH7YR?<~CMjFvi8jb+u0z1Ya2;MS=MQM(h&?gy?2%3PsAIcJh(_w|PK!-uL62#!=E}hW~QO{dU9(6x} zggnx)&la^(x2y)uC(hCMpzZ6G2gJ?%HB(KMLp8&y$kPf^Q4Cwc7LUIJ3EMj z^Gi)eAre6$S2R}Mn%xdsPYpv0m}X<+-gD-;{#nSw>x`+>IX{}mwa-?qO&v~B>Kw{? z&0g+2H1+enh3FVe4>?o5HbLKLqwp8NFN6wOTL+kpRcT&L*N6@im`67pdUS4^4in_6 z!`#nj;>!(}7QdY9bS|4S2{>tJ+O+n zSAS0!=6qNPvZuV&F2`GOZFtFmY3Cj_v-5#55u0%zvFS)2AFVLS{k;GJ_&DdqJWYO7hTj!L!6%3X&GDRzwwY;_blc)6+R3Rr^+dTMZey%!QECK(0Of%N7|7FYm*6{a={bWj&fj&#PTe z6CyN%%BENr1xVcO+Q0IVeAikkVDSLhOh%bjW-O~H(Dj%7f(YEmKu4*9Q%0Z*Et~oH zhd+z$pR-XAp&anm04pECblJq=o@4>->?8gU?|5501wGM9%0xkdcUQMWv->zAp8v?> z;B!1EZrmw1F0pK%3pwr`%k?J3e&r*0hI3-H&vE+xH`B!OvorSW3RMfYv$Ok{RCAkG z0N!}fS=QRYHKxZ}FR!yy1P2kyn9AFMXriS^|8G`P#LvPWF{H5xr?gcxb_J z`o3@~FTiXmmB?)u7!(v_NBo)enJlO;i5%IOjpY&`wy6MxG7o@M??q(#DNW{1X2AC7 zw`cN1FW)P!Q%gp=zoeG0aQ`fQd6sVHfp2zUFcF8 z4Sc4E#8Yg59&!WntRSBI!sPGJV!MQM2Qv2e_LliB4+dmFT_d?L-1-p+U>`w1S~l~o zbu%8E8#LY^bj0y4AaeXroPEkIwpu#;c#k2}Xz(h`{riNcpPjK&3L9UBGOwl+KEy;^ zXZkpMaUkFQS$kv-zi^&;dd&Ejq5Hryzz}(A+<*(q|4BmiNYVvtkqMa|oZjpaRC@W_ zx9sKrSlI+0)IyCv#jZM*5npYuUuDvB4S;g9tx+0wPh=3cCKy4E3TNq*c^$ieknnm@nNdmJzhBcuu(f%N=9@WCtZNe<;Ojd<0hV=El(gz|1uX@VEcaTf7vPCqN!_^T zwq`{PS(8q2*q$b)kxh8NMIKO@|4QT8)k4^^NJ&3=u%H=k*8*fDVtpJ0(W?6)~bk z6jh%bk!i0Fq`|U}hl4?9WteiVx&gV(TM)|iN7aKK$W%bs>w$-dH}pz{Y!@Bk{fu-gu@_$QAEUJv|tyvRHe*v<6o1Scj^j8 z@cQ@rvr}bZNcwOk-FNCF;B^&^PutS?<&U*P?Uge*IXSfWtu`0~PDd$$wL^zFB|14U zQ^9FIelXYmnbwwH76&mEFc{7kCeC|#A3B!!TIxWj3++=LPbEuxFM5# zN-8n=8Boc_sc1PFWOp)FKl>aDXITtSgM#7>7twS5wj6J7$PpyXB-px>40^`*-0s?D zjJlKY#ZOUtt)VH0=j-uIM(PwZ@%b>q-=hlE3G^!oGaBlpd_816I>^wscI z0+Ssc=Dx8okm^&=W%3B)qwG-x*0<(jnsegkTZyU1Dt0GB$hL$Kz={jPsdFq{auBeg zATsR(TGAwcww{iTuL9QdO=gTE{**SnK*di&JxR5kfh2%f=gaDF8t4tc@*xiwgXX!s zA4iwL%&^nlXk3q?@6N3ozIggho5%vqt?nZl>3I6uH*wV=*E0o1@$L1Lm*7%WW;Si6 zw6+FlA9KdrPiijsK>m`hJ@?V2{|3>_Rn2DgwhHW^EvohCEy4Ui6%41n^&@93ObiIo%fAG=plR9mzLT-oM`GH?;r7rs zfV%qW*3&s4wkDd@_I!I=)!TWo_D$9xR(+)b0X#nE%OJw;W_r&(acP*`{q!FM9fx3ci02l>CadYaS`mDb}^qXCnl{v8_oKi zv}B8#iVOIIt3RyS3<6qEJthYkT7(mDONB=Mjqd_<*T#^}4OqXcJ~ssyoHak-s(k zhfL0C1m~3h>%kGDuyTf~H2~YR$Y9djN#Y$F_I{-~-_ll@KHH)Hom=~})VFk=@x_Nu zrIua)`bZ@W%{Y@WxfzWp=lq(T8O@e~*279NM2PK4On z>D=-0tb@}f@$jpnAfkT6t^mc|vbwYN?5FL*@34;tC)eSu&u|}eM{#HO3dD@=G%0v4 zmcSYHH#7+4j%sWeX%u2W)`WEG2a-bss?;`F<4F}e?PA<7+zYAq)~Fvjr>Qxb4%Ggj zK1lp9JKN9N_>h(ldvGUaAC%O9<+bZojm7T2ulXWsGl(@`Kpchj0 z9m3ThAPK+Ae|-n76F5rj+)-i>rF87|sW$V43|Rp3c7;&x^$b9Bi-pqs;V&AU_uYR?gD1ITu_5Pj3?$WTiry7 zFF=IE33ajr>fB-hW&>N(NVM#Z6XY1V_Fwh(AjNZCQc5klST<~6vm^u8o&9yYIFoFP zYHO`gUDIwOMciS{uYw?la~R!vdt)qFEz0@xw398ti&pzpea$b{f2-#(xPQpQQwBy5om%W^`FV=~1t97y3NblM>U7awz6S3&Yl!b@elP`i(e% zFXB5d>SXMkm7nJZ9_l@$m+v@X((QN(+>WU)MHVX+CmJuX+SnkMWS5J3zK2K76$;tD zm0IUl6ZxGC5pv~!@~-xeHPdE{>c)%qM)0aHV9MJjc*(_&x12~|i_5G}x4ILq3WJ@m zB!1hHHO4E08-9}VAEzlAkFpBmwW6UB%*tA%>)ic^{QIW?fJN^bwh+owbau44L0eq_ zdR5z)A)&kn*CP7HSyOVLN?c96va*6X0gyDrQ=phXq*3}l>b-U>piu>Fz;J?Ip6wdj zO?Z7J1JJaG`Tub)HN3N1uY{T!SYIlf26L3&uOeW#ERf5RE?5SM6M&*!4bf6}X1zUtIa5w|STfIAv!>>(ewb;r@iVJiv*-Vv7V3_dm}mqB23}E8L}2!H2y#^1^HRjBm|G*#wzHTj5Z#3BzhSv# zv~}NKk_NJ}UrNwfBF;42ht6^E9mCw;r507YOAJ7OWt=Q)sMp<2PY*PgM>H&z2I)7H zmt#X@_kQ7J-!<6lqSog7AQ~SnabMH{H5DCLQ!=xWJk8VWysAK6HqGyWWLP^-5$jgI zS@^pIYPAx{g9g5M&~F|w1e*HZCvrPE+zF6-7p4XR@*pUUT+%a2v0&BX!x8NmGvMO* zv7KIt=m}g-i)s)8R=g83uMJ;m4LghU#-pC>s%pyuR~Fl>gX)YRK&xCU9iPCt3P^Zq zTv>?beJhT8Dt-@(674T{O&j#sGSv)@ySwQ4w6KgVGz)*)xQ-s7?NvKmjcQFRlO9Gl zibH}F;*LJW+yt*wC=De!)MAIHtpOGkN{wkJHEH{1BQYk%!470}E?IkC{CErQ*!HFq zWw}<>c|1(`KLp7YP*-z>;Vro!fV|!Z05tR7j*hcTz;%yCcldk>qrNu$+^F!~tRsj~nUV^!xF@JqfIbI)>gf-7}PZ-oDxt(bc7!2kq z2pDSAIPWAgOz5ASjKwEaoT>KqmLGJ8FMA0_0Ob^KS^h@T1e5=BsFG;3ytI@ENbak^Ya-axJO*EjZ%%^?LLkU~MX8s*mvDEl1x-l- z$eaVU3@7M_@t%wcV5mqCSE>PxfRjz*Grp}j4FbTSbATtxRtFfY?Yrpc+PD#D37M^? zNQfRd6?=tp<;Mc~c4dJKnHIui;Wd6E?L`+_D z%`dwHm{Rr+Yg|w74i9VO4rZ&FYR`OUVq}a+*FMj2Y_r?!JcU!)gX}PHY?Sv^5fNu_ z`glt+GG2j)=kgw`Bzr`Q2H_)fV;-(wH_-?AgH@>l+@U(iM{rI8CiiLh`%H@9?=t}w zXskAb8xE^O!)@#6pkr5HeEPJ#1N@CqyY?a)PLllu{AC*e=%fHj@c5^H7j}diMG?zf z`x+p0j->@zyrJttxuAURy4=&sj#%Bxs#2Tn%@GZVW=Yw$yPf{b<;EXJGw|OI_tK4y zaKCM_$)G#E;>oR)TMU|2iVr!=DuNCxqq0H$M=3I<&M&Nne(DRYb|Ryk=E$$?YY$8) zZtzFJ2aq1#gSJ0^{@e-WE%|-!g~R;w$O?`0|G(uCaS`XJ7GG@;#GQ}ueGv1~HK-}O+C zcRuOiR?f5TnRjy8l5*LHbW882$r5}k2oh9vO?1F!-=R??yo;!Uma0kGp|`w#{!0fQ zAA@?%J&IXe>t2j`z?UL_U=b|R1cM!qS%R20Az^QtXk%X5--WS3|H)q}1y8|;pu#2f zLudXjT&I9vQvk{Cqv#rc2q~u%3Y*w*wuqb>)Pi*k} zVg=7{xY@zQlzhuTF#K{2bO8t~cq{!|6S(&K0!p*@6|CS|1s@+2L$Qv%$r?SK0k*oY zUYFzcv0~u&iGFpY-0lU)jmJd4Oky<(4JKp}Vyr#UGx`1f6O)_B7JHljs0OPV4P{iP=~`4iuz*URMH)?!tODCV)U{0aS6(kL09Z#{ku+ zCiE@Py~iHBec@FyzuRKPLg?p&goKI}$r2<$d$hO;qTIiO3v$B?)vX!xa9Vos9mr4m zyR)CV$Q>cgGvdHw6qE5Ci;O zk8JWbK&06KZX-$XW|p5I^0e-bYism(36TE*Y6t&hZw=6tF=Bv zkKjR}*Q-k(Pss?7RKTSE@^R5)i;!+pM*0%5C!Va130T6BjS*QkC)EldQ6mGMQ2+W9R`rVG%Q zYwNEPYE`t|@IaQWDkAUM(6^N&YF9I92$kU950)PE$=0V)ZyWBLFJ?I*4~|_!$I;N( z^&>&bwv{&7)f?bp$-vP`aBc(lH47lbe!)WuIsDp!-z!$ovq~iX8!ZQnhP=^XJ$XC4 zF?_UIh}VN-D%Pz(W5t?kHUJR#)gmua@CN{uF%pE@=(mP4@zv@ zk7EdQ;TM)_yq)DBdp7(nv$h}5aG=JCHW$0t}o9thpA7Zo+;gL zmWmeptw(JZU!%~>H$k)d=^HXSehRppn=o`lGi>bj!?D!zsjsk^o}K1psabFDE$J&h z!%wu(;ji%Gito%c>|24j?_^TDwhM1uA9x&M!Y<;OZc+L{iiHdSI~`?UIq>l*j! z%c{zEMYWh!l^hY1k={RJ13@oFo=aM9-z6!p04Uqu%9;Z>*4aOHIaN=2(scSn*=)RE zctLTUvu0$e*+C&>B9U$A!@F-4E2BT>>R)+6;U9olPdJodNO>~KbtA#x^)gUb@-2yL zKCSnkwv9ZNhvW~UD2ohbaIXSmp83pEOa4%8@6Su7xL692@|XfhdOYudfPf0eU5fen z`DeLaOvLfn$7eA1JC=toT;{6V!AT!K)wzZt3%JK0Rhx|!RYGg;PigHh?Z`}|RTw=a zA&&g3IpKn@a8oJ>`a3(@BmRBi2_pGdlM_WId`Yf5vI#scE$kn%5cE z_7(11Q?SN^#XNegH)w7K@;M?;o5Bbe+hSePXbI;ry8T_$sc=lUFT;$g-PzBBh*n4T zMX9JYC9~gDYYE4+sT3>oiASVXtYj?B>fCHdJqwTuF2koUu>NW|A`a?vxKw;>IDhA- za}a*TNM32vIvby?{JratGZpE>TEFO{(Q*`&qs^8pSam+m_2TyQ16rEF9m9(`#gVLv z)!q#w~f zKDP#joMKkkTJA}Su`|l>RbfB!VnlSW-s)(k?_2`c=Wv>f0E7yUnXQuRnQ|k7o&?#7 z4*X`mMn@#A-^A8T{QRUKp(I1R&+~(3t}uPvF`==BEBS|IFF}Okmf84>Wv-o{)MB0;6cCpAx{#HbxP}gT$3|EKZyw@L!*|2Ov-sCB$Gqi@0 zS_invv1R*#m(-=l{iraC%DEmV#ybWXaxXfitXY6l&--PPzhKBVE=9mp1+BHL`x=)g z>6e%P-E`Z_KR9@AM#PTq^&~o>v;D213#AdX?)}}_`0G{-e9%r*CqKt^Dz!85$IW|N z?dO*6o*qk?BNn;tLP|`WEV(s+KE2!^pcHF{0Y9X>K1ffRe6~?B^6(FnK$rbyodT^~ zs#3Ol=jQ5UG1->chh**L% zQ=<6;b9uKxS5Nvl&hMZ}B$m}kwhHmc@si<{4QRcdXP10di*$aR z8u!HGok0x2j9WJ;tLd;jPoRr0b0N-+0sKe;Btf@)F@gE!i&2q!zxnCw=!(tB&r@PIanBN>q5h6Q%S&3<_s#6{ie^j16v8(m_g9WkK8Rui&_Zs(=D~{ z>(?#Q{w~kCGd;GE!sgSr>ts1cEnqW(>7_iHaHrk-#gt_Fe4VdEpJ5<9TI| zoB1@D`%!P_@d!ST^3;UeiJb&^idr*qaXsC()jWN2(Ie@)X3c5@(~ zCO)*UI>O{TD(MW$*I%1_6igQ{>xuS{Km``sIPKrb}3PW^FEpe z{rQ!YpH8q^6E~KI;Zdo#YyS4yNWEA{G*1{FzU;-Vz*wU47@PS9R!46QrO;O(tl?T( zvY|K9>-wtxV}--Xth-84@Kao|G-B0DvE%Q;G5i&!%6!Qf6>2{5g?9UQV%#>P-X`0< zYJ4d?+o`6YNs&D4Q}XAKv!dq2B2%sPfR`rN9p#-b#;cL5D?jxLky;x(I%o5k`J|Dy z(ObP}@CMH=P&Jf|ynVJ{y_B`((aL~kLy{wVrPQ|u(Ota}m0js-+2}hJrmY-bo~k?+ zCLX7+oPS&~zwKk9V#8q9)$&+aXC_ILP{0Pu(1V3?Dq$Qpi0gLeJ}Y1ErUvIX?OuYN zk*`rE9P@hwR%oudpy%ulv1VOy9Zc$09S zXTcmMFf?q3JRkbzU_8Ic+p1J#rK}OF0B4!6{Cdvh;`hlu1UPRII$H=| z&X8{WMlTQ@s0uerdoxYQO)AGX^6SHl8Q~f9KIv%CF6EttY&ii*&aq*p527a}k8-N_Yac1x6lPnVb6u2Udk| zMY-`6Z%jeC>#lc6==UN6DXCa&lElUXgxVARyZnTl_s)<0)O7g1b-0*6H+Z77d{$By z5Z=EYA(nR?7TDqY)AV>pGSB2}ZfK`EU*P41|F6;FjpUL5ZIv1--{7R+@xzB-eRp?L ztsSd9!ai(nSDm{9Ls$Cz@XaJ^NCL*KjY|cg4*J^C(&B9Z=m+KXcLDL7z2>jPqq)%! zB%JU2yOwf60Ii;eQlh*0KBj#7f^0dp_;;DGgW2Q`fxC8X+o6kuD)X`r{g_;9m^1pq zv|Hn0dG)pnDlY%o_yOT4^9AaK%Sj6TSj!44&Cht(Yz`6@owgSPg5ZEZA;Nfs=3iEU zgdD{VtnX*Jc=dy0=>teB%Ur8DA)Olo-ZioGgX)4 z-WY*2Ce>O$we%y-K``C5{$@5FcGD5@Fcp*^Et_^M*R5QugUf{_br>W($YCXBn`hU< zVKY8>QUq03m&5)6#=o;*YlQ{6CpfX3E4Cnx{+M`eCgUTY(Pl^Z+!<$`-B|BoS2~%8 zrhL>{7ukw{lXlxd{0=Dw+x7ad$kTOz+;$TarK47#Vao0S=EVED#i^iPvT3pl@ zS!oLpHMIwaKh~_nlkmd*!GdpH06e<*vD?Jj`);;xx9ux?_ESl}`&+HVZrpR_r~Ccm zK@8X@z|hAW0dJqSQv^VEf5V=S@VM`BT~h-2tr7JX^n$RITDYtp_%d*MwTQu@6LI}^6 zJyafTyUo51j=!i}V<~)$R)KcGc5JF5Hnpk2k@m7(J0+a{N1pyW4hAfLlsM-YkdH>^PBqv(HX0Fv_7EHR(k7SIySGX~A+R%Z0QP70;g=btX+cDEJ|M|6QM{=I(xtWq;}R=%t;= z7vtbvzK1*e)lZAeL~fM&o0KQneIW;PF4kK~MMjhmp1>0%$laxpA+ru}28M@uYK5$h z$)R~z<6F$&&X0Y}0$>pd`cKVq4vDSyx^M5L(29_CEoabq^#&ivEm?dW~PDO%A`>(T}{q837 zxMO)QM7-y1Wyn`amF>lVcZ8G2OWE^k5Jv(*G6k_Q|Nkbm2#>BRsh2+9PRJe-S)`CR z%b!>LXl6Mizp7^VTjkn)kCP+xn1b{}=MLQX5$bimsb%T`d-2+V5xde6P2aF&Uq4b) zgK<*gNRYur_c)!7dhM`qCNPk-(m}Ei*zBNPOh1+oGTJ|UYQ3cbqQ3c0Sx-$7?m>2D zV7B--=S1#RKn)z2Sxgcx?Tts1Mq5-$a<*K5&xpwUATv|IjuiIf=Z3=JbN1By0^4(Z z>0mNnF72*Y$LSzM+Qd1!i&xoW8b5w#9^*uDzq;Ub+peNkNVMzBo@K9PsaXGWh(tXq zP+qEF*L1QpX~MX?GbBubIS^~jm&Q>vXl17-w=53{ti^{R_Mz9~sVK3M6kyzlez;&C z4sdBDQmtOME=>-NH|rzp?5mb+)`sWxRI-drx1QK!JhycTI681=8<1AXP;I7OXD(s!kh-8O{AI<%r z@;(ynDQEzD;|BuE0vFN}aY!gR^Ze$>u5Qi8w(2*Ffm`+8cC~07U(YAGy7waMJn$s= z@Hru+<^+d?#p%BHt&r3+fd`%~1X9TR(CSSQ0!_rK)dHLc^1ph$w3ds6ym|`@ zqY0HYn(q-iuBthtQ-X0lnY9Y1(uuAw65VHUUnIY%bQb*@0Fq@Y&-f*(bW4nz_#ANC z6X>;Eo7p+a5W=$$DB6l|?*9mA9}$7M(Jg38ptv~%eW6*|DCPxSO}^cG4V|aL@ZD87n$Tyr?g2v;^&Ur>b@e+K@BG5M%WH>qMb@0o;k+4bDtzk=u?nk zM}toVt$7g=;r*1L9#4OF7-B-lAT#}c&xNvs=e~rwKH|N3t}2DRpysd5{Nlaryul!CweQ&;ce4pc@&$i|E3R(oeg8u2Z(YyJ=N(RCZRjy?& zlS@gbD|W_~Ocd8HIQhB4c{_~Adp}^MUtKxRnYF5pgYb~JgFy%=l-CKi5Bar;luwI{ zCXrnbKK&fFJk5MkNq~I*ToN}D89fufQ^^0?XhOLEDN9MX|KCOn_P5w0?bPH=-vfTJ zo%tnj_G2$aN6#0ImrQ7i^xNkpqkk8=Xg3i6D1HH zcys!;{1C~cFE@jM`i4DKeKJ-1Z+xd*sb{s9Z?XR~HGSmZ(QLyJ#qbO|_;{IO8>i}R z@MUCD(RshEBYDp~>;C?I^c@CmiLtVIQ;=Qb>HZM$y?JLZ+h^xh=kQxR@M}I$s?Qb| z{+xxb)@SlDNWQ_sAf(b%1{Jmb97fM$1jUhiOWI4#FX@Ov zHwyNLN?s(u*||3{`AbImsE|?l)3B6fb>iG{`w!Gz{_VJ?zu4j<1y68JbS9ab!XAAD zS*)~|8JhXu=<#PJXRe!1NHMzH-N{gAF-XSpqX?3zrgd&K6=V+IKnw*QLDxQTncXZN zl^7z2}VB3uU;TA^2xFmRbR==?u0}1T*;P_G7pCiC5$Za65>=U40`@h-6s)iYivrp-E*q zuhCd*i~7<<4hUFMU_C7=xmxj8qn;LWYRuhfV5%b&1qKV;aO+Ulot&OOj9!n5eqez} zKJDyaY?h#)Dz_rHE5veDtx;6_?SNhxUY zY+6|l8yuA53Df%0f0*fPXkH9LCC`@-GB@Tslz#V`exk2w^<0Aom|}e0Rm}BsRyMw- zIrh>t?r^a0QAaJ8I~ zP6^IAPQ=%*p8z#)jhQ$Av^l;zknVbTH2DZ&4QDK4B&%k*J30%Y1)=XwcTMW^^;+}c zClfdKGz7F0KTs>WwlZY8SsU;rMoL}JuumopVkBdCYd`huJ^3bBV_#yBiE|j8dKo#N zgxqB&2_8epX`0ESVWEN$dC8I7(m}V>OslfnjlVk>^^thINZx5Tm&5eS=6`E)l>%$B zJniScF)^buDZYWZwDU=2t|>K#_8O}@Xb5hIioZu+AkAVR{KzYkvhIbv=b%R1Mgv~L z#1-b;Es#~rhET7wots{ok&(By4zovj`trB83HYHK*#@t74|J(bk&M4xjewUi^*Y8t zTy%E%HsoYjD8?o>hQ6YA)yy@kiGLThrb>RY*fT*!0=#&e+q&00NN<0wQPOS1|30`mB`g#-M0g?f(LOR{rvAbgy@wfsh^!&=%)UeSy=B~90MPs ze|p&4R=XI6bq8&&fhWy;#a&~eP-*No!AV?=pNh(VqPZKDVVfP<*;klre#jWxxYw?1EsHKSt0)d^-@yx#n>YN*V2&sa#rnxY&T>V?v0`Z$@?TgV?#Tz9Hr5!S zd>aH>Kx|@3(aFnOc9an)5v0rd)Lv4r+l`Ecr<_u(6VCTL=#gOp=Qf1--JPue!Cu@o0t-@M(-D6{7oho0Zo+(B-JSdIc~x`#CWvH`+^@i zFAuABJ2bXEKV7M32bbgc&uE5beoJ&W}C85)^b&@ z*`(q~*I(@USxC=vwfJ?b7eBpi`Q~f{Av7SUWkn2;xm^wlbTMTTqke*WB4|iyjO^Kg z(`RnS4L%EgWxW}9g))#vX=o7xVTvb6?0irVY+fET8o}@7-<|KgID@VH!bc%b^346< z5vuYH+9ezDKQb*1lGR3#hw(R&gJ(CCR1sxK@?mu=Lhzeu=S-UOAbFO;>AvQUNW!;~ zBJV;as;}8WfdY+;__Jp@6gY}4#wJshBqW>CVa==8TCR1DJojZTX%YQLEcv^)IkK2= zm(>e8;TG%PM+-b~1^Jost-!~leNoV2jARqm;8*!Rt&V=_)KNgcJPqla@t&fW0eMvK z2(ef7PY}_;x*ii1iX(+PCXGKAbJ|Vh>}oBL?00m5j87`P}RGE>iPmuXKlZls16?`9}J_sz*f(0-;V& zIzkPaAhC;WInI2}+iQ<|o^LxDzQ=XiAM&1!w_T|E{U_+~H0E+eA>NHyh^3Yncj}qS zW+5N3Xm&At;z?TP0{F+tx6sOOCIb6i@{*A z=Qa+Io!nzeY17|t-E?0|zIzw8H-A3pt@*z!k{~(Oyp}LR>Hbou3KKQ;&xTLv1b3;Z zsh0qV%0}5z<%v}EGee|cmkGSTH4wmeo|&1cR%F=i%tc2>$HL8hrYa)RREA3{`wY1N zQZF>%JH{M~$_vp+KndfPh-GPL5NSGJR$9tUXQx!LZ1(Bxz^m@^1DRl3v7DC>4xAmY z3fdo^duMGDmAB0~U%PQxH7q`$YDspDd#qMpYCz-JgMcGFZos;NGt1RmY1$Y8ga8`u zDbV9{g>y{m9~9&=2kP)Ld39H3O#nr*k_BozilCkJb&2uorj`~8FiFphF?RUzokR-) z#4Y$^wc7Xi&txU;#&E8bItUgkJ+4k^jkYE$J@}pW7X1)vk2jwf^C3Vj5c-5QV}|Sn zkm{KcB9;2huz$(pyqipA3D2pqI+*q{Jg=|^nUdN$$!w}{L`1Rxm#t~iHvuekrd8J} zPP=LWamSt=7n)k{R2q<9naR`didM=cydd6`J zs;Tw%r_s?-cL3Pb>?-c%k3YUT-xmMnjZE?}Mi?G6dDY_p(8Lo!GlwFb%zrrur~!JZ zsHk4iC}5wddMA5Ql{m_Ah6o@ALzz1p4yaIT9XHlk72MNt49yC3CaTjO9M>!~k5lPH zc!o9e9j`WZRs>mOC=3pH6tldvg%F~ql=o~AbOdc@h_ab&c|dqqPLsJ@KmddK5@Mf- z;zqs27Y-N_tl^YFwWNH`P1Dw`B#$eg34aSiqf$Cx=Ly;0D>g(kXvii2$~=0$(?3fa z;--g6dcosg`I$^`3=>M2@wu$(5XqBUe47d*yJBz(rt3g>;NetUUO+obYc2O;21N(e zbN%6}4WCMF$;o7c5Zmi-s9DBlj}#i_s6dQ0=mB-?*(WnS0$CL-LugI{iaEito}OOX za$CegA!rBSNi!Kp(=B_Dzz9EhRa$1tY2Jg)iQ}%*{gpay+hu8u4SbVda!@L%RR1EJ z4OtDUttl&npl87gvUulNg*`3MrCcLXW;TImK>NoEsnKG|XMt1UtNM+gHH@K@*Dv{< zRH8;VO<$o`qVOAo?H7V%wQ9qb1`aK(a9gdO1THccz@q`?=uMmr_bT}l0F*=skX_&acEq~t!Au1l6q6t#9}PJ$7pwEEwGoDy2YhdEBY zH53#Ynsf{Z#aaR5;dI*zwSVTY9>EJ>QWp{(rnzkA8j!6&Mc=D_)ug7Zo7g^uKP-;o%1g++ruGqH9( z;0kIZz}rhM^KUKIADl91c``97S#Q^~0kAsK)%Iud`DI7K@BUdrQdB}Py~kjBfr0AG z_J2mry5l)l^!|CbQE45p?Vz4G@e|N)?k1(w8?kDmFH>D5LX$?KXOtR(nHWZ+q@yB5 z_e>H)@)hmht~gr1nJg~&7cHU|RL~+t$9|{Sn@S_Pbixa={CdnPY5Lfn+Q*S0Bm`aZ z#RE*^=z6SKE+*#5F?#rkrBdoF@)|2mRs$pGJe2YJhu)Jv*2i!k<++X8h6EE2Bc1<6 zi$b^J&r=&;^qGMZiiIgyb2Pb>Q{~R{!1H3l3_CyeC4!CdJu{WMVw=nEKaP1*p&$sY z=%+)|7pzB|Pjb=U%Ng)P5AQ0UZ!T|afJi>#-<2JXMy7LNnmK>w$^N_KJNL@cGFLB@ zkK^wN#-r)mla^3zEp^8`n1+$^(e2RXb!Us&!Z&c%%dAn=TS*BaVwV)ZCT>~Gkh6CntY#5f*jYw5jlq9YWqw&MkmXK^))Jro=6wX2$z z`Rkly`I&tQQo2WXx;BX;G_UoEBBE!hD`HGY2Y{J0{y_Wv8=Lqz@9vfi7}X}`)|})x zP6QaGXmx!y`mRr{P1a_IdRY5TPmjL}Fmmzzs`|TGdxerrE1Xg>yE5uJcEf z&UP=NBd(xC$fm-&O!UH`3{d}LL`$w%v-;47QgV<117+SN$bO`GBLZ)Sr`u$O( zj)!b_7LkY0>dy^BAQ@=0<_PmsISi4W!a{@vqjD)~a}A#aB5bu36~9~#oBSWfLb|(A0g)0A*mQ%mO1E@(Y(n6!&HtQtoOj$i z#(O{95BHOd;eMWHt-0o!`I~db-Pt0o_yLhafd!pSjh@GQtEhDtSKpN-d1w%Yy!{Bw z6oQ|Vo!B6GvXi?(Kt@yFlvgDTRM)j_o-9Tfm6m_?+h8x{@(SY=C0A4vQ&ab7a)HVL z(0)*b_n$k7P5)<8*ivQ|ng?ny_kE8C`6{rp7(YlOPL^8bPn;};ymp<_TYCs)$X~N- zu{J2=9>ucMJ%8jbNCM{O+VD<4u=MqQm%=p%{rgl$BkL% zgph8?ObtqgINCEfRUM5(#V6#1uP!}JLtVM)4opBp*$+OTznAd3W5S&j?ZDU=4m6B_ zR#a3#8I{u2m!gGEI9r~GI%9*=_D7WnZLNIUe*hW`?kmd4{WRRf$|JdN#ynBP@6NvA zb^F>gvZRvZt9jqEea)fiFNiP-M3E(p={+gY4d2qi2DO5`+0*;!l@m1aG^8Gzb zppCMh=pl$CE{<*qh!h3|%{3NIH%AJms)qY?;{WmPsA5qIRC1yLbazk$SVMsU>d%u$& z$F6GRTT;W35e=b3diA}#`~GTI?T`0!->gZAiTP?(azt?sGC>x07?FiVzbvJol<+-*@R`#36O$xxNeP2luxxagG!CHQAbKFmFr?#M&J z!kEQBWsvk?m75O83bEgSa*g^I_tR8JxFp3-(or+#B&6?u@?k!f{bHI*UwrV5mkKBY&0GHidB zIcL0@b>5o}I{$$HRU#`6G*UxW(l*(a-ZCD_mIg6<7-($rHrkwg#xsT zBMM6kO_;g)c70W&0Y4S|;XUeq3;RfCinbunOmhATojmAj`l&ZUm4*ifN$Grv{P1*m z84lUtUg$f1UAd6XI`It0D(ur&)_s)NXN@e`7$?xp{FM7=`wL?6{{Q%{?<4%Lge|pa z0kmyl*uLp>Tm-0OoU$~h?|0;DM+JSG13}%{wG#kEGf)dF2^EarZ&lCAb7g+hElVWG zR4#ma(q_4;TOL}bX(F%lI5{UB0Imou-99mb2&mavry``&RCn99R=;aW&*V+=(E#Or zMAktWG6(UtZ?lu*9R#0d2NhLr%b;^I6Ww}`JVFJFGZ8rCpgp{k141q5OA%Ze#R^W$ z|4QaC;sP`}3K#)h@r;@}uY{m`xs`MFzIbPYLV5*#@iW*`7vqHEAdvta_I=z>oKzV6 z^GH;NGIT z{M}ZH5Scy~t10=#>P1U`UO8DJ$RduMjSd?Q4C!jx*w`4kQ#o7@?U)de6bEc1jE`P3 zwzXMx4vX){x7!3zux91xk`u_Wpqn8F-2T5HD}_@|DS{k*Dz<5#%L1S9TJvvA18`tH zJ!TS;+AL;L(o4P=H)aZ^G@9{@@vS0f%@ykEl7)e~|H$!R$R1Lj}Urs*^GsnZjO98zDp5T%6#^6&|0TEmXFs5<<4VZg5nmn`7I=&A?zA9r-^gn~TMinAG#`t5; zEu)c9IM((WdVTQ`gaj&1+pB;XI_&D+TJjVTxAGQ34Krmn>b5jpyDmc53x;BO_->Xt ztFnp23&4hmH!ba7|L`dLn7l!h{0=%~rXW5PI8T26>E7G$L_!4jx84Fry)M=LK5qG^ z78x)x<@+~ge1A)be~&A#IfxL&C(?Rjb~POsTtS92mkj-hTgB!Sh1D?JbB7(+!nisk z*nh2XJb213>T@(#~+9<@eku;u}YEhJ#TamO*LP#~JFJ1$pQ ziv#HFiq$3<)0gHWlB-ZO2YocB{*|fvCd8bdziV`b4(G z-pPr}_vXR^G;Y6FWf9SV_Y-t(jwGdLkNC*~ASliT4~Li~FzjqyPFFE0!n!QR8+1+n zh7sq8($?!=6S6m}4zd6oBl>2m-oGlI+w!spjr)l~OX_yeJa{8_c#A8T>3&K>^dIogFE^&yAqT?#a}2wJ6(n6EjAajc?qC%E zEzDSmj}E4+ywB`kEXj|);sb~E8grX^o+1!QePk+@U)hPizr@(`jogdr#HH*7B0Eq+ za}L@Sb2=_b0eHA?gy_xrvgKSo52%}_kdl_pkCHE2J=-a2d6Rk(3rv(8FC*PY$;}{unw$IoHkRXO;zWA2*0*y`)&%%c`nxe-V+PRD zo0mA`{J4Sl!x#>Y@M2(~7w9r5>23on-x+Dnvddh`9?@dTUA9L3BLd;Gl%Z~)--eiL zKh}|?KbkA5I%M{LL$q_h{%Kc}csbiV6lV$ za-SN2n6L_!>HnNeRmlmvW3RL8cjkYl(^qbeRR2svqlgMDxHu8$Bd3)g0kd^Z)G9Br zmX=K7%EjM2V%A5M4uA9lbd`PuCgmlv>JikePY*A_%WE?7R-Bs} zmz0`?5{t7x+3W%_|CW=SwQ&7>FM`&&`ZcFkg0U4!XY;8(L;->d-+RN^?XhCw>1yi_ zWOhH_5s5x|ZyE*MmYv`HR>nv9s_t|CqOXU2pK%`3c?XIbZYu!mw@n^`6%9D)g=%w& z`P#9_aG)@wn%Kc=F&E4RDDPIUEFpJnP|)0+<98F*GI1TOl)<-ren`M%RPeYjiRnF; zw8^VRRl`Svlo9VQj;M^X^?#5hpwu}_(aO5;nni?5nT?~n79hvRCpaFy=E4UgO6$br zcV)oqAsAZx5jMi_vh(Qd8v39CJEuL`=hoz^?3zih;1MW82x1~BNa%|l9QThO&b^vF9>E9pc`spud9OX@!PS=7t6CZQ(W2K6 zYBiYyGwhfGoVqYCtms<1pP+rSn-MLUZ$x``GatyaUHj2)cjnc8S%~H2H)>|hL_Now zrz=Zo+;!&`x52O3Uoh|W2CBRd0OHveG`D4e9KPq!qtMcF=-^*xp^ss^4wXjZ{V7?I8P$)L zq0ezSL%M{JB}KfaxYaxlZQ(=e_0vvcS`wm`5nm43A?F?M4g7fXVe4qqf4zsDWB6tw zue!)|OP(P}?m)RS*FcPrw2k}b%R6Z!mYU_Hd&O!b?hA$(aXM9(-z@fD=Cn9qw3N+9 z=4je=H|B5SX7FJTri+Dtp!9tVN}o@MQUj(}mPqjH9#0CF#8U@Qfm*l8I#iK~X_idteF}m04mIPju?phGE}m7POThcNeKs_nUTO;h35(>Y`dhy zT}{vWB^`&$^~Q>_#*jJi#9ap=^k-kuT_|-QyV$OFO-NZt;`4-|)s0|wiBOi}iY*+^ zE)R|``5uN4ZEqp$i?-}Zm?Le0Qr7$7=5zdA3Oj$^!FPF@V@{$Qy?hKQrE}3m3)eW@ zYi!cn7CF*0XS=ToUXt`@#YI>It(bUP|MI^qxG&D(;iP`=fY#q6Jy=oWn!ZUowuA?5Hcr>D@$4DPQtm2t1EB8*T88Ca8%E^fziW7yK>xO)aZe?;CCwm>K}uEs1Yb_*_&%< z5Qa-s12cIn>2#*i4v7Q9|F265D#)9YOb;gO0SgsH5GDS(0wv104W(Nx$P*I$N=$r& z^+fPd0;5mpgeS$zPYP_=e2?oUPuf3`5CgX0wMFf9xN@2pVoDMdVmR?d_B3^xHWN57 zKO+|miS7`UeCI;m-P!UXHT7{vAPw>GmmggRL?+UKsN`&WBItkg=G3v7U)j?^s$P6M zDnd!T$v_Kpe2&^WasRL)oe=D$5qo~7ACzp$s$)g?5@xshGOD{{376#;s`;nC08Z*Y+*djBi+XEFV7VEEIz z1L2J*U*ir%P8%h}FE$h6;}0y4Km06l6Tq@8zl|RX!6rBPc=cnrVo{vNe1I$2I9^|v zoxG0UO!C7d2RZYe{7+>8DtQ(f+qAs0MO}>NH!P5_x9Sq6+ENmDrvPW75XxHNTnO$% zoHZyw28A9mpBxt3qseog1b$r4e)7ml5-&Cu4}brZ_hFnAAU{U-Kyt=tit3>2{cgyH z-S`(A;P6$UYltq0{r>wxSiM2`vey3HuXN{(3;~?@{;_S(w=McHH={V24U2&`W}xm% z`x^-7P`}x~?>%};LRKO$)7jC)_)(#>djkvrDnOwp9uECMKT_K9fB~Ifb#}YBlW*6C z4w~E9oPbql9zotp#}I#$dy*CI{JpQ_O$|2ys%OhP*qA2)^QIVeY91v(Yb-@-S}bh6 zu5tedGH-KGdxybK~%#!Yp2Ettmh)rt{$ju=9x zQ4>^rzz~4eB@%(Dx?Q7pxSXo|Mg2@LA~|zmHshG8&cje;@u(v;`ip)t*oV9KK_u8m zS9Ls2Qdc;k%)&i6;cgH^M?@1x-;z)B)9>paXQ+1jdx18qNJO9({i?+?9#$MRR6w6=0TU%F81TD2^movV`zjyk8{o@}Sb8T%qIaTj56x zho_t?Dy%&FSi!n)iXUO09ZZP3-+uG8$>WFEdN3&GHEjK@)#QD_rI5@NkjNo`)919Bv{i2c(K|J`@8_DYa`9?A*Mvn0;pFz2UUT`R z_OtxxI@XPksDgWZi)L$G%I<6#F{&nv5e!qKoA)x00MbTs^jHvODT=D%bS<4{z>OC` zQY~m-rXPg>MzOc7D3eEii*QEYx)Xx0W z?-NjImc+m?4|39{kKmE2eYw$B{Z|eGI5*eBzUsEW#72&dVUC<$$_&Jq?7X~93?9sBM~&u^DORd45fuKWG(# z+*BH8DEYhqEW`fgcL5S$87y%VLLrP$2xGSEC7iMDf%U3lq0?4+nMa#-L{NP!dp(`q zZgn3Aq)8*#74o&%51J4MyolheB_eAu1cM%HNMzy7{O{9P7!(bg9LB)Im%>n8e2`f} zEzL$`Xk+80gnaT3=OjcdNNyt~7zAYXv`jysk65W~tK@!}DVPw-)?se4(89>EJ9x%) zEY9AsL{X>T6f(;`G&zyS`#>xl>W*}-)U#iLf4V|NO@U^vka%PmTdX`?X<*=kZ!b>7 z2zY6|Qv)M{69l^=-nuQ(2|*s?P!*dyU;@o#f{Bv+*waZv3*Q9RZ$*FLlN~U37FC6(O94f=~R<(z9JX8C*=;z_UtPg{ozOEE3GbOce9N9I3yOt=hO%(Pt4hkeWXqn2(nqe!k!;cu3xytWBs`PwiU}6j`WkO|aD4xwW9xyP zv;l1$GCcaeCLv!dq96Nwij5{4Auv$r;Ut(>x2YV{(QWn*RTnm@`oyRXswy$l*Ic6^6fJ_i;H`mey{0XBZ z7Z;a;VL<5ivKm-4_H8j)BKNK6kCG-PVY#TyBwOxBRY{j{LrDCq8yIPf*-8>kw*Qf6 zhE5(Vg(T1VuL1kG+*qst&XD2z@xk9YXm6X%JDX1QeI+x{_R;&DkE-E{=itWSo2emO zw}*N!*vDZ?eLUkjVr8A{EhQ4|Q&PgJ<$~#>W#J(_&u9c2X2qRl>N4Zs8~H5+QKs0p zx+{*;s0>*O&%+q9EuDn=h}b>Gs0P7^!6QnfJz|TUD^;@Km`;&id>E=Y=acd<03)rs z7d@9)YseNArKT`Su#b{#jDQnsYcj8N%R92KBtO??OvGuWgT!nwP&t}NYxlF58_FCL z#R%iA)9nG&A<7>pWZHo+3JKQL2}Sz*g*5c1_5wsZ9D1MXt$J62Hi64}cK=iDZ|?|v zxg03I)9l@QLQI*NAZgNa?jI4HLY2V`2x~L>fFz7ZcVxR}w zFcMYFWtKkWbe#P9BltiW_Mh-NwkfB%36;Rb<7?$XPlwe@zi%hywjslTZlO?RF`Tmb z?_~2%aRMX)jA+Zgj@xL>D<+HdKMKMDlabZD$8%Jf8SGM&*KXdUEV+a--pp2_ZP)I0 zL|@CQ=BeZ98-2u8AY}E&4?fPb4A6cwkb-t$>P&0@Qn_;_Qf7#J3O9@OL0p^;^?v*7 z&f~q``DS#6jX_mm#BmO1!pfPV5uX@`KtUBM`8gcbjZ!fB$yK!Rc6P@P$_&i0z7+AO z@O($;SmhVJCSemNX)=a4D|z(YKf1VIJ8?FSY5&4R<_(A9AjR?nljQ^IorUQxSDN=&GxP_YuxKpvRqO zQ0C4LM^ElAj#bGf-ZA&HQJ>fkd@HlZ2!%0H9N6s(Y}!U$#w(VMrn5SoYDqP}>+?So zEE_k+gzRB8I3o$C%6~vGYN)*9aM`i3f&%kOMD&jmydP_VIOdXjnNtSxPgV!CIN0t> zAKkiBuxLCN>mz!$;lza3gICoBRIP#jKvqHo61Lf4-gFABG z7m{M(?l|9ngFS&Vm(%q_Qn6c-En6#C|8JdMMcEq6a*6 zsN0)RZ&)G30JFnHO%Ed|7Pc;mHQD!}n_RkeAt%k7(-VP3-Xh3|Hvl{vMat&va4zk0C3!<*Pg(a6O>#h1V^N$2{1q)%+hPKfPin_uHl z2+KJLB0sWbGVwhAx#YV@+ewT-xH=igmhD>hOMupd7H=Y*q~*${=L@Phl`x<)ER*JH z|1vukQzcRn?FRJq1?Aw!*FaDKL6HY$df>))l zXZur&@bCcE^cosZbW1BfEJEgn+(jA=1zu}Y@6-Vo7L>p+6gvDB=R()q$yHYPbfrZq zf#bNixCy{QZ}aiZz25-Ht3VczV1?zlJ;aCxIQLH9i{?r-x2NmKnLL%}r{}cWWx*#k zjo@OMC+PwPOBg)7)PcYn5JdI}fGD9kdU7^2%3~cN>x-fx>C4ua%M1D&`BT`LJnRwyjW(L~BR!sbStp#9BU+V& z7`&(mS)u^I1$!snMy!r`DTbwa2T1t_RjJy?d0C=A8d@I>)v}^If#OWNH)BI8g<2nJ z=u&q~;7Th&t@8r+&AMtwtUv0o-+tBV(?gNHKGKj8oa(210F>OtLooBTY_pHp-YwA( zGOrOLgR}weA$G~8EeIS9JfDRD*jRkTb@>b3zcC1X0M0>V7`HcAKeG8>2SE}F%+H?| zpOrK}&hvw)kUzoxd!+iatE4aRYyhh#4MMGt(#f2>iJNgY8zv$N`m`P^PvwEG4@-=E zTBSuFy{l=IgZ|Wmp)GC;cjeNaFdRx0=4FYXj|iM= zUQ$MQwB5GlK-lt@n~^pGXli36ya<|PJ{;CPVlqRQ=Z=I(ptXt$r1P1$-io_Z==m?? zcC;~#nXiIm38Or-21GVhR2pUvG?({`m(X?3@}=#LkOkA zFX9fHY=#@{O!}chah~)9d}4Gw*G7)c77ipR99}$`I_8Jo&nk5S&w(9Gbwts&vGOH6SnxAxeCsi|F_0nmT9pZ{z1=7VC?oK=ecM4AzRZ&X>j4`QKRi~k z`!XOng*t<4En5Ui^^<0Nsxv~n*-prJ;Twvd&3xeL47^UNkxYT`MIC;y>Q_soN9^Pu zKHf8V#lePiwAvfo$SDvjB>UV6gkWpF$Vr(;Ikd?s-2)i}gZD;D!4dok9!N*s4#JD% z(V6^Fl0C|AdYWnZ9cb``&aNYN8_qu2q`e070r0=7H(>BBcyqrSFA4kdg-J`iXH=}T zbE~#S6ok%m-mqPmzT(KaJ&ULw!`>eU0q}Ovi0$JCstJeAKo#tJ=8CMVr4y!k z769Nr#aWSsg5g4Xv8_nhPekIYvPe%Mdf+V!r*h@D{l7;AQC-y(>2soo3{1QOd}7tJU(Y zkyFq0BJ_n5`a}Cm%dTG|uZ9zIMa*uyk?f{;x${VYq1vx1J_ZH8;gm22AtR5IU$Unf z!`5YgD0oeJB(rS#)Kn^WtooJdx8%J=i16iT4}OOR^DH^ZvU`_Z*m{Nn;8v?Us%U!E z*2(7aI$7gH)32Q7?cih-IdPLc`4SQL3NQKz+jSHO`!leKkcTn~9d?vPVrke2Fw1NJJq8h;V;+ZrW&Reh5YOaB8?^x&NZrV1h1V&XWM7 z6bPg2$}`tIErugYbOihs@qG=NNQ_vuqv(O(pr5U8={daXaoMcPq$$_T^1U`T!Xi5x zHmg_2yw}`>Pg7-H?T*Ky?Yy4?k`QhfVDiQC&ytHz9_Nc65V(EJWXYBybSTY%Ri8fn z&h@)DXRL{}^QVGj@km-rXXM{NctbL^wcnID$FpFnw9eGY3tJwyU2T0-4wM29Wj2J8 zER+if70hHUg>~VlqkixGmJAR~^=^rpq%ZarAxDPgtdHO6fFof=O( zBwak0>=M~^CXWt!ySUp`|8Si)+`j3a&9}VXsj{4D7U@fTYUmu9-Hy(+z)XbEk+hWMgUQMPtD(Z zSFTUwIe^^4mBphjk^MA-v39K`Lxp$Dm(jPRrlJ@3d}hS_=S%n9yLvFkX)3Nll&;zc z{asZ*ta+5~q7)QJuw_>S)1>5$__qHb5&M&*<&_7fC>5M3GV$qFnLkYDvyTSBfB19h z%xw#kp>n1-DrL*{{Ur2TVYL*P7-kB&%Nq+64Qzhd@~nGBLy2{1zfJDpA7r-@x0DFE zo?A*>9g2|o?)q5QIPeFUKfg&`$b`LY zWV_m@O~(9oIL~zBxl6$|^I=b5wyez_c}SrQTlTA9!Ib|@LOh(a`A(x6$?m3Mmy@VR&)wwS|p!A*cSGgJPvvUz-d z(j(?c&*!Y(rfXWyK)ZJzGFHYJhph0;Il`UhkG%gj{+1Zt1MX*++P;W9j9XO8mBK9M z=`dUv$FQlWBqxC}&tuX1@dD$?2}(8^x1Zdr+5XH|1w1=M@c4N4PreP*u-oW&8@GQ0 z)6OVM2)!czKGJieY{xki!BPs)7dCxB%r+_ z&h0w(gbT&rD0rtU4`OR2TnAJn-jTZEF0`&#nG!((1PKw33f|czNq`KO?;xxIeM#w%*ix z!TsydY%~#jVSC_~DRgJ;e)wqB^loE9)a4Xxs{A_lBg|s)#h%?e5ZCl;=i~P{c~pR9 zW8JZlX}bhOdczXh*}JSXBBa=e^=d3eHXL|%D04OGCx96rnxFKg0NpHo0QOPP61t0O zEOEcXvNTBKn(yk<7|-k{UkcF%OloBIC_`1=2XT5ie&03C&TQJqWN3ntgVZpPkcrvo zO^+s?C8)($sXt!W9x|ZjpjTde5a10-hJ3N%PE>@P713#<@rbQ1Y$MtHK1I|KBA-jl zViqFK$ZOtv-eD6y&&Tib7pxiG=h}b0Es|0b$P(cnpfo1QcAU()$3=40Nv3hjHdP#= z^!Em?{N2a&0k1E;veX0{(1a>5N6&v{GOBj*-TYEM)D@5;{nYmHcfYL<2XhRJ)>+j* z&cFW_*o|=&BtCpjKk_xPrA%WkLqUj7Xi{>r-8F`qsqfgqv}*2Wyn6?T*N)3#l$AivFi=#YsUUJ7QnlCWyzDZ zBdNbF@Q5T?S`jD_3#1jzmYn;oKDawL#<9_<`u%bKbF}jDs5^8&T?hWg7Ztr~(B&z` zYnz0+#pjng&{0*Knfu<#_N|Vx0F7>zI1Nbtc z&}r7a;F)#kBJrzFwgu}(PKS;1?1i7Hj>g^6j;g+OJsBHqGV-8k^a7B9sc#yf!p4lB z#;r7+69QV1RJ?H+;;nF8M^g7J$;tbG2QoGN4lC^+>efF9KorYf>HV>x|=4RSHdn@Nt3xG&(Rc+vFSM0Yg-6_^(x>30tAvz_=T~1 zDUkUfKk|cw4;yi$K!_!ves0MSmW6hEVQG`)HB+s%XBti(2GU#3-c9&}{tm(AnQ>;;n%iwwR z2Y~~kjY}Y4QikEX^O@mA3v8>NsMr{iuOpWj4%`-wBF??LeyT*-=EBgb<2 ztgm16&jcfP4ue#>cThjsD`iLQr<8T=lev-lrY1yKII_>e4&L}GIjY>GZY}bNzBK4i za%kVqF-7-5&XQrTqgUKo70ZUf%^&rxH?vY)9L9t+W z@RDJ{()=+*RK42w^~Y?pWm9UT7W|Fpm$he}PG*!Bqt~@7Z_e~vK3Z73cqv}F?0eaf zQ#ed#xWm~j8~F5vFd?>x2O?GfO|uzHUcWx}S%1S_VU&eN9}xNqguuZ!7>S~Atggjd z09@Ep6sNCa)>3{oZ<g_wB1+>vdOn8A2akaYq-s|DW>- zWsd`8&Vx}>>{R9gYlTD<*dX7pq=$ot^Imp|6j8mX&u4L(?eIr=07is%vry=A80``3 z&8msmYb#{}sB8ji^ZDD|A`qZdBELGyDo=afW={8q74XJ9{>Ugi3B-gbgO@y2*G?)0 z;UGCMQT_T8NX>W}p==@4|7PH8Cc!%C{j^*0( zr%&mqo+G4b35q7+7qtJOQw8K5Bqd2q2`7nf#k%63Ej z9|H9pO8>WkdS}6uu?#oUe+9}{kXxg#B^+axvRkt4cX|wwouv6JTt*d@wzc{?=*Z40 z^Q-^RQ}uHDYS&+!)M3gKbRRO?9k7`>!~hgu@ab_Oj5vIqLa4LJVa+7b=*tG$BY0V< zBIjCm@Q1qRr>E7k10n8*ukn-1uh5Eb=EKBlciJv(ufCby;;A!fpiZPP1-+KW%#~X7 zX40i1x_7+#0uT-$*9bTTKE-j%@=94mNSK*v!uZ~M%p24vMs`M|IPf0Q;16Z@gpF7@ zo^+Cs3nu%c$SNDd^Oh$o_R(wh1S0=d)Tx$wV~l>$Cau+Cji?{%r)AJ`G4D{mY5-&L zYSelh>xvp9>VDzl>qj&GX>B>%2Mu6>o!A_$J?x1}*DI5({_>sbv6nil(WocNN~m0G z3@WdUSkQvzEv-n6#Sxa+dkZZu5cgu)2?JWrR}4;<+4U>oKB%0@ghqy|aT$GDr{&8q z76mfiU2H@;feLLAP<&qho1yW^j@n+j3rn%`d{f>(yNulJa^G|OyH ziMTi&zI+~gceSdnT$P~#)IY6O+9yE!_xbwO?xmtyO}6Z$igV;D?42<`RJxk^bfv5K z+i4dn8p0x<9=IjPs9#eRBmR$Au(pVd!1Wi$kS4ssc2Jg<81c(%O^azcIe;JMH6r>M z(UfU^3@Q*i))xG_Cia^x6~zL)ET_0U2xKCMCM-n=Bpu8MJ{|Mu4#y=t=VVG_M}#sN zYOpi-6UBStA{3=8hPjvop5|**lZ6*(Hr>=Sc^wJ3RPeKmpmwU+cZi`SjN6MO(lc{y zM;@o(qbYApndMjo+Q=cFA(FdsjKhIzNM5wc!6S7&OvIl~2g+lsbng~+{A6mYHyKuB zW*50L-|l3zc=8ipTV~z*d-m!*hft)uB~g!53S)&sv+)#mR6GTA?!QE#!=*ybS|(2E z^%AHCW%@eV?6@gHbtY*No{B~(IGlBrXqHkt$*3iG{LXtcZj{0SgAF$#u7Ax;#?_5q zALWl8E<@+)`qSUmFd)q!LVZY2!2+rNbAhGN$GWc&lsh&^i;eZ)GZ3QQ&L2trxsIXr zQm~3XlR_69^gO)`Jm8m?IsDTI049MSe;4UJ1Z9lJKZ0Y{LZja$C1yIgNAJ9PIzc#; zP%U>OT(@N61jFZD4ULwl`B4%YnwxDa=A(NO;;%1XpXg1p&Q7;DP>0Fyxh9NFDdMyD z=hsLIyZ+0ecpmG{_Yv|b7TxYG$7J?9m24R2X^4QX|FN(o_D8-Yb^a`9q!Xv^@az_U zIU(Zgd}oq?@HUYn}16-pJ-@X)|4dVZk^1+e^x$B*Ob4=%yO!_c9vB$tzy zpL5uBI@*VkS1>m-CYYgKU55NR2XH^wB=8#0M#vnQGlzO*>K>P_&wb^u<-J?k9Dw@n zb&mEXaM)gA3B!M8S;CEsoIxX!5eNm=!H%U7hxo%Dj`i;j)DR5)1hD4}K6K#s z2Hc&Mz!ZX+BFjUotP#va9Q%a%#VweC8CB=p+?_UpVX0d#xL2%!_t08X%H`|}R?j14 z9M)PGpS`}j)306hDYO-*)BYgvohE=_Sic`S*A-ALU*?Q7Xz! z-Bh&_(qQI$>tHEQf?>;)^`e%L10__GmFn>>rGy%K3Wrm%G^)IRs4;mS9W^d)XfInp z?Dn)LZ4n;d4%BUd5z3bHcYA7GxMg@>pa%|r%f7$-TNc(M4V%~?>!BRARPS>|MaQKQ z_ixP*b1O*n$~rb#Z}z?rZY&ro`ArY7g*=$A;-Cwr z5_>Hbipif6UvF7tD}7K-Pn{QV^se7UQyeL$Y_dZaBum%ZyHsXjYuO&o-}gMpg8DR| z!$a1tSIh3cnTv|t>}=0&|IvBazRmrXQ;`kDx$fF8xnN%QYaHcy#jHq6Ne~ozA>CX! zV>{m{Fy_bC0fwUdwkpih>~$z-Cu19i3vlUQy7l%h3)9(xR|m~0VIVdmPJ$W)6`1V$ z>f5}}Ub0wu#yT80EPVV@a5<9u^*-%FU)!Ue+Mf%Jo$j#KjJ+N)11y zF^Fef&Gr8wC1Abq=O`K=gN|VhLx)!mD8^-9n4d7uT8Eedd?gOywySsslyGLks|3A-)M&x*KLjyK})x|LJ<+q|D zg4~zqcN}KXefp2Q@pmYf<5tZ-HctK)0+_PD@zG|Qy-ay~lQ|P_oy@(!&!Z~7 zarM1SQM2Hwd*|DKz3d9lcfQFhUbtU(qSTqc@T;iv-f4=bf>n+J%Q($HM;~DRU{p-( zMD+IW@nA{OI2G#GlZ$4G@qw0`4?}_W=_xV>TN6H~io}`>VwR(Cabt|$w5Y>UI!dqp zl%#Do-2Ux#IT@7~*eR=Hy|!7Mc4@COQV}z(FIi~UzhqeYy}zNpguG}-Uo-X3=fs2j z9oQvYae0bQE^fjKCkkS&uO~(VaRhMoM1jQg^{<3sE#a}Oq#y*Bt+qDPEDf#fv(kTv8Px>2AgangdfV;wMYvk@&4VRi~HbV7@ z)F5*fRQbBy{q;Kaz5)pG`?i>92*MpUq2!gY6CqXl260%*$iwRuqibm|c-yX3+iZgK z^x~hH%cbht!VF3e=Ie>U+Rx+T;~@{6HZ#H$C70Er17%$ z^(%ILXK4Lu+pSWBo#Bo!Y$nrT^D2)dv>!s*BH^3nz+N~rJ~EQ9cC)+w`=GS^vtI^0 zW%Ccp*|1gN)XdgA?5WS*@BRF-Z9|n5zt!T++(7JiF!Yq>BG_|biToy2nAUV@HOD`@ zV+Fe-q7c8X^lKKo0uNdERtp#$CY2Y25is(ybmph8w*?F-b_8m?#|(xFEOb6AZ{+g1 z=ugQ%zFqrdHD4H`Qhj#qG=G>qGgEI1t#?_3t4;9K7H|&Q1E`6P|dVvvA5aJL=?dj-N-=GL$5{lr`ipo)Ua1H=3{&73Gg!@c^x`(c&^ zih(hDdF%vxgvM9dU}B-mT=m4~ZDL zk?lgauf^OSLCc+D_mi^%D1~lZvhYEbOTSM{{;Sb<)B34Z)RINz!NWi_C03 zri9&ZW$o*so8c}!C@P=z_O7hX8_gbPdo8iG06rGlR&%`PY+AvYMYiEjX*EpSI!TgDS*A&?#oG+7Nc4l*O2mWIxc~ z@hn>&N4P?8?)FFcbJNhZx8)Dl3}JB&_Uu#*_wEz~Qz4LW{#RSaP0lLG6+G-Z-@`pi z9m-R$&V&r?rz+`1{vLE#T^y}$hUMJQjZw~y4GU*rXFca^I?g?``i+#enOo~#fU*2; z)7DhB@Y;H}sLIrA>+w{w%pM<2b(EzND{F_^_3ha9?bd>4t?TyLcdP#KldS^QqV=(f zkxMN@CHC@#R735FgluS$P^njikjV8;#AcC(wc2{>(DS!_i7uTD^I3=yzb+unT6lJL zMxC|jblr>>@&tjmhXQH1M<$%5kg_rwO+EwOCUZ529Hzs>ytfB8=%BI$~ zp~BppNYQ#y)Fv1vrwAsWc}-WkT2I&b$ZqZKDqZbVsgR0#Ym@$(PCv7r;fo^YVUF6{ zkjtw6Wwmp&{ClQbMGlSJp>?RmQvDWh26S*L)GZzVT(;bA<~Y>|-ZPZH;Aur7Dja2L zD{pIiRq*Q5w3@6elypRAMu2^J-d8-GW(mNVL-BHPCoqSw>tNN zpl|1NwrRw3xqx)+v#Acor&2Wsc1D`}#PmPE`2rqD)N%yUtP>c5OHp$H;O;DfUptua zA*2iv@>@dOy(CwQ(g;XEAFwu;XLFAz6*j*jJ4XJw3f;A!o$?a4qGGXKHM%et(u1@`6J3NH39z z@&2J1u#O+|+Dt}|6>H>OGb?HwGd**Als5DDd?5^~lebnwpv@Fs;y*5{%WBoM;F| z?0@MVnDdijK9G921qLJvE$y#i|6>h_PoZwDH@@vpuHJ9Cy?Lvbeu{Y83F2)JKR~N> zZC4-i&2nsp(nd3hMBl>)|Hp(JBX;8QIBXY4TE1B(1E)6@^%tX--ISetWk2xu5&~-kfJt`WXWE( z_vsN4=vwDckSnY#QNW<3AeMwa%*|&io^04qr7=F%dTA06JUNNt1tENzo^Vw!*n}j2 zYPa$dfj}sCRd-)oFtX(*-StQoHN82me0lAROJoo1%~qMKVXW;s>vGt=JNugE^T=iL=Fk*0rXxsv{k)%y{;_Tf&dWB%v0_u?sR^$& zTy(B>M=Yy95+6z6AanY&HoGBJcdAPEuBPG;uri+aTh)Giu^GV;Fq0NYdU9@|6jVQV zwlp_8(!Ay#j6)y>cMn7Xl3Rd+Nz~5TUT~mnHVW-y-6)`u-P?(y34Nz6-NxK5I)t<~ zwYCzLS=Y~lC_&eQz0nuJV@f`O=KM$$FAB#SzV0~Dp}#*PGZU`i)`OtpzWw`cyN&KZ zvBFSd;%c0|O#5vSvGmPP)>{>QIRdC*`#k`cesGd9WH*mB7dG{zILc#3Y9wck2A+kxZfPQ$BT>jsi{~ne|kk(nSITO zvR){8b|t_B*Mo$11=<8hWOea#hLP|Pah*wLbAMa`5S|#DcdavLBX_?&co^|2uU|~M zU*pm^1<pRZ?Agpb&zUzcItJA@w;{C38qmpi&*yBJz^e^3r-w^^z+5oLMPG zR%bUb)VtTIM97s-c93%L5wj;=F%$#r|2i}NM0rIuc-BRfg zm-(WoaUy|2Z_Y-qY5Z)Lco{!V1QPMt*IwQ6{?y;6qhm1Bd;PjV@LfizzCoAk>{*Il zqtWQ1ATE>%)1%!wnE@_6@18itysZq4>OmftHyH<4#Do-#U%CSPvQ$n8_e%?#&Bo<1 z@4b1ja}j=WsSWp)AB`j4#n^OOs$uncSeISh5*Mwo{;uKJ?~0hs3!8Vtx8W4+?VycH&g0(5?0TWo*XihxX#*We5FBV}{RMjBaM|v5O z0i6VNCh0M6N;?mLta2Ntq9Wn&?Z%ggyNb|A77crFat5al1bT7PE!U3x^|?nN7+3bD z+TKV~zAB`DHL9*5nLk%23kUhc4Ams5`vapYD2WU5*4RK3>5S~{A-Y9+F;G~hE0{^7I_q%>HJ!@|?VH2(Cw5a>$Xj(96 x!Jq}hHw$RN@XZw3$e;y-77X7kFbM|nxQ?y8$V(}2NYR1A8}GONZx7P3{{WGOI3fT5 literal 48412 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 a%Nq}muj?}z36pogzspK$7jhJDJpM1fw7a Date: Wed, 10 Mar 2021 21:28:34 -0800 Subject: [PATCH 082/284] Added SeaweedFS_Cluster_Backup.png --- note/SeaweedFS_Cluster_Backup.png | Bin 0 -> 279733 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 note/SeaweedFS_Cluster_Backup.png diff --git a/note/SeaweedFS_Cluster_Backup.png b/note/SeaweedFS_Cluster_Backup.png new file mode 100644 index 0000000000000000000000000000000000000000..dab52d720007335714053c818ae0324092d41186 GIT binary patch literal 279733 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.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%0AB~kSC0>PRmLRC(Gh%Wye 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ΠU^+l1Tq_x34VNwDL(Y21o+}yGm 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 Date: Wed, 10 Mar 2021 21:43:25 -0800 Subject: [PATCH 083/284] Added SeaweedFS_Cluster_Backup.png --- note/SeaweedFS_Cluster_Backup.png | Bin 279733 -> 102603 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/SeaweedFS_Cluster_Backup.png b/note/SeaweedFS_Cluster_Backup.png index dab52d720007335714053c818ae0324092d41186..022a884352db2a369c6dad520921a9d6d21c01d9 100644 GIT binary patch literal 102603 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

      ct7F11@vj)aWelu{+nAWP{{0 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 literal 279733 zcmeFYcT|(zwmu4qyuLbZWP5drDd z21c3{qzKYg5FrSNw7b}Qe}10dJ!g-*@3`asb%ycH%gS5UnscpZKC`UL7G{RqHXqn5 zARw^K*ht?>Kwuq5KtL#b<9g7N6K2K}5ZH?LGqCrgvWZ?4f`Bwk@1JMVP-Ra#(@z?v zFAasdF&K&-UT!2`H!4$+M(_ho;CCwB!;9!e@c8F7P-Q6Ogfi>|1Y)hMDh<94>*Q)!+X*E=uA&(m@fF+nC3^IfN#(Yj^-F}um}Gk5ErNm zOb(psFc=hq9l;&t1-gJ#g{djR;Gp>!%E%gRDh<^G=M*n80el$}@MQYxEqb25bSh{; zA`ptoiYhRuiXudPwf7h|qMNVRACFmW^e6Z-z38-mjtHWn2>$)E?*uJ|LITW98BRn%Pr%?R@Dor3MD+v=s^)P50mZu!VIC?3sPaF$12a&=LCiehXeiPc z$QJ31BSLg6$p)snXd2B6PE`)1nbG}V6qKHhyP1`jswExn0WR~Wqm0#QhBlM{4wfBA zQ9-l4m=+|Ay1I?NEyTkfZH%&J6R@Uigg?Se)y)b^!XVuB&GkGuXdQ63j*cP1R~o7d zS2eX^=;2Ug6wWh{>O(bCC)rr2Bf&3TdfpIQmX9&c$CmD{$Hby6aYVlW2FBLJhJy47 zUYQR9C#tp%U0Ql z%Ch!U(TAYeDgi87AkEaw)(5YOWipJF-Pky+kuuH$hqL$gMk!l(vGmpT3{+IGa1)#z zHGs-Mk<5IcP^voH+#mGKn_$8+wZeezuJ+i-gw2Ba!r4q!@CQW|M)9ymVt`Pr{q1cK zo+vbvMn>vbn2;!F3lngKC4r7MRrAF9SX&_cJyEu{NMk#qmzh@}(K8TdYvo0=HPba> zU{!pZ%^@ zbcBT)5^rEg@$tqZX*dGM&Qy=0Zes#r6YQxtBQr~eo*F_AYG7*Y@8t_K!1$}%nc4$1cI)QL{N+@Nua@ApKYp- z@YG?Lo2i*HO(CWPQxgx43Kkhaz#=(VtgkATWMygW=BG?mH?U_}d-)^PJ!~M9Kmx;y zM00}#*ibxF4InHW$p;7=X#>^`63zk#f1)RNJl!5{NICtZJtE}Z6Phr)QV)IocoIoy(Ihg0JqaX4=Sbbtp7YisCEXM5^e26)r$R4_V3 zKaP>UpAo}c-3#XpkWAMDMzXUqLHN^*3_Wb@R^M&B3O%}h93nV!blhQBijFms=%%Af zwnH+>WHJmxgxIkCyx`_Omf#XkKLV7fXA=NZr*iDcM3kC^J`JXfF}8)+>Da26niw;2 z$Uv4Gla02uxAkKw+Yoh)4QNy>Roxc}g?Q*v$ZQ7D7Uquf#$eps@Mbh5ii-7O5y;+n z7MM0jmIoCLUSmQqWV)-{crn!MO)yvk6_lyDrzt=vT{6N4;zLCQ+A!cG9Lo*m>8=JL zBCL#k{e4j=J*F?+)*{fr6Ka5R(}NIA***kEz8p@Ea?t}AZ*jT~+5dLtAvA>zW zxeD3a%)$=~L*i9X_IS9JA=X{bL|G4xv({7f9VR zRoTGO&`KZWPS-KPV%f?J&?`d((%4O(;i;=k*Vkq1l1&0UiF!uHmX&@>dDZLIDQ$W*oTF+k}C5YY@TWfGgMtB->E>cjQW2C5b& z3}YY^@CF?^M&HESly2!`?XPcQq-z2rvxweUFJq#R9v7-~| zK2!>nSZ{ z^n$3XOw{-HF;GR};YQ{Nh?|YFn>W$N67A`&>~3j5w6^xg6Y17|7WPJFK0bE-SU8SG zRHNzGd)mR6z7_@$J(vZYW=W*!+Nogy1Jcz;m@+6frX(X8k?Cd)8W6fTT~!;Fu3w-I zHqg@p!SKWDFxAv`^@uQ%yBQT&b~MY-kOrrlnL}*?SvopId>|CZF$(ltwcIRyBuUo~ zs%&Hpv-O2p=r97+d~Ez#I#8k+)f8caN9(KO-Eeq&7S@}JfY80M%D%=Vl)r^NnxcnS z##y_&!x&gwPg6Ame-#V004t&z&?*(k!<-r5VQhnR$Ds5B4M}hVYhxV-&MeRfg488> zlWh=WBWolaLh$pqN2{n%Os)03Y3}~|KK2xItP#x5Kpo<1K_U71cquEB{e1(`cn@zZ z9j3V30PgfMlfq@BQ-xYRa?5HDb9vvOfzw_fP33|(*kvI z0jmbi+=NLoqR@yIP+wyTouZ~=W=XL0_3?$#t?39O8U|&mZxrAKr?9-KCU{!{=mbFz zf`H(`+D01a+j&^&s?haS0CzzeT6!C)>#Qo#&I@B`&LR-3lvVJEKwUeAIn4^-1F%|5 zDK1x|2B8?o7j0oFcjPn;1oa24Css2B@y4W8&m^(7dr5*j2@ z*9`%_0sybq2c#C9{>5wmL2|+0|MDDQ1}|!5paKGi1&sA|tl7@v>Fd~OHeDAoWxV3D zd*5lYPzUK=5o=ED2?*GC@rip?Q|Tl=viQTm11E~l-3g>q+`AJcD$#d&VVbhj=L=j& zP?)HB2Ggm+6E=EkRC7*U^i%7p@AucL?%W~xKYt>Ur7dKMl6Iet9$xcrKG%lcANjYB z*)MaLC-yY;?kj`SLi+#XC(e%aKmN9Qn|pG&6n!f_Ls#VAbXm~YIsM=Lyz`RVnz(96 zHD|Nazv+sQ6o<9`f9|P}{^1LojQ9Oy>hk|iGbNYCAvA~_R`-N^C z30D``C-8G^{Z@gjnCnskY|+zcV+(bHY}re>+h%^wT8Ighch5%q3S3?Lf>oUHR3NG( zWCbg5>P-2B{lVkw>Z40Pg$X@8_9C)>MPza9>08tuu0ZW3zDDiV#%Ye2z}SjS_S)o; zrn3Tp>aE>j0?qs>ENk~~;Q{3Xtra`mt^chx_wf4r0?zAR6+1(B(SpKQ>NB>pRM68)DR_s z$=I>)ul)`o1^16%$=zQM(|Tb3@oyc~p8%>qxb<&!Y}^(RB&aby_=+oFw*KLh_kF47 zoHpIKnEO3Rz--RvP;P43)ROpvmlG3GN)n&9x~32ETv5Hnf~JpJAVT$vu8NAL`15*v zt#2xcdbIT79)vlTOY^Yic=_kH8l+%Q*%=WPPcg-ezW@@ z9Ig{j0TmQK#4^`<7gwejp8mk-rr#CEb%Ef z@*l5X?Ez)iwV~*i5X`&ZEA=%hd?jRNZTKMd2s9|6gjn{Ww((c7!u$FIHMV%s3u;bb zZU=40>fRp`tvA%GZ4l{#XIa zkWyMWxGsFgHh&~{h$?(TIGinj5}-^n#5IgHAH0EYhvlZs5o|~o?bk6g; z*9p87pH^dS3Nl%!5lCEPKNzvM;~FJMt8IqVP!D?&w}~aXSuDY~TH<+T|)%Ukm{)GrmPwHFc{ZSkGE z<^98?l;*DaK%FN9>v|vz#n(wQQ=)Wk^$d0GH09)&e^6l9%vl9ja8rL!G&GqkTP(`k^ z=}lxTCCM<4)I{l&rM#)&qHvYD^WA+d=ba@5O?{ugC>$4U*c0xxebd*TrW`3Hr5pGY z_NchP_-ey7Y?0F>j?{+O6%y%cb3GFV(FjBqJfe5 zN(K+Em!M;p*N0;?#61Ii+vN^nFAQo4B$YROvR{;rkmYqBtk-D7eHW-N9v}~9g|-I= zU#Po-cs;8;*0Vf8R9;XLv!93%E$-QnA?bV^Q9s*kAwaJhs%9S3YI-BnE*)gXTeyLG zQVcJs@ri*sVkg_@IL;i)oA24gyKHq~h3ikWD0?yr)Z6LNGrPha4%RUWou^qL)#qaC zUKFnQUc}q0Uc%N@#Sg{{Xb5|_s+!Oil%&U1t3uSxU8>geXGVD)%sZjK=jKi+04_Q| zQ*eKw@D1dy8w$5oiVr9)R6coXBIhV4o{!ww3|$W<-0)kQLk+iF#YV1G?=fsvDREh} zy*@Pj>gt;EZuka+1LRIC1<2SNt#)I9+UcT5GhWlwF~NMK^Y@BnD{x(9#d6L8>BHJN z=Ee>7nyN%>oog<+Ikfo|q4drvIcl9ijPCnNlxFFUFzdezS=ly}RKhZEe$`8IlVh zGG~11<|8+oM~hY;6pu?9=us?BkL#$_u1%9QaSjX3Nb7v#9J+O;==W-u+GxZ_o~az! z^A}#<;|U#N5ZrO(>K*kLLlr;74`m5u-Oy-(ACm4UcwlPaJUg|v zRx*}GH{*Qk2?*Q9^*U=?0OR$B& z67z|5&)U+5hR1qa*EVSd6UE})r*R#kB;rp>YC_fz+VHN{_t;EUcKKD?;*~J&^gzRD z>4Iqu%PV%Hqr7hHo3Vepwp}$Xt~ljx^TUj`cRx8R$I0{|Z0{QV0oPi9!uX295zy4+ zHy@Hl%=ksMpW|apaaUA``Os7C-nLw!&2Z-fjYJWOtv0c_tN0Xm9`zV^eTYRI#<9?K z3=b3Lb`yuhJXcLy{-XmhOD=lc<9X5Aga@-D;vG4|V+qxJd^NOZn|gC{$du=X6<$hJ zpPG6Rush$R_Z@p!SF}y{3r_(P#3b@FHhp3mN{qIxg{5+(DJ55(xVei9iUPMaJ@`fX z5v=*c>*T}S+*BJlIb%xiuU9u)t)x;-+dmMzw&z+}V?N`et&)Rq=`%i2If~9(vWHj! z8958nLrq*OiN8om#6~~~qj#{;@_$V}3;ZU8QsKZl+r?vb+AXQ)W@O_7%5y2v;bZZ+MHhEeK+V@bwbkY)meumYb*qzJ!^gh1#tjKS3Ij= z>uhCspW;;6(3M-wh}KPwF0tZ%e92!=Xy5eA-=}7~KljmDV?s(OF!U9+xzl^8s>mX;)SB zgTUh6))-iP(m?W>&famBdxc$d8Zq|)(95TwQ~35_|Mysl!L3PuiGkYpqw+U+2?6qq z+)BhG3fVIgS)BZaz|suGt%Hq|*s!Q^NYUU6i6=lVqQ%0 zhCIOH-WqmAlgx!?p!!q+QM0SY2Xd z)Vosg^1OZF$M4cci5vUR(}0FA&KmM@s=4{sP72u5BfszMP%`~_VpM5c+Nhjjc&03U zA-m%@tR6K2V?HyfTJraprRuwi$Oq+_0bYBH^*I$>O@}uxE2m}LmUu(?F+;;)l0^yO zH9`>~#?6xC7?Ez{4LMAh~UMBb&Zc~|k)(wtK# zp*fr*hv(Y8TTyG5Vyne(S8AKrrU}pN{A*@k+5vdw#)ytbztK@OB^mm2G7C- z_Vlz8jh!2wB7d53o>T1} zB?r#Sqt@F;cedv3L`5`@G=CscaaYh+bm`or;9lOfDgG@)`+dUYExA)$r;@f-eSG*R zEOJHoVZ-C7Hyt0DA}19~s-D{pJQ3kFoouk{lDWI1t`P_-tlgmWK*tl!ElEQqnHz|& z>Zpn%yC51KlFY1Rx`z){@u6_iEJV99ERQO_*^YQ0&h#J`Z&9Kze0Z<6 zgV(f@m^pCmVVl7I(cyZCgMVVaxeZ}Y+LTWpr|@8^Qe09{`LmtEqxcgJRrfqZ$1i|;}^~Rq$HCmU%6aPeDwtMe125# zX((sD?}B!@RQBGcX#twQu_7@HCvtUa280iuHOc%s%25|;EQD(0A34Ems_S#D`rQ0B zA;GozVbAc_(~m3PqDfVEh8y|mqIuOjVg{mGIO<|`No#J@Llp5#?;kfhrS0M8byME^ zZqw)c2H$-+Ja=rE_XLBNDRL4z)t0%W9uOQ@Ayfb)g4ZPHvc~0P7KXin`wY0nuxjy> zTz zl~_HSx;@wY^N|{{5642yFC{s~z5NkxM!wSd zebO`AJLVJxCu8sm?b!s*TJvb>V|fQ2j86v$2v>dS*)M>S`~Z^)It68Ozs#Sx7}<49 zQ5_D`{}xSvX7~lSaW9_|t!Fr7J{H(lzTDc>Y=5fL+hvVwG$A0G73{){ccRP;H?Fw& zYkXE1W;~KV)zO<@avT28Nw-*{I0^gYiMPVR$G$r=Qi`|xXg99&YaO+>dhCoFQtYTG zMLBP#C2CK;dr)|pNy=;zAH8ymnVG*^NoQ~vKilBDz8yQizTUngQqr-r%+@8SU8QdH zo5rNZbTtC@Y+fNu@X4Fqv(uE8!M0yNw~}|mrhAu*Uw-dyf-@AC`A?T4_qN}uJy1Vd z>MN%3(e1kU)UXB?0tnpwD<|4f|7QJ_?r=q$hgPR{X6*4#xV6Wl+S5BsV272Ug#uJQ z;Z0MHpjiDi%avnF^ltigNTwidv0X2cE_=U-shN|A(x_#sccj+a?E_8~o zn0WaGL$dpJ*fZY zWQQ4`{{46ID}LMM|K{ZI3lI%FyVd&X@4(J#z~}$?oJIgjb0NNTWY=H7|GOuDpF|wq zeQjtP)MA_LUn}@`u;GuB{#EcZ>qRVsX^&LNk7;OA+njix#A z%gx_olkJ)7&0I%Y(+Af|7)bsDPlMLnzkh!&GWx$@+B=msVJ5v0|9U{LkCr1W&nBZ`Vf0C@&&R|6M2y1x?e3q_|{*94UpZ|-dO~r-e zUafUXYb?P3~l8 z-{MSnhpuGTCO^6V>KSZHbDC3dE0Bda;R#`}pc>x#5%-FPyfFXbJ7YD`?B}#G0z^ ze)#R=0s@h96v*o4^y~iej)y+oT4lw3{=CB)A#)oGVl}7QHMWYq+jmj;CuSo%FAiS8JQyZKLRI>ZM`=!Xw3+n20e+ZrrP4y)dk-UZ+6aZFR}_^QN?iY59K7Z=Mu zd;UCHxXEK@+EBc?*5jED7y8i~jvuQz#q-lEOMNT-7sP1FVarV}%V%nW<_4Y$Yd^bX z5INaRuj?=ErcLixB}_U6d^|5kuYNsx-I9MOA`mX!1D`SQJeasgL0_(qb^ zVM{Z1QnIoOtI}MVt6S;6BLCoY#{(xw(Cqk)s4rgEgtdMOsPzR;3r3v^n22gT6tuPR zV1T31=!1z*U%q^~PI|1~AgsL@epBzFZGfld2C#%0|71TmvR7T8SFKk347N2% zvq$eGr7^-k|JdVx`>FG@wQ2_iP5K#+p4_rhX!$^Z+Mng}$i~hO`X9(&9B?TU&UK8@ zj+=YGqWHLEcPMgxSKAt?{b_*R=|G<00e{=i@Vr>CEp84B{JC_Jqx-pUE-Sz6;-#yC z=4cu#i_`28E@`rhT+kl{YgHC49UdN*S@@A2(EGUDXD}*w=3Sx!_DtdlhZLo-t|#ZW zME}s3{eYjEYLt*vRNS8A94J>iKO$zDesV7m@+_(R_(DcNFDF@@DKq=6n=~{PF1Yp# zyfox6QHM#{JYDs@R&3h=mD6Ts+aJ^vz1{!ouUddv+~VSN+lL~;mR-Ad>p=q!pS9v| z7lUsFvi+pVgSGB=X8IZl>W}WUD@9m zWEhy%|1Nd;;xuxuz75tfI4U}ZZvT9?O#E`}#Yc@_%7V`;g|#Sm7O1(Xyn69EWM2B` zLh;+lrAI6yv#7?3+d-cuaxWY`qP1Py%;n;!w*9%fwA7d|E$y{ed;Ir=aw`P$tuPPW z$coDggWiu!(T~rGZEuv5tV&L9tr-+cQ_h(VhQIJ%BB(X>K$hT?KW<{J4C=m`}Ml|v$t$Wo(WxiX6*U)mR4wbiQsPMw95;04e>_t zF2VWpS^Jlg+M=ao%^wU_%!wQ&zjfaFouA!(%fvh1cN&UEsP(d+dd%(HyZ4B+^g5-w#iH24vcAw$X4*@Bk{4V!!+T-- ziv3V16xyHuv62;SExutd!b)A@@P$=CU5&Exn-&ROKznqVJm@ zY7Hk~ny(QE1ephxw~^dhg__5#=2W#d5Bd1M`*$v)4hm5ATti9p}Zw*+SYE0d=S7E6>gwTMfTLBlR)SUYE=q+RFxkxIj zsL$=x)wwMT6>g`8O0-I&=cN89YK@s+=>bvQ5dnk({9`>|tIq>*jx?_f}+ZUkM4W$0?w`B8BeXQ zhiIXYsapJ0Z-+dCr`eY}dR6O6nZ5nX+szWe#cQ-%?61}o(@vjFcy=7`qxd1N zI-x48Vnt+{|6{HVwskyCEhs>+GA4BQiIn!ICq#sw6-7C*2?OrIKb{#Qq1uyg6oP+z zG^y5DMuFQ2dd-2?LW`w4XeDOr7e4;nC>?bH^8!Crkm8cq(*K zdPA zAR*Gn4P=T#=HK5n&wOdME8)K5SlIHkgd|Z!!QR!Qtfp{Lh@d{U8Aw1Z4RgL?;nN5`JgWwzX%eBmx`?vC< z+}e$@#Y>^Z6@9Im%=VMnLz+X^^ca01a|a(DYFEx?j~wz1n}7aho5F&Q59)q%vqx^v zS?RC5smZ7E%MNF6C9!T)1W2Hdh~VS;`43#^LbeGv6jXD&6q=HI`h3`tKFa+mmt@K z*i?#qT}4j<>0!sv$GCKod*Rn5p;MVZosg6O)(9 zLp{Qii+xugM~iGloaV=bxn0;<(JkW=nb>lCnUvAlTIIVLGV_tyuh4P&NN~eF8hfDN zX-jgoLcSdi)4cq74Xm}Xui)7mB_)I0+b)kU0sM}aHHYK*?y8~Rb6^W8T`$bG+g4nV za8_TN)H8i{=TjH0u;X8)rL8AoPbuzc@OE1zU^1_6aebh0; zN+dr#*B>Pcdv)7T7#33_^S!5n=`(OycA$sZrh4?6dqRmPh)%}kJ#9kzbQR(oUrxxT z`^CkUC)7~RpFfZEhN6A|D26bn-C^961@@8S0leSx8)vJI`KSguKlmS~rbb5wbA*JVP@m zsya)k6nZ89&E7p#8Z8P|1h$1~Ki! z0nL1Z-1fxJj51Q|(xi2KQX5}nZ9>CXM?pbCeX}WXw$P>^sjb*j3v(EA55tF=waboZ zDZ_)%9xwa8b(al}71V8S5oYa)KF$*}NWE$CX9(P)&*Viy`u= zg|zC}^02Cr9r147%NK*@{kLk3u2uLo?jBzOiXW=aeQTA?{*)NG{)}o!r+uaCfN-u3 zr_ytHI~acO37!crwM$BLB_xnS*f_d0<6!a0EObF!QcdYV_m-q> zE^P9NcFf~#qbpdExGeDx$3CQsEAYtcAXE3_(Y%fD&F^*&XY~D$)=8| z1ehZ9c3xI+_7I`{K?&`p6Y-UAOLH8dW}r#2s@X%vVdlcODc}gTTpDAIwTr?5S~Zx$ zn-Ts*4kjTUB32wF2Xc%pOQYO@%441L8eyFJ8d9;8(mF*HBzuz1UyTnRm%Ae0s zMLLR4_VmT58}UQc2q%tRz!vp`B;lo&I;XQ2F4l&(WooV?_59i!8ZxMW8BG?gv&C*8 zHxEAewTHEP;J9=_`dMiXwyEqPTN_SmdCo6T)H|C{IpSmPm;yhkd{$l8u)yCGxPWgL z9N$VSsa-6J85T??e5E8@&U^dv*Zp3p?;|a#@-R}qkDM7cEGc@%J2RMX93N|P|BJ#l z*UZ!zf9|kJzu|q8&Ze$11?_7|Nu;7cPORvn?<@?@w>?5RxhBE*L4%lboTB)rQ}lFv1eqg zFKnge{>`SMt$AY2sxVBsQpMFEfZ?Us!&!<= z;X{>kHR{qzE`tV)(VpdKxu(;cl&Ph?GRsO~P0un!J0uk!41BgyF4ho2okGAkoO!XV zi6cw6n<2RukV96z(AoK>(%Y`RXkywOoi=V%Z{x&%XWq?;@G!9oGtPLz$HXD0>5qFq zB)LRIkZS1O`(T6Iq}QB*Cpg~UMn>k;sUTfP$DW_Bq7EIrZFQwc@woOtUye=g%Nu!C zg0?lip!7%@D<{r-~RaF z*;TcAwjJ9Z6ySBC$!v^iA#@O@_UyG@H`jNo4S`=o8~+gN#U7vSKX$zLs()jx_t!64 zeq*s8N+tW=6{C$VJ*_rZ%&TU%aCuFU9nM_kmyQjy<3U>{o2#}=){UC04q9L5RRy>d z-mhvpS-R?ejX!rlN4vD&|JISuxn77683*M;!o>`3baz$=9#|K@#@@*+IhV&>b@8Lr zC(**o#G<4X)`D{Ng3WV+A5*JV;A~)tesJ(XNmf{T$>SF|69?ic*cf+g@MNcA`Shu` zqg5+uF&SRyZ5w9$5qb-y{9~MsWp)-%sCFi{Z|eJ;NDA~ocfd%{knfY&y%NPXTUM(^ zl}~T~xTi#i&(~EV+CX!!CplZ5DT*1RmVLZ1G~~g&ybrbcgR~O4!|LcVzex$nhcMq` zWRzg)hB4w^CP$UeCNUR*gZ7}gnKhANBj5hAXLzjIC@O33MET%$Ng^mOX=G1Sj5cS{ zBtm|~^7M(CIAC+$=YZn6j^iI)Tg<(Tw>LLr{U}v*zI}tR*o-68I3=EU{USu<$8Bkn zRh~|QrV$Ra=f#?gKXkA9QIrqL@l!7Ys}f!h8SHbE9X>Wn7;ipC%s$b0cQI?v-Eh)J zH&7OKyyEfv&$R0`%|6_lEg^SQvIVlQ5#bOe$`)(Bua=3A$(Wrp=egt7#)@N2`Ek26 z#9j`~EG|p.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%0AB~kSC0>PRmLRC(Gh%Wye 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ΠU^+l1Tq_x34VNwDL(Y21o+}yGm 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 Date: Wed, 10 Mar 2021 21:51:48 -0800 Subject: [PATCH 084/284] Update SeaweedFS_Cluster_Backup.png --- note/SeaweedFS_Cluster_Backup.png | Bin 102603 -> 87999 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/SeaweedFS_Cluster_Backup.png b/note/SeaweedFS_Cluster_Backup.png index 022a884352db2a369c6dad520921a9d6d21c01d9..d8f2e19ff57674dbeb60cbda06713d825fa60bd8 100644 GIT binary patch literal 87999 zcmeFZcR-U_(>_dN>xOv^d|Lpa2KC_pYQ$W`~Tft5$+`Sea@VjYp%Iw*uT(7eSY49yeup% z{Dua)W-KfmB`hp#M%+8VmA41nS(Dj;E%k# zBg9eR6!=cd+na>9#ycb2!4lv~3Q!pZWpG&vVPIimECJC0-;>;lc<`4#-i7G3^${I6 zA1^Yv0*Aq5^u3i3R&Itq1bsQO3Iv0N zE9&e2y$u@P$JgD<^Y6FGE6RX>|9*k$?~VWaD#4xV=I6Y1RY4C}^dHlK`@8>REUccP zmJ8fd(G;O)gfpWm8(X@7jcl#J6AM=R+vsRuue0)h-vnw!bH;i5D#FnaEE?%$%rLQ0 zl(WT~T9Eu`${2qp*~gS-ZRSQ~YMFW*K(xK|{9$B<3EEB93IT&+hY3~uaAa$y)* zdosMBXtE;4o1$oeq{yKOwl01y6e+Q&&OE-tt00L+(%mlA_t5J zzJt4(Y<;zHQBVLsyLmI^846aqNSdu5L=T|?_kcM&dt3NWw1^}dA_k|7z*9_+NJU=) z1Bb@A*mzRiCA+1fJ3-Is!}u+>8n=sHST zwmwXp71WT41}{-bIEbkN%97@{6+CcDH&-&v)568im?G!lZ%)9#R8SZ_Hy2NT8$CH& zMJN=i?+P3i4wXmH{dINdo{IWRBW-KCGSh~k=MOhQqLAit2G-ym5CcOiZHSJuF$HU6 zu86etcEg#t=zG%@l=OA{UHz@C7(O~?{wSK39@>_|B)Som&9(Ivt&E^_q@1rSh+b_o z9K^@d6lrPZ%_RBz`TJ_4;I4WW2rq;!3GRg_!#s#)iq;;UNDmsp)0gRocQa6OL->0k z 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

      Y%D0;EDYhx{dcD#lUKACC0qC)fg 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 literal 102603 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

      ct7F11@vj)aWelu{+nAWP{{0 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 From 828fbf3fb796f19095599d5788e2b517bafabba9 Mon Sep 17 00:00:00 2001 From: wuheng Date: Thu, 11 Mar 2021 15:20:50 +0800 Subject: [PATCH 085/284] s3: "isLast" returns true when the file does not exist --- weed/s3api/filer_util.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/weed/s3api/filer_util.go b/weed/s3api/filer_util.go index 3626ece98..12a74126a 100644 --- a/weed/s3api/filer_util.go +++ b/weed/s3api/filer_util.go @@ -31,6 +31,10 @@ func (s3a *S3ApiServer) list(parentDirectoryPath, prefix, startFrom string, incl return nil }, startFrom, inclusive, limit) + if len(entries) == 0 { + isLast = true + } + return } From 4db21012c1604d535420d4a892c06daecb795c1f Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Thu, 11 Mar 2021 22:38:59 +0500 Subject: [PATCH 086/284] error if read chunk zero data size --- weed/filer/stream.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/weed/filer/stream.go b/weed/filer/stream.go index 6a87a2b7d..292e41f82 100644 --- a/weed/filer/stream.go +++ b/weed/filer/stream.go @@ -15,7 +15,7 @@ import ( func StreamContent(masterClient wdclient.HasLookupFileIdFunction, w io.Writer, chunks []*filer_pb.FileChunk, offset int64, size int64) error { - // fmt.Printf("start to stream content for chunks: %+v\n", chunks) + glog.V(9).Infof("start to stream content for chunks: %+v\n", chunks) chunkViews := ViewFromChunks(masterClient.GetLookupFileIdFunction(), chunks, offset, size) fileId2Url := make(map[string][]string) @@ -38,7 +38,14 @@ func StreamContent(masterClient wdclient.HasLookupFileIdFunction, w io.Writer, c if err != nil { glog.Errorf("read chunk: %v", err) return fmt.Errorf("read chunk: %v", err) + } else if len(data) == 0 { + glog.Errorf("data size zero read chunk: %s", urlStrings) + return fmt.Errorf("data size zero read chunk: %s", urlStrings) + } else if len(chunkViews) == 1 && int64(len(data)) != size { + glog.Errorf("data size not eq %i read chunk: %s", size, urlStrings) + return fmt.Errorf("data size not eq %i read chunk: %s", size, urlStrings) } + _, err = w.Write(data) if err != nil { glog.Errorf("write chunk: %v", err) From 79280e151396d3b4aab13d8f78b944d6038a21e3 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 11 Mar 2021 09:49:40 -0800 Subject: [PATCH 087/284] escape special characters fix https://github.com/chrislusf/seaweedfs/issues/1884 --- weed/s3api/s3api_object_handlers.go | 13 ++++++------- weed/s3api/s3api_object_handlers_postpolicy.go | 3 ++- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index 866d85822..36e57b0c8 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -70,7 +70,7 @@ func (s3a *S3ApiServer) PutObjectHandler(w http.ResponseWriter, r *http.Request) return } } else { - uploadUrl := s3a.buildUploadUrl(bucket, object) + uploadUrl := fmt.Sprintf("http://%s%s/%s%s", s3a.option.Filer, s3a.option.BucketsPath, bucket, urlPathEscape(object)) etag, errCode := s3a.putToFiler(r, uploadUrl, dataReader) @@ -85,13 +85,12 @@ func (s3a *S3ApiServer) PutObjectHandler(w http.ResponseWriter, r *http.Request) writeSuccessResponseEmpty(w) } -func (s3a *S3ApiServer) buildUploadUrl(bucket string, object string) string { +func urlPathEscape(object string) string { var escapedParts []string for _, part := range strings.Split(object, "/") { escapedParts = append(escapedParts, url.PathEscape(part)) } - object = strings.Join(escapedParts, "/") - return fmt.Sprintf("http://%s%s/%s%s", s3a.option.Filer, s3a.option.BucketsPath, bucket, object) + return strings.Join(escapedParts, "/") } func (s3a *S3ApiServer) GetObjectHandler(w http.ResponseWriter, r *http.Request) { @@ -104,7 +103,7 @@ func (s3a *S3ApiServer) GetObjectHandler(w http.ResponseWriter, r *http.Request) } destUrl := fmt.Sprintf("http://%s%s/%s%s", - s3a.option.Filer, s3a.option.BucketsPath, bucket, object) + s3a.option.Filer, s3a.option.BucketsPath, bucket, urlPathEscape(object)) s3a.proxyToFiler(w, r, destUrl, passThroughResponse) @@ -115,7 +114,7 @@ func (s3a *S3ApiServer) HeadObjectHandler(w http.ResponseWriter, r *http.Request bucket, object := getBucketAndObject(r) destUrl := fmt.Sprintf("http://%s%s/%s%s", - s3a.option.Filer, s3a.option.BucketsPath, bucket, object) + s3a.option.Filer, s3a.option.BucketsPath, bucket, urlPathEscape(object)) s3a.proxyToFiler(w, r, destUrl, passThroughResponse) @@ -126,7 +125,7 @@ func (s3a *S3ApiServer) DeleteObjectHandler(w http.ResponseWriter, r *http.Reque bucket, object := getBucketAndObject(r) destUrl := fmt.Sprintf("http://%s%s/%s%s?recursive=true", - s3a.option.Filer, s3a.option.BucketsPath, bucket, object) + s3a.option.Filer, s3a.option.BucketsPath, bucket, urlPathEscape(object)) s3a.proxyToFiler(w, r, destUrl, func(proxyResponse *http.Response, w http.ResponseWriter) { for k, v := range proxyResponse.Header { diff --git a/weed/s3api/s3api_object_handlers_postpolicy.go b/weed/s3api/s3api_object_handlers_postpolicy.go index 383eac943..035302ae6 100644 --- a/weed/s3api/s3api_object_handlers_postpolicy.go +++ b/weed/s3api/s3api_object_handlers_postpolicy.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/base64" "errors" + "fmt" "github.com/chrislusf/seaweedfs/weed/s3api/policy" "github.com/chrislusf/seaweedfs/weed/s3api/s3err" "github.com/dustin/go-humanize" @@ -109,7 +110,7 @@ func (s3a *S3ApiServer) PostPolicyBucketHandler(w http.ResponseWriter, r *http.R } } - uploadUrl := s3a.buildUploadUrl(bucket, object) + uploadUrl := fmt.Sprintf("http://%s%s/%s%s", s3a.option.Filer, s3a.option.BucketsPath, bucket, urlPathEscape(object)) etag, errCode := s3a.putToFiler(r, uploadUrl, fileBody) From 58cdcc6d6eb13dd6c887cb7766aa7e4273c6051d Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Thu, 11 Mar 2021 23:34:36 +0500 Subject: [PATCH 088/284] error if urls not found --- weed/filer/stream.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/weed/filer/stream.go b/weed/filer/stream.go index 292e41f82..573ab65e8 100644 --- a/weed/filer/stream.go +++ b/weed/filer/stream.go @@ -26,6 +26,9 @@ func StreamContent(masterClient wdclient.HasLookupFileIdFunction, w io.Writer, c if err != nil { glog.V(1).Infof("operation LookupFileId %s failed, err: %v", chunkView.FileId, err) return err + } else if len(urlStrings) == 0 { + glog.Errorf("operation LookupFileId %s failed, err: urls not found", chunkView.FileId) + return fmt.Errorf("operation LookupFileId %s failed, err: urls not found", chunkView.FileId) } fileId2Url[chunkView.FileId] = urlStrings } @@ -38,12 +41,6 @@ func StreamContent(masterClient wdclient.HasLookupFileIdFunction, w io.Writer, c if err != nil { glog.Errorf("read chunk: %v", err) return fmt.Errorf("read chunk: %v", err) - } else if len(data) == 0 { - glog.Errorf("data size zero read chunk: %s", urlStrings) - return fmt.Errorf("data size zero read chunk: %s", urlStrings) - } else if len(chunkViews) == 1 && int64(len(data)) != size { - glog.Errorf("data size not eq %i read chunk: %s", size, urlStrings) - return fmt.Errorf("data size not eq %i read chunk: %s", size, urlStrings) } _, err = w.Write(data) From aba47fd9e83fa1e297199fd10518289237e3bf26 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 11 Mar 2021 14:08:20 -0800 Subject: [PATCH 089/284] reduce repeated calls to dir.FullPath() --- weed/filesys/dir.go | 12 ++++++------ weed/filesys/filehandle.go | 9 +++++---- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index ca826fbbc..33e1a0a3a 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -251,10 +251,10 @@ func (dir *Dir) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs.Node, err func (dir *Dir) Lookup(ctx context.Context, req *fuse.LookupRequest, resp *fuse.LookupResponse) (node fs.Node, err error) { - glog.V(4).Infof("dir Lookup %s: %s by %s", dir.FullPath(), req.Name, req.Header.String()) - - fullFilePath := util.NewFullPath(dir.FullPath(), req.Name) dirPath := util.FullPath(dir.FullPath()) + glog.V(4).Infof("dir Lookup %s: %s by %s", dirPath, req.Name, req.Header.String()) + + fullFilePath := dirPath.Child(req.Name) visitErr := meta_cache.EnsureVisited(dir.wfs.metaCache, dir.wfs, dirPath) if visitErr != nil { glog.Errorf("dir Lookup %s: %v", dirPath, visitErr) @@ -305,7 +305,8 @@ func (dir *Dir) Lookup(ctx context.Context, req *fuse.LookupRequest, resp *fuse. func (dir *Dir) ReadDirAll(ctx context.Context) (ret []fuse.Dirent, err error) { - glog.V(4).Infof("dir ReadDirAll %s", dir.FullPath()) + dirPath := util.FullPath(dir.FullPath()) + glog.V(4).Infof("dir ReadDirAll %s", dirPath) processEachEntryFn := func(entry *filer_pb.Entry, isLast bool) error { if entry.IsDirectory { @@ -318,12 +319,11 @@ func (dir *Dir) ReadDirAll(ctx context.Context) (ret []fuse.Dirent, err error) { return nil } - dirPath := util.FullPath(dir.FullPath()) if err = meta_cache.EnsureVisited(dir.wfs.metaCache, dir.wfs, dirPath); err != nil { glog.Errorf("dir ReadDirAll %s: %v", dirPath, err) return nil, fuse.EIO } - listErr := dir.wfs.metaCache.ListDirectoryEntries(context.Background(), util.FullPath(dir.FullPath()), "", false, int64(math.MaxInt32), func(entry *filer.Entry) bool { + listErr := dir.wfs.metaCache.ListDirectoryEntries(context.Background(), dirPath, "", false, int64(math.MaxInt32), func(entry *filer.Entry) bool { processEachEntryFn(entry.ToProtoEntry(), false) return true }) diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index adec1cd70..25eaf7033 100644 --- a/weed/filesys/filehandle.go +++ b/weed/filesys/filehandle.go @@ -111,15 +111,16 @@ func (fh *FileHandle) readFromChunks(buff []byte, offset int64) (int64, error) { } fileSize := int64(filer.FileSize(entry)) + fileFullPath := fh.f.fullpath() if fileSize == 0 { - glog.V(1).Infof("empty fh %v", fh.f.fullpath()) + glog.V(1).Infof("empty fh %v", fileFullPath) return 0, io.EOF } if offset+int64(len(buff)) <= int64(len(entry.Content)) { totalRead := copy(buff, entry.Content[offset:]) - glog.V(4).Infof("file handle read cached %s [%d,%d] %d", fh.f.fullpath(), offset, offset+int64(totalRead), totalRead) + glog.V(4).Infof("file handle read cached %s [%d,%d] %d", fileFullPath, offset, offset+int64(totalRead), totalRead) return int64(totalRead), nil } @@ -142,10 +143,10 @@ func (fh *FileHandle) readFromChunks(buff []byte, offset int64) (int64, error) { totalRead, err := reader.ReadAt(buff, offset) if err != nil && err != io.EOF { - glog.Errorf("file handle read %s: %v", fh.f.fullpath(), err) + glog.Errorf("file handle read %s: %v", fileFullPath, err) } - glog.V(4).Infof("file handle read %s [%d,%d] %d : %v", fh.f.fullpath(), offset, offset+int64(totalRead), totalRead, err) + glog.V(4).Infof("file handle read %s [%d,%d] %d : %v", fileFullPath, offset, offset+int64(totalRead), totalRead, err) return int64(totalRead), err } From 40dc5ac90470efcd913b9aebe0ab25487ad0cae5 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 11 Mar 2021 16:36:43 -0800 Subject: [PATCH 090/284] mount: add a bit retry when connecting to filer during startup --- weed/command/mount_std.go | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/weed/command/mount_std.go b/weed/command/mount_std.go index 6eb836311..8da69d0ac 100644 --- a/weed/command/mount_std.go +++ b/weed/command/mount_std.go @@ -63,16 +63,23 @@ func RunMount(option *MountOptions, umask os.FileMode) bool { // try to connect to filer, filerBucketsPath may be useful later grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client") var cipher bool - err = pb.WithGrpcFilerClient(filerGrpcAddress, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { - resp, err := client.GetFilerConfiguration(context.Background(), &filer_pb.GetFilerConfigurationRequest{}) + for i := 0; i < 10; i++ { + err = pb.WithGrpcFilerClient(filerGrpcAddress, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { + resp, err := client.GetFilerConfiguration(context.Background(), &filer_pb.GetFilerConfigurationRequest{}) + if err != nil { + return fmt.Errorf("get filer grpc address %s configuration: %v", filerGrpcAddress, err) + } + cipher = resp.Cipher + return nil + }) if err != nil { - return fmt.Errorf("get filer grpc address %s configuration: %v", filerGrpcAddress, err) + glog.V(0).Infof("failed to talk to filer %s: %v", filerGrpcAddress, err) + glog.V(0).Infof("wait for %d seconds ...", i+1) + time.Sleep(time.Duration(i+1)*time.Second) } - cipher = resp.Cipher - return nil - }) + } if err != nil { - glog.Infof("failed to talk to filer %s: %v", filerGrpcAddress, err) + glog.Errorf("failed to talk to filer %s: %v", filerGrpcAddress, err) return true } From fcc52d1e4ee6014fb1c9728e59716db86bc17eca Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 11 Mar 2021 18:05:24 -0800 Subject: [PATCH 091/284] shell: add s3.clean.uploads to clean up stale multipart uploads fix https://github.com/chrislusf/seaweedfs/issues/1855 --- weed/shell/command_s3_clean_uploads.go | 91 ++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 weed/shell/command_s3_clean_uploads.go diff --git a/weed/shell/command_s3_clean_uploads.go b/weed/shell/command_s3_clean_uploads.go new file mode 100644 index 000000000..beffa2808 --- /dev/null +++ b/weed/shell/command_s3_clean_uploads.go @@ -0,0 +1,91 @@ +package shell + +import ( + "flag" + "fmt" + "github.com/chrislusf/seaweedfs/weed/util" + "io" + "math" + "time" + + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" +) + +func init() { + Commands = append(Commands, &commandS3CleanUploads{}) +} + +type commandS3CleanUploads struct { +} + +func (c *commandS3CleanUploads) Name() string { + return "s3.clean.uploads" +} + +func (c *commandS3CleanUploads) Help() string { + return `clean up stale multipart uploads + + Example: + s3.clean.uploads -replication 001 + +` +} + +func (c *commandS3CleanUploads) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { + + bucketCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) + uploadedTimeAgo := bucketCommand.Duration("timeAgo", 24*time.Hour, "created time before now. \"1.5h\" or \"2h45m\". Valid time units are \"m\", \"h\"") + if err = bucketCommand.Parse(args); err != nil { + return nil + } + + var filerBucketsPath string + filerBucketsPath, err = readFilerBucketsPath(commandEnv) + if err != nil { + return fmt.Errorf("read buckets: %v", err) + } + + var buckets []string + err = filer_pb.List(commandEnv, filerBucketsPath, "", func(entry *filer_pb.Entry, isLast bool) error { + buckets = append(buckets, entry.Name) + return nil + }, "", false, math.MaxUint32) + if err != nil { + return fmt.Errorf("list buckets under %v: %v", filerBucketsPath, err) + } + + for _, bucket:= range buckets { + c.cleanupUploads(commandEnv, writer, filerBucketsPath, bucket, *uploadedTimeAgo) + } + + return err + +} + +func (c *commandS3CleanUploads) cleanupUploads(commandEnv *CommandEnv, writer io.Writer, filerBucketsPath string, bucket string, timeAgo time.Duration) error { + uploadsDir := filerBucketsPath+"/"+bucket+"/.uploads" + var staleUploads []string + now := time.Now() + err := filer_pb.List(commandEnv, uploadsDir, "", func(entry *filer_pb.Entry, isLast bool) error { + ctime := time.Unix(entry.Attributes.Crtime, 0) + if ctime.Add(timeAgo).Before(now) { + staleUploads = append(staleUploads, entry.Name) + } + return nil + }, "", false, math.MaxUint32) + if err != nil { + return fmt.Errorf("list uploads under %v: %v", uploadsDir, err) + } + + for _, staleUpload:= range staleUploads { + fmt.Fprintf(writer, "purge %s/%s\n", uploadsDir, staleUpload) + + err = util.Delete(fmt.Sprintf("http://%s:%d%s/%s?recursive=true&ignoreRecursiveError=true",commandEnv.option.FilerHost, commandEnv.option.FilerHost,uploadsDir, staleUpload), "") + if err != nil { + return fmt.Errorf("purge %s/%s: %v", uploadsDir, staleUpload, err) + } + } + + return nil + +} \ No newline at end of file From 7f887c78d23900402abbbc51861fa805cb053ad1 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 11 Mar 2021 18:18:16 -0800 Subject: [PATCH 092/284] fix --- weed/shell/command_s3_clean_uploads.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/shell/command_s3_clean_uploads.go b/weed/shell/command_s3_clean_uploads.go index beffa2808..0830b552a 100644 --- a/weed/shell/command_s3_clean_uploads.go +++ b/weed/shell/command_s3_clean_uploads.go @@ -80,7 +80,7 @@ func (c *commandS3CleanUploads) cleanupUploads(commandEnv *CommandEnv, writer io for _, staleUpload:= range staleUploads { fmt.Fprintf(writer, "purge %s/%s\n", uploadsDir, staleUpload) - err = util.Delete(fmt.Sprintf("http://%s:%d%s/%s?recursive=true&ignoreRecursiveError=true",commandEnv.option.FilerHost, commandEnv.option.FilerHost,uploadsDir, staleUpload), "") + err = util.Delete(fmt.Sprintf("http://%s:%d%s/%s?recursive=true&ignoreRecursiveError=true",commandEnv.option.FilerHost, commandEnv.option.FilerPort,uploadsDir, staleUpload), "") if err != nil { return fmt.Errorf("purge %s/%s: %v", uploadsDir, staleUpload, err) } From cca66c7fbe883480c9935ec1f5fe469ee35dae0b Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 11 Mar 2021 18:39:45 -0800 Subject: [PATCH 093/284] print out the url --- weed/shell/command_s3_clean_uploads.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/weed/shell/command_s3_clean_uploads.go b/weed/shell/command_s3_clean_uploads.go index 0830b552a..1fe13d981 100644 --- a/weed/shell/command_s3_clean_uploads.go +++ b/weed/shell/command_s3_clean_uploads.go @@ -78,9 +78,10 @@ func (c *commandS3CleanUploads) cleanupUploads(commandEnv *CommandEnv, writer io } for _, staleUpload:= range staleUploads { - fmt.Fprintf(writer, "purge %s/%s\n", uploadsDir, staleUpload) + deleteUrl := fmt.Sprintf("http://%s:%d%s/%s?recursive=true&ignoreRecursiveError=true",commandEnv.option.FilerHost, commandEnv.option.FilerPort,uploadsDir, staleUpload) + fmt.Fprintf(writer, "purge %s\n", deleteUrl) - err = util.Delete(fmt.Sprintf("http://%s:%d%s/%s?recursive=true&ignoreRecursiveError=true",commandEnv.option.FilerHost, commandEnv.option.FilerPort,uploadsDir, staleUpload), "") + err = util.Delete(deleteUrl, "") if err != nil { return fmt.Errorf("purge %s/%s: %v", uploadsDir, staleUpload, err) } From 4c1d945e46d280c7e38eb7fe759c57519ba9140e Mon Sep 17 00:00:00 2001 From: wuh-fnst Date: Fri, 12 Mar 2021 11:10:01 +0800 Subject: [PATCH 094/284] make List correctly judge whether it is the last file --- weed/pb/filer_pb/filer_client.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/weed/pb/filer_pb/filer_client.go b/weed/pb/filer_pb/filer_client.go index 079fbd671..e4d8bee34 100644 --- a/weed/pb/filer_pb/filer_client.go +++ b/weed/pb/filer_pb/filer_client.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "io" + "math" "os" "strings" "time" @@ -101,12 +102,16 @@ func SeaweedList(client SeaweedFilerClient, parentDirectoryPath, prefix string, } func doSeaweedList(client SeaweedFilerClient, fullDirPath util.FullPath, prefix string, fn EachEntryFunciton, startFrom string, inclusive bool, limit uint32) (err error) { - + // Redundancy limit to make it correctly judge whether it is the last file. + redLimit := limit + if limit != math.MaxInt32 && limit != 0{ + redLimit = limit + 1 + } request := &ListEntriesRequest{ Directory: string(fullDirPath), Prefix: prefix, StartFromFileName: startFrom, - Limit: limit, + Limit: redLimit, InclusiveStartFrom: inclusive, } @@ -119,6 +124,7 @@ func doSeaweedList(client SeaweedFilerClient, fullDirPath util.FullPath, prefix } var prevEntry *Entry + count := 0 for { resp, recvErr := stream.Recv() if recvErr != nil { @@ -139,6 +145,10 @@ func doSeaweedList(client SeaweedFilerClient, fullDirPath util.FullPath, prefix } } prevEntry = resp.Entry + count++ + if count > int(limit) && limit != 0 { + prevEntry = nil + } } return nil From d66645ecdad9e3dd7cd6bdb5642f1130b2d2195b Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Fri, 12 Mar 2021 12:40:33 +0500 Subject: [PATCH 095/284] add 12 tests https://github.com/chrislusf/seaweedfs/issues/1810 --- docker/Dockerfile.s3tests | 2 +- docker/compose/local-s3tests-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile.s3tests b/docker/Dockerfile.s3tests index 18d57fad1..5b6d762de 100644 --- a/docker/Dockerfile.s3tests +++ b/docker/Dockerfile.s3tests @@ -28,4 +28,4 @@ ENV \ S3TEST_CONF="/s3test.conf" ENTRYPOINT ["/bin/bash", "-c"] -CMD ["exec ./virtualenv/bin/nosetests ${NOSETESTS_OPTIONS-} ${NOSETESTS_ATTR:+-a $NOSETESTS_ATTR} ${NOSETESTS_EXCLUDE:+-e $NOSETESTS_EXCLUDE}"] \ No newline at end of file +CMD ["sleep 10 && exec ./virtualenv/bin/nosetests ${NOSETESTS_OPTIONS-} ${NOSETESTS_ATTR:+-a $NOSETESTS_ATTR} ${NOSETESTS_EXCLUDE:+-e $NOSETESTS_EXCLUDE}"] \ No newline at end of file diff --git a/docker/compose/local-s3tests-compose.yml b/docker/compose/local-s3tests-compose.yml index f78dfb3ad..915778d32 100644 --- a/docker/compose/local-s3tests-compose.yml +++ b/docker/compose/local-s3tests-compose.yml @@ -38,7 +38,7 @@ services: S3TEST_CONF: "s3tests.conf" NOSETESTS_OPTIONS: "--verbose --logging-level=ERROR --with-xunit --failure-detail s3tests_boto3.functional.test_s3" NOSETESTS_ATTR: "!tagging,!fails_on_aws,!encryption,!bucket-policy,!versioning,!fails_on_rgw,!bucket-policy,!fails_with_subdomain,!policy_status,!object-lock,!lifecycle,!cors,!user-policy" - NOSETESTS_EXCLUDE: "(bucket_list_delimiter_basic|bucket_listv2_delimiter_basic|bucket_listv2_encoding_basic|bucket_list_encoding_basic|bucket_list_delimiter_prefix|bucket_listv2_delimiter_prefix_ends_with_delimiter|bucket_list_delimiter_prefix_ends_with_delimiter|bucket_list_delimiter_alt|bucket_listv2_delimiter_alt|bucket_list_delimiter_prefix_underscore|bucket_list_delimiter_percentage|bucket_listv2_delimiter_percentage|bucket_list_delimiter_whitespace|bucket_listv2_delimiter_whitespace|bucket_list_delimiter_dot|bucket_listv2_delimiter_dot|bucket_list_delimiter_unreadable|bucket_listv2_delimiter_unreadable|bucket_listv2_fetchowner_defaultempty|bucket_listv2_fetchowner_empty|bucket_list_delimiter_not_skip_special|bucket_list_prefix_delimiter_alt|bucket_listv2_prefix_delimiter_alt|bucket_list_prefix_delimiter_prefix_not_exist|bucket_listv2_prefix_delimiter_prefix_not_exist|bucket_list_prefix_delimiter_delimiter_not_exist|bucket_listv2_prefix_delimiter_delimiter_not_exist|bucket_list_prefix_delimiter_prefix_delimiter_not_exist|bucket_listv2_prefix_delimiter_prefix_delimiter_not_exist|bucket_list_maxkeys_none|bucket_listv2_maxkeys_none|bucket_list_maxkeys_invalid|bucket_listv2_continuationtoken_empty|bucket_list_return_data|bucket_list_objects_anonymous|bucket_listv2_objects_anonymous|bucket_notexist|bucketv2_notexist|bucket_delete_nonempty|bucket_concurrent_set_canned_acl|object_write_to_nonexist_bucket|object_requestid_matches_header_on_error|object_head_zero_bytes|object_write_cache_control|object_write_expires|object_set_get_metadata_none_to_good|object_set_get_metadata_none_to_empty|object_set_get_metadata_overwrite_to_empty|post_object_anonymous_request|post_object_authenticated_request|post_object_authenticated_no_content_type|post_object_authenticated_request_bad_access_key|post_object_set_success_code|post_object_set_invalid_success_code|post_object_upload_larger_than_chunk|post_object_set_key_from_filename|post_object_ignored_header|post_object_case_insensitive_condition_fields|post_object_escaped_field_values|post_object_success_redirect_action|post_object_invalid_signature|post_object_invalid_access_key|post_object_missing_policy_condition|post_object_user_specified_header|post_object_request_missing_policy_specified_field|post_object_expired_policy|post_object_invalid_request_field_value|get_object_ifmatch_failed|get_object_ifunmodifiedsince_good|put_object_ifmatch_failed|object_raw_get|object_raw_get_bucket_gone|object_delete_key_bucket_gone|object_raw_get_bucket_acl|object_raw_get_object_acl|object_raw_authenticated|object_raw_response_headers|object_raw_authenticated_bucket_acl|object_raw_authenticated_object_acl|object_raw_authenticated_bucket_gone|object_raw_get_x_amz_expires_not_expired|object_raw_get_x_amz_expires_out_max_range|object_raw_get_x_amz_expires_out_positive_range|object_anon_put_write_access|object_raw_put_authenticated_expired|bucket_create_naming_bad_short_one|bucket_create_naming_bad_short_two|bucket_create_exists|bucket_get_location|bucket_acl_default|bucket_acl_canned|bucket_acl_canned_publicreadwrite|bucket_acl_canned_authenticatedread|object_acl_default|object_acl_canned_during_create|object_acl_canned|object_acl_canned_publicreadwrite|object_acl_canned_authenticatedread|object_acl_canned_bucketownerread|object_acl_canned_bucketownerfullcontrol|object_acl_full_control_verify_attributes|bucket_acl_canned_private_to_private|bucket_acl_grant_nonexist_user|bucket_acl_no_grants|bucket_acl_grant_email_not_exist|bucket_acl_revoke_all|bucket_recreate_not_overriding|bucket_create_special_key_names|object_copy_zero_size|object_copy_verify_contenttype|object_copy_to_itself|object_copy_to_itself_with_metadata|object_copy_not_owned_bucket|object_copy_not_owned_object_bucket|object_copy_retaining_metadata|object_copy_replacing_metadata|multipart_upload_empty|multipart_copy_invalid_range|multipart_copy_special_names|multipart_upload_resend_part|multipart_upload_size_too_small|abort_multipart_upload_not_found|multipart_upload_missing_part|multipart_upload_incorrect_etag|100_continue|ranged_request_invalid_range|ranged_request_empty_object|access_bucket)" + NOSETESTS_EXCLUDE: "(bucket_list_delimiter_basic|bucket_listv2_delimiter_basic|bucket_listv2_encoding_basic|bucket_list_encoding_basic|bucket_list_delimiter_prefix|bucket_listv2_delimiter_prefix_ends_with_delimiter|bucket_list_delimiter_prefix_ends_with_delimiter|bucket_list_delimiter_alt|bucket_listv2_delimiter_alt|bucket_list_delimiter_prefix_underscore|bucket_list_delimiter_percentage|bucket_listv2_delimiter_percentage|bucket_list_delimiter_whitespace|bucket_listv2_delimiter_whitespace|bucket_list_delimiter_dot|bucket_listv2_delimiter_dot|bucket_list_delimiter_unreadable|bucket_listv2_delimiter_unreadable|bucket_listv2_fetchowner_defaultempty|bucket_listv2_fetchowner_empty|bucket_list_prefix_delimiter_alt|bucket_listv2_prefix_delimiter_alt|bucket_list_prefix_delimiter_prefix_not_exist|bucket_listv2_prefix_delimiter_prefix_not_exist|bucket_list_prefix_delimiter_delimiter_not_exist|bucket_listv2_prefix_delimiter_delimiter_not_exist|bucket_list_prefix_delimiter_prefix_delimiter_not_exist|bucket_listv2_prefix_delimiter_prefix_delimiter_not_exist|bucket_list_maxkeys_none|bucket_listv2_maxkeys_none|bucket_list_maxkeys_invalid|bucket_listv2_continuationtoken_empty|bucket_list_return_data|bucket_list_objects_anonymous|bucket_listv2_objects_anonymous|bucket_notexist|bucketv2_notexist|bucket_delete_nonempty|bucket_concurrent_set_canned_acl|object_write_to_nonexist_bucket|object_requestid_matches_header_on_error|object_write_cache_control|object_write_expires|object_set_get_metadata_none_to_good|object_set_get_metadata_none_to_empty|object_set_get_metadata_overwrite_to_empty|post_object_anonymous_request|post_object_authenticated_request|post_object_authenticated_no_content_type|post_object_authenticated_request_bad_access_key|post_object_set_success_code|post_object_set_invalid_success_code|post_object_upload_larger_than_chunk|post_object_set_key_from_filename|post_object_ignored_header|post_object_case_insensitive_condition_fields|post_object_escaped_field_values|post_object_success_redirect_action|post_object_invalid_signature|post_object_invalid_access_key|post_object_missing_policy_condition|post_object_user_specified_header|post_object_request_missing_policy_specified_field|post_object_expired_policy|post_object_invalid_request_field_value|get_object_ifmatch_failed|get_object_ifunmodifiedsince_good|put_object_ifmatch_failed|object_raw_get_bucket_gone|object_delete_key_bucket_gone|object_raw_get_bucket_acl|object_raw_get_object_acl|object_raw_response_headers|object_raw_authenticated_bucket_gone|object_raw_get_x_amz_expires_out_max_range|object_raw_get_x_amz_expires_out_positive_range|object_anon_put_write_access|object_raw_put_authenticated_expired|bucket_create_exists|bucket_create_naming_bad_short_one|bucket_create_naming_bad_short_two|bucket_get_location|bucket_acl_default|bucket_acl_canned|bucket_acl_canned_publicreadwrite|bucket_acl_canned_authenticatedread|object_acl_default|object_acl_canned_during_create|object_acl_canned|object_acl_canned_publicreadwrite|object_acl_canned_authenticatedread|object_acl_canned_bucketownerread|object_acl_canned_bucketownerfullcontrol|object_acl_full_control_verify_attributes|bucket_acl_canned_private_to_private|bucket_acl_grant_nonexist_user|bucket_acl_no_grants|bucket_acl_grant_email_not_exist|bucket_acl_revoke_all|bucket_recreate_not_overriding|object_copy_verify_contenttype|object_copy_to_itself|object_copy_to_itself_with_metadata|object_copy_not_owned_bucket|object_copy_not_owned_object_bucket|object_copy_retaining_metadata|object_copy_replacing_metadata|multipart_upload_empty|multipart_copy_invalid_range|multipart_copy_special_names|multipart_upload_resend_part|multipart_upload_size_too_small|abort_multipart_upload_not_found|multipart_upload_missing_part|multipart_upload_incorrect_etag|100_continue|ranged_request_invalid_range|ranged_request_empty_object|access_bucket)" depends_on: - master - volume From 7d57664c2d80f2b7d3eb4cecc57a3275bafee44d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 12 Mar 2021 00:36:29 -0800 Subject: [PATCH 096/284] mount: internals switch to filer.Entry instead of protobuf --- weed/filer/filechunks.go | 4 +++ weed/filesys/dir.go | 58 +++++++++++++------------------------- weed/filesys/dir_link.go | 10 +++---- weed/filesys/dirty_page.go | 2 +- weed/filesys/file.go | 46 +++++++++++++++--------------- weed/filesys/filehandle.go | 37 +++++++++++------------- weed/filesys/fscache.go | 2 +- weed/filesys/wfs.go | 2 +- weed/filesys/xattr.go | 13 +++++---- 9 files changed, 80 insertions(+), 94 deletions(-) diff --git a/weed/filer/filechunks.go b/weed/filer/filechunks.go index 68f308a51..542754e3b 100644 --- a/weed/filer/filechunks.go +++ b/weed/filer/filechunks.go @@ -23,6 +23,10 @@ func TotalSize(chunks []*filer_pb.FileChunk) (size uint64) { return } +func FileSize2(entry *Entry) (size uint64) { + return maxUint64(TotalSize(entry.Chunks), entry.Attr.FileSize) +} + func FileSize(entry *filer_pb.Entry) (size uint64) { return maxUint64(TotalSize(entry.Chunks), entry.Attributes.FileSize) } diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index 33e1a0a3a..6168425af 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -1,7 +1,6 @@ package filesys import ( - "bytes" "context" "math" "os" @@ -22,7 +21,7 @@ import ( type Dir struct { name string wfs *WFS - entry *filer_pb.Entry + entry *filer.Entry parent *Dir } @@ -59,11 +58,11 @@ func (dir *Dir) Attr(ctx context.Context, attr *fuse.Attr) error { } // attr.Inode = util.FullPath(dir.FullPath()).AsInode() - attr.Mode = os.FileMode(dir.entry.Attributes.FileMode) | os.ModeDir - attr.Mtime = time.Unix(dir.entry.Attributes.Mtime, 0) - attr.Crtime = time.Unix(dir.entry.Attributes.Crtime, 0) - attr.Gid = dir.entry.Attributes.Gid - attr.Uid = dir.entry.Attributes.Uid + attr.Mode = dir.entry.Attr.Mode | os.ModeDir + attr.Mtime = dir.entry.Attr.Mtime + attr.Crtime = dir.entry.Attr.Crtime + attr.Gid = dir.entry.Attr.Gid + attr.Uid = dir.entry.Attr.Uid glog.V(4).Infof("dir Attr %s, attr: %+v", dir.FullPath(), attr) @@ -103,12 +102,13 @@ func (dir *Dir) Fsync(ctx context.Context, req *fuse.FsyncRequest) error { } func (dir *Dir) newFile(name string, entry *filer_pb.Entry) fs.Node { - f := dir.wfs.fsNodeCache.EnsureFsNode(util.NewFullPath(dir.FullPath(), name), func() fs.Node { + dirPath := dir.FullPath() + f := dir.wfs.fsNodeCache.EnsureFsNode(util.NewFullPath(dirPath, name), func() fs.Node { return &File{ Name: name, dir: dir, wfs: dir.wfs, - entry: entry, + entry: filer.FromPbEntry(dirPath, entry), entryViewCache: nil, } }) @@ -119,7 +119,7 @@ func (dir *Dir) newFile(name string, entry *filer_pb.Entry) fs.Node { func (dir *Dir) newDirectory(fullpath util.FullPath, entry *filer_pb.Entry) fs.Node { d := dir.wfs.fsNodeCache.EnsureFsNode(fullpath, func() fs.Node { - return &Dir{name: entry.Name, wfs: dir.wfs, entry: entry, parent: dir} + return &Dir{name: entry.Name, wfs: dir.wfs, entry: filer.FromPbEntry(dir.FullPath(), entry), parent: dir} }) d.(*Dir).parent = dir // in case dir node was created later return d @@ -436,19 +436,19 @@ func (dir *Dir) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fus } if req.Valid.Mode() { - dir.entry.Attributes.FileMode = uint32(req.Mode) + dir.entry.Attr.Mode = req.Mode } if req.Valid.Uid() { - dir.entry.Attributes.Uid = req.Uid + dir.entry.Attr.Uid = req.Uid } if req.Valid.Gid() { - dir.entry.Attributes.Gid = req.Gid + dir.entry.Attr.Gid = req.Gid } if req.Valid.Mtime() { - dir.entry.Attributes.Mtime = req.Mtime.Unix() + dir.entry.Attr.Mtime = req.Mtime } return dir.saveEntry() @@ -527,12 +527,14 @@ func (dir *Dir) saveEntry() error { return dir.wfs.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { - dir.wfs.mapPbIdFromLocalToFiler(dir.entry) - defer dir.wfs.mapPbIdFromFilerToLocal(dir.entry) + pbEntry := dir.entry.ToProtoEntry() + + dir.wfs.mapPbIdFromLocalToFiler(pbEntry) + defer dir.wfs.mapPbIdFromFilerToLocal(pbEntry) request := &filer_pb.UpdateEntryRequest{ Directory: parentDir, - Entry: dir.entry, + Entry: pbEntry, Signatures: []int32{dir.wfs.signature}, } @@ -550,25 +552,5 @@ func (dir *Dir) saveEntry() error { } func (dir *Dir) FullPath() string { - var parts []string - for p := dir; p != nil; p = p.parent { - if strings.HasPrefix(p.name, "/") { - if len(p.name) > 1 { - parts = append(parts, p.name[1:]) - } - } else { - parts = append(parts, p.name) - } - } - - if len(parts) == 0 { - return "/" - } - - var buf bytes.Buffer - for i := len(parts) - 1; i >= 0; i-- { - buf.WriteString("/") - buf.WriteString(parts[i]) - } - return buf.String() + return string(dir.entry.FullPath) } diff --git a/weed/filesys/dir_link.go b/weed/filesys/dir_link.go index 606e52fcb..010d0141a 100644 --- a/weed/filesys/dir_link.go +++ b/weed/filesys/dir_link.go @@ -48,7 +48,7 @@ func (dir *Dir) Link(ctx context.Context, req *fuse.LinkRequest, old fs.Node) (f oldEntry.HardLinkCounter++ updateOldEntryRequest := &filer_pb.UpdateEntryRequest{ Directory: oldFile.dir.FullPath(), - Entry: oldEntry, + Entry: oldEntry.ToProtoEntry(), Signatures: []int32{dir.wfs.signature}, } @@ -58,7 +58,7 @@ func (dir *Dir) Link(ctx context.Context, req *fuse.LinkRequest, old fs.Node) (f Entry: &filer_pb.Entry{ Name: req.NewName, IsDirectory: false, - Attributes: oldEntry.Attributes, + Attributes: filer.EntryAttributeToPb(oldEntry), Chunks: oldEntry.Chunks, Extended: oldEntry.Extended, HardLinkId: oldEntry.HardLinkId, @@ -152,12 +152,12 @@ func (file *File) Readlink(ctx context.Context, req *fuse.ReadlinkRequest) (stri return "", err } - if os.FileMode(entry.Attributes.FileMode)&os.ModeSymlink == 0 { + if entry.Attr.Mode&os.ModeSymlink == 0 { return "", fuse.Errno(syscall.EINVAL) } - glog.V(4).Infof("Readlink: %v/%v => %v", file.dir.FullPath(), file.Name, entry.Attributes.SymlinkTarget) + glog.V(4).Infof("Readlink: %v/%v => %v", file.dir.FullPath(), file.Name, entry.Attr.SymlinkTarget) - return entry.Attributes.SymlinkTarget, nil + return entry.Attr.SymlinkTarget, nil } diff --git a/weed/filesys/dirty_page.go b/weed/filesys/dirty_page.go index 8888cff96..b190b8473 100644 --- a/weed/filesys/dirty_page.go +++ b/weed/filesys/dirty_page.go @@ -74,7 +74,7 @@ func (pages *ContinuousDirtyPages) saveExistingLargestPageToStorage() (hasSavedD return false } - fileSize := int64(entry.Attributes.FileSize) + fileSize := int64(entry.Attr.FileSize) chunkSize := min(maxList.Size(), fileSize-maxList.Offset()) if chunkSize == 0 { diff --git a/weed/filesys/file.go b/weed/filesys/file.go index 5931dd2ff..db8062ceb 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -33,7 +33,7 @@ type File struct { Name string dir *Dir wfs *WFS - entry *filer_pb.Entry + entry *filer.Entry entryLock sync.RWMutex entryViewCache []filer.VisibleInterval isOpen int @@ -58,16 +58,16 @@ func (file *File) Attr(ctx context.Context, attr *fuse.Attr) (err error) { // attr.Inode = file.fullpath().AsInode() attr.Valid = time.Second - attr.Mode = os.FileMode(entry.Attributes.FileMode) - attr.Size = filer.FileSize(entry) + attr.Mode = os.FileMode(entry.Attr.Mode) + attr.Size = filer.FileSize2(entry) if file.isOpen > 0 { - attr.Size = entry.Attributes.FileSize + attr.Size = entry.Attr.FileSize glog.V(4).Infof("file Attr %s, open:%v, size: %d", file.fullpath(), file.isOpen, attr.Size) } - attr.Crtime = time.Unix(entry.Attributes.Crtime, 0) - attr.Mtime = time.Unix(entry.Attributes.Mtime, 0) - attr.Gid = entry.Attributes.Gid - attr.Uid = entry.Attributes.Uid + attr.Crtime = entry.Attr.Crtime + attr.Mtime = entry.Attr.Mtime + attr.Gid = entry.Attr.Gid + attr.Uid = entry.Attr.Uid attr.Blocks = attr.Size/blockSize + 1 attr.BlockSize = uint32(file.wfs.option.ChunkSizeLimit) if entry.HardLinkCounter > 0 { @@ -126,7 +126,7 @@ func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *f if req.Valid.Size() { glog.V(4).Infof("%v file setattr set size=%v chunks=%d", file.fullpath(), req.Size, len(entry.Chunks)) - if req.Size < filer.FileSize(entry) { + if req.Size < filer.FileSize2(entry) { // fmt.Printf("truncate %v \n", fullPath) var chunks []*filer_pb.FileChunk var truncatedChunks []*filer_pb.FileChunk @@ -149,32 +149,32 @@ func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *f file.entryViewCache, _ = filer.NonOverlappingVisibleIntervals(file.wfs.LookupFn(), chunks) file.reader = nil } - entry.Attributes.FileSize = req.Size + entry.Attr.FileSize = req.Size file.dirtyMetadata = true } if req.Valid.Mode() { - entry.Attributes.FileMode = uint32(req.Mode) + entry.Attr.Mode = req.Mode file.dirtyMetadata = true } if req.Valid.Uid() { - entry.Attributes.Uid = req.Uid + entry.Attr.Uid = req.Uid file.dirtyMetadata = true } if req.Valid.Gid() { - entry.Attributes.Gid = req.Gid + entry.Attr.Gid = req.Gid file.dirtyMetadata = true } if req.Valid.Crtime() { - entry.Attributes.Crtime = req.Crtime.Unix() + entry.Attr.Crtime = req.Crtime file.dirtyMetadata = true } if req.Valid.Mtime() { - entry.Attributes.Mtime = req.Mtime.Unix() + entry.Attr.Mtime = req.Mtime file.dirtyMetadata = true } @@ -259,7 +259,7 @@ func (file *File) Forget() { file.wfs.fsNodeCache.DeleteFsNode(t) } -func (file *File) maybeLoadEntry(ctx context.Context) (entry *filer_pb.Entry, err error) { +func (file *File) maybeLoadEntry(ctx context.Context) (entry *filer.Entry, err error) { entry = file.getEntry() if file.isOpen > 0 { return entry, nil @@ -330,7 +330,7 @@ func (file *File) addChunks(chunks []*filer_pb.FileChunk) { entry.Chunks = append(entry.Chunks, newChunks...) } -func (file *File) setEntry(entry *filer_pb.Entry) { +func (file *File) setEntry(entry *filer.Entry) { file.entryLock.Lock() defer file.entryLock.Unlock() file.entry = entry @@ -346,15 +346,17 @@ func (file *File) clearEntry() { file.reader = nil } -func (file *File) saveEntry(entry *filer_pb.Entry) error { +func (file *File) saveEntry(entry *filer.Entry) error { return file.wfs.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { - file.wfs.mapPbIdFromLocalToFiler(entry) - defer file.wfs.mapPbIdFromFilerToLocal(entry) + pbEntry := entry.ToProtoEntry() + + file.wfs.mapPbIdFromLocalToFiler(pbEntry) + defer file.wfs.mapPbIdFromFilerToLocal(pbEntry) request := &filer_pb.UpdateEntryRequest{ Directory: file.dir.FullPath(), - Entry: entry, + Entry: pbEntry, Signatures: []int32{file.wfs.signature}, } @@ -371,7 +373,7 @@ func (file *File) saveEntry(entry *filer_pb.Entry) error { }) } -func (file *File) getEntry() *filer_pb.Entry { +func (file *File) getEntry() *filer.Entry { file.entryLock.RLock() defer file.entryLock.RUnlock() return file.entry diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index 25eaf7033..be214c02d 100644 --- a/weed/filesys/filehandle.go +++ b/weed/filesys/filehandle.go @@ -6,7 +6,6 @@ import ( "io" "math" "net/http" - "os" "sync" "time" @@ -42,7 +41,7 @@ func newFileHandle(file *File, uid, gid uint32) *FileHandle { } entry := fh.f.getEntry() if entry != nil { - entry.Attributes.FileSize = filer.FileSize(entry) + entry.Attr.FileSize = filer.FileSize2(entry) } return fh @@ -110,7 +109,7 @@ func (fh *FileHandle) readFromChunks(buff []byte, offset int64) (int64, error) { return 0, io.EOF } - fileSize := int64(filer.FileSize(entry)) + fileSize := int64(filer.FileSize2(entry)) fileFullPath := fh.f.fullpath() if fileSize == 0 { @@ -171,7 +170,7 @@ func (fh *FileHandle) Write(ctx context.Context, req *fuse.WriteRequest, resp *f } entry.Content = nil - entry.Attributes.FileSize = uint64(max(req.Offset+int64(len(data)), int64(entry.Attributes.FileSize))) + entry.Attr.FileSize = uint64(max(req.Offset+int64(len(data)), int64(entry.Attr.FileSize))) glog.V(4).Infof("%v write [%d,%d) %d", fh.f.fullpath(), req.Offset, req.Offset+int64(len(req.Data)), len(req.Data)) fh.dirtyPages.AddPage(req.Offset, data) @@ -259,26 +258,24 @@ func (fh *FileHandle) doFlush(ctx context.Context, header fuse.Header) error { return nil } - if entry.Attributes != nil { - entry.Attributes.Mime = fh.contentType - if entry.Attributes.Uid == 0 { - entry.Attributes.Uid = header.Uid - } - if entry.Attributes.Gid == 0 { - entry.Attributes.Gid = header.Gid - } - if entry.Attributes.Crtime == 0 { - entry.Attributes.Crtime = time.Now().Unix() - } - entry.Attributes.Mtime = time.Now().Unix() - entry.Attributes.FileMode = uint32(os.FileMode(entry.Attributes.FileMode) &^ fh.f.wfs.option.Umask) - entry.Attributes.Collection = fh.dirtyPages.collection - entry.Attributes.Replication = fh.dirtyPages.replication + entry.Attr.Mime = fh.contentType + if entry.Attr.Uid == 0 { + entry.Attr.Uid = header.Uid } + if entry.Attr.Gid == 0 { + entry.Attr.Gid = header.Gid + } + if entry.Attr.Crtime.IsZero() { + entry.Attr.Crtime = time.Now() + } + entry.Attr.Mtime = time.Now() + entry.Attr.Mode = entry.Attr.Mode &^ fh.f.wfs.option.Umask + entry.Attr.Collection = fh.dirtyPages.collection + entry.Attr.Replication = fh.dirtyPages.replication request := &filer_pb.CreateEntryRequest{ Directory: fh.f.dir.FullPath(), - Entry: entry, + Entry: entry.ToProtoEntry(), Signatures: []int32{fh.f.wfs.signature}, } diff --git a/weed/filesys/fscache.go b/weed/filesys/fscache.go index 6b1012090..0740d607f 100644 --- a/weed/filesys/fscache.go +++ b/weed/filesys/fscache.go @@ -126,7 +126,7 @@ func (c *FsCache) Move(oldPath util.FullPath, newPath util.FullPath) *FsNode { f.Name = target.name entry := f.getEntry() if entry != nil { - entry.Name = f.Name + entry.FullPath = newPath } } parent.disconnectChild(target) diff --git a/weed/filesys/wfs.go b/weed/filesys/wfs.go index c6d9080a1..7a6b4fa2b 100644 --- a/weed/filesys/wfs.go +++ b/weed/filesys/wfs.go @@ -131,7 +131,7 @@ func NewSeaweedFileSystem(option *Option) *WFS { }) entry, _ := filer_pb.GetEntry(wfs, util.FullPath(wfs.option.FilerMountRootPath)) - wfs.root = &Dir{name: wfs.option.FilerMountRootPath, wfs: wfs, entry: entry} + wfs.root = &Dir{name: wfs.option.FilerMountRootPath, wfs: wfs, entry: filer.FromPbEntry(wfs.option.FilerMountRootPath,entry)} wfs.fsNodeCache = newFsCache(wfs.root) if wfs.option.ConcurrentWriters > 0 { diff --git a/weed/filesys/xattr.go b/weed/filesys/xattr.go index 92e43b675..a50d87ba7 100644 --- a/weed/filesys/xattr.go +++ b/weed/filesys/xattr.go @@ -2,6 +2,7 @@ package filesys import ( "context" + "github.com/chrislusf/seaweedfs/weed/filer" "github.com/seaweedfs/fuse" @@ -10,7 +11,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" ) -func getxattr(entry *filer_pb.Entry, req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse) error { +func getxattr(entry *filer.Entry, req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse) error { if entry == nil { return fuse.ErrNoXattr @@ -38,7 +39,7 @@ func getxattr(entry *filer_pb.Entry, req *fuse.GetxattrRequest, resp *fuse.Getxa } -func setxattr(entry *filer_pb.Entry, req *fuse.SetxattrRequest) error { +func setxattr(entry *filer.Entry, req *fuse.SetxattrRequest) error { if entry == nil { return fuse.EIO @@ -61,7 +62,7 @@ func setxattr(entry *filer_pb.Entry, req *fuse.SetxattrRequest) error { } -func removexattr(entry *filer_pb.Entry, req *fuse.RemovexattrRequest) error { +func removexattr(entry *filer.Entry, req *fuse.RemovexattrRequest) error { if entry == nil { return fuse.ErrNoXattr @@ -83,7 +84,7 @@ func removexattr(entry *filer_pb.Entry, req *fuse.RemovexattrRequest) error { } -func listxattr(entry *filer_pb.Entry, req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse) error { +func listxattr(entry *filer.Entry, req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse) error { if entry == nil { return fuse.EIO @@ -108,7 +109,7 @@ func listxattr(entry *filer_pb.Entry, req *fuse.ListxattrRequest, resp *fuse.Lis } -func (wfs *WFS) maybeLoadEntry(dir, name string) (entry *filer_pb.Entry, err error) { +func (wfs *WFS) maybeLoadEntry(dir, name string) (entry *filer.Entry, err error) { fullpath := util.NewFullPath(dir, name) // glog.V(3).Infof("read entry cache miss %s", fullpath) @@ -119,5 +120,5 @@ func (wfs *WFS) maybeLoadEntry(dir, name string) (entry *filer_pb.Entry, err err if cacheErr == filer_pb.ErrNotFound { return nil, fuse.ENOENT } - return cachedEntry.ToProtoEntry(), cacheErr + return cachedEntry, cacheErr } From 2d567e00aa18d34173659ba0044466a89e0622ea Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 12 Mar 2021 02:54:08 -0800 Subject: [PATCH 097/284] add mount memory profiling --- docker/Makefile | 7 ++- .../compose/local-mount-profile-compose.yml | 47 +++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 docker/compose/local-mount-profile-compose.yml diff --git a/docker/Makefile b/docker/Makefile index 345eac272..a933956b7 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,8 +4,10 @@ all: gen gen: dev -build: +binary: cd ../weed; CGO_ENABLED=0 GOOS=linux go build -ldflags "-extldflags -static"; mv weed ../docker/ + +build: binary docker build --no-cache -t chrislusf/seaweedfs:local -f Dockerfile.local . rm ./weed @@ -21,6 +23,9 @@ dev_tls: build certstrap dev_mount: build docker-compose -f compose/local-mount-compose.yml -p seaweedfs up +profile_mount: build + docker-compose -f compose/local-mount-profile-compose.yml -p seaweedfs up + k8s: build docker-compose -f compose/local-k8s-compose.yml -p seaweedfs up diff --git a/docker/compose/local-mount-profile-compose.yml b/docker/compose/local-mount-profile-compose.yml new file mode 100644 index 000000000..4682591c4 --- /dev/null +++ b/docker/compose/local-mount-profile-compose.yml @@ -0,0 +1,47 @@ +version: '2' + +services: + master: + image: chrislusf/seaweedfs:local + ports: + - 9333:9333 + - 19333:19333 + command: "master -ip=master" + volume: + image: chrislusf/seaweedfs:local + ports: + - 7455:8080 + - 9325:9325 + volumes: + - /Volumes/mobile_disk/99:/data + command: 'volume -mserver="master:9333" -port=8080 -metricsPort=9325 -preStopSeconds=1 -publicUrl=localhost:7455' + depends_on: + - master + filer: + image: chrislusf/seaweedfs:local + ports: + - 8888:8888 + - 18888:18888 + - 9326:9326 + volumes: + - /Volumes/mobile_disk/99:/data + command: 'filer -master="master:9333" -metricsPort=9326' + tty: true + stdin_open: true + depends_on: + - master + - volume + mount: + image: chrislusf/seaweedfs:local + privileged: true + cap_add: + - SYS_ADMIN + devices: + - fuse + volumes: + - /Volumes/mobile_disk/99:/data + entrypoint: '/bin/sh -c "mkdir -p t1 && weed mount -filer=filer:8888 -dir=./t1 -cacheCapacityMB=0 -memprofile=/data/mount.mem.pprof"' + depends_on: + - master + - volume + - filer From e19b6b2d0a40b82f3db8be55da954babed28e8ef Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 12 Mar 2021 02:55:06 -0800 Subject: [PATCH 098/284] upgrade fuse version, add batch forget --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index f7b869281..7969c4c89 100644 --- a/go.mod +++ b/go.mod @@ -60,7 +60,7 @@ require ( github.com/prometheus/client_golang v1.3.0 github.com/rakyll/statik v0.1.7 github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563 // indirect - github.com/seaweedfs/fuse v1.1.1 + github.com/seaweedfs/fuse v1.1.3 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 8c7e3ac3f..223d290af 100644 --- a/go.sum +++ b/go.sum @@ -683,6 +683,8 @@ 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/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= From 5fbcaaf37ab6c7588950ca679dbc718c1c499234 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 12 Mar 2021 09:45:25 -0800 Subject: [PATCH 099/284] fullpath() test is not needed --- weed/filesys/dir_test.go | 34 ---------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 weed/filesys/dir_test.go diff --git a/weed/filesys/dir_test.go b/weed/filesys/dir_test.go deleted file mode 100644 index 49c76eb5e..000000000 --- a/weed/filesys/dir_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package filesys - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestDirPath(t *testing.T) { - - p := &Dir{name: "/some"} - p = &Dir{name: "path", parent: p} - p = &Dir{name: "to", parent: p} - p = &Dir{name: "a", parent: p} - p = &Dir{name: "file", parent: p} - - assert.Equal(t, "/some/path/to/a/file", p.FullPath()) - - p = &Dir{name: "/some"} - assert.Equal(t, "/some", p.FullPath()) - - p = &Dir{name: "/"} - assert.Equal(t, "/", p.FullPath()) - - p = &Dir{name: "/"} - p = &Dir{name: "path", parent: p} - assert.Equal(t, "/path", p.FullPath()) - - p = &Dir{name: "/"} - p = &Dir{name: "path", parent: p} - p = &Dir{name: "to", parent: p} - assert.Equal(t, "/path/to", p.FullPath()) - -} From 2a68ddb963d2ad3810b799487fa66059790fb105 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 12 Mar 2021 15:32:51 -0800 Subject: [PATCH 100/284] default to empty host to bind to tcp4 and tcp6 --- weed/command/filer.go | 2 +- weed/command/master.go | 2 +- weed/command/server.go | 2 +- weed/command/volume.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/weed/command/filer.go b/weed/command/filer.go index 534bd9e04..68edb8e69 100644 --- a/weed/command/filer.go +++ b/weed/command/filer.go @@ -54,7 +54,7 @@ func init() { f.masters = cmdFiler.Flag.String("master", "localhost:9333", "comma-separated master servers") f.collection = cmdFiler.Flag.String("collection", "", "all data will be stored in this default collection") f.ip = cmdFiler.Flag.String("ip", util.DetectedHostAddress(), "filer server http listen ip address") - f.bindIp = cmdFiler.Flag.String("ip.bind", "0.0.0.0", "ip address to bind to") + f.bindIp = cmdFiler.Flag.String("ip.bind", "", "ip address to bind to") f.port = cmdFiler.Flag.Int("port", 8888, "filer server http listen port") f.publicPort = cmdFiler.Flag.Int("port.readonly", 0, "readonly port opened to public") f.defaultReplicaPlacement = cmdFiler.Flag.String("defaultReplicaPlacement", "", "default replication type. If not specified, use master setting.") diff --git a/weed/command/master.go b/weed/command/master.go index fb58cfefd..40d9b9a16 100644 --- a/weed/command/master.go +++ b/weed/command/master.go @@ -49,7 +49,7 @@ func init() { cmdMaster.Run = runMaster // break init cycle m.port = cmdMaster.Flag.Int("port", 9333, "http listen port") m.ip = cmdMaster.Flag.String("ip", util.DetectedHostAddress(), "master | address") - m.ipBind = cmdMaster.Flag.String("ip.bind", "0.0.0.0", "ip address to bind to") + m.ipBind = cmdMaster.Flag.String("ip.bind", "", "ip address to bind to") m.metaFolder = cmdMaster.Flag.String("mdir", os.TempDir(), "data directory to store meta data") m.peers = cmdMaster.Flag.String("peers", "", "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") m.volumeSizeLimitMB = cmdMaster.Flag.Uint("volumeSizeLimitMB", 30*1000, "Master stops directing writes to oversized volumes.") diff --git a/weed/command/server.go b/weed/command/server.go index a39802412..a9e1c94bb 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -50,7 +50,7 @@ var cmdServer = &Command{ var ( serverIp = cmdServer.Flag.String("ip", util.DetectedHostAddress(), "ip or server name") - serverBindIp = cmdServer.Flag.String("ip.bind", "0.0.0.0", "ip address to bind to") + serverBindIp = cmdServer.Flag.String("ip.bind", "", "ip address to bind to") serverTimeout = cmdServer.Flag.Int("idleTimeout", 30, "connection idle seconds") serverDataCenter = cmdServer.Flag.String("dataCenter", "", "current volume server's data center name") serverRack = cmdServer.Flag.String("rack", "", "current volume server's rack name") diff --git a/weed/command/volume.go b/weed/command/volume.go index f49ece9dc..0e8224dbc 100644 --- a/weed/command/volume.go +++ b/weed/command/volume.go @@ -71,7 +71,7 @@ func init() { v.publicPort = cmdVolume.Flag.Int("port.public", 0, "port opened to public") v.ip = cmdVolume.Flag.String("ip", util.DetectedHostAddress(), "ip or server name") v.publicUrl = cmdVolume.Flag.String("publicUrl", "", "Publicly accessible address") - v.bindIp = cmdVolume.Flag.String("ip.bind", "0.0.0.0", "ip address to bind to") + v.bindIp = cmdVolume.Flag.String("ip.bind", "", "ip address to bind to") v.masters = cmdVolume.Flag.String("mserver", "localhost:9333", "comma-separated master servers") v.preStopSeconds = cmdVolume.Flag.Int("preStopSeconds", 10, "number of seconds between stop send heartbeats and stop volume server") // v.pulseSeconds = cmdVolume.Flag.Int("pulseSeconds", 5, "number of seconds between heartbeats, must be smaller than or equal to the master's setting") From 972327f96676f7f3f88ae9bab5332108eec5326c Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 13 Mar 2021 11:04:51 -0800 Subject: [PATCH 101/284] prevent nil volume nm --- weed/storage/volume.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/weed/storage/volume.go b/weed/storage/volume.go index 366449c53..e0638d8a8 100644 --- a/weed/storage/volume.go +++ b/weed/storage/volume.go @@ -234,10 +234,16 @@ func (v *Volume) expiredLongEnough(maxDelayMinutes uint32) bool { return false } -func (v *Volume) CollectStatus() (maxFileKey types.NeedleId, datFileSize int64, modTime time.Time, fileCount, deletedCount, deletedSize uint64) { +func (v *Volume) collectStatus() (maxFileKey types.NeedleId, datFileSize int64, modTime time.Time, fileCount, deletedCount, deletedSize uint64, ok bool) { v.dataFileAccessLock.RLock() defer v.dataFileAccessLock.RUnlock() - glog.V(3).Infof("CollectStatus volume %d", v.Id) + glog.V(3).Infof("collectStatus volume %d", v.Id) + + if v.nm == nil { + return + } + + ok = true maxFileKey = v.nm.MaxFileKey() datFileSize, modTime, _ = v.DataBackend.GetStat() @@ -251,7 +257,11 @@ func (v *Volume) CollectStatus() (maxFileKey types.NeedleId, datFileSize int64, func (v *Volume) ToVolumeInformationMessage() (types.NeedleId, *master_pb.VolumeInformationMessage) { - maxFileKey, volumeSize, modTime, fileCount, deletedCount, deletedSize := v.CollectStatus() + maxFileKey, volumeSize, modTime, fileCount, deletedCount, deletedSize, ok := v.collectStatus() + + if !ok { + return 0, nil + } volumeInfo := &master_pb.VolumeInformationMessage{ Id: uint32(v.Id), From cb423312a424d60836f51a0d0c8608bb71dc7ee7 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 13 Mar 2021 11:05:29 -0800 Subject: [PATCH 102/284] prevent nil volume message --- weed/storage/store.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/weed/storage/store.go b/weed/storage/store.go index fb33a708c..c3507c0e2 100644 --- a/weed/storage/store.go +++ b/weed/storage/store.go @@ -217,6 +217,9 @@ func (s *Store) CollectHeartbeat() *master_pb.Heartbeat { location.volumesLock.RLock() for _, v := range location.volumes { curMaxFileKey, volumeMessage := v.ToVolumeInformationMessage() + if volumeMessage == nil { + continue + } if maxFileKey < curMaxFileKey { maxFileKey = curMaxFileKey } From 6d3a96eb562f13336fac7e52ccee905fd696c426 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 13 Mar 2021 22:07:39 -0800 Subject: [PATCH 103/284] filer: mysql2, postgres2 trigger actions on bucket creation and deletion fix https://github.com/chrislusf/seaweedfs/issues/1877 --- weed/filer/abstract_sql/abstract_sql_store.go | 19 +++++++++++++++ weed/filer/filer_on_meta_event.go | 18 +++++++++++++++ weed/filer/filerstore.go | 6 +++++ weed/filer/filerstore_wrapper.go | 23 +++++++++++++++++++ 4 files changed, 66 insertions(+) diff --git a/weed/filer/abstract_sql/abstract_sql_store.go b/weed/filer/abstract_sql/abstract_sql_store.go index 07ce56145..6f37a118b 100644 --- a/weed/filer/abstract_sql/abstract_sql_store.go +++ b/weed/filer/abstract_sql/abstract_sql_store.go @@ -32,6 +32,25 @@ type AbstractSqlStore struct { dbsLock sync.Mutex } +func (store *AbstractSqlStore) OnBucketCreation(bucket string) { + store.dbsLock.Lock() + defer store.dbsLock.Unlock() + + if store.dbs == nil { + return + } + store.dbs[bucket] = true +} +func (store *AbstractSqlStore) OnBucketDeletion(bucket string) { + store.dbsLock.Lock() + defer store.dbsLock.Unlock() + + if store.dbs == nil { + return + } + delete(store.dbs, bucket) +} + const ( DEFAULT_TABLE = "filemeta" ) diff --git a/weed/filer/filer_on_meta_event.go b/weed/filer/filer_on_meta_event.go index b29324b61..c9f75a5ca 100644 --- a/weed/filer/filer_on_meta_event.go +++ b/weed/filer/filer_on_meta_event.go @@ -12,6 +12,24 @@ 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.onBucketEvents(event) +} + +func (f *Filer) onBucketEvents(event *filer_pb.SubscribeMetadataResponse) { + message := event.EventNotification + for _, sig := range message.Signatures { + if sig == f.Signature { + return + } + } + if f.DirBucketsPath == event.Directory { + if message.OldEntry == nil && message.NewEntry != nil { + f.Store.OnBucketCreation(message.NewEntry.Name) + } + if message.OldEntry != nil && message.NewEntry == nil { + f.Store.OnBucketDeletion(message.OldEntry.Name) + } + } } func (f *Filer) maybeReloadFilerConfiguration(event *filer_pb.SubscribeMetadataResponse) { diff --git a/weed/filer/filerstore.go b/weed/filer/filerstore.go index 8955a25c7..069920f2d 100644 --- a/weed/filer/filerstore.go +++ b/weed/filer/filerstore.go @@ -39,3 +39,9 @@ type FilerStore interface { Shutdown() } + +type BucketAware interface { + OnBucketCreation(bucket string) + OnBucketDeletion(bucket string) +} + diff --git a/weed/filer/filerstore_wrapper.go b/weed/filer/filerstore_wrapper.go index 64baac371..95848e61b 100644 --- a/weed/filer/filerstore_wrapper.go +++ b/weed/filer/filerstore_wrapper.go @@ -21,6 +21,8 @@ type VirtualFilerStore interface { DeleteHardLink(ctx context.Context, hardLinkId HardLinkId) error DeleteOneEntry(ctx context.Context, entry *Entry) error AddPathSpecificStore(path string, storeId string, store FilerStore) + OnBucketCreation(bucket string) + OnBucketDeletion(bucket string) } type FilerStoreWrapper struct { @@ -40,6 +42,27 @@ func NewFilerStoreWrapper(store FilerStore) *FilerStoreWrapper { } } +func (fsw *FilerStoreWrapper) OnBucketCreation(bucket string) { + for _, store := range fsw.storeIdToStore { + if ba, ok := store.(BucketAware); ok { + ba.OnBucketCreation(bucket) + } + } + if ba, ok := fsw.defaultStore.(BucketAware); ok { + ba.OnBucketCreation(bucket) + } +} +func (fsw *FilerStoreWrapper) OnBucketDeletion(bucket string) { + for _, store := range fsw.storeIdToStore { + if ba, ok := store.(BucketAware); ok { + ba.OnBucketDeletion(bucket) + } + } + if ba, ok := fsw.defaultStore.(BucketAware); ok { + ba.OnBucketDeletion(bucket) + } +} + func (fsw *FilerStoreWrapper) AddPathSpecificStore(path string, storeId string, store FilerStore) { fsw.storeIdToStore[storeId] = NewFilerStorePathTranlator(path, store) err := fsw.pathToStore.Put([]byte(path), storeId) From 2d4c2db81df0b5012705c395aa306cd077cc36f4 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 14 Mar 2021 13:20:14 -0700 Subject: [PATCH 104/284] filer: leveldb, rocksdb auto create store directory fix https://github.com/chrislusf/seaweedfs/issues/1901 --- weed/filer/leveldb/leveldb_store.go | 2 ++ weed/filer/leveldb2/leveldb2_store.go | 1 + weed/filer/leveldb3/leveldb3_store.go | 1 + weed/filer/rocksdb/rocksdb_store.go | 2 ++ 4 files changed, 6 insertions(+) diff --git a/weed/filer/leveldb/leveldb_store.go b/weed/filer/leveldb/leveldb_store.go index ac0ad4ba6..ce454f36a 100644 --- a/weed/filer/leveldb/leveldb_store.go +++ b/weed/filer/leveldb/leveldb_store.go @@ -8,6 +8,7 @@ import ( leveldb_errors "github.com/syndtr/goleveldb/leveldb/errors" "github.com/syndtr/goleveldb/leveldb/opt" leveldb_util "github.com/syndtr/goleveldb/leveldb/util" + "os" "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/glog" @@ -38,6 +39,7 @@ func (store *LevelDBStore) Initialize(configuration weed_util.Configuration, pre func (store *LevelDBStore) initialize(dir string) (err error) { glog.Infof("filer store dir: %s", dir) + os.MkdirAll(dir, 0755) if err := weed_util.TestFolderWritable(dir); err != nil { return fmt.Errorf("Check Level Folder %s Writable: %s", dir, err) } diff --git a/weed/filer/leveldb2/leveldb2_store.go b/weed/filer/leveldb2/leveldb2_store.go index c76340da4..124d61c1c 100644 --- a/weed/filer/leveldb2/leveldb2_store.go +++ b/weed/filer/leveldb2/leveldb2_store.go @@ -38,6 +38,7 @@ func (store *LevelDB2Store) Initialize(configuration weed_util.Configuration, pr func (store *LevelDB2Store) initialize(dir string, dbCount int) (err error) { glog.Infof("filer store leveldb2 dir: %s", dir) + os.MkdirAll(dir, 0755) if err := weed_util.TestFolderWritable(dir); err != nil { return fmt.Errorf("Check Level Folder %s Writable: %s", dir, err) } diff --git a/weed/filer/leveldb3/leveldb3_store.go b/weed/filer/leveldb3/leveldb3_store.go index c81ea7bbe..d1cdfbbf6 100644 --- a/weed/filer/leveldb3/leveldb3_store.go +++ b/weed/filer/leveldb3/leveldb3_store.go @@ -45,6 +45,7 @@ func (store *LevelDB3Store) Initialize(configuration weed_util.Configuration, pr func (store *LevelDB3Store) initialize(dir string) (err error) { glog.Infof("filer store leveldb3 dir: %s", dir) + os.MkdirAll(dir, 0755) if err := weed_util.TestFolderWritable(dir); err != nil { return fmt.Errorf("Check Level Folder %s Writable: %s", dir, err) } diff --git a/weed/filer/rocksdb/rocksdb_store.go b/weed/filer/rocksdb/rocksdb_store.go index 70c301725..379a18c62 100644 --- a/weed/filer/rocksdb/rocksdb_store.go +++ b/weed/filer/rocksdb/rocksdb_store.go @@ -8,6 +8,7 @@ import ( "crypto/md5" "fmt" "io" + "os" "github.com/tecbot/gorocksdb" @@ -56,6 +57,7 @@ func (store *RocksDBStore) Initialize(configuration weed_util.Configuration, pre func (store *RocksDBStore) initialize(dir string) (err error) { glog.Infof("filer store rocksdb dir: %s", dir) + os.MkdirAll(dir, 0755) if err := weed_util.TestFolderWritable(dir); err != nil { return fmt.Errorf("Check Level Folder %s Writable: %s", dir, err) } From 35d939a1d21322e7eb1d58899ebf4929f4fd2a72 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 14 Mar 2021 13:21:02 -0700 Subject: [PATCH 105/284] go fmt --- weed/command/mount_std.go | 2 +- weed/filer/filerstore.go | 1 - weed/filesys/wfs.go | 2 +- weed/pb/filer_pb/filer_client.go | 2 +- weed/shell/command_s3_clean_uploads.go | 10 +++++----- weed/storage/needle/crc.go | 2 +- weed/storage/volume_stream_write.go | 2 +- weed/wdclient/net2/doc.go | 2 +- weed/wdclient/net2/ip.go | 2 +- weed/wdclient/resource_pool/doc.go | 2 +- 10 files changed, 13 insertions(+), 14 deletions(-) diff --git a/weed/command/mount_std.go b/weed/command/mount_std.go index 8da69d0ac..f6f7b1d55 100644 --- a/weed/command/mount_std.go +++ b/weed/command/mount_std.go @@ -75,7 +75,7 @@ func RunMount(option *MountOptions, umask os.FileMode) bool { if err != nil { glog.V(0).Infof("failed to talk to filer %s: %v", filerGrpcAddress, err) glog.V(0).Infof("wait for %d seconds ...", i+1) - time.Sleep(time.Duration(i+1)*time.Second) + time.Sleep(time.Duration(i+1) * time.Second) } } if err != nil { diff --git a/weed/filer/filerstore.go b/weed/filer/filerstore.go index 069920f2d..a5b2f25de 100644 --- a/weed/filer/filerstore.go +++ b/weed/filer/filerstore.go @@ -44,4 +44,3 @@ type BucketAware interface { OnBucketCreation(bucket string) OnBucketDeletion(bucket string) } - diff --git a/weed/filesys/wfs.go b/weed/filesys/wfs.go index 7a6b4fa2b..7c3907326 100644 --- a/weed/filesys/wfs.go +++ b/weed/filesys/wfs.go @@ -131,7 +131,7 @@ func NewSeaweedFileSystem(option *Option) *WFS { }) entry, _ := filer_pb.GetEntry(wfs, util.FullPath(wfs.option.FilerMountRootPath)) - wfs.root = &Dir{name: wfs.option.FilerMountRootPath, wfs: wfs, entry: filer.FromPbEntry(wfs.option.FilerMountRootPath,entry)} + wfs.root = &Dir{name: wfs.option.FilerMountRootPath, wfs: wfs, entry: filer.FromPbEntry(wfs.option.FilerMountRootPath, entry)} wfs.fsNodeCache = newFsCache(wfs.root) if wfs.option.ConcurrentWriters > 0 { diff --git a/weed/pb/filer_pb/filer_client.go b/weed/pb/filer_pb/filer_client.go index e4d8bee34..8cf42026d 100644 --- a/weed/pb/filer_pb/filer_client.go +++ b/weed/pb/filer_pb/filer_client.go @@ -104,7 +104,7 @@ func SeaweedList(client SeaweedFilerClient, parentDirectoryPath, prefix string, func doSeaweedList(client SeaweedFilerClient, fullDirPath util.FullPath, prefix string, fn EachEntryFunciton, startFrom string, inclusive bool, limit uint32) (err error) { // Redundancy limit to make it correctly judge whether it is the last file. redLimit := limit - if limit != math.MaxInt32 && limit != 0{ + if limit != math.MaxInt32 && limit != 0 { redLimit = limit + 1 } request := &ListEntriesRequest{ diff --git a/weed/shell/command_s3_clean_uploads.go b/weed/shell/command_s3_clean_uploads.go index 1fe13d981..5f674d7b6 100644 --- a/weed/shell/command_s3_clean_uploads.go +++ b/weed/shell/command_s3_clean_uploads.go @@ -54,7 +54,7 @@ func (c *commandS3CleanUploads) Do(args []string, commandEnv *CommandEnv, writer return fmt.Errorf("list buckets under %v: %v", filerBucketsPath, err) } - for _, bucket:= range buckets { + for _, bucket := range buckets { c.cleanupUploads(commandEnv, writer, filerBucketsPath, bucket, *uploadedTimeAgo) } @@ -63,7 +63,7 @@ func (c *commandS3CleanUploads) Do(args []string, commandEnv *CommandEnv, writer } func (c *commandS3CleanUploads) cleanupUploads(commandEnv *CommandEnv, writer io.Writer, filerBucketsPath string, bucket string, timeAgo time.Duration) error { - uploadsDir := filerBucketsPath+"/"+bucket+"/.uploads" + uploadsDir := filerBucketsPath + "/" + bucket + "/.uploads" var staleUploads []string now := time.Now() err := filer_pb.List(commandEnv, uploadsDir, "", func(entry *filer_pb.Entry, isLast bool) error { @@ -77,8 +77,8 @@ func (c *commandS3CleanUploads) cleanupUploads(commandEnv *CommandEnv, writer io return fmt.Errorf("list uploads under %v: %v", uploadsDir, err) } - for _, staleUpload:= range staleUploads { - deleteUrl := fmt.Sprintf("http://%s:%d%s/%s?recursive=true&ignoreRecursiveError=true",commandEnv.option.FilerHost, commandEnv.option.FilerPort,uploadsDir, staleUpload) + for _, staleUpload := range staleUploads { + deleteUrl := fmt.Sprintf("http://%s:%d%s/%s?recursive=true&ignoreRecursiveError=true", commandEnv.option.FilerHost, commandEnv.option.FilerPort, uploadsDir, staleUpload) fmt.Fprintf(writer, "purge %s\n", deleteUrl) err = util.Delete(deleteUrl, "") @@ -89,4 +89,4 @@ func (c *commandS3CleanUploads) cleanupUploads(commandEnv *CommandEnv, writer io return nil -} \ No newline at end of file +} diff --git a/weed/storage/needle/crc.go b/weed/storage/needle/crc.go index 22456faa2..4476631c2 100644 --- a/weed/storage/needle/crc.go +++ b/weed/storage/needle/crc.go @@ -35,7 +35,7 @@ func NewCRCwriter(w io.Writer) *CRCwriter { return &CRCwriter{ crc: CRC(0), - w: w, + w: w, } } diff --git a/weed/storage/volume_stream_write.go b/weed/storage/volume_stream_write.go index 955875aa2..d229bdf20 100644 --- a/weed/storage/volume_stream_write.go +++ b/weed/storage/volume_stream_write.go @@ -73,7 +73,7 @@ func (v *Volume) StreamRead(n *needle.Needle, writer io.Writer) (err error) { sr := &StreamReader{ readerAt: v.DataBackend, - offset: nv.Offset.ToActualOffset(), + offset: nv.Offset.ToActualOffset(), } bufReader := bufio.NewReader(sr) bufReader.Discard(NeedleHeaderSize) diff --git a/weed/wdclient/net2/doc.go b/weed/wdclient/net2/doc.go index f4d6552e4..fd1c6323d 100644 --- a/weed/wdclient/net2/doc.go +++ b/weed/wdclient/net2/doc.go @@ -3,4 +3,4 @@ package net2 // copied from https://github.com/dropbox/godropbox/tree/master/net2 -// removed other dependencies \ No newline at end of file +// removed other dependencies diff --git a/weed/wdclient/net2/ip.go b/weed/wdclient/net2/ip.go index 60e46342f..ff5e3b24e 100644 --- a/weed/wdclient/net2/ip.go +++ b/weed/wdclient/net2/ip.go @@ -80,7 +80,7 @@ func GetLocalIPs() ([]*net.IP, error) { // TODO(zviad): Is rest of the code really necessary? addrs, err := net.InterfaceAddrs() if err != nil { - return nil, fmt.Errorf( "Failed to get interface addresses: %v", err) + return nil, fmt.Errorf("Failed to get interface addresses: %v", err) } for _, addr := range addrs { ipnet, ok := addr.(*net.IPNet) diff --git a/weed/wdclient/resource_pool/doc.go b/weed/wdclient/resource_pool/doc.go index c17b17c6c..b8b3f92fa 100644 --- a/weed/wdclient/resource_pool/doc.go +++ b/weed/wdclient/resource_pool/doc.go @@ -2,4 +2,4 @@ package resource_pool // copied from https://github.com/dropbox/godropbox/tree/master/resource_pool -// removed other dependencies \ No newline at end of file +// removed other dependencies From 29e62aba00291351076d9489f4444af87b5e1d81 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 14 Mar 2021 20:23:19 -0700 Subject: [PATCH 106/284] possible fix for volume balance address https://github.com/chrislusf/seaweedfs/issues/1534 --- weed/shell/command_volume_balance.go | 2 +- weed/shell/command_volume_balance_test.go | 12 + weed/shell/command_volume_list_test.go | 892 ++++++++++++++++++++++ 3 files changed, 905 insertions(+), 1 deletion(-) create mode 100644 weed/shell/command_volume_list_test.go diff --git a/weed/shell/command_volume_balance.go b/weed/shell/command_volume_balance.go index e0c41f310..33ae9344d 100644 --- a/weed/shell/command_volume_balance.go +++ b/weed/shell/command_volume_balance.go @@ -201,7 +201,7 @@ type CapacityFunc func(*master_pb.DataNodeInfo) int func capacityByMaxVolumeCount(diskType types.DiskType) CapacityFunc { return func(info *master_pb.DataNodeInfo) int { - diskInfo, found := info.DiskInfos[string(diskType)] + diskInfo, found := info.DiskInfos[diskType.ReadableString()] if !found { return 0 } diff --git a/weed/shell/command_volume_balance_test.go b/weed/shell/command_volume_balance_test.go index 696bc7fac..a2c0b4bc7 100644 --- a/weed/shell/command_volume_balance_test.go +++ b/weed/shell/command_volume_balance_test.go @@ -169,3 +169,15 @@ func TestIsGoodMove(t *testing.T) { } } + +func TestBalance(t *testing.T) { + topologyInfo := parseOutput(topoData) + volumeServers := collectVolumeServersByDc(topologyInfo, "") + volumeReplicas, _ := collectVolumeReplicaLocations(topologyInfo) + diskTypes := collectVolumeDiskTypes(topologyInfo) + + if err := balanceVolumeServers(nil, diskTypes, volumeReplicas, volumeServers, 30*1024*1024*1024, "ALL_COLLECTIONS", false); err != nil { + t.Errorf("balance: %v", err) + } + +} \ No newline at end of file diff --git a/weed/shell/command_volume_list_test.go b/weed/shell/command_volume_list_test.go new file mode 100644 index 000000000..26b2b40a9 --- /dev/null +++ b/weed/shell/command_volume_list_test.go @@ -0,0 +1,892 @@ +package shell + +import ( + "github.com/golang/protobuf/proto" + "github.com/stretchr/testify/assert" + "strconv" + "strings" + "testing" + + "github.com/chrislusf/seaweedfs/weed/pb/master_pb" +) + +func TestParsing(t *testing.T) { + topo := parseOutput(topoData) + + assert.Equal(t, 5, len(topo.DataCenterInfos)) + +} + +func parseOutput(output string) *master_pb.TopologyInfo { + lines := strings.Split(output, "\n") + var topo *master_pb.TopologyInfo + var dc *master_pb.DataCenterInfo + var rack *master_pb.RackInfo + var dn *master_pb.DataNodeInfo + var disk *master_pb.DiskInfo + for _, line := range lines { + line = strings.TrimSpace(line) + parts := strings.Split(line, " ") + switch parts[0] { + case "Topology": + if topo == nil { + topo = &master_pb.TopologyInfo{} + } + case "DataCenter": + if dc == nil { + dc = &master_pb.DataCenterInfo{ + Id: parts[1], + } + topo.DataCenterInfos = append(topo.DataCenterInfos, dc) + } else { + dc = nil + } + case "Rack": + if rack == nil { + rack = &master_pb.RackInfo{ + Id: parts[1], + } + dc.RackInfos = append(dc.RackInfos, rack) + } else { + rack = nil + } + case "DataNode": + if dn == nil { + dn = &master_pb.DataNodeInfo{ + Id: parts[1], + DiskInfos: make(map[string]*master_pb.DiskInfo), + } + rack.DataNodeInfos = append(rack.DataNodeInfos, dn) + } else { + dn = nil + } + case "Disk": + if disk == nil { + diskType := parts[1][:strings.Index(parts[1], "(")] + maxVolumeCountStr := parts[1][strings.Index(parts[1], "/")+1:] + maxVolumeCount, _ := strconv.Atoi(maxVolumeCountStr) + disk = &master_pb.DiskInfo{ + Type: diskType, + MaxVolumeCount: uint64(maxVolumeCount), + } + dn.DiskInfos[diskType] = disk + } else { + disk = nil + } + case "volume": + volumeLine := line[len("volume "):] + volume := &master_pb.VolumeInformationMessage{} + proto.UnmarshalText(volumeLine, volume) + disk.VolumeInfos = append(disk.VolumeInfos, volume) + } + } + + return topo +} + +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 +` From 352ba23f83adb5bddb5c65d1d2e6637a46cda05d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 14 Mar 2021 20:49:56 -0700 Subject: [PATCH 107/284] revert previous change revert 29e62aba00291351076d9489f4444af87b5e1d81 --- 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 33ae9344d..e0c41f310 100644 --- a/weed/shell/command_volume_balance.go +++ b/weed/shell/command_volume_balance.go @@ -201,7 +201,7 @@ type CapacityFunc func(*master_pb.DataNodeInfo) int func capacityByMaxVolumeCount(diskType types.DiskType) CapacityFunc { return func(info *master_pb.DataNodeInfo) int { - diskInfo, found := info.DiskInfos[diskType.ReadableString()] + diskInfo, found := info.DiskInfos[string(diskType)] if !found { return 0 } From ca100568f76b9ccc472352c62bc1647c9d156843 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 14 Mar 2021 20:50:14 -0700 Subject: [PATCH 108/284] fix parsing --- weed/shell/command_volume_list_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/weed/shell/command_volume_list_test.go b/weed/shell/command_volume_list_test.go index 26b2b40a9..b09622fc2 100644 --- a/weed/shell/command_volume_list_test.go +++ b/weed/shell/command_volume_list_test.go @@ -1,6 +1,7 @@ package shell import ( + "github.com/chrislusf/seaweedfs/weed/storage/types" "github.com/golang/protobuf/proto" "github.com/stretchr/testify/assert" "strconv" @@ -69,7 +70,7 @@ func parseOutput(output string) *master_pb.TopologyInfo { Type: diskType, MaxVolumeCount: uint64(maxVolumeCount), } - dn.DiskInfos[diskType] = disk + dn.DiskInfos[types.ToDiskType(diskType).String()] = disk } else { disk = nil } From a4cfffc264d3af61a3e363dc4d9db8f606284069 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 14 Mar 2021 21:29:55 -0700 Subject: [PATCH 109/284] shell: fix moving volume, volume server evacuate fix https://github.com/chrislusf/seaweedfs/issues/1534 --- weed/shell/command_volume_balance.go | 5 ++--- .../command_volume_server_evacuate_test.go | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 weed/shell/command_volume_server_evacuate_test.go diff --git a/weed/shell/command_volume_balance.go b/weed/shell/command_volume_balance.go index e0c41f310..ad7da0e44 100644 --- a/weed/shell/command_volume_balance.go +++ b/weed/shell/command_volume_balance.go @@ -393,9 +393,8 @@ func adjustAfterMove(v *master_pb.VolumeInformationMessage, volumeReplicas map[u if replica.location.dataNode.Id == fullNode.info.Id && replica.location.rack == fullNode.rack && replica.location.dc == fullNode.dc { - replica.location.dc = emptyNode.dc - replica.location.rack = emptyNode.rack - replica.location.dataNode = emptyNode.info + loc := newLocation(emptyNode.dc, emptyNode.rack, emptyNode.info) + replica.location = &loc return } } diff --git a/weed/shell/command_volume_server_evacuate_test.go b/weed/shell/command_volume_server_evacuate_test.go new file mode 100644 index 000000000..5753af78b --- /dev/null +++ b/weed/shell/command_volume_server_evacuate_test.go @@ -0,0 +1,17 @@ +package shell + +import ( + "os" + "testing" +) + +func TestVolumeServerEvacuate(t *testing.T) { + topologyInfo := parseOutput(topoData) + + volumeServer := "192.168.1.4:8080" + + if err := evacuateNormalVolumes(nil, topologyInfo, volumeServer, true, false, os.Stdout); err != nil { + t.Errorf("evacuate: %v", err) + } + +} From 9f00f95bfb8dcf118ade083c66122725f25fdd45 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 14 Mar 2021 21:32:00 -0700 Subject: [PATCH 110/284] 2.32 --- 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 c19a964d3..fd08a4232 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.31" -version: 2.31 +appVersion: "2.32" +version: 2.32 diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index a5813b8b3..e06d47ec4 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.31" - started using {.Chart.appVersion} + # imageTag: "2.32" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index 1cd2f160a..fdb37d7f6 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, 31) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 32) COMMIT = "" ) From 7194a5e7bf38ec136ea8ec8f6b50960d598a4d95 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Mon, 15 Mar 2021 18:52:59 +0500 Subject: [PATCH 111/284] avoid http error: superfluous response.WriteHeader https://github.com/chrislusf/seaweedfs/issues/1838 --- go.mod | 4 +- go.sum | 2 + weed/filer/filechunk_manifest.go | 6 +-- weed/filer/stream.go | 43 ++++++++++++++++--- .../replication/repl_util/replication_util.go | 2 +- weed/util/fasthttp_util.go | 7 +-- 6 files changed, 50 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index 7969c4c89..028d16cf4 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/google/uuid v1.1.1 github.com/gorilla/mux v1.7.4 github.com/gorilla/websocket v1.4.1 // indirect - github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 github.com/grpc-ecosystem/grpc-gateway v1.11.0 // indirect github.com/jcmturner/gofork v1.0.0 // indirect github.com/json-iterator/go v1.1.10 @@ -88,7 +88,7 @@ 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/sync v0.0.0-20200930132711-30421366ff76 // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sys v0.0.0-20201022201747-fb209a7c41cd golang.org/x/tools v0.0.0-20200608174601-1b747fd94509 google.golang.org/api v0.26.0 diff --git a/go.sum b/go.sum index 223d290af..b49485dc6 100644 --- a/go.sum +++ b/go.sum @@ -959,6 +959,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ 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-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/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= diff --git a/weed/filer/filechunk_manifest.go b/weed/filer/filechunk_manifest.go index 99a62c90c..c4f989394 100644 --- a/weed/filer/filechunk_manifest.go +++ b/weed/filer/filechunk_manifest.go @@ -91,10 +91,10 @@ func fetchChunk(lookupFileIdFn wdclient.LookupFileIdFunctionType, fileId string, glog.Errorf("operation LookupFileId %s failed, err: %v", fileId, err) return nil, err } - return retriedFetchChunkData(urlStrings, cipherKey, isGzipped, true, 0, 0) + return retriedFetchChunkData(urlStrings, cipherKey, isGzipped, true, false, 0, 0) } -func retriedFetchChunkData(urlStrings []string, cipherKey []byte, isGzipped bool, isFullChunk bool, offset int64, size int) ([]byte, error) { +func retriedFetchChunkData(urlStrings []string, cipherKey []byte, isGzipped bool, isFullChunk bool, isCheck bool, offset int64, size int) ([]byte, error) { var err error var buffer bytes.Buffer @@ -102,7 +102,7 @@ func retriedFetchChunkData(urlStrings []string, cipherKey []byte, isGzipped bool for waitTime := time.Second; waitTime < util.RetryWaitTime; waitTime += waitTime / 2 { for _, urlString := range urlStrings { - shouldRetry, err = util.FastReadUrlAsStream(urlString+"?readDeleted=true", cipherKey, isGzipped, isFullChunk, offset, size, func(data []byte) { + shouldRetry, err = util.FastReadUrlAsStream(urlString+"?readDeleted=true", cipherKey, isGzipped, isFullChunk, isCheck, offset, size, func(data []byte) { buffer.Write(data) }) if !shouldRetry { diff --git a/weed/filer/stream.go b/weed/filer/stream.go index 573ab65e8..7e041e213 100644 --- a/weed/filer/stream.go +++ b/weed/filer/stream.go @@ -3,6 +3,7 @@ package filer import ( "bytes" "fmt" + "golang.org/x/sync/errgroup" "io" "math" "strings" @@ -33,16 +34,32 @@ func StreamContent(masterClient wdclient.HasLookupFileIdFunction, w io.Writer, c fileId2Url[chunkView.FileId] = urlStrings } - for _, chunkView := range chunkViews { + for idx, chunkView := range chunkViews { urlStrings := fileId2Url[chunkView.FileId] - data, err := retriedFetchChunkData(urlStrings, chunkView.CipherKey, chunkView.IsGzipped, chunkView.IsFullChunk(), chunkView.Offset, int(chunkView.Size)) + // Pre-check all chunkViews urls + gErr := new(errgroup.Group) + if len(chunkViews) > 1 && idx == 0 { + CheckAllChunkViews(chunkViews[1:], &fileId2Url, gErr) + } + data, err := retriedFetchChunkData( + urlStrings, + chunkView.CipherKey, + chunkView.IsGzipped, + chunkView.IsFullChunk(), + false, + chunkView.Offset, + int(chunkView.Size), + ) if err != nil { glog.Errorf("read chunk: %v", err) return fmt.Errorf("read chunk: %v", err) } - + if err := gErr.Wait(); err != nil { + glog.Errorf("check all chunks: %v", err) + return fmt.Errorf("check all chunks: %v", err) + } _, err = w.Write(data) if err != nil { glog.Errorf("write chunk: %v", err) @@ -54,6 +71,22 @@ func StreamContent(masterClient wdclient.HasLookupFileIdFunction, w io.Writer, c } +func CheckAllChunkViews(chunkViews []*ChunkView, fileId2Url *map[string][]string, gErr *errgroup.Group) { + for _, chunkView := range chunkViews { + gErr.Go(func() error { + _, err := retriedFetchChunkData( + (*fileId2Url)[chunkView.FileId], + chunkView.CipherKey, + chunkView.IsGzipped, + chunkView.IsFullChunk(), + true, + chunkView.Offset, + int(chunkView.Size)) + return err + }) + } +} + // ---------------- ReadAllReader ---------------------------------- func ReadAll(masterClient *wdclient.MasterClient, chunks []*filer_pb.FileChunk) ([]byte, error) { @@ -73,7 +106,7 @@ func ReadAll(masterClient *wdclient.MasterClient, chunks []*filer_pb.FileChunk) return nil, err } - data, err := retriedFetchChunkData(urlStrings, chunkView.CipherKey, chunkView.IsGzipped, chunkView.IsFullChunk(), chunkView.Offset, int(chunkView.Size)) + data, err := retriedFetchChunkData(urlStrings, chunkView.CipherKey, chunkView.IsGzipped, chunkView.IsFullChunk(), false, chunkView.Offset, int(chunkView.Size)) if err != nil { return nil, err } @@ -185,7 +218,7 @@ func (c *ChunkStreamReader) fetchChunkToBuffer(chunkView *ChunkView) error { var buffer bytes.Buffer var shouldRetry bool for _, urlString := range urlStrings { - shouldRetry, err = util.FastReadUrlAsStream(urlString, chunkView.CipherKey, chunkView.IsGzipped, chunkView.IsFullChunk(), chunkView.Offset, int(chunkView.Size), func(data []byte) { + shouldRetry, err = util.FastReadUrlAsStream(urlString, chunkView.CipherKey, chunkView.IsGzipped, chunkView.IsFullChunk(), false, chunkView.Offset, int(chunkView.Size), func(data []byte) { buffer.Write(data) }) if !shouldRetry { diff --git a/weed/replication/repl_util/replication_util.go b/weed/replication/repl_util/replication_util.go index f642bb801..23fbe3292 100644 --- a/weed/replication/repl_util/replication_util.go +++ b/weed/replication/repl_util/replication_util.go @@ -20,7 +20,7 @@ func CopyFromChunkViews(chunkViews []*filer.ChunkView, filerSource *source.Filer var shouldRetry bool for _, fileUrl := range fileUrls { - shouldRetry, err = util.FastReadUrlAsStream(fileUrl, nil, false, chunk.IsFullChunk(), chunk.Offset, int(chunk.Size), func(data []byte) { + shouldRetry, err = util.FastReadUrlAsStream(fileUrl, nil, false, chunk.IsFullChunk(), false, chunk.Offset, int(chunk.Size), func(data []byte) { writeErr = writeFunc(data) }) if err != nil { diff --git a/weed/util/fasthttp_util.go b/weed/util/fasthttp_util.go index 6c31a40da..02c78e79d 100644 --- a/weed/util/fasthttp_util.go +++ b/weed/util/fasthttp_util.go @@ -72,12 +72,11 @@ func FastGet(url string) ([]byte, bool, error) { return out, false, nil } -func FastReadUrlAsStream(fileUrl string, cipherKey []byte, isContentGzipped bool, isFullChunk bool, offset int64, size int, fn func(data []byte)) (retryable bool, err error) { +func FastReadUrlAsStream(fileUrl string, cipherKey []byte, isContentGzipped bool, isFullChunk bool, isCheck bool, offset int64, size int, fn func(data []byte)) (retryable bool, err error) { if cipherKey != nil { return readEncryptedUrl(fileUrl, cipherKey, isContentGzipped, isFullChunk, offset, size, fn) } - req := fasthttp.AcquireRequest() res := fasthttp.AcquireResponse() defer fasthttp.ReleaseRequest(req) @@ -85,7 +84,9 @@ func FastReadUrlAsStream(fileUrl string, cipherKey []byte, isContentGzipped bool req.SetRequestURIBytes([]byte(fileUrl)) - if isFullChunk { + if isCheck { + req.Header.Add("Range", "bytes=0-1") + } else if isFullChunk { req.Header.Add("Accept-Encoding", "gzip") } else { req.Header.Add("Range", fmt.Sprintf("bytes=%d-%d", offset, offset+int64(size)-1)) From 46b9f5cff470d24dab87a2e7737f00ef3c2c98ae Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Mon, 15 Mar 2021 19:33:33 +0500 Subject: [PATCH 112/284] add debug logging --- weed/filer/stream.go | 4 +++- weed/server/volume_server_handlers_read.go | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/weed/filer/stream.go b/weed/filer/stream.go index 7e041e213..4353b1f07 100644 --- a/weed/filer/stream.go +++ b/weed/filer/stream.go @@ -73,9 +73,11 @@ func StreamContent(masterClient wdclient.HasLookupFileIdFunction, w io.Writer, c func CheckAllChunkViews(chunkViews []*ChunkView, fileId2Url *map[string][]string, gErr *errgroup.Group) { for _, chunkView := range chunkViews { + urlStrings := (*fileId2Url)[chunkView.FileId] + glog.V(9).Infof("Check chunk: %+v\n url: %v", chunkView, urlStrings) gErr.Go(func() error { _, err := retriedFetchChunkData( - (*fileId2Url)[chunkView.FileId], + urlStrings, chunkView.CipherKey, chunkView.IsGzipped, chunkView.IsFullChunk(), diff --git a/weed/server/volume_server_handlers_read.go b/weed/server/volume_server_handlers_read.go index 2db46ac9b..981984378 100644 --- a/weed/server/volume_server_handlers_read.go +++ b/weed/server/volume_server_handlers_read.go @@ -27,7 +27,7 @@ var fileNameEscaper = strings.NewReplacer(`\`, `\\`, `"`, `\"`) func (vs *VolumeServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) { - // println(r.Method + " " + r.URL.Path) + glog.V(9).Info(r.Method + " " + r.URL.Path + " " + r.Header.Get("Range")) stats.VolumeServerRequestCounter.WithLabelValues("get").Inc() start := time.Now() From 90510e3137157f387b6326726ab42873057f6bc9 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Mon, 15 Mar 2021 21:22:59 +0500 Subject: [PATCH 113/284] If WriteHeader is not called explicitly, the first call to Write will trigger an implicit WriteHeader(http.StatusOK). WriteHeader: Only one header may be written. Go does not currently! --- weed/server/common.go | 8 ++++---- weed/server/filer_server_handlers_read.go | 5 +---- weed/server/volume_server_handlers_read.go | 5 +---- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/weed/server/common.go b/weed/server/common.go index 9001a3b33..5c5f1b8eb 100644 --- a/weed/server/common.go +++ b/weed/server/common.go @@ -234,12 +234,12 @@ func adjustHeaderContentDisposition(w http.ResponseWriter, r *http.Request, file } } -func processRangeRequest(r *http.Request, w http.ResponseWriter, totalSize int64, mimeType string, writeFn func(writer io.Writer, offset int64, size int64, httpStatusCode int) error) { +func processRangeRequest(r *http.Request, w http.ResponseWriter, totalSize int64, mimeType string, writeFn func(writer io.Writer, offset int64, size int64) error) { rangeReq := r.Header.Get("Range") if rangeReq == "" { w.Header().Set("Content-Length", strconv.FormatInt(totalSize, 10)) - if err := writeFn(w, 0, totalSize, 0); err != nil { + if err := writeFn(w, 0, totalSize); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } @@ -279,7 +279,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)) - err = writeFn(w, ra.start, ra.length, http.StatusPartialContent) + err = writeFn(w, ra.start, ra.length) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return @@ -307,7 +307,7 @@ func processRangeRequest(r *http.Request, w http.ResponseWriter, totalSize int64 pw.CloseWithError(e) return } - if e = writeFn(part, ra.start, ra.length, 0); e != nil { + if e = writeFn(part, ra.start, ra.length); e != nil { pw.CloseWithError(e) return } diff --git a/weed/server/filer_server_handlers_read.go b/weed/server/filer_server_handlers_read.go index 892a732f7..231fbd874 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -150,10 +150,7 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, } } - processRangeRequest(r, w, totalSize, mimeType, func(writer io.Writer, offset int64, size int64, httpStatusCode int) error { - if httpStatusCode != 0 { - w.WriteHeader(httpStatusCode) - } + processRangeRequest(r, w, totalSize, mimeType, func(writer io.Writer, offset int64, size int64) error { if offset+size <= int64(len(entry.Content)) { _, err := writer.Write(entry.Content[offset : offset+size]) if err != nil { diff --git a/weed/server/volume_server_handlers_read.go b/weed/server/volume_server_handlers_read.go index 981984378..3e977cfd4 100644 --- a/weed/server/volume_server_handlers_read.go +++ b/weed/server/volume_server_handlers_read.go @@ -261,13 +261,10 @@ func writeResponseContent(filename, mimeType string, rs io.ReadSeeker, w http.Re return nil } - processRangeRequest(r, w, totalSize, mimeType, func(writer io.Writer, offset int64, size int64, httpStatusCode int) error { + processRangeRequest(r, w, totalSize, mimeType, func(writer io.Writer, offset int64, size int64) error { if _, e = rs.Seek(offset, 0); e != nil { return e } - if httpStatusCode != 0 { - w.WriteHeader(httpStatusCode) - } _, e = io.CopyN(writer, rs, size) return e }) From 3a3699867b0f6f6c12d4b6c3e127ee3c49b57a42 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Mon, 15 Mar 2021 23:30:22 +0500 Subject: [PATCH 114/284] Status PartialContent for Content-Range response --- weed/s3api/s3api_object_handlers.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index 610daef9f..2b6b80f90 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -326,7 +326,11 @@ func passThroughResponse(proxyResponse *http.Response, w http.ResponseWriter) { for k, v := range proxyResponse.Header { w.Header()[k] = v } - w.WriteHeader(proxyResponse.StatusCode) + if proxyResponse.Header.Get("Content-Range") != "" && proxyResponse.StatusCode == 200 { + w.WriteHeader(http.StatusPartialContent) + } else { + w.WriteHeader(proxyResponse.StatusCode) + } io.Copy(w, proxyResponse.Body) } From 050a7f9599599914dc8f2c728b3248021827bc65 Mon Sep 17 00:00:00 2001 From: wuh-fnst Date: Mon, 15 Mar 2021 11:22:36 +0800 Subject: [PATCH 115/284] s3: count correction for the number of files in the dir --- weed/s3api/s3api_objects_list_handlers.go | 1 - 1 file changed, 1 deletion(-) diff --git a/weed/s3api/s3api_objects_list_handlers.go b/weed/s3api/s3api_objects_list_handlers.go index 2d36c6ec9..739cdd8f9 100644 --- a/weed/s3api/s3api_objects_list_handlers.go +++ b/weed/s3api/s3api_objects_list_handlers.go @@ -206,7 +206,6 @@ func (s3a *S3ApiServer) doListFilerEntries(client filer_pb.SeaweedFilerClient, d isTruncated = isTruncated || subIsTruncated maxKeys -= subCounter nextMarker = subDir + "/" + subNextMarker - counter += subCounter // finished processing this sub directory marker = subDir } From 22a07a12d2cc89abc66f100ffb4356439eaa1614 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 15 Mar 2021 20:46:25 -0700 Subject: [PATCH 116/284] [mount] [regression] `filer.path` option results in empty mount in 2.32 fix https://github.com/chrislusf/seaweedfs/issues/1906 --- weed/filesys/dir.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index 6168425af..dc208dcbb 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -552,5 +552,8 @@ func (dir *Dir) saveEntry() error { } func (dir *Dir) FullPath() string { - return string(dir.entry.FullPath) + if dir.wfs.option.FilerMountRootPath == "/" { + return string(dir.entry.FullPath) + } + return string(dir.entry.FullPath)[len(dir.wfs.option.FilerMountRootPath):] } From 4b1ed227d12323ab3f3c67a0b39967c84a053bc4 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 16 Mar 2021 00:33:14 -0700 Subject: [PATCH 117/284] revert fasthttp changes related to https://github.com/chrislusf/seaweedfs/issues/1907 --- weed/command/benchmark.go | 2 +- weed/filer/filechunk_manifest.go | 2 +- weed/filer/read_write.go | 2 +- weed/filer/stream.go | 2 +- .../replication/repl_util/replication_util.go | 2 +- weed/util/fasthttp_util.go | 116 ------------------ weed/util/http_util.go | 2 +- 7 files changed, 6 insertions(+), 122 deletions(-) delete mode 100644 weed/util/fasthttp_util.go diff --git a/weed/command/benchmark.go b/weed/command/benchmark.go index af0793c70..4fedb55f1 100644 --- a/weed/command/benchmark.go +++ b/weed/command/benchmark.go @@ -305,7 +305,7 @@ func readFiles(fileIdLineChan chan string, s *stat) { } var bytes []byte for _, url := range urls { - bytes, _, err = util.FastGet(url) + bytes, _, err = util.Get(url) if err == nil { break } diff --git a/weed/filer/filechunk_manifest.go b/weed/filer/filechunk_manifest.go index 99a62c90c..845bfaec1 100644 --- a/weed/filer/filechunk_manifest.go +++ b/weed/filer/filechunk_manifest.go @@ -102,7 +102,7 @@ func retriedFetchChunkData(urlStrings []string, cipherKey []byte, isGzipped bool for waitTime := time.Second; waitTime < util.RetryWaitTime; waitTime += waitTime / 2 { for _, urlString := range urlStrings { - shouldRetry, err = util.FastReadUrlAsStream(urlString+"?readDeleted=true", cipherKey, isGzipped, isFullChunk, offset, size, func(data []byte) { + shouldRetry, err = util.ReadUrlAsStream(urlString+"?readDeleted=true", cipherKey, isGzipped, isFullChunk, offset, size, func(data []byte) { buffer.Write(data) }) if !shouldRetry { diff --git a/weed/filer/read_write.go b/weed/filer/read_write.go index 7a6da3beb..1f78057ef 100644 --- a/weed/filer/read_write.go +++ b/weed/filer/read_write.go @@ -35,7 +35,7 @@ func ReadContent(filerAddress string, dir, name string) ([]byte, error) { target := fmt.Sprintf("http://%s%s/%s", filerAddress, dir, name) - data, _, err := util.FastGet(target) + data, _, err := util.Get(target) return data, err } diff --git a/weed/filer/stream.go b/weed/filer/stream.go index 573ab65e8..42b4070d8 100644 --- a/weed/filer/stream.go +++ b/weed/filer/stream.go @@ -185,7 +185,7 @@ func (c *ChunkStreamReader) fetchChunkToBuffer(chunkView *ChunkView) error { var buffer bytes.Buffer var shouldRetry bool for _, urlString := range urlStrings { - shouldRetry, err = util.FastReadUrlAsStream(urlString, chunkView.CipherKey, chunkView.IsGzipped, chunkView.IsFullChunk(), chunkView.Offset, int(chunkView.Size), func(data []byte) { + shouldRetry, err = util.ReadUrlAsStream(urlString, chunkView.CipherKey, chunkView.IsGzipped, chunkView.IsFullChunk(), chunkView.Offset, int(chunkView.Size), func(data []byte) { buffer.Write(data) }) if !shouldRetry { diff --git a/weed/replication/repl_util/replication_util.go b/weed/replication/repl_util/replication_util.go index f642bb801..519a9a201 100644 --- a/weed/replication/repl_util/replication_util.go +++ b/weed/replication/repl_util/replication_util.go @@ -20,7 +20,7 @@ func CopyFromChunkViews(chunkViews []*filer.ChunkView, filerSource *source.Filer var shouldRetry bool for _, fileUrl := range fileUrls { - shouldRetry, err = util.FastReadUrlAsStream(fileUrl, nil, false, chunk.IsFullChunk(), chunk.Offset, int(chunk.Size), func(data []byte) { + shouldRetry, err = util.ReadUrlAsStream(fileUrl, nil, false, chunk.IsFullChunk(), chunk.Offset, int(chunk.Size), func(data []byte) { writeErr = writeFunc(data) }) if err != nil { diff --git a/weed/util/fasthttp_util.go b/weed/util/fasthttp_util.go deleted file mode 100644 index 6c31a40da..000000000 --- a/weed/util/fasthttp_util.go +++ /dev/null @@ -1,116 +0,0 @@ -package util - -import ( - "bytes" - "fmt" - "github.com/valyala/fasthttp" - "sync" - "time" -) - -var ( - fastClient = &fasthttp.Client{ - NoDefaultUserAgentHeader: true, // Don't send: User-Agent: fasthttp - MaxConnsPerHost: 1024, - ReadBufferSize: 4096, // Make sure to set this big enough that your whole request can be read at once. - WriteBufferSize: 64 * 1024, // Same but for your response. - ReadTimeout: time.Second, - WriteTimeout: time.Second, - MaxIdleConnDuration: time.Minute, - DisableHeaderNamesNormalizing: true, // If you set the case on your headers correctly you can enable this. - DialDualStack: true, - } - - // Put everything in pools to prevent garbage. - bytesPool = sync.Pool{ - New: func() interface{} { - b := make([]byte, 0) - return &b - }, - } - - responsePool = sync.Pool{ - New: func() interface{} { - return make(chan *fasthttp.Response) - }, - } -) - -func FastGet(url string) ([]byte, bool, error) { - - req := fasthttp.AcquireRequest() - res := fasthttp.AcquireResponse() - defer fasthttp.ReleaseRequest(req) - defer fasthttp.ReleaseResponse(res) - - req.SetRequestURIBytes([]byte(url)) - req.Header.Add("Accept-Encoding", "gzip") - - err := fastClient.Do(req, res) - if err != nil { - return nil, true, err - } - - var data []byte - contentEncoding := res.Header.Peek("Content-Encoding") - if bytes.Compare(contentEncoding, []byte("gzip")) == 0 { - data, err = res.BodyGunzip() - } else { - data = res.Body() - } - - out := make([]byte, len(data)) - copy(out, data) - - if res.StatusCode() >= 400 { - retryable := res.StatusCode() >= 500 - return nil, retryable, fmt.Errorf("%s: %d", url, res.StatusCode()) - } - if err != nil { - return nil, false, err - } - return out, false, nil -} - -func FastReadUrlAsStream(fileUrl string, cipherKey []byte, isContentGzipped bool, isFullChunk bool, offset int64, size int, fn func(data []byte)) (retryable bool, err error) { - - if cipherKey != nil { - return readEncryptedUrl(fileUrl, cipherKey, isContentGzipped, isFullChunk, offset, size, fn) - } - - req := fasthttp.AcquireRequest() - res := fasthttp.AcquireResponse() - defer fasthttp.ReleaseRequest(req) - defer fasthttp.ReleaseResponse(res) - - req.SetRequestURIBytes([]byte(fileUrl)) - - if isFullChunk { - req.Header.Add("Accept-Encoding", "gzip") - } else { - req.Header.Add("Range", fmt.Sprintf("bytes=%d-%d", offset, offset+int64(size)-1)) - } - - if err = fastClient.Do(req, res); err != nil { - return true, err - } - - if res.StatusCode() >= 400 { - retryable = res.StatusCode() >= 500 - return retryable, fmt.Errorf("%s: %d", fileUrl, res.StatusCode()) - } - - contentEncoding := res.Header.Peek("Content-Encoding") - if bytes.Compare(contentEncoding, []byte("gzip")) == 0 { - bodyData, err := res.BodyGunzip() - if err != nil { - return false, err - } - fn(bodyData) - } else { - fn(res.Body()) - } - - return false, nil - -} diff --git a/weed/util/http_util.go b/weed/util/http_util.go index eff282bab..135d10c45 100644 --- a/weed/util/http_util.go +++ b/weed/util/http_util.go @@ -313,7 +313,7 @@ func ReadUrlAsStream(fileUrl string, cipherKey []byte, isContentGzipped bool, is } func readEncryptedUrl(fileUrl string, cipherKey []byte, isContentCompressed bool, isFullChunk bool, offset int64, size int, fn func(data []byte)) (bool, error) { - encryptedData, retryable, err := FastGet(fileUrl) + encryptedData, retryable, err := Get(fileUrl) if err != nil { return retryable, fmt.Errorf("fetch %s: %v", fileUrl, err) } From 91a3ac9731f646ce41b62bb4cd1768e5ce2342e2 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 16 Mar 2021 00:36:06 -0700 Subject: [PATCH 118/284] 2.33 --- 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 fd08a4232..2a74b2f96 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.32" -version: 2.32 +appVersion: "2.33" +version: 2.33 diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index e06d47ec4..d93242b0c 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.32" - started using {.Chart.appVersion} + # imageTag: "2.33" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index fdb37d7f6..8e7cafd6e 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, 32) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 33) COMMIT = "" ) From 06da02739d4a97dd8288f7fa05de7cd369e97d78 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Tue, 16 Mar 2021 14:15:17 +0500 Subject: [PATCH 119/284] CheckAllChunkViews() for HEAD requests only --- weed/command/filer_cat.go | 2 +- weed/filer/filer_on_meta_event.go | 2 +- weed/filer/read_write.go | 2 +- weed/filer/stream.go | 23 ++++++++++++----------- weed/server/filer_server_handlers_read.go | 5 ++++- weed/shell/command_fs_cat.go | 2 +- 6 files changed, 20 insertions(+), 16 deletions(-) diff --git a/weed/command/filer_cat.go b/weed/command/filer_cat.go index a46098b04..c4281feba 100644 --- a/weed/command/filer_cat.go +++ b/weed/command/filer_cat.go @@ -110,7 +110,7 @@ func runFilerCat(cmd *Command, args []string) bool { filerCat.filerClient = client - return filer.StreamContent(&filerCat, writer, respLookupEntry.Entry.Chunks, 0, math.MaxInt64) + return filer.StreamContent(&filerCat, writer, respLookupEntry.Entry.Chunks, 0, math.MaxInt64, false) }) diff --git a/weed/filer/filer_on_meta_event.go b/weed/filer/filer_on_meta_event.go index c9f75a5ca..a91faeb24 100644 --- a/weed/filer/filer_on_meta_event.go +++ b/weed/filer/filer_on_meta_event.go @@ -52,7 +52,7 @@ func (f *Filer) maybeReloadFilerConfiguration(event *filer_pb.SubscribeMetadataR func (f *Filer) readEntry(chunks []*filer_pb.FileChunk) ([]byte, error) { var buf bytes.Buffer - err := StreamContent(f.MasterClient, &buf, chunks, 0, math.MaxInt64) + err := StreamContent(f.MasterClient, &buf, chunks, 0, math.MaxInt64, false) if err != nil { return nil, err } diff --git a/weed/filer/read_write.go b/weed/filer/read_write.go index 7a6da3beb..1a04c6503 100644 --- a/weed/filer/read_write.go +++ b/weed/filer/read_write.go @@ -27,7 +27,7 @@ func ReadEntry(masterClient *wdclient.MasterClient, filerClient filer_pb.Seaweed return err } - return StreamContent(masterClient, byteBuffer, respLookupEntry.Entry.Chunks, 0, math.MaxInt64) + return StreamContent(masterClient, byteBuffer, respLookupEntry.Entry.Chunks, 0, math.MaxInt64, false) } diff --git a/weed/filer/stream.go b/weed/filer/stream.go index 4353b1f07..f53563aa2 100644 --- a/weed/filer/stream.go +++ b/weed/filer/stream.go @@ -14,7 +14,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, w io.Writer, chunks []*filer_pb.FileChunk, offset int64, size int64, isCheck bool) error { glog.V(9).Infof("start to stream content for chunks: %+v\n", chunks) chunkViews := ViewFromChunks(masterClient.GetLookupFileIdFunction(), chunks, offset, size) @@ -34,15 +34,20 @@ func StreamContent(masterClient wdclient.HasLookupFileIdFunction, w io.Writer, c fileId2Url[chunkView.FileId] = urlStrings } - for idx, chunkView := range chunkViews { - - urlStrings := fileId2Url[chunkView.FileId] - + if isCheck { // Pre-check all chunkViews urls gErr := new(errgroup.Group) - if len(chunkViews) > 1 && idx == 0 { - CheckAllChunkViews(chunkViews[1:], &fileId2Url, gErr) + CheckAllChunkViews(chunkViews, &fileId2Url, gErr) + if err := gErr.Wait(); err != nil { + glog.Errorf("check all chunks: %v", err) + return fmt.Errorf("check all chunks: %v", err) } + return nil + } + + for _, chunkView := range chunkViews { + + urlStrings := fileId2Url[chunkView.FileId] data, err := retriedFetchChunkData( urlStrings, chunkView.CipherKey, @@ -56,10 +61,6 @@ func StreamContent(masterClient wdclient.HasLookupFileIdFunction, w io.Writer, c glog.Errorf("read chunk: %v", err) return fmt.Errorf("read chunk: %v", err) } - if err := gErr.Wait(); err != nil { - glog.Errorf("check all chunks: %v", err) - return fmt.Errorf("check all chunks: %v", err) - } _, err = w.Write(data) if err != nil { glog.Errorf("write chunk: %v", err) diff --git a/weed/server/filer_server_handlers_read.go b/weed/server/filer_server_handlers_read.go index 231fbd874..f90b070a2 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -131,6 +131,9 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, if r.Method == "HEAD" { w.Header().Set("Content-Length", strconv.FormatInt(totalSize, 10)) + processRangeRequest(r, w, totalSize, mimeType, func(writer io.Writer, offset int64, size int64) error { + return filer.StreamContent(fs.filer.MasterClient, writer, entry.Chunks, offset, size, true) + }) return } @@ -158,7 +161,7 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, } return err } - return filer.StreamContent(fs.filer.MasterClient, writer, entry.Chunks, offset, size) + return filer.StreamContent(fs.filer.MasterClient, writer, entry.Chunks, offset, size, false) }) } diff --git a/weed/shell/command_fs_cat.go b/weed/shell/command_fs_cat.go index 3c5e13663..df43d93dc 100644 --- a/weed/shell/command_fs_cat.go +++ b/weed/shell/command_fs_cat.go @@ -52,7 +52,7 @@ func (c *commandFsCat) Do(args []string, commandEnv *CommandEnv, writer io.Write return err } - return filer.StreamContent(commandEnv.MasterClient, writer, respLookupEntry.Entry.Chunks, 0, math.MaxInt64) + return filer.StreamContent(commandEnv.MasterClient, writer, respLookupEntry.Entry.Chunks, 0, math.MaxInt64, false) }) From c00dd5e62ed72e42545d6b74dd6073b84c722743 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 16 Mar 2021 02:55:49 -0700 Subject: [PATCH 120/284] report error if entry not found --- weed/filesys/file.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/weed/filesys/file.go b/weed/filesys/file.go index db8062ceb..a44e4d5e2 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -56,6 +56,10 @@ func (file *File) Attr(ctx context.Context, attr *fuse.Attr) (err error) { } } + if entry == nil { + return fuse.ENOENT + } + // attr.Inode = file.fullpath().AsInode() attr.Valid = time.Second attr.Mode = os.FileMode(entry.Attr.Mode) From 69694a17be1ef8817d9afb3a1265e605298e7ab3 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 16 Mar 2021 02:59:26 -0700 Subject: [PATCH 121/284] reverting 7d57664c2d80f2b7d3eb4cecc57a3275bafee44d --- weed/filer/filechunks.go | 4 --- weed/filesys/dir.go | 59 ++++++++++++++++++++++++-------------- weed/filesys/dir_link.go | 10 +++---- weed/filesys/dirty_page.go | 2 +- weed/filesys/file.go | 46 ++++++++++++++--------------- weed/filesys/filehandle.go | 37 +++++++++++++----------- weed/filesys/fscache.go | 2 +- weed/filesys/wfs.go | 2 +- weed/filesys/xattr.go | 13 ++++----- 9 files changed, 93 insertions(+), 82 deletions(-) diff --git a/weed/filer/filechunks.go b/weed/filer/filechunks.go index 542754e3b..68f308a51 100644 --- a/weed/filer/filechunks.go +++ b/weed/filer/filechunks.go @@ -23,10 +23,6 @@ func TotalSize(chunks []*filer_pb.FileChunk) (size uint64) { return } -func FileSize2(entry *Entry) (size uint64) { - return maxUint64(TotalSize(entry.Chunks), entry.Attr.FileSize) -} - func FileSize(entry *filer_pb.Entry) (size uint64) { return maxUint64(TotalSize(entry.Chunks), entry.Attributes.FileSize) } diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index dc208dcbb..33e1a0a3a 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -1,6 +1,7 @@ package filesys import ( + "bytes" "context" "math" "os" @@ -21,7 +22,7 @@ import ( type Dir struct { name string wfs *WFS - entry *filer.Entry + entry *filer_pb.Entry parent *Dir } @@ -58,11 +59,11 @@ func (dir *Dir) Attr(ctx context.Context, attr *fuse.Attr) error { } // attr.Inode = util.FullPath(dir.FullPath()).AsInode() - attr.Mode = dir.entry.Attr.Mode | os.ModeDir - attr.Mtime = dir.entry.Attr.Mtime - attr.Crtime = dir.entry.Attr.Crtime - attr.Gid = dir.entry.Attr.Gid - attr.Uid = dir.entry.Attr.Uid + attr.Mode = os.FileMode(dir.entry.Attributes.FileMode) | os.ModeDir + attr.Mtime = time.Unix(dir.entry.Attributes.Mtime, 0) + attr.Crtime = time.Unix(dir.entry.Attributes.Crtime, 0) + attr.Gid = dir.entry.Attributes.Gid + attr.Uid = dir.entry.Attributes.Uid glog.V(4).Infof("dir Attr %s, attr: %+v", dir.FullPath(), attr) @@ -102,13 +103,12 @@ func (dir *Dir) Fsync(ctx context.Context, req *fuse.FsyncRequest) error { } func (dir *Dir) newFile(name string, entry *filer_pb.Entry) fs.Node { - dirPath := dir.FullPath() - f := dir.wfs.fsNodeCache.EnsureFsNode(util.NewFullPath(dirPath, name), func() fs.Node { + f := dir.wfs.fsNodeCache.EnsureFsNode(util.NewFullPath(dir.FullPath(), name), func() fs.Node { return &File{ Name: name, dir: dir, wfs: dir.wfs, - entry: filer.FromPbEntry(dirPath, entry), + entry: entry, entryViewCache: nil, } }) @@ -119,7 +119,7 @@ func (dir *Dir) newFile(name string, entry *filer_pb.Entry) fs.Node { func (dir *Dir) newDirectory(fullpath util.FullPath, entry *filer_pb.Entry) fs.Node { d := dir.wfs.fsNodeCache.EnsureFsNode(fullpath, func() fs.Node { - return &Dir{name: entry.Name, wfs: dir.wfs, entry: filer.FromPbEntry(dir.FullPath(), entry), parent: dir} + return &Dir{name: entry.Name, wfs: dir.wfs, entry: entry, parent: dir} }) d.(*Dir).parent = dir // in case dir node was created later return d @@ -436,19 +436,19 @@ func (dir *Dir) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fus } if req.Valid.Mode() { - dir.entry.Attr.Mode = req.Mode + dir.entry.Attributes.FileMode = uint32(req.Mode) } if req.Valid.Uid() { - dir.entry.Attr.Uid = req.Uid + dir.entry.Attributes.Uid = req.Uid } if req.Valid.Gid() { - dir.entry.Attr.Gid = req.Gid + dir.entry.Attributes.Gid = req.Gid } if req.Valid.Mtime() { - dir.entry.Attr.Mtime = req.Mtime + dir.entry.Attributes.Mtime = req.Mtime.Unix() } return dir.saveEntry() @@ -527,14 +527,12 @@ func (dir *Dir) saveEntry() error { return dir.wfs.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { - pbEntry := dir.entry.ToProtoEntry() - - dir.wfs.mapPbIdFromLocalToFiler(pbEntry) - defer dir.wfs.mapPbIdFromFilerToLocal(pbEntry) + dir.wfs.mapPbIdFromLocalToFiler(dir.entry) + defer dir.wfs.mapPbIdFromFilerToLocal(dir.entry) request := &filer_pb.UpdateEntryRequest{ Directory: parentDir, - Entry: pbEntry, + Entry: dir.entry, Signatures: []int32{dir.wfs.signature}, } @@ -552,8 +550,25 @@ func (dir *Dir) saveEntry() error { } func (dir *Dir) FullPath() string { - if dir.wfs.option.FilerMountRootPath == "/" { - return string(dir.entry.FullPath) + var parts []string + for p := dir; p != nil; p = p.parent { + if strings.HasPrefix(p.name, "/") { + if len(p.name) > 1 { + parts = append(parts, p.name[1:]) + } + } else { + parts = append(parts, p.name) + } } - return string(dir.entry.FullPath)[len(dir.wfs.option.FilerMountRootPath):] + + if len(parts) == 0 { + return "/" + } + + var buf bytes.Buffer + for i := len(parts) - 1; i >= 0; i-- { + buf.WriteString("/") + buf.WriteString(parts[i]) + } + return buf.String() } diff --git a/weed/filesys/dir_link.go b/weed/filesys/dir_link.go index 010d0141a..606e52fcb 100644 --- a/weed/filesys/dir_link.go +++ b/weed/filesys/dir_link.go @@ -48,7 +48,7 @@ func (dir *Dir) Link(ctx context.Context, req *fuse.LinkRequest, old fs.Node) (f oldEntry.HardLinkCounter++ updateOldEntryRequest := &filer_pb.UpdateEntryRequest{ Directory: oldFile.dir.FullPath(), - Entry: oldEntry.ToProtoEntry(), + Entry: oldEntry, Signatures: []int32{dir.wfs.signature}, } @@ -58,7 +58,7 @@ func (dir *Dir) Link(ctx context.Context, req *fuse.LinkRequest, old fs.Node) (f Entry: &filer_pb.Entry{ Name: req.NewName, IsDirectory: false, - Attributes: filer.EntryAttributeToPb(oldEntry), + Attributes: oldEntry.Attributes, Chunks: oldEntry.Chunks, Extended: oldEntry.Extended, HardLinkId: oldEntry.HardLinkId, @@ -152,12 +152,12 @@ func (file *File) Readlink(ctx context.Context, req *fuse.ReadlinkRequest) (stri return "", err } - if entry.Attr.Mode&os.ModeSymlink == 0 { + if os.FileMode(entry.Attributes.FileMode)&os.ModeSymlink == 0 { return "", fuse.Errno(syscall.EINVAL) } - glog.V(4).Infof("Readlink: %v/%v => %v", file.dir.FullPath(), file.Name, entry.Attr.SymlinkTarget) + glog.V(4).Infof("Readlink: %v/%v => %v", file.dir.FullPath(), file.Name, entry.Attributes.SymlinkTarget) - return entry.Attr.SymlinkTarget, nil + return entry.Attributes.SymlinkTarget, nil } diff --git a/weed/filesys/dirty_page.go b/weed/filesys/dirty_page.go index b190b8473..8888cff96 100644 --- a/weed/filesys/dirty_page.go +++ b/weed/filesys/dirty_page.go @@ -74,7 +74,7 @@ func (pages *ContinuousDirtyPages) saveExistingLargestPageToStorage() (hasSavedD return false } - fileSize := int64(entry.Attr.FileSize) + fileSize := int64(entry.Attributes.FileSize) chunkSize := min(maxList.Size(), fileSize-maxList.Offset()) if chunkSize == 0 { diff --git a/weed/filesys/file.go b/weed/filesys/file.go index a44e4d5e2..b73cd895b 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -33,7 +33,7 @@ type File struct { Name string dir *Dir wfs *WFS - entry *filer.Entry + entry *filer_pb.Entry entryLock sync.RWMutex entryViewCache []filer.VisibleInterval isOpen int @@ -62,16 +62,16 @@ func (file *File) Attr(ctx context.Context, attr *fuse.Attr) (err error) { // attr.Inode = file.fullpath().AsInode() attr.Valid = time.Second - attr.Mode = os.FileMode(entry.Attr.Mode) - attr.Size = filer.FileSize2(entry) + attr.Mode = os.FileMode(entry.Attributes.FileMode) + attr.Size = filer.FileSize(entry) if file.isOpen > 0 { - attr.Size = entry.Attr.FileSize + attr.Size = entry.Attributes.FileSize glog.V(4).Infof("file Attr %s, open:%v, size: %d", file.fullpath(), file.isOpen, attr.Size) } - attr.Crtime = entry.Attr.Crtime - attr.Mtime = entry.Attr.Mtime - attr.Gid = entry.Attr.Gid - attr.Uid = entry.Attr.Uid + attr.Crtime = time.Unix(entry.Attributes.Crtime, 0) + attr.Mtime = time.Unix(entry.Attributes.Mtime, 0) + attr.Gid = entry.Attributes.Gid + attr.Uid = entry.Attributes.Uid attr.Blocks = attr.Size/blockSize + 1 attr.BlockSize = uint32(file.wfs.option.ChunkSizeLimit) if entry.HardLinkCounter > 0 { @@ -130,7 +130,7 @@ func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *f if req.Valid.Size() { glog.V(4).Infof("%v file setattr set size=%v chunks=%d", file.fullpath(), req.Size, len(entry.Chunks)) - if req.Size < filer.FileSize2(entry) { + if req.Size < filer.FileSize(entry) { // fmt.Printf("truncate %v \n", fullPath) var chunks []*filer_pb.FileChunk var truncatedChunks []*filer_pb.FileChunk @@ -153,32 +153,32 @@ func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *f file.entryViewCache, _ = filer.NonOverlappingVisibleIntervals(file.wfs.LookupFn(), chunks) file.reader = nil } - entry.Attr.FileSize = req.Size + entry.Attributes.FileSize = req.Size file.dirtyMetadata = true } if req.Valid.Mode() { - entry.Attr.Mode = req.Mode + entry.Attributes.FileMode = uint32(req.Mode) file.dirtyMetadata = true } if req.Valid.Uid() { - entry.Attr.Uid = req.Uid + entry.Attributes.Uid = req.Uid file.dirtyMetadata = true } if req.Valid.Gid() { - entry.Attr.Gid = req.Gid + entry.Attributes.Gid = req.Gid file.dirtyMetadata = true } if req.Valid.Crtime() { - entry.Attr.Crtime = req.Crtime + entry.Attributes.Crtime = req.Crtime.Unix() file.dirtyMetadata = true } if req.Valid.Mtime() { - entry.Attr.Mtime = req.Mtime + entry.Attributes.Mtime = req.Mtime.Unix() file.dirtyMetadata = true } @@ -263,7 +263,7 @@ func (file *File) Forget() { file.wfs.fsNodeCache.DeleteFsNode(t) } -func (file *File) maybeLoadEntry(ctx context.Context) (entry *filer.Entry, err error) { +func (file *File) maybeLoadEntry(ctx context.Context) (entry *filer_pb.Entry, err error) { entry = file.getEntry() if file.isOpen > 0 { return entry, nil @@ -334,7 +334,7 @@ func (file *File) addChunks(chunks []*filer_pb.FileChunk) { entry.Chunks = append(entry.Chunks, newChunks...) } -func (file *File) setEntry(entry *filer.Entry) { +func (file *File) setEntry(entry *filer_pb.Entry) { file.entryLock.Lock() defer file.entryLock.Unlock() file.entry = entry @@ -350,17 +350,15 @@ func (file *File) clearEntry() { file.reader = nil } -func (file *File) saveEntry(entry *filer.Entry) error { +func (file *File) saveEntry(entry *filer_pb.Entry) error { return file.wfs.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { - pbEntry := entry.ToProtoEntry() - - file.wfs.mapPbIdFromLocalToFiler(pbEntry) - defer file.wfs.mapPbIdFromFilerToLocal(pbEntry) + file.wfs.mapPbIdFromLocalToFiler(entry) + defer file.wfs.mapPbIdFromFilerToLocal(entry) request := &filer_pb.UpdateEntryRequest{ Directory: file.dir.FullPath(), - Entry: pbEntry, + Entry: entry, Signatures: []int32{file.wfs.signature}, } @@ -377,7 +375,7 @@ func (file *File) saveEntry(entry *filer.Entry) error { }) } -func (file *File) getEntry() *filer.Entry { +func (file *File) getEntry() *filer_pb.Entry { file.entryLock.RLock() defer file.entryLock.RUnlock() return file.entry diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index be214c02d..25eaf7033 100644 --- a/weed/filesys/filehandle.go +++ b/weed/filesys/filehandle.go @@ -6,6 +6,7 @@ import ( "io" "math" "net/http" + "os" "sync" "time" @@ -41,7 +42,7 @@ func newFileHandle(file *File, uid, gid uint32) *FileHandle { } entry := fh.f.getEntry() if entry != nil { - entry.Attr.FileSize = filer.FileSize2(entry) + entry.Attributes.FileSize = filer.FileSize(entry) } return fh @@ -109,7 +110,7 @@ func (fh *FileHandle) readFromChunks(buff []byte, offset int64) (int64, error) { return 0, io.EOF } - fileSize := int64(filer.FileSize2(entry)) + fileSize := int64(filer.FileSize(entry)) fileFullPath := fh.f.fullpath() if fileSize == 0 { @@ -170,7 +171,7 @@ func (fh *FileHandle) Write(ctx context.Context, req *fuse.WriteRequest, resp *f } entry.Content = nil - entry.Attr.FileSize = uint64(max(req.Offset+int64(len(data)), int64(entry.Attr.FileSize))) + entry.Attributes.FileSize = uint64(max(req.Offset+int64(len(data)), int64(entry.Attributes.FileSize))) glog.V(4).Infof("%v write [%d,%d) %d", fh.f.fullpath(), req.Offset, req.Offset+int64(len(req.Data)), len(req.Data)) fh.dirtyPages.AddPage(req.Offset, data) @@ -258,24 +259,26 @@ func (fh *FileHandle) doFlush(ctx context.Context, header fuse.Header) error { return nil } - entry.Attr.Mime = fh.contentType - if entry.Attr.Uid == 0 { - entry.Attr.Uid = header.Uid + if entry.Attributes != nil { + entry.Attributes.Mime = fh.contentType + if entry.Attributes.Uid == 0 { + entry.Attributes.Uid = header.Uid + } + if entry.Attributes.Gid == 0 { + entry.Attributes.Gid = header.Gid + } + if entry.Attributes.Crtime == 0 { + entry.Attributes.Crtime = time.Now().Unix() + } + entry.Attributes.Mtime = time.Now().Unix() + entry.Attributes.FileMode = uint32(os.FileMode(entry.Attributes.FileMode) &^ fh.f.wfs.option.Umask) + entry.Attributes.Collection = fh.dirtyPages.collection + entry.Attributes.Replication = fh.dirtyPages.replication } - if entry.Attr.Gid == 0 { - entry.Attr.Gid = header.Gid - } - if entry.Attr.Crtime.IsZero() { - entry.Attr.Crtime = time.Now() - } - entry.Attr.Mtime = time.Now() - entry.Attr.Mode = entry.Attr.Mode &^ fh.f.wfs.option.Umask - entry.Attr.Collection = fh.dirtyPages.collection - entry.Attr.Replication = fh.dirtyPages.replication request := &filer_pb.CreateEntryRequest{ Directory: fh.f.dir.FullPath(), - Entry: entry.ToProtoEntry(), + Entry: entry, Signatures: []int32{fh.f.wfs.signature}, } diff --git a/weed/filesys/fscache.go b/weed/filesys/fscache.go index 0740d607f..6b1012090 100644 --- a/weed/filesys/fscache.go +++ b/weed/filesys/fscache.go @@ -126,7 +126,7 @@ func (c *FsCache) Move(oldPath util.FullPath, newPath util.FullPath) *FsNode { f.Name = target.name entry := f.getEntry() if entry != nil { - entry.FullPath = newPath + entry.Name = f.Name } } parent.disconnectChild(target) diff --git a/weed/filesys/wfs.go b/weed/filesys/wfs.go index 7c3907326..c6d9080a1 100644 --- a/weed/filesys/wfs.go +++ b/weed/filesys/wfs.go @@ -131,7 +131,7 @@ func NewSeaweedFileSystem(option *Option) *WFS { }) entry, _ := filer_pb.GetEntry(wfs, util.FullPath(wfs.option.FilerMountRootPath)) - wfs.root = &Dir{name: wfs.option.FilerMountRootPath, wfs: wfs, entry: filer.FromPbEntry(wfs.option.FilerMountRootPath, entry)} + wfs.root = &Dir{name: wfs.option.FilerMountRootPath, wfs: wfs, entry: entry} wfs.fsNodeCache = newFsCache(wfs.root) if wfs.option.ConcurrentWriters > 0 { diff --git a/weed/filesys/xattr.go b/weed/filesys/xattr.go index a50d87ba7..92e43b675 100644 --- a/weed/filesys/xattr.go +++ b/weed/filesys/xattr.go @@ -2,7 +2,6 @@ package filesys import ( "context" - "github.com/chrislusf/seaweedfs/weed/filer" "github.com/seaweedfs/fuse" @@ -11,7 +10,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" ) -func getxattr(entry *filer.Entry, req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse) error { +func getxattr(entry *filer_pb.Entry, req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse) error { if entry == nil { return fuse.ErrNoXattr @@ -39,7 +38,7 @@ func getxattr(entry *filer.Entry, req *fuse.GetxattrRequest, resp *fuse.Getxattr } -func setxattr(entry *filer.Entry, req *fuse.SetxattrRequest) error { +func setxattr(entry *filer_pb.Entry, req *fuse.SetxattrRequest) error { if entry == nil { return fuse.EIO @@ -62,7 +61,7 @@ func setxattr(entry *filer.Entry, req *fuse.SetxattrRequest) error { } -func removexattr(entry *filer.Entry, req *fuse.RemovexattrRequest) error { +func removexattr(entry *filer_pb.Entry, req *fuse.RemovexattrRequest) error { if entry == nil { return fuse.ErrNoXattr @@ -84,7 +83,7 @@ func removexattr(entry *filer.Entry, req *fuse.RemovexattrRequest) error { } -func listxattr(entry *filer.Entry, req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse) error { +func listxattr(entry *filer_pb.Entry, req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse) error { if entry == nil { return fuse.EIO @@ -109,7 +108,7 @@ func listxattr(entry *filer.Entry, req *fuse.ListxattrRequest, resp *fuse.Listxa } -func (wfs *WFS) maybeLoadEntry(dir, name string) (entry *filer.Entry, err error) { +func (wfs *WFS) maybeLoadEntry(dir, name string) (entry *filer_pb.Entry, err error) { fullpath := util.NewFullPath(dir, name) // glog.V(3).Infof("read entry cache miss %s", fullpath) @@ -120,5 +119,5 @@ func (wfs *WFS) maybeLoadEntry(dir, name string) (entry *filer.Entry, err error) if cacheErr == filer_pb.ErrNotFound { return nil, fuse.ENOENT } - return cachedEntry, cacheErr + return cachedEntry.ToProtoEntry(), cacheErr } From 9672f9e1b2ed399470e6ec877a667417c8b26870 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 16 Mar 2021 03:01:15 -0700 Subject: [PATCH 122/284] 2.34 --- 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 2a74b2f96..024e3d32d 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.33" -version: 2.33 +appVersion: "2.34" +version: 2.34 diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index d93242b0c..2f4448026 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.33" - started using {.Chart.appVersion} + # imageTag: "2.34" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index 8e7cafd6e..a7d8cc0bf 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, 33) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 34) COMMIT = "" ) From c5705e7a35b4097a2026ad9da2fd5ca88a16492d Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Wed, 17 Mar 2021 23:40:42 +0500 Subject: [PATCH 123/284] dir + slash key does not exist https://github.com/chrislusf/seaweedfs/issues/1917 --- weed/s3api/s3api_object_handlers.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index 2b6b80f90..56f50ddce 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -310,8 +310,7 @@ func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, des return } defer util.CloseResponse(resp) - - if (resp.ContentLength == -1 || resp.StatusCode == 404) && !strings.HasSuffix(destUrl, "/") { + if resp.ContentLength == -1 || resp.StatusCode == 404 { if r.Method != "DELETE" { writeErrorResponse(w, s3err.ErrNoSuchKey, r.URL) return From bf94149920456cd0754c54b01a23015893406888 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Wed, 17 Mar 2021 23:41:34 +0500 Subject: [PATCH 124/284] add line --- weed/s3api/s3api_object_handlers.go | 1 + 1 file changed, 1 insertion(+) diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index 56f50ddce..b3cfd9ec7 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -310,6 +310,7 @@ func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, des return } defer util.CloseResponse(resp) + if resp.ContentLength == -1 || resp.StatusCode == 404 { if r.Method != "DELETE" { writeErrorResponse(w, s3err.ErrNoSuchKey, r.URL) From b1a86cf8085d5f0aff27f7ff6e3b8a7d666f766b Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 19 Mar 2021 01:31:49 -0700 Subject: [PATCH 125/284] s3: copy object to itself fix https://github.com/chrislusf/seaweedfs/issues/1922 --- docker/compose/local-s3tests-compose.yml | 2 +- weed/pb/filer_pb/filer_client.go | 20 ++++++++++++++ weed/s3api/filer_util.go | 6 +++++ weed/s3api/s3api_object_copy_handlers.go | 27 ++++++++++++++++++- .../filer_server_handlers_write_autochunk.go | 20 ++++++++++---- 5 files changed, 68 insertions(+), 7 deletions(-) diff --git a/docker/compose/local-s3tests-compose.yml b/docker/compose/local-s3tests-compose.yml index 915778d32..381e3eb97 100644 --- a/docker/compose/local-s3tests-compose.yml +++ b/docker/compose/local-s3tests-compose.yml @@ -38,7 +38,7 @@ services: S3TEST_CONF: "s3tests.conf" NOSETESTS_OPTIONS: "--verbose --logging-level=ERROR --with-xunit --failure-detail s3tests_boto3.functional.test_s3" NOSETESTS_ATTR: "!tagging,!fails_on_aws,!encryption,!bucket-policy,!versioning,!fails_on_rgw,!bucket-policy,!fails_with_subdomain,!policy_status,!object-lock,!lifecycle,!cors,!user-policy" - NOSETESTS_EXCLUDE: "(bucket_list_delimiter_basic|bucket_listv2_delimiter_basic|bucket_listv2_encoding_basic|bucket_list_encoding_basic|bucket_list_delimiter_prefix|bucket_listv2_delimiter_prefix_ends_with_delimiter|bucket_list_delimiter_prefix_ends_with_delimiter|bucket_list_delimiter_alt|bucket_listv2_delimiter_alt|bucket_list_delimiter_prefix_underscore|bucket_list_delimiter_percentage|bucket_listv2_delimiter_percentage|bucket_list_delimiter_whitespace|bucket_listv2_delimiter_whitespace|bucket_list_delimiter_dot|bucket_listv2_delimiter_dot|bucket_list_delimiter_unreadable|bucket_listv2_delimiter_unreadable|bucket_listv2_fetchowner_defaultempty|bucket_listv2_fetchowner_empty|bucket_list_prefix_delimiter_alt|bucket_listv2_prefix_delimiter_alt|bucket_list_prefix_delimiter_prefix_not_exist|bucket_listv2_prefix_delimiter_prefix_not_exist|bucket_list_prefix_delimiter_delimiter_not_exist|bucket_listv2_prefix_delimiter_delimiter_not_exist|bucket_list_prefix_delimiter_prefix_delimiter_not_exist|bucket_listv2_prefix_delimiter_prefix_delimiter_not_exist|bucket_list_maxkeys_none|bucket_listv2_maxkeys_none|bucket_list_maxkeys_invalid|bucket_listv2_continuationtoken_empty|bucket_list_return_data|bucket_list_objects_anonymous|bucket_listv2_objects_anonymous|bucket_notexist|bucketv2_notexist|bucket_delete_nonempty|bucket_concurrent_set_canned_acl|object_write_to_nonexist_bucket|object_requestid_matches_header_on_error|object_write_cache_control|object_write_expires|object_set_get_metadata_none_to_good|object_set_get_metadata_none_to_empty|object_set_get_metadata_overwrite_to_empty|post_object_anonymous_request|post_object_authenticated_request|post_object_authenticated_no_content_type|post_object_authenticated_request_bad_access_key|post_object_set_success_code|post_object_set_invalid_success_code|post_object_upload_larger_than_chunk|post_object_set_key_from_filename|post_object_ignored_header|post_object_case_insensitive_condition_fields|post_object_escaped_field_values|post_object_success_redirect_action|post_object_invalid_signature|post_object_invalid_access_key|post_object_missing_policy_condition|post_object_user_specified_header|post_object_request_missing_policy_specified_field|post_object_expired_policy|post_object_invalid_request_field_value|get_object_ifmatch_failed|get_object_ifunmodifiedsince_good|put_object_ifmatch_failed|object_raw_get_bucket_gone|object_delete_key_bucket_gone|object_raw_get_bucket_acl|object_raw_get_object_acl|object_raw_response_headers|object_raw_authenticated_bucket_gone|object_raw_get_x_amz_expires_out_max_range|object_raw_get_x_amz_expires_out_positive_range|object_anon_put_write_access|object_raw_put_authenticated_expired|bucket_create_exists|bucket_create_naming_bad_short_one|bucket_create_naming_bad_short_two|bucket_get_location|bucket_acl_default|bucket_acl_canned|bucket_acl_canned_publicreadwrite|bucket_acl_canned_authenticatedread|object_acl_default|object_acl_canned_during_create|object_acl_canned|object_acl_canned_publicreadwrite|object_acl_canned_authenticatedread|object_acl_canned_bucketownerread|object_acl_canned_bucketownerfullcontrol|object_acl_full_control_verify_attributes|bucket_acl_canned_private_to_private|bucket_acl_grant_nonexist_user|bucket_acl_no_grants|bucket_acl_grant_email_not_exist|bucket_acl_revoke_all|bucket_recreate_not_overriding|object_copy_verify_contenttype|object_copy_to_itself|object_copy_to_itself_with_metadata|object_copy_not_owned_bucket|object_copy_not_owned_object_bucket|object_copy_retaining_metadata|object_copy_replacing_metadata|multipart_upload_empty|multipart_copy_invalid_range|multipart_copy_special_names|multipart_upload_resend_part|multipart_upload_size_too_small|abort_multipart_upload_not_found|multipart_upload_missing_part|multipart_upload_incorrect_etag|100_continue|ranged_request_invalid_range|ranged_request_empty_object|access_bucket)" + NOSETESTS_EXCLUDE: "(bucket_list_delimiter_basic|bucket_listv2_delimiter_basic|bucket_listv2_encoding_basic|bucket_list_encoding_basic|bucket_list_delimiter_prefix|bucket_listv2_delimiter_prefix_ends_with_delimiter|bucket_list_delimiter_prefix_ends_with_delimiter|bucket_list_delimiter_alt|bucket_listv2_delimiter_alt|bucket_list_delimiter_prefix_underscore|bucket_list_delimiter_percentage|bucket_listv2_delimiter_percentage|bucket_list_delimiter_whitespace|bucket_listv2_delimiter_whitespace|bucket_list_delimiter_dot|bucket_listv2_delimiter_dot|bucket_list_delimiter_unreadable|bucket_listv2_delimiter_unreadable|bucket_listv2_fetchowner_defaultempty|bucket_listv2_fetchowner_empty|bucket_list_prefix_delimiter_alt|bucket_listv2_prefix_delimiter_alt|bucket_list_prefix_delimiter_prefix_not_exist|bucket_listv2_prefix_delimiter_prefix_not_exist|bucket_list_prefix_delimiter_delimiter_not_exist|bucket_listv2_prefix_delimiter_delimiter_not_exist|bucket_list_prefix_delimiter_prefix_delimiter_not_exist|bucket_listv2_prefix_delimiter_prefix_delimiter_not_exist|bucket_list_maxkeys_none|bucket_listv2_maxkeys_none|bucket_list_maxkeys_invalid|bucket_listv2_continuationtoken_empty|bucket_list_return_data|bucket_list_objects_anonymous|bucket_listv2_objects_anonymous|bucket_notexist|bucketv2_notexist|bucket_delete_nonempty|bucket_concurrent_set_canned_acl|object_write_to_nonexist_bucket|object_requestid_matches_header_on_error|object_write_cache_control|object_write_expires|object_set_get_metadata_none_to_good|object_set_get_metadata_none_to_empty|object_set_get_metadata_overwrite_to_empty|post_object_anonymous_request|post_object_authenticated_request|post_object_authenticated_no_content_type|post_object_authenticated_request_bad_access_key|post_object_set_success_code|post_object_set_invalid_success_code|post_object_upload_larger_than_chunk|post_object_set_key_from_filename|post_object_ignored_header|post_object_case_insensitive_condition_fields|post_object_escaped_field_values|post_object_success_redirect_action|post_object_invalid_signature|post_object_invalid_access_key|post_object_missing_policy_condition|post_object_user_specified_header|post_object_request_missing_policy_specified_field|post_object_expired_policy|post_object_invalid_request_field_value|get_object_ifmatch_failed|get_object_ifunmodifiedsince_good|put_object_ifmatch_failed|object_raw_get_bucket_gone|object_delete_key_bucket_gone|object_raw_get_bucket_acl|object_raw_get_object_acl|object_raw_response_headers|object_raw_authenticated_bucket_gone|object_raw_get_x_amz_expires_out_max_range|object_raw_get_x_amz_expires_out_positive_range|object_anon_put_write_access|object_raw_put_authenticated_expired|bucket_create_exists|bucket_create_naming_bad_short_one|bucket_create_naming_bad_short_two|bucket_get_location|bucket_acl_default|bucket_acl_canned|bucket_acl_canned_publicreadwrite|bucket_acl_canned_authenticatedread|object_acl_default|object_acl_canned_during_create|object_acl_canned|object_acl_canned_publicreadwrite|object_acl_canned_authenticatedread|object_acl_canned_bucketownerread|object_acl_canned_bucketownerfullcontrol|object_acl_full_control_verify_attributes|bucket_acl_canned_private_to_private|bucket_acl_grant_nonexist_user|bucket_acl_no_grants|bucket_acl_grant_email_not_exist|bucket_acl_revoke_all|bucket_recreate_not_overriding|object_copy_verify_contenttype|object_copy_to_itself_with_metadata|object_copy_not_owned_bucket|object_copy_not_owned_object_bucket|object_copy_retaining_metadata|object_copy_replacing_metadata|multipart_upload_empty|multipart_copy_invalid_range|multipart_copy_special_names|multipart_upload_resend_part|multipart_upload_size_too_small|abort_multipart_upload_not_found|multipart_upload_missing_part|multipart_upload_incorrect_etag|100_continue|ranged_request_invalid_range|ranged_request_empty_object|access_bucket)" depends_on: - master - volume diff --git a/weed/pb/filer_pb/filer_client.go b/weed/pb/filer_pb/filer_client.go index 8cf42026d..65bd85c84 100644 --- a/weed/pb/filer_pb/filer_client.go +++ b/weed/pb/filer_pb/filer_client.go @@ -182,6 +182,26 @@ func Exists(filerClient FilerClient, parentDirectoryPath string, entryName strin return } +func Touch(filerClient FilerClient, parentDirectoryPath string, entryName string, entry *Entry) (err error) { + + return filerClient.WithFilerClient(func(client SeaweedFilerClient) error { + + request := &UpdateEntryRequest{ + Directory: parentDirectoryPath, + Entry: entry, + } + + glog.V(4).Infof("touch entry %v/%v: %v", parentDirectoryPath, entryName, request) + if err := UpdateEntry(client, request); err != nil { + glog.V(0).Infof("touch exists entry %v: %v", request, err) + return fmt.Errorf("touch exists entry %s/%s: %v", parentDirectoryPath, entryName, err) + } + + return nil + }) + +} + func Mkdir(filerClient FilerClient, parentDirectoryPath string, dirName string, fn func(entry *Entry)) error { return filerClient.WithFilerClient(func(client SeaweedFilerClient) error { diff --git a/weed/s3api/filer_util.go b/weed/s3api/filer_util.go index 12a74126a..1803332a3 100644 --- a/weed/s3api/filer_util.go +++ b/weed/s3api/filer_util.go @@ -79,6 +79,12 @@ func (s3a *S3ApiServer) exists(parentDirectoryPath string, entryName string, isD } +func (s3a *S3ApiServer) touch(parentDirectoryPath string, entryName string, entry *filer_pb.Entry) (err error) { + + return filer_pb.Touch(s3a, parentDirectoryPath, entryName, entry) + +} + func (s3a *S3ApiServer) getEntry(parentDirectoryPath, entryName string) (entry *filer_pb.Entry, err error) { fullPath := util.NewFullPath(parentDirectoryPath, entryName) return filer_pb.GetEntry(s3a, fullPath) diff --git a/weed/s3api/s3api_object_copy_handlers.go b/weed/s3api/s3api_object_copy_handlers.go index ca578e7e5..84a85fd78 100644 --- a/weed/s3api/s3api_object_copy_handlers.go +++ b/weed/s3api/s3api_object_copy_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" @@ -25,6 +26,26 @@ func (s3a *S3ApiServer) CopyObjectHandler(w http.ResponseWriter, r *http.Request } srcBucket, srcObject := pathToBucketAndObject(cpSrcPath) + + if (srcBucket == dstBucket && srcObject == dstObject || cpSrcPath == "") && isReplace(r) { + fullPath := util.FullPath(fmt.Sprintf("%s/%s%s", s3a.option.BucketsPath, dstBucket, dstObject)) + dir, name := fullPath.DirAndName() + entry, err := s3a.getEntry(dir, name) + if err != nil { + writeErrorResponse(w, s3err.ErrInvalidCopySource, r.URL) + } + 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) + } + writeSuccessResponseXML(w, encodeResponse(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.URL) @@ -32,7 +53,7 @@ func (s3a *S3ApiServer) CopyObjectHandler(w http.ResponseWriter, r *http.Request } if srcBucket == dstBucket && srcObject == dstObject { - writeErrorResponse(w, s3err.ErrInvalidCopySource, r.URL) + writeErrorResponse(w, s3err.ErrInvalidCopyDest, r.URL) return } @@ -147,3 +168,7 @@ func (s3a *S3ApiServer) CopyObjectPartHandler(w http.ResponseWriter, r *http.Req writeSuccessResponseXML(w, encodeResponse(response)) } + +func isReplace(r *http.Request) bool { + return r.Header.Get("X-Amz-Metadata-Directive") == "REPLACE" +} diff --git a/weed/server/filer_server_handlers_write_autochunk.go b/weed/server/filer_server_handlers_write_autochunk.go index 318399281..b990f6488 100644 --- a/weed/server/filer_server_handlers_write_autochunk.go +++ b/weed/server/filer_server_handlers_write_autochunk.go @@ -212,7 +212,7 @@ func (fs *FilerServer) saveMetaData(ctx context.Context, r *http.Request, fileNa entry.Extended = make(map[string][]byte) } - fs.saveAmzMetaData(r, entry) + SaveAmzMetaData(r, entry.Extended, false) for k, v := range r.Header { if len(v) > 0 && strings.HasPrefix(k, needle.PairNamePrefix) { @@ -383,17 +383,24 @@ func (fs *FilerServer) mkdir(ctx context.Context, w http.ResponseWriter, r *http return filerResult, replyerr } -func (fs *FilerServer) saveAmzMetaData(r *http.Request, entry *filer.Entry) { +func SaveAmzMetaData(r *http.Request, existing map[string][]byte, isReplace bool) (metadata map[string][]byte) { + + metadata = make(map[string][]byte) + if !isReplace { + for k, v := range existing { + metadata[k] = v + } + } if sc := r.Header.Get(xhttp.AmzStorageClass); sc != "" { - entry.Extended[xhttp.AmzStorageClass] = []byte(sc) + metadata[xhttp.AmzStorageClass] = []byte(sc) } if tags := r.Header.Get(xhttp.AmzObjectTagging); tags != "" { for _, v := range strings.Split(tags, "&") { tag := strings.Split(v, "=") if len(tag) == 2 { - entry.Extended[xhttp.AmzObjectTagging+"-"+tag[0]] = []byte(tag[1]) + metadata[xhttp.AmzObjectTagging+"-"+tag[0]] = []byte(tag[1]) } } } @@ -401,8 +408,11 @@ func (fs *FilerServer) saveAmzMetaData(r *http.Request, entry *filer.Entry) { for header, values := range r.Header { if strings.HasPrefix(header, xhttp.AmzUserMetaPrefix) { for _, value := range values { - entry.Extended[header] = []byte(value) + metadata[header] = []byte(value) } } } + + return + } From e9b1853d63f5a6a5fda7f4c64d44a5a9ed8ba0da Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 19 Mar 2021 01:31:56 -0700 Subject: [PATCH 126/284] go fmt --- weed/shell/command_volume_balance_test.go | 2 +- weed/shell/command_volume_list_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/weed/shell/command_volume_balance_test.go b/weed/shell/command_volume_balance_test.go index a2c0b4bc7..b77811f51 100644 --- a/weed/shell/command_volume_balance_test.go +++ b/weed/shell/command_volume_balance_test.go @@ -180,4 +180,4 @@ func TestBalance(t *testing.T) { t.Errorf("balance: %v", err) } -} \ No newline at end of file +} diff --git a/weed/shell/command_volume_list_test.go b/weed/shell/command_volume_list_test.go index b09622fc2..72c76f242 100644 --- a/weed/shell/command_volume_list_test.go +++ b/weed/shell/command_volume_list_test.go @@ -67,7 +67,7 @@ func parseOutput(output string) *master_pb.TopologyInfo { maxVolumeCountStr := parts[1][strings.Index(parts[1], "/")+1:] maxVolumeCount, _ := strconv.Atoi(maxVolumeCountStr) disk = &master_pb.DiskInfo{ - Type: diskType, + Type: diskType, MaxVolumeCount: uint64(maxVolumeCount), } dn.DiskInfos[types.ToDiskType(diskType).String()] = disk From 0a51df02cb27fb51efc7245fae1d9aad25ffcc1e Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 19 Mar 2021 12:58:24 -0700 Subject: [PATCH 127/284] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 737338d7a..408a621dd 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ Your support will be really appreciated by me and other supporters! - [SeaweedFS on Twitter](https://twitter.com/SeaweedFS) - [SeaweedFS Mailing List](https://groups.google.com/d/forum/seaweedfs) - [Wiki Documentation](https://github.com/chrislusf/seaweedfs/wiki) +- [SeaweedFS White Paper](https://github.com/chrislusf/seaweedfs/wiki/SeaweedFS_Architecture.pdf) - [SeaweedFS Introduction Slides](https://www.slideshare.net/chrislusf/seaweedfs-introduction) Table of Contents From b2c1c209a548da5b64cee9ea4639b68ed0a4fc8c Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 20 Mar 2021 06:33:45 -0700 Subject: [PATCH 128/284] refactor --- weed/shell/shell_liner.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/weed/shell/shell_liner.go b/weed/shell/shell_liner.go index 00adb1abc..d79f67032 100644 --- a/weed/shell/shell_liner.go +++ b/weed/shell/shell_liner.go @@ -19,6 +19,10 @@ var ( func RunShell(options ShellOptions) { + sort.Slice(Commands, func(i, j int) bool { + return strings.Compare(Commands[i].Name(), Commands[j].Name()) < 0 + }) + line = liner.NewLiner() defer line.Close() @@ -96,9 +100,6 @@ func printGenericHelp() { ` fmt.Print(msg) - sort.Slice(Commands, func(i, j int) bool { - return strings.Compare(Commands[i].Name(), Commands[j].Name()) < 0 - }) for _, c := range Commands { helpTexts := strings.SplitN(c.Help(), "\n", 2) fmt.Printf(" %-30s\t# %s \n", c.Name(), helpTexts[0]) @@ -114,10 +115,6 @@ func printHelp(cmds []string) { } else { cmd := strings.ToLower(args[0]) - sort.Slice(Commands, func(i, j int) bool { - return strings.Compare(Commands[i].Name(), Commands[j].Name()) < 0 - }) - for _, c := range Commands { if c.Name() == cmd { fmt.Printf(" %s\t# %s\n", c.Name(), c.Help()) From 41cc6e661b8208761a6512db6b8db57d906f0ed7 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 20 Mar 2021 06:34:09 -0700 Subject: [PATCH 129/284] fs.mv ensures there are 2 arguments --- weed/shell/command_fs_mv.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/weed/shell/command_fs_mv.go b/weed/shell/command_fs_mv.go index 0a7eed02d..6b96072df 100644 --- a/weed/shell/command_fs_mv.go +++ b/weed/shell/command_fs_mv.go @@ -36,6 +36,10 @@ func (c *commandFsMv) Help() string { func (c *commandFsMv) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { + if len(args) != 2 { + return fmt.Errorf("need to have 2 arguments.") + } + sourcePath, err := commandEnv.parseUrl(args[0]) if err != nil { return err From 27e24162f27df87df754d7368298ce9453d8865f Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 20 Mar 2021 06:37:03 -0700 Subject: [PATCH 130/284] minor --- weed/shell/command_fs_mv.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/shell/command_fs_mv.go b/weed/shell/command_fs_mv.go index 6b96072df..2448c8f61 100644 --- a/weed/shell/command_fs_mv.go +++ b/weed/shell/command_fs_mv.go @@ -37,7 +37,7 @@ func (c *commandFsMv) Help() string { func (c *commandFsMv) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { if len(args) != 2 { - return fmt.Errorf("need to have 2 arguments.") + return fmt.Errorf("need to have 2 arguments") } sourcePath, err := commandEnv.parseUrl(args[0]) From f6e2566ee5cce592a0fdcecaa6e217e829f8b3c0 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 20 Mar 2021 12:02:57 -0700 Subject: [PATCH 131/284] better logs for cookie mismatch --- weed/storage/volume_read_write.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/weed/storage/volume_read_write.go b/weed/storage/volume_read_write.go index 1853e458a..5251e09c0 100644 --- a/weed/storage/volume_read_write.go +++ b/weed/storage/volume_read_write.go @@ -146,7 +146,8 @@ func (v *Volume) doWriteRequest(n *needle.Needle) (offset uint64, size Size, isU return } if existingNeedle.Cookie != n.Cookie { - glog.V(0).Infof("write cookie mismatch: existing %x, new %x", 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) return } From 102a951377c595062f03cf3a15b765ae733cc0bd Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 21 Mar 2021 13:05:53 -0700 Subject: [PATCH 132/284] refactor, split into 2 files --- weed/storage/volume_read.go | 123 ++++++++++++++++++ .../{volume_read_write.go => volume_write.go} | 112 ---------------- 2 files changed, 123 insertions(+), 112 deletions(-) create mode 100644 weed/storage/volume_read.go rename weed/storage/{volume_read_write.go => volume_write.go} (71%) diff --git a/weed/storage/volume_read.go b/weed/storage/volume_read.go new file mode 100644 index 000000000..31dd3c784 --- /dev/null +++ b/weed/storage/volume_read.go @@ -0,0 +1,123 @@ +package storage + +import ( + "fmt" + "io" + "time" + + "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/storage/backend" + "github.com/chrislusf/seaweedfs/weed/storage/needle" + "github.com/chrislusf/seaweedfs/weed/storage/super_block" + . "github.com/chrislusf/seaweedfs/weed/storage/types" +) + +// read fills in Needle content by looking up n.Id from NeedleMapper +func (v *Volume) readNeedle(n *needle.Needle, readOption *ReadOption) (int, error) { + v.dataFileAccessLock.RLock() + defer v.dataFileAccessLock.RUnlock() + + nv, ok := v.nm.Get(n.Id) + if !ok || nv.Offset.IsZero() { + return -1, ErrorNotFound + } + readSize := nv.Size + if readSize.IsDeleted() { + if readOption != nil && readOption.ReadDeleted && readSize != TombstoneFileSize { + glog.V(3).Infof("reading deleted %s", n.String()) + readSize = -readSize + } else { + return -1, ErrorDeleted + } + } + if readSize == 0 { + return 0, nil + } + 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()) + } + v.checkReadWriteError(err) + if err != nil { + return 0, err + } + bytesRead := len(n.Data) + if !n.HasTtl() { + return bytesRead, nil + } + ttlMinutes := n.Ttl.Minutes() + if ttlMinutes == 0 { + return bytesRead, nil + } + if !n.HasLastModifiedDate() { + return bytesRead, nil + } + if time.Now().Before(time.Unix(0, int64(n.AppendAtNs)).Add(time.Duration(ttlMinutes) * time.Minute)) { + return bytesRead, nil + } + return -1, ErrorNotFound +} + +type VolumeFileScanner interface { + VisitSuperBlock(super_block.SuperBlock) error + ReadNeedleBody() bool + VisitNeedle(n *needle.Needle, offset int64, needleHeader, needleBody []byte) error +} + +func ScanVolumeFile(dirname string, collection string, id needle.VolumeId, + needleMapKind NeedleMapKind, + volumeFileScanner VolumeFileScanner) (err error) { + var v *Volume + if v, err = loadVolumeWithoutIndex(dirname, collection, id, needleMapKind); err != nil { + return fmt.Errorf("failed to load volume %d: %v", id, err) + } + if err = volumeFileScanner.VisitSuperBlock(v.SuperBlock); err != nil { + return fmt.Errorf("failed to process volume %d super block: %v", id, err) + } + defer v.Close() + + version := v.Version() + + offset := int64(v.SuperBlock.BlockSize()) + + return ScanVolumeFileFrom(version, v.DataBackend, offset, volumeFileScanner) +} + +func ScanVolumeFileFrom(version needle.Version, datBackend backend.BackendStorageFile, offset int64, volumeFileScanner VolumeFileScanner) (err error) { + n, nh, rest, e := needle.ReadNeedleHeader(datBackend, version, offset) + if e != nil { + if e == io.EOF { + return nil + } + return fmt.Errorf("cannot read %s at offset %d: %v", datBackend.Name(), offset, e) + } + for n != nil { + var needleBody []byte + if volumeFileScanner.ReadNeedleBody() { + // println("needle", n.Id.String(), "offset", offset, "size", n.Size, "rest", rest) + if needleBody, err = n.ReadNeedleBody(datBackend, version, offset+NeedleHeaderSize, rest); err != nil { + glog.V(0).Infof("cannot read needle head [%d, %d) body [%d, %d) body length %d: %v", offset, offset+NeedleHeaderSize, offset+NeedleHeaderSize, offset+NeedleHeaderSize+rest, rest, err) + // err = fmt.Errorf("cannot read needle body: %v", err) + // return + } + } + err := volumeFileScanner.VisitNeedle(n, offset, nh, needleBody) + if err == io.EOF { + return nil + } + if err != nil { + glog.V(0).Infof("visit needle error: %v", err) + return fmt.Errorf("visit needle error: %v", err) + } + offset += NeedleHeaderSize + rest + glog.V(4).Infof("==> new entry offset %d", offset) + if n, nh, rest, err = needle.ReadNeedleHeader(datBackend, version, offset); err != nil { + if err == io.EOF { + return nil + } + return fmt.Errorf("cannot read needle header at offset %d: %v", offset, err) + } + glog.V(4).Infof("new entry needle size:%d rest:%d", n.Size, rest) + } + return nil +} diff --git a/weed/storage/volume_read_write.go b/weed/storage/volume_write.go similarity index 71% rename from weed/storage/volume_read_write.go rename to weed/storage/volume_write.go index 5251e09c0..c3cb813fb 100644 --- a/weed/storage/volume_read_write.go +++ b/weed/storage/volume_write.go @@ -4,14 +4,12 @@ import ( "bytes" "errors" "fmt" - "io" "os" "time" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/storage/backend" "github.com/chrislusf/seaweedfs/weed/storage/needle" - "github.com/chrislusf/seaweedfs/weed/storage/super_block" . "github.com/chrislusf/seaweedfs/weed/storage/types" ) @@ -227,52 +225,6 @@ func (v *Volume) doDeleteRequest(n *needle.Needle) (Size, error) { return 0, nil } -// read fills in Needle content by looking up n.Id from NeedleMapper -func (v *Volume) readNeedle(n *needle.Needle, readOption *ReadOption) (int, error) { - v.dataFileAccessLock.RLock() - defer v.dataFileAccessLock.RUnlock() - - nv, ok := v.nm.Get(n.Id) - if !ok || nv.Offset.IsZero() { - return -1, ErrorNotFound - } - readSize := nv.Size - if readSize.IsDeleted() { - if readOption != nil && readOption.ReadDeleted && readSize != TombstoneFileSize { - glog.V(3).Infof("reading deleted %s", n.String()) - readSize = -readSize - } else { - return -1, ErrorDeleted - } - } - if readSize == 0 { - return 0, nil - } - 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()) - } - v.checkReadWriteError(err) - if err != nil { - return 0, err - } - bytesRead := len(n.Data) - if !n.HasTtl() { - return bytesRead, nil - } - ttlMinutes := n.Ttl.Minutes() - if ttlMinutes == 0 { - return bytesRead, nil - } - if !n.HasLastModifiedDate() { - return bytesRead, nil - } - if time.Now().Before(time.Unix(0, int64(n.AppendAtNs)).Add(time.Duration(ttlMinutes) * time.Minute)) { - return bytesRead, nil - } - return -1, ErrorNotFound -} - func (v *Volume) startWorker() { go func() { chanClosed := false @@ -347,67 +299,3 @@ func (v *Volume) startWorker() { } }() } - -type VolumeFileScanner interface { - VisitSuperBlock(super_block.SuperBlock) error - ReadNeedleBody() bool - VisitNeedle(n *needle.Needle, offset int64, needleHeader, needleBody []byte) error -} - -func ScanVolumeFile(dirname string, collection string, id needle.VolumeId, - needleMapKind NeedleMapKind, - volumeFileScanner VolumeFileScanner) (err error) { - var v *Volume - if v, err = loadVolumeWithoutIndex(dirname, collection, id, needleMapKind); err != nil { - return fmt.Errorf("failed to load volume %d: %v", id, err) - } - if err = volumeFileScanner.VisitSuperBlock(v.SuperBlock); err != nil { - return fmt.Errorf("failed to process volume %d super block: %v", id, err) - } - defer v.Close() - - version := v.Version() - - offset := int64(v.SuperBlock.BlockSize()) - - return ScanVolumeFileFrom(version, v.DataBackend, offset, volumeFileScanner) -} - -func ScanVolumeFileFrom(version needle.Version, datBackend backend.BackendStorageFile, offset int64, volumeFileScanner VolumeFileScanner) (err error) { - n, nh, rest, e := needle.ReadNeedleHeader(datBackend, version, offset) - if e != nil { - if e == io.EOF { - return nil - } - return fmt.Errorf("cannot read %s at offset %d: %v", datBackend.Name(), offset, e) - } - for n != nil { - var needleBody []byte - if volumeFileScanner.ReadNeedleBody() { - // println("needle", n.Id.String(), "offset", offset, "size", n.Size, "rest", rest) - if needleBody, err = n.ReadNeedleBody(datBackend, version, offset+NeedleHeaderSize, rest); err != nil { - glog.V(0).Infof("cannot read needle head [%d, %d) body [%d, %d) body length %d: %v", offset, offset+NeedleHeaderSize, offset+NeedleHeaderSize, offset+NeedleHeaderSize+rest, rest, err) - // err = fmt.Errorf("cannot read needle body: %v", err) - // return - } - } - err := volumeFileScanner.VisitNeedle(n, offset, nh, needleBody) - if err == io.EOF { - return nil - } - if err != nil { - glog.V(0).Infof("visit needle error: %v", err) - return fmt.Errorf("visit needle error: %v", err) - } - offset += NeedleHeaderSize + rest - glog.V(4).Infof("==> new entry offset %d", offset) - if n, nh, rest, err = needle.ReadNeedleHeader(datBackend, version, offset); err != nil { - if err == io.EOF { - return nil - } - return fmt.Errorf("cannot read needle header at offset %d: %v", offset, err) - } - glog.V(4).Infof("new entry needle size:%d rest:%d", n.Size, rest) - } - return nil -} From df461402cccd28fc863d78aba3304893ef82f328 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 21 Mar 2021 22:27:30 -0700 Subject: [PATCH 133/284] ensure entry attribute is not nill fix https://github.com/chrislusf/seaweedfs/issues/1926 --- weed/filesys/file.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/weed/filesys/file.go b/weed/filesys/file.go index b73cd895b..da93e0fae 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -280,6 +280,9 @@ func (file *File) maybeLoadEntry(ctx context.Context) (entry *filer_pb.Entry, er return entry, err } if entry != nil { + if entry.Attributes == nil { + entry.Attributes = &filer_pb.FuseAttributes{} + } file.setEntry(entry) } else { glog.Warningf("maybeLoadEntry not found entry %s/%s: %v", file.dir.FullPath(), file.Name, err) From b465095db10bf0f7b9214e75fe1e81ec3fc35ce3 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 22 Mar 2021 00:03:16 -0700 Subject: [PATCH 134/284] shell: add volume.check.disk to fix inconsistency for replicated volumes fix https://github.com/chrislusf/seaweedfs/issues/1923 --- weed/pb/filer_pb/filer.pb.go | 2 +- weed/pb/iam_pb/iam.pb.go | 2 +- weed/pb/master_pb/master.pb.go | 2 +- weed/pb/messaging_pb/messaging.pb.go | 2 +- weed/pb/volume_server.proto | 24 + weed/pb/volume_server_pb/volume_server.pb.go | 1976 +++++++++++------- weed/server/volume_grpc_read_write.go | 38 + weed/shell/command_volume_check_disk.go | 243 +++ weed/storage/needle/needle_read_write.go | 34 +- weed/storage/needle_map/memdb.go | 9 +- weed/storage/volume_read.go | 8 + weed/storage/volume_write.go | 26 + 12 files changed, 1565 insertions(+), 801 deletions(-) create mode 100644 weed/server/volume_grpc_read_write.go create mode 100644 weed/shell/command_volume_check_disk.go diff --git a/weed/pb/filer_pb/filer.pb.go b/weed/pb/filer_pb/filer.pb.go index 607a2f26e..902c39514 100644 --- a/weed/pb/filer_pb/filer.pb.go +++ b/weed/pb/filer_pb/filer.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.24.0 +// protoc-gen-go v1.25.0 // protoc v3.12.3 // source: filer.proto diff --git a/weed/pb/iam_pb/iam.pb.go b/weed/pb/iam_pb/iam.pb.go index 93bc854cc..7d0b6281b 100644 --- a/weed/pb/iam_pb/iam.pb.go +++ b/weed/pb/iam_pb/iam.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.24.0 +// protoc-gen-go v1.25.0 // protoc v3.12.3 // source: iam.proto diff --git a/weed/pb/master_pb/master.pb.go b/weed/pb/master_pb/master.pb.go index 9b49d2df5..7e1f282dd 100644 --- a/weed/pb/master_pb/master.pb.go +++ b/weed/pb/master_pb/master.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.24.0 +// protoc-gen-go v1.25.0 // protoc v3.12.3 // source: master.proto diff --git a/weed/pb/messaging_pb/messaging.pb.go b/weed/pb/messaging_pb/messaging.pb.go index 90b4b724a..591406347 100644 --- a/weed/pb/messaging_pb/messaging.pb.go +++ b/weed/pb/messaging_pb/messaging.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.24.0 +// protoc-gen-go v1.25.0 // protoc v3.12.3 // source: messaging.proto diff --git a/weed/pb/volume_server.proto b/weed/pb/volume_server.proto index 7faf5d4f5..f9836c402 100644 --- a/weed/pb/volume_server.proto +++ b/weed/pb/volume_server.proto @@ -52,6 +52,11 @@ service VolumeServer { rpc CopyFile (CopyFileRequest) returns (stream CopyFileResponse) { } + rpc ReadNeedleBlob (ReadNeedleBlobRequest) returns (ReadNeedleBlobResponse) { + } + rpc WriteNeedleBlob (WriteNeedleBlobRequest) returns (WriteNeedleBlobResponse) { + } + rpc VolumeTailSender (VolumeTailSenderRequest) returns (stream VolumeTailSenderResponse) { } rpc VolumeTailReceiver (VolumeTailReceiverRequest) returns (VolumeTailReceiverResponse) { @@ -253,6 +258,25 @@ message CopyFileResponse { bytes file_content = 1; } +message ReadNeedleBlobRequest { + uint32 volume_id = 1; + uint64 needle_id = 2; + int64 offset = 3; // actual offset + int32 size = 4; +} +message ReadNeedleBlobResponse { + bytes needle_blob = 1; +} + +message WriteNeedleBlobRequest { + uint32 volume_id = 1; + uint64 needle_id = 2; + int32 size = 3; + bytes needle_blob = 4; +} +message WriteNeedleBlobResponse { +} + message VolumeTailSenderRequest { uint32 volume_id = 1; uint64 since_ns = 2; diff --git a/weed/pb/volume_server_pb/volume_server.pb.go b/weed/pb/volume_server_pb/volume_server.pb.go index dbcc738e5..c642142ba 100644 --- a/weed/pb/volume_server_pb/volume_server.pb.go +++ b/weed/pb/volume_server_pb/volume_server.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.24.0 +// protoc-gen-go v1.25.0 // protoc v3.12.3 // source: volume_server.proto @@ -1973,6 +1973,233 @@ func (x *CopyFileResponse) GetFileContent() []byte { return nil } +type ReadNeedleBlobRequest 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"` // actual offset + Size int32 `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"` +} + +func (x *ReadNeedleBlobRequest) Reset() { + *x = ReadNeedleBlobRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReadNeedleBlobRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReadNeedleBlobRequest) ProtoMessage() {} + +func (x *ReadNeedleBlobRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[38] + 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 ReadNeedleBlobRequest.ProtoReflect.Descriptor instead. +func (*ReadNeedleBlobRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{38} +} + +func (x *ReadNeedleBlobRequest) GetVolumeId() uint32 { + if x != nil { + return x.VolumeId + } + return 0 +} + +func (x *ReadNeedleBlobRequest) GetNeedleId() uint64 { + if x != nil { + return x.NeedleId + } + return 0 +} + +func (x *ReadNeedleBlobRequest) GetOffset() int64 { + if x != nil { + return x.Offset + } + return 0 +} + +func (x *ReadNeedleBlobRequest) GetSize() int32 { + if x != nil { + return x.Size + } + return 0 +} + +type ReadNeedleBlobResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NeedleBlob []byte `protobuf:"bytes,1,opt,name=needle_blob,json=needleBlob,proto3" json:"needle_blob,omitempty"` +} + +func (x *ReadNeedleBlobResponse) Reset() { + *x = ReadNeedleBlobResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReadNeedleBlobResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReadNeedleBlobResponse) ProtoMessage() {} + +func (x *ReadNeedleBlobResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[39] + 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 ReadNeedleBlobResponse.ProtoReflect.Descriptor instead. +func (*ReadNeedleBlobResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{39} +} + +func (x *ReadNeedleBlobResponse) GetNeedleBlob() []byte { + if x != nil { + return x.NeedleBlob + } + return nil +} + +type WriteNeedleBlobRequest 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"` + Size int32 `protobuf:"varint,3,opt,name=size,proto3" json:"size,omitempty"` + NeedleBlob []byte `protobuf:"bytes,4,opt,name=needle_blob,json=needleBlob,proto3" json:"needle_blob,omitempty"` +} + +func (x *WriteNeedleBlobRequest) Reset() { + *x = WriteNeedleBlobRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WriteNeedleBlobRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WriteNeedleBlobRequest) ProtoMessage() {} + +func (x *WriteNeedleBlobRequest) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[40] + 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 WriteNeedleBlobRequest.ProtoReflect.Descriptor instead. +func (*WriteNeedleBlobRequest) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{40} +} + +func (x *WriteNeedleBlobRequest) GetVolumeId() uint32 { + if x != nil { + return x.VolumeId + } + return 0 +} + +func (x *WriteNeedleBlobRequest) GetNeedleId() uint64 { + if x != nil { + return x.NeedleId + } + return 0 +} + +func (x *WriteNeedleBlobRequest) GetSize() int32 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *WriteNeedleBlobRequest) GetNeedleBlob() []byte { + if x != nil { + return x.NeedleBlob + } + return nil +} + +type WriteNeedleBlobResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *WriteNeedleBlobResponse) Reset() { + *x = WriteNeedleBlobResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_volume_server_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WriteNeedleBlobResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WriteNeedleBlobResponse) ProtoMessage() {} + +func (x *WriteNeedleBlobResponse) ProtoReflect() protoreflect.Message { + mi := &file_volume_server_proto_msgTypes[41] + 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 WriteNeedleBlobResponse.ProtoReflect.Descriptor instead. +func (*WriteNeedleBlobResponse) Descriptor() ([]byte, []int) { + return file_volume_server_proto_rawDescGZIP(), []int{41} +} + type VolumeTailSenderRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1986,7 +2213,7 @@ type VolumeTailSenderRequest struct { func (x *VolumeTailSenderRequest) Reset() { *x = VolumeTailSenderRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[38] + mi := &file_volume_server_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1999,7 +2226,7 @@ func (x *VolumeTailSenderRequest) String() string { func (*VolumeTailSenderRequest) ProtoMessage() {} func (x *VolumeTailSenderRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[38] + mi := &file_volume_server_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2012,7 +2239,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{38} + return file_volume_server_proto_rawDescGZIP(), []int{42} } func (x *VolumeTailSenderRequest) GetVolumeId() uint32 { @@ -2049,7 +2276,7 @@ type VolumeTailSenderResponse struct { func (x *VolumeTailSenderResponse) Reset() { *x = VolumeTailSenderResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[39] + mi := &file_volume_server_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2062,7 +2289,7 @@ func (x *VolumeTailSenderResponse) String() string { func (*VolumeTailSenderResponse) ProtoMessage() {} func (x *VolumeTailSenderResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[39] + mi := &file_volume_server_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2075,7 +2302,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{39} + return file_volume_server_proto_rawDescGZIP(), []int{43} } func (x *VolumeTailSenderResponse) GetNeedleHeader() []byte { @@ -2113,7 +2340,7 @@ type VolumeTailReceiverRequest struct { func (x *VolumeTailReceiverRequest) Reset() { *x = VolumeTailReceiverRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[40] + mi := &file_volume_server_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2126,7 +2353,7 @@ func (x *VolumeTailReceiverRequest) String() string { func (*VolumeTailReceiverRequest) ProtoMessage() {} func (x *VolumeTailReceiverRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[40] + mi := &file_volume_server_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2139,7 +2366,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{40} + return file_volume_server_proto_rawDescGZIP(), []int{44} } func (x *VolumeTailReceiverRequest) GetVolumeId() uint32 { @@ -2179,7 +2406,7 @@ type VolumeTailReceiverResponse struct { func (x *VolumeTailReceiverResponse) Reset() { *x = VolumeTailReceiverResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[41] + mi := &file_volume_server_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2192,7 +2419,7 @@ func (x *VolumeTailReceiverResponse) String() string { func (*VolumeTailReceiverResponse) ProtoMessage() {} func (x *VolumeTailReceiverResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[41] + mi := &file_volume_server_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2205,7 +2432,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{41} + return file_volume_server_proto_rawDescGZIP(), []int{45} } type VolumeEcShardsGenerateRequest struct { @@ -2220,7 +2447,7 @@ type VolumeEcShardsGenerateRequest struct { func (x *VolumeEcShardsGenerateRequest) Reset() { *x = VolumeEcShardsGenerateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[42] + mi := &file_volume_server_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2233,7 +2460,7 @@ func (x *VolumeEcShardsGenerateRequest) String() string { func (*VolumeEcShardsGenerateRequest) ProtoMessage() {} func (x *VolumeEcShardsGenerateRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[42] + mi := &file_volume_server_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2246,7 +2473,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{42} + return file_volume_server_proto_rawDescGZIP(), []int{46} } func (x *VolumeEcShardsGenerateRequest) GetVolumeId() uint32 { @@ -2272,7 +2499,7 @@ type VolumeEcShardsGenerateResponse struct { func (x *VolumeEcShardsGenerateResponse) Reset() { *x = VolumeEcShardsGenerateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[43] + mi := &file_volume_server_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2285,7 +2512,7 @@ func (x *VolumeEcShardsGenerateResponse) String() string { func (*VolumeEcShardsGenerateResponse) ProtoMessage() {} func (x *VolumeEcShardsGenerateResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[43] + mi := &file_volume_server_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2298,7 +2525,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{43} + return file_volume_server_proto_rawDescGZIP(), []int{47} } type VolumeEcShardsRebuildRequest struct { @@ -2313,7 +2540,7 @@ type VolumeEcShardsRebuildRequest struct { func (x *VolumeEcShardsRebuildRequest) Reset() { *x = VolumeEcShardsRebuildRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[44] + mi := &file_volume_server_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2326,7 +2553,7 @@ func (x *VolumeEcShardsRebuildRequest) String() string { func (*VolumeEcShardsRebuildRequest) ProtoMessage() {} func (x *VolumeEcShardsRebuildRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[44] + mi := &file_volume_server_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2339,7 +2566,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{44} + return file_volume_server_proto_rawDescGZIP(), []int{48} } func (x *VolumeEcShardsRebuildRequest) GetVolumeId() uint32 { @@ -2367,7 +2594,7 @@ type VolumeEcShardsRebuildResponse struct { func (x *VolumeEcShardsRebuildResponse) Reset() { *x = VolumeEcShardsRebuildResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[45] + mi := &file_volume_server_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2380,7 +2607,7 @@ func (x *VolumeEcShardsRebuildResponse) String() string { func (*VolumeEcShardsRebuildResponse) ProtoMessage() {} func (x *VolumeEcShardsRebuildResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[45] + mi := &file_volume_server_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2393,7 +2620,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{45} + return file_volume_server_proto_rawDescGZIP(), []int{49} } func (x *VolumeEcShardsRebuildResponse) GetRebuiltShardIds() []uint32 { @@ -2420,7 +2647,7 @@ type VolumeEcShardsCopyRequest struct { func (x *VolumeEcShardsCopyRequest) Reset() { *x = VolumeEcShardsCopyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[46] + mi := &file_volume_server_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2433,7 +2660,7 @@ func (x *VolumeEcShardsCopyRequest) String() string { func (*VolumeEcShardsCopyRequest) ProtoMessage() {} func (x *VolumeEcShardsCopyRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[46] + mi := &file_volume_server_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2446,7 +2673,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{46} + return file_volume_server_proto_rawDescGZIP(), []int{50} } func (x *VolumeEcShardsCopyRequest) GetVolumeId() uint32 { @@ -2507,7 +2734,7 @@ type VolumeEcShardsCopyResponse struct { func (x *VolumeEcShardsCopyResponse) Reset() { *x = VolumeEcShardsCopyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[47] + mi := &file_volume_server_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2520,7 +2747,7 @@ func (x *VolumeEcShardsCopyResponse) String() string { func (*VolumeEcShardsCopyResponse) ProtoMessage() {} func (x *VolumeEcShardsCopyResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[47] + mi := &file_volume_server_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2533,7 +2760,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{47} + return file_volume_server_proto_rawDescGZIP(), []int{51} } type VolumeEcShardsDeleteRequest struct { @@ -2549,7 +2776,7 @@ type VolumeEcShardsDeleteRequest struct { func (x *VolumeEcShardsDeleteRequest) Reset() { *x = VolumeEcShardsDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[48] + mi := &file_volume_server_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2562,7 +2789,7 @@ func (x *VolumeEcShardsDeleteRequest) String() string { func (*VolumeEcShardsDeleteRequest) ProtoMessage() {} func (x *VolumeEcShardsDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[48] + mi := &file_volume_server_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2575,7 +2802,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{48} + return file_volume_server_proto_rawDescGZIP(), []int{52} } func (x *VolumeEcShardsDeleteRequest) GetVolumeId() uint32 { @@ -2608,7 +2835,7 @@ type VolumeEcShardsDeleteResponse struct { func (x *VolumeEcShardsDeleteResponse) Reset() { *x = VolumeEcShardsDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[49] + mi := &file_volume_server_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2621,7 +2848,7 @@ func (x *VolumeEcShardsDeleteResponse) String() string { func (*VolumeEcShardsDeleteResponse) ProtoMessage() {} func (x *VolumeEcShardsDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[49] + mi := &file_volume_server_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2634,7 +2861,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{49} + return file_volume_server_proto_rawDescGZIP(), []int{53} } type VolumeEcShardsMountRequest struct { @@ -2650,7 +2877,7 @@ type VolumeEcShardsMountRequest struct { func (x *VolumeEcShardsMountRequest) Reset() { *x = VolumeEcShardsMountRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[50] + mi := &file_volume_server_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2663,7 +2890,7 @@ func (x *VolumeEcShardsMountRequest) String() string { func (*VolumeEcShardsMountRequest) ProtoMessage() {} func (x *VolumeEcShardsMountRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[50] + mi := &file_volume_server_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2676,7 +2903,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{50} + return file_volume_server_proto_rawDescGZIP(), []int{54} } func (x *VolumeEcShardsMountRequest) GetVolumeId() uint32 { @@ -2709,7 +2936,7 @@ type VolumeEcShardsMountResponse struct { func (x *VolumeEcShardsMountResponse) Reset() { *x = VolumeEcShardsMountResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[51] + mi := &file_volume_server_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2722,7 +2949,7 @@ func (x *VolumeEcShardsMountResponse) String() string { func (*VolumeEcShardsMountResponse) ProtoMessage() {} func (x *VolumeEcShardsMountResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[51] + mi := &file_volume_server_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2735,7 +2962,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{51} + return file_volume_server_proto_rawDescGZIP(), []int{55} } type VolumeEcShardsUnmountRequest struct { @@ -2750,7 +2977,7 @@ type VolumeEcShardsUnmountRequest struct { func (x *VolumeEcShardsUnmountRequest) Reset() { *x = VolumeEcShardsUnmountRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[52] + mi := &file_volume_server_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2763,7 +2990,7 @@ func (x *VolumeEcShardsUnmountRequest) String() string { func (*VolumeEcShardsUnmountRequest) ProtoMessage() {} func (x *VolumeEcShardsUnmountRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[52] + mi := &file_volume_server_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2776,7 +3003,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{52} + return file_volume_server_proto_rawDescGZIP(), []int{56} } func (x *VolumeEcShardsUnmountRequest) GetVolumeId() uint32 { @@ -2802,7 +3029,7 @@ type VolumeEcShardsUnmountResponse struct { func (x *VolumeEcShardsUnmountResponse) Reset() { *x = VolumeEcShardsUnmountResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[53] + mi := &file_volume_server_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2815,7 +3042,7 @@ func (x *VolumeEcShardsUnmountResponse) String() string { func (*VolumeEcShardsUnmountResponse) ProtoMessage() {} func (x *VolumeEcShardsUnmountResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[53] + mi := &file_volume_server_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2828,7 +3055,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{53} + return file_volume_server_proto_rawDescGZIP(), []int{57} } type VolumeEcShardReadRequest struct { @@ -2846,7 +3073,7 @@ type VolumeEcShardReadRequest struct { func (x *VolumeEcShardReadRequest) Reset() { *x = VolumeEcShardReadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[54] + mi := &file_volume_server_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2859,7 +3086,7 @@ func (x *VolumeEcShardReadRequest) String() string { func (*VolumeEcShardReadRequest) ProtoMessage() {} func (x *VolumeEcShardReadRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[54] + mi := &file_volume_server_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2872,7 +3099,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{54} + return file_volume_server_proto_rawDescGZIP(), []int{58} } func (x *VolumeEcShardReadRequest) GetVolumeId() uint32 { @@ -2922,7 +3149,7 @@ type VolumeEcShardReadResponse struct { func (x *VolumeEcShardReadResponse) Reset() { *x = VolumeEcShardReadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[55] + mi := &file_volume_server_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2935,7 +3162,7 @@ func (x *VolumeEcShardReadResponse) String() string { func (*VolumeEcShardReadResponse) ProtoMessage() {} func (x *VolumeEcShardReadResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[55] + mi := &file_volume_server_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2948,7 +3175,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{55} + return file_volume_server_proto_rawDescGZIP(), []int{59} } func (x *VolumeEcShardReadResponse) GetData() []byte { @@ -2979,7 +3206,7 @@ type VolumeEcBlobDeleteRequest struct { func (x *VolumeEcBlobDeleteRequest) Reset() { *x = VolumeEcBlobDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[56] + mi := &file_volume_server_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2992,7 +3219,7 @@ func (x *VolumeEcBlobDeleteRequest) String() string { func (*VolumeEcBlobDeleteRequest) ProtoMessage() {} func (x *VolumeEcBlobDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[56] + mi := &file_volume_server_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3005,7 +3232,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{56} + return file_volume_server_proto_rawDescGZIP(), []int{60} } func (x *VolumeEcBlobDeleteRequest) GetVolumeId() uint32 { @@ -3045,7 +3272,7 @@ type VolumeEcBlobDeleteResponse struct { func (x *VolumeEcBlobDeleteResponse) Reset() { *x = VolumeEcBlobDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[57] + mi := &file_volume_server_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3058,7 +3285,7 @@ func (x *VolumeEcBlobDeleteResponse) String() string { func (*VolumeEcBlobDeleteResponse) ProtoMessage() {} func (x *VolumeEcBlobDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[57] + mi := &file_volume_server_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3071,7 +3298,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{57} + return file_volume_server_proto_rawDescGZIP(), []int{61} } type VolumeEcShardsToVolumeRequest struct { @@ -3086,7 +3313,7 @@ type VolumeEcShardsToVolumeRequest struct { func (x *VolumeEcShardsToVolumeRequest) Reset() { *x = VolumeEcShardsToVolumeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[58] + mi := &file_volume_server_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3099,7 +3326,7 @@ func (x *VolumeEcShardsToVolumeRequest) String() string { func (*VolumeEcShardsToVolumeRequest) ProtoMessage() {} func (x *VolumeEcShardsToVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[58] + mi := &file_volume_server_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3112,7 +3339,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{58} + return file_volume_server_proto_rawDescGZIP(), []int{62} } func (x *VolumeEcShardsToVolumeRequest) GetVolumeId() uint32 { @@ -3138,7 +3365,7 @@ type VolumeEcShardsToVolumeResponse struct { func (x *VolumeEcShardsToVolumeResponse) Reset() { *x = VolumeEcShardsToVolumeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[59] + mi := &file_volume_server_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3151,7 +3378,7 @@ func (x *VolumeEcShardsToVolumeResponse) String() string { func (*VolumeEcShardsToVolumeResponse) ProtoMessage() {} func (x *VolumeEcShardsToVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[59] + mi := &file_volume_server_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3164,7 +3391,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{59} + return file_volume_server_proto_rawDescGZIP(), []int{63} } type ReadVolumeFileStatusRequest struct { @@ -3178,7 +3405,7 @@ type ReadVolumeFileStatusRequest struct { func (x *ReadVolumeFileStatusRequest) Reset() { *x = ReadVolumeFileStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[60] + mi := &file_volume_server_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3191,7 +3418,7 @@ func (x *ReadVolumeFileStatusRequest) String() string { func (*ReadVolumeFileStatusRequest) ProtoMessage() {} func (x *ReadVolumeFileStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[60] + mi := &file_volume_server_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3204,7 +3431,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{60} + return file_volume_server_proto_rawDescGZIP(), []int{64} } func (x *ReadVolumeFileStatusRequest) GetVolumeId() uint32 { @@ -3233,7 +3460,7 @@ type ReadVolumeFileStatusResponse struct { func (x *ReadVolumeFileStatusResponse) Reset() { *x = ReadVolumeFileStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[61] + mi := &file_volume_server_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3246,7 +3473,7 @@ func (x *ReadVolumeFileStatusResponse) String() string { func (*ReadVolumeFileStatusResponse) ProtoMessage() {} func (x *ReadVolumeFileStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[61] + mi := &file_volume_server_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3259,7 +3486,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{61} + return file_volume_server_proto_rawDescGZIP(), []int{65} } func (x *ReadVolumeFileStatusResponse) GetVolumeId() uint32 { @@ -3342,7 +3569,7 @@ type DiskStatus struct { func (x *DiskStatus) Reset() { *x = DiskStatus{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[62] + mi := &file_volume_server_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3355,7 +3582,7 @@ func (x *DiskStatus) String() string { func (*DiskStatus) ProtoMessage() {} func (x *DiskStatus) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[62] + mi := &file_volume_server_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3368,7 +3595,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{62} + return file_volume_server_proto_rawDescGZIP(), []int{66} } func (x *DiskStatus) GetDir() string { @@ -3437,7 +3664,7 @@ type MemStatus struct { func (x *MemStatus) Reset() { *x = MemStatus{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[63] + mi := &file_volume_server_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3450,7 +3677,7 @@ func (x *MemStatus) String() string { func (*MemStatus) ProtoMessage() {} func (x *MemStatus) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[63] + mi := &file_volume_server_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3463,7 +3690,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{63} + return file_volume_server_proto_rawDescGZIP(), []int{67} } func (x *MemStatus) GetGoroutines() int32 { @@ -3533,7 +3760,7 @@ type RemoteFile struct { func (x *RemoteFile) Reset() { *x = RemoteFile{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[64] + mi := &file_volume_server_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3546,7 +3773,7 @@ func (x *RemoteFile) String() string { func (*RemoteFile) ProtoMessage() {} func (x *RemoteFile) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[64] + mi := &file_volume_server_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3559,7 +3786,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{64} + return file_volume_server_proto_rawDescGZIP(), []int{68} } func (x *RemoteFile) GetBackendType() string { @@ -3624,7 +3851,7 @@ type VolumeInfo struct { func (x *VolumeInfo) Reset() { *x = VolumeInfo{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[65] + mi := &file_volume_server_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3637,7 +3864,7 @@ func (x *VolumeInfo) String() string { func (*VolumeInfo) ProtoMessage() {} func (x *VolumeInfo) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[65] + mi := &file_volume_server_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3650,7 +3877,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{65} + return file_volume_server_proto_rawDescGZIP(), []int{69} } func (x *VolumeInfo) GetFiles() []*RemoteFile { @@ -3688,7 +3915,7 @@ type VolumeTierMoveDatToRemoteRequest struct { func (x *VolumeTierMoveDatToRemoteRequest) Reset() { *x = VolumeTierMoveDatToRemoteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[66] + mi := &file_volume_server_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3701,7 +3928,7 @@ func (x *VolumeTierMoveDatToRemoteRequest) String() string { func (*VolumeTierMoveDatToRemoteRequest) ProtoMessage() {} func (x *VolumeTierMoveDatToRemoteRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[66] + mi := &file_volume_server_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3714,7 +3941,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{66} + return file_volume_server_proto_rawDescGZIP(), []int{70} } func (x *VolumeTierMoveDatToRemoteRequest) GetVolumeId() uint32 { @@ -3757,7 +3984,7 @@ type VolumeTierMoveDatToRemoteResponse struct { func (x *VolumeTierMoveDatToRemoteResponse) Reset() { *x = VolumeTierMoveDatToRemoteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[67] + mi := &file_volume_server_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3770,7 +3997,7 @@ func (x *VolumeTierMoveDatToRemoteResponse) String() string { func (*VolumeTierMoveDatToRemoteResponse) ProtoMessage() {} func (x *VolumeTierMoveDatToRemoteResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[67] + mi := &file_volume_server_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3783,7 +4010,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{67} + return file_volume_server_proto_rawDescGZIP(), []int{71} } func (x *VolumeTierMoveDatToRemoteResponse) GetProcessed() int64 { @@ -3813,7 +4040,7 @@ type VolumeTierMoveDatFromRemoteRequest struct { func (x *VolumeTierMoveDatFromRemoteRequest) Reset() { *x = VolumeTierMoveDatFromRemoteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[68] + mi := &file_volume_server_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3826,7 +4053,7 @@ func (x *VolumeTierMoveDatFromRemoteRequest) String() string { func (*VolumeTierMoveDatFromRemoteRequest) ProtoMessage() {} func (x *VolumeTierMoveDatFromRemoteRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[68] + mi := &file_volume_server_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3839,7 +4066,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{68} + return file_volume_server_proto_rawDescGZIP(), []int{72} } func (x *VolumeTierMoveDatFromRemoteRequest) GetVolumeId() uint32 { @@ -3875,7 +4102,7 @@ type VolumeTierMoveDatFromRemoteResponse struct { func (x *VolumeTierMoveDatFromRemoteResponse) Reset() { *x = VolumeTierMoveDatFromRemoteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[69] + mi := &file_volume_server_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3888,7 +4115,7 @@ func (x *VolumeTierMoveDatFromRemoteResponse) String() string { func (*VolumeTierMoveDatFromRemoteResponse) ProtoMessage() {} func (x *VolumeTierMoveDatFromRemoteResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[69] + mi := &file_volume_server_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3901,7 +4128,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{69} + return file_volume_server_proto_rawDescGZIP(), []int{73} } func (x *VolumeTierMoveDatFromRemoteResponse) GetProcessed() int64 { @@ -3927,7 +4154,7 @@ type VolumeServerStatusRequest struct { func (x *VolumeServerStatusRequest) Reset() { *x = VolumeServerStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[70] + mi := &file_volume_server_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3940,7 +4167,7 @@ func (x *VolumeServerStatusRequest) String() string { func (*VolumeServerStatusRequest) ProtoMessage() {} func (x *VolumeServerStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[70] + mi := &file_volume_server_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3953,7 +4180,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{70} + return file_volume_server_proto_rawDescGZIP(), []int{74} } type VolumeServerStatusResponse struct { @@ -3968,7 +4195,7 @@ type VolumeServerStatusResponse struct { func (x *VolumeServerStatusResponse) Reset() { *x = VolumeServerStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[71] + mi := &file_volume_server_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3981,7 +4208,7 @@ func (x *VolumeServerStatusResponse) String() string { func (*VolumeServerStatusResponse) ProtoMessage() {} func (x *VolumeServerStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[71] + mi := &file_volume_server_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3994,7 +4221,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{71} + return file_volume_server_proto_rawDescGZIP(), []int{75} } func (x *VolumeServerStatusResponse) GetDiskStatuses() []*DiskStatus { @@ -4020,7 +4247,7 @@ type VolumeServerLeaveRequest struct { func (x *VolumeServerLeaveRequest) Reset() { *x = VolumeServerLeaveRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[72] + mi := &file_volume_server_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4033,7 +4260,7 @@ func (x *VolumeServerLeaveRequest) String() string { func (*VolumeServerLeaveRequest) ProtoMessage() {} func (x *VolumeServerLeaveRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[72] + mi := &file_volume_server_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4046,7 +4273,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{72} + return file_volume_server_proto_rawDescGZIP(), []int{76} } type VolumeServerLeaveResponse struct { @@ -4058,7 +4285,7 @@ type VolumeServerLeaveResponse struct { func (x *VolumeServerLeaveResponse) Reset() { *x = VolumeServerLeaveResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[73] + mi := &file_volume_server_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4071,7 +4298,7 @@ func (x *VolumeServerLeaveResponse) String() string { func (*VolumeServerLeaveResponse) ProtoMessage() {} func (x *VolumeServerLeaveResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[73] + mi := &file_volume_server_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4084,7 +4311,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{73} + return file_volume_server_proto_rawDescGZIP(), []int{77} } // select on volume servers @@ -4103,7 +4330,7 @@ type QueryRequest struct { func (x *QueryRequest) Reset() { *x = QueryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[74] + mi := &file_volume_server_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4116,7 +4343,7 @@ func (x *QueryRequest) String() string { func (*QueryRequest) ProtoMessage() {} func (x *QueryRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[74] + mi := &file_volume_server_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4129,7 +4356,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{74} + return file_volume_server_proto_rawDescGZIP(), []int{78} } func (x *QueryRequest) GetSelections() []string { @@ -4178,7 +4405,7 @@ type QueriedStripe struct { func (x *QueriedStripe) Reset() { *x = QueriedStripe{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[75] + mi := &file_volume_server_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4191,7 +4418,7 @@ func (x *QueriedStripe) String() string { func (*QueriedStripe) ProtoMessage() {} func (x *QueriedStripe) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[75] + mi := &file_volume_server_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4204,7 +4431,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{75} + return file_volume_server_proto_rawDescGZIP(), []int{79} } func (x *QueriedStripe) GetRecords() []byte { @@ -4226,7 +4453,7 @@ type VolumeNeedleStatusRequest struct { func (x *VolumeNeedleStatusRequest) Reset() { *x = VolumeNeedleStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[76] + mi := &file_volume_server_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4239,7 +4466,7 @@ func (x *VolumeNeedleStatusRequest) String() string { func (*VolumeNeedleStatusRequest) ProtoMessage() {} func (x *VolumeNeedleStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[76] + mi := &file_volume_server_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4252,7 +4479,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{76} + return file_volume_server_proto_rawDescGZIP(), []int{80} } func (x *VolumeNeedleStatusRequest) GetVolumeId() uint32 { @@ -4285,7 +4512,7 @@ type VolumeNeedleStatusResponse struct { func (x *VolumeNeedleStatusResponse) Reset() { *x = VolumeNeedleStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[77] + mi := &file_volume_server_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4298,7 +4525,7 @@ func (x *VolumeNeedleStatusResponse) String() string { func (*VolumeNeedleStatusResponse) ProtoMessage() {} func (x *VolumeNeedleStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[77] + mi := &file_volume_server_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4311,7 +4538,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{77} + return file_volume_server_proto_rawDescGZIP(), []int{81} } func (x *VolumeNeedleStatusResponse) GetNeedleId() uint64 { @@ -4369,7 +4596,7 @@ type QueryRequest_Filter struct { func (x *QueryRequest_Filter) Reset() { *x = QueryRequest_Filter{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[78] + mi := &file_volume_server_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4382,7 +4609,7 @@ func (x *QueryRequest_Filter) String() string { func (*QueryRequest_Filter) ProtoMessage() {} func (x *QueryRequest_Filter) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[78] + mi := &file_volume_server_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4395,7 +4622,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{74, 0} + return file_volume_server_proto_rawDescGZIP(), []int{78, 0} } func (x *QueryRequest_Filter) GetField() string { @@ -4434,7 +4661,7 @@ type QueryRequest_InputSerialization struct { func (x *QueryRequest_InputSerialization) Reset() { *x = QueryRequest_InputSerialization{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[79] + mi := &file_volume_server_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4447,7 +4674,7 @@ func (x *QueryRequest_InputSerialization) String() string { func (*QueryRequest_InputSerialization) ProtoMessage() {} func (x *QueryRequest_InputSerialization) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[79] + mi := &file_volume_server_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4460,7 +4687,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{74, 1} + return file_volume_server_proto_rawDescGZIP(), []int{78, 1} } func (x *QueryRequest_InputSerialization) GetCompressionType() string { @@ -4503,7 +4730,7 @@ type QueryRequest_OutputSerialization struct { func (x *QueryRequest_OutputSerialization) Reset() { *x = QueryRequest_OutputSerialization{} if protoimpl.UnsafeEnabled { - mi := &file_volume_server_proto_msgTypes[80] + mi := &file_volume_server_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4516,7 +4743,7 @@ func (x *QueryRequest_OutputSerialization) String() string { func (*QueryRequest_OutputSerialization) ProtoMessage() {} func (x *QueryRequest_OutputSerialization) ProtoReflect() protoreflect.Message { - mi := &file_volume_server_proto_msgTypes[80] + mi := &file_volume_server_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4529,7 +4756,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{74, 2} + return file_volume_server_proto_rawDescGZIP(), []int{78, 2} } func (x *QueryRequest_OutputSerialization) GetCsvOutput() *QueryRequest_OutputSerialization_CSVOutput { @@ -4564,7 +4791,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[81] + mi := &file_volume_server_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4577,7 +4804,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[81] + mi := &file_volume_server_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4590,7 +4817,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{74, 1, 0} + return file_volume_server_proto_rawDescGZIP(), []int{78, 1, 0} } func (x *QueryRequest_InputSerialization_CSVInput) GetFileHeaderInfo() string { @@ -4653,7 +4880,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[82] + mi := &file_volume_server_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4666,7 +4893,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[82] + mi := &file_volume_server_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4679,7 +4906,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{74, 1, 1} + return file_volume_server_proto_rawDescGZIP(), []int{78, 1, 1} } func (x *QueryRequest_InputSerialization_JSONInput) GetType() string { @@ -4698,7 +4925,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[83] + mi := &file_volume_server_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4711,7 +4938,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[83] + mi := &file_volume_server_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4724,7 +4951,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{74, 1, 2} + return file_volume_server_proto_rawDescGZIP(), []int{78, 1, 2} } type QueryRequest_OutputSerialization_CSVOutput struct { @@ -4742,7 +4969,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[84] + mi := &file_volume_server_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4755,7 +4982,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[84] + mi := &file_volume_server_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4768,7 +4995,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{74, 2, 0} + return file_volume_server_proto_rawDescGZIP(), []int{78, 2, 0} } func (x *QueryRequest_OutputSerialization_CSVOutput) GetQuoteFields() string { @@ -4817,7 +5044,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[85] + mi := &file_volume_server_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4830,7 +5057,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[85] + mi := &file_volume_server_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4843,7 +5070,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{74, 2, 1} + return file_volume_server_proto_rawDescGZIP(), []int{78, 2, 1} } func (x *QueryRequest_OutputSerialization_JSONOutput) GetRecordDelimiter() string { @@ -5037,510 +5264,545 @@ var file_volume_server_proto_rawDesc = []byte{ 0x6e, 0x64, 0x22, 0x35, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x66, 0x69, - 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 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, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x73, 0x12, 0x30, 0x0a, - 0x14, 0x69, 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x69, 0x64, 0x6c, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, - 0x84, 0x01, 0x0a, 0x18, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x53, 0x65, - 0x6e, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6f, - 0x64, 0x79, 0x12, 0x22, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x4c, 0x61, 0x73, - 0x74, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0xb7, 0x01, 0x0a, 0x19, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x7d, 0x0a, 0x15, 0x52, 0x65, 0x61, + 0x64, 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, 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, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x39, 0x0a, 0x16, 0x52, 0x65, 0x61, 0x64, + 0x4e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x5f, 0x62, 0x6c, 0x6f, + 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, + 0x6c, 0x6f, 0x62, 0x22, 0x87, 0x01, 0x0a, 0x16, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4e, 0x65, 0x65, + 0x64, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x62, 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, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 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, 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, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x69, 0x64, 0x6c, 0x65, - 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x30, - 0x0a, 0x14, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x22, 0x1c, 0x0a, 0x1a, 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, 0x5c, - 0x0a, 0x1d, 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, 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, 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, 0x20, 0x0a, 0x1e, - 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, 0x5b, - 0x0a, 0x1c, 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, 0x12, 0x1b, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x84, + 0x01, 0x0a, 0x18, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, + 0x65, 0x65, 0x64, 0x6c, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0c, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6e, 0x65, 0x65, 0x64, 0x6c, 0x65, 0x42, 0x6f, 0x64, + 0x79, 0x12, 0x22, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x4c, 0x61, 0x73, 0x74, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0xb7, 0x01, 0x0a, 0x19, 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, 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, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x07, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x69, + 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x69, 0x64, 0x6c, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x30, 0x0a, + 0x14, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, + 0x1c, 0x0a, 0x1a, 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, 0x5c, 0x0a, + 0x1d, 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, 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, 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, 0x4b, 0x0a, 0x1d, 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, 0x12, 0x2a, 0x0a, 0x11, - 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0f, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x74, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x73, 0x22, 0x8b, 0x02, 0x0a, 0x19, 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, 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, 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, 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x73, - 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x65, 0x63, 0x78, 0x5f, 0x66, 0x69, 0x6c, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x45, 0x63, 0x78, - 0x46, 0x69, 0x6c, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x22, - 0x0a, 0x0d, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x65, 0x63, 0x6a, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x45, 0x63, 0x6a, 0x46, 0x69, - 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x69, 0x66, 0x5f, 0x66, - 0x69, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x56, - 0x69, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 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, 0x77, 0x0a, 0x1b, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x0a, 0x1e, 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, 0x5b, 0x0a, + 0x1c, 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, 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, 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, 0x4b, 0x0a, 0x1d, 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, 0x12, 0x2a, 0x0a, 0x11, 0x72, + 0x65, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0f, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x73, 0x22, 0x8b, 0x02, 0x0a, 0x19, 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, 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, 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, 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x73, 0x12, + 0x22, 0x0a, 0x0d, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x65, 0x63, 0x78, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x45, 0x63, 0x78, 0x46, + 0x69, 0x6c, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x22, 0x0a, + 0x0d, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x65, 0x63, 0x6a, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x45, 0x63, 0x6a, 0x46, 0x69, 0x6c, + 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x69, 0x66, 0x5f, 0x66, 0x69, + 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x56, 0x69, + 0x66, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 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, 0x77, 0x0a, 0x1b, 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, 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, + 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, + 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0d, 0x52, 0x08, 0x73, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x73, 0x22, 0x1e, 0x0a, 0x1c, + 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, 0x76, 0x0a, 0x1a, + 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, 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, 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, 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x49, 0x64, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 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, 0x58, 0x0a, 0x1c, 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, 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, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x73, 0x22, 0x1f, 0x0a, + 0x1d, 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, 0x99, + 0x01, 0x0a, 0x18, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x61, 0x64, 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, 0x19, 0x0a, 0x08, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x68, 0x61, 0x72, + 0x64, 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, + 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x22, 0x4e, 0x0a, 0x19, 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, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x69, + 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x69, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x8d, 0x01, 0x0a, 0x19, 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, 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, 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, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, + 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x1c, 0x0a, 0x1a, 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, 0x5c, 0x0a, 0x1d, 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, 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, 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, 0x20, 0x0a, 0x1e, 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, 0x3a, 0x0a, 0x1b, 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, 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, 0x8a, 0x03, 0x0a, 0x1c, 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, 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, 0x3b, 0x0a, 0x1a, 0x69, 0x64, 0x78, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x69, 0x64, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, + 0x22, 0x0a, 0x0d, 0x69, 0x64, 0x78, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x69, 0x64, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x1a, 0x64, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x64, 0x61, 0x74, 0x46, 0x69, 0x6c, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x12, 0x22, 0x0a, 0x0d, 0x64, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x64, 0x61, 0x74, 0x46, 0x69, 0x6c, 0x65, + 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, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, + 0x65, 0x22, 0xbb, 0x01, 0x0a, 0x0a, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, + 0x69, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x04, 0x75, 0x73, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x65, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x66, 0x72, 0x65, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x66, 0x72, 0x65, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x46, 0x72, 0x65, 0x65, 0x12, + 0x21, 0x0a, 0x0c, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x55, 0x73, + 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, + 0xa3, 0x01, 0x0a, 0x09, 0x4d, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, + 0x0a, 0x67, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x67, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x10, 0x0a, + 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, + 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x75, + 0x73, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x65, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x04, 0x66, 0x72, 0x65, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x65, 0x6c, 0x66, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x65, 0x6c, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x68, + 0x65, 0x61, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x68, 0x65, 0x61, 0x70, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0xd8, 0x01, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x46, 0x69, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x7c, 0x0a, 0x0a, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x32, + 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 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, 0x22, 0xc8, + 0x01, 0x0a, 0x20, 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, 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, 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, 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x73, 0x22, 0x1e, 0x0a, - 0x1c, 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, 0x76, 0x0a, - 0x1a, 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, 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, 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, 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x49, 0x64, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 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, 0x58, 0x0a, 0x1c, 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, 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, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x73, 0x22, 0x1f, - 0x0a, 0x1d, 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, - 0x99, 0x01, 0x0a, 0x18, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x61, 0x64, 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, 0x19, 0x0a, 0x08, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x68, 0x61, - 0x72, 0x64, 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, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x22, 0x4e, 0x0a, 0x19, 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, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, - 0x69, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x8d, 0x01, 0x0a, 0x19, - 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, 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, 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, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, - 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x1c, 0x0a, 0x1a, 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, 0x5c, 0x0a, 0x1d, 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, 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, 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, 0x20, 0x0a, 0x1e, 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, 0x3a, 0x0a, 0x1b, 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, 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, 0x8a, 0x03, 0x0a, 0x1c, 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, 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, 0x3b, 0x0a, 0x1a, 0x69, 0x64, 0x78, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x69, 0x64, 0x78, 0x46, 0x69, 0x6c, 0x65, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x12, 0x22, 0x0a, 0x0d, 0x69, 0x64, 0x78, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x69, 0x64, 0x78, 0x46, 0x69, 0x6c, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x1a, 0x64, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x64, 0x61, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x64, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x64, 0x61, 0x74, 0x46, 0x69, 0x6c, - 0x65, 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, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, - 0x70, 0x65, 0x22, 0xbb, 0x01, 0x0a, 0x0a, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x64, 0x69, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x04, 0x75, 0x73, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x65, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x66, 0x72, 0x65, 0x65, 0x12, 0x21, 0x0a, - 0x0c, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x66, 0x72, 0x65, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x46, 0x72, 0x65, 0x65, - 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x55, - 0x73, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, - 0x22, 0xa3, 0x01, 0x0a, 0x09, 0x4d, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, - 0x0a, 0x0a, 0x67, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0a, 0x67, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x10, - 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x61, 0x6c, 0x6c, - 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, - 0x75, 0x73, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x65, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x04, 0x66, 0x72, 0x65, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x65, 0x6c, 0x66, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x65, 0x6c, 0x66, 0x12, 0x12, 0x0a, 0x04, - 0x68, 0x65, 0x61, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x68, 0x65, 0x61, 0x70, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0xd8, 0x01, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x23, - 0x0a, 0x0d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x7c, 0x0a, 0x0a, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x32, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 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, 0x22, - 0xc8, 0x01, 0x0a, 0x20, 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, 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, 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, 0x38, 0x0a, 0x18, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x16, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x13, 0x6b, - 0x65, 0x65, 0x70, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x5f, 0x66, 0x69, - 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x4c, 0x6f, - 0x63, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x73, 0x0a, 0x21, 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, 0x12, - 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x30, 0x0a, - 0x13, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x65, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, - 0x92, 0x01, 0x0a, 0x22, 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, 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, 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, 0x2f, 0x0a, 0x14, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x72, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x11, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x46, 0x69, 0x6c, 0x65, 0x22, 0x75, 0x0a, 0x23, 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, 0x12, 0x1c, 0x0a, 0x09, 0x70, - 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x70, 0x72, 0x6f, - 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, - 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, 0x1b, 0x0a, 0x19, 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, 0x22, 0xa1, 0x01, 0x0a, 0x1a, 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, 0x12, 0x41, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x6b, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c, 0x64, 0x69, - 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x40, 0x0a, 0x0d, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x1a, 0x0a, 0x18, - 0x56, 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, 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, + 0x12, 0x38, 0x0a, 0x18, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x16, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x13, 0x6b, 0x65, + 0x65, 0x70, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x4c, 0x6f, 0x63, + 0x61, 0x6c, 0x44, 0x61, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x73, 0x0a, 0x21, 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, 0x12, 0x1c, + 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x13, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, 0x92, + 0x01, 0x0a, 0x22, 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, 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, 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, 0x2f, 0x0a, 0x14, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x5f, 0x64, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x11, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x44, 0x61, 0x74, 0x46, + 0x69, 0x6c, 0x65, 0x22, 0x75, 0x0a, 0x23, 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, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x65, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, 0x1b, 0x0a, 0x19, 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, 0x22, 0xa1, 0x01, 0x0a, 0x1a, 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, 0x12, 0x41, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c, 0x64, 0x69, 0x73, + 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x40, 0x0a, 0x0d, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x1a, 0x0a, 0x18, 0x56, + 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, 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, 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, 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, + 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, 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, 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, 0xd8, 0x1f, 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, 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, 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, + 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, 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, 0xa9, 0x21, 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, 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, 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, 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, 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, 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, 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, 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, + 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, + 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, 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, 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, + 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, 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, + 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, 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, + 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, - 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, + 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, @@ -5686,7 +5948,7 @@ func file_volume_server_proto_rawDescGZIP() []byte { return file_volume_server_proto_rawDescData } -var file_volume_server_proto_msgTypes = make([]protoimpl.MessageInfo, 86) +var file_volume_server_proto_msgTypes = make([]protoimpl.MessageInfo, 90) var file_volume_server_proto_goTypes = []interface{}{ (*BatchDeleteRequest)(nil), // 0: volume_server_pb.BatchDeleteRequest (*BatchDeleteResponse)(nil), // 1: volume_server_pb.BatchDeleteResponse @@ -5726,68 +5988,72 @@ var file_volume_server_proto_goTypes = []interface{}{ (*VolumeCopyResponse)(nil), // 35: volume_server_pb.VolumeCopyResponse (*CopyFileRequest)(nil), // 36: volume_server_pb.CopyFileRequest (*CopyFileResponse)(nil), // 37: volume_server_pb.CopyFileResponse - (*VolumeTailSenderRequest)(nil), // 38: volume_server_pb.VolumeTailSenderRequest - (*VolumeTailSenderResponse)(nil), // 39: volume_server_pb.VolumeTailSenderResponse - (*VolumeTailReceiverRequest)(nil), // 40: volume_server_pb.VolumeTailReceiverRequest - (*VolumeTailReceiverResponse)(nil), // 41: volume_server_pb.VolumeTailReceiverResponse - (*VolumeEcShardsGenerateRequest)(nil), // 42: volume_server_pb.VolumeEcShardsGenerateRequest - (*VolumeEcShardsGenerateResponse)(nil), // 43: volume_server_pb.VolumeEcShardsGenerateResponse - (*VolumeEcShardsRebuildRequest)(nil), // 44: volume_server_pb.VolumeEcShardsRebuildRequest - (*VolumeEcShardsRebuildResponse)(nil), // 45: volume_server_pb.VolumeEcShardsRebuildResponse - (*VolumeEcShardsCopyRequest)(nil), // 46: volume_server_pb.VolumeEcShardsCopyRequest - (*VolumeEcShardsCopyResponse)(nil), // 47: volume_server_pb.VolumeEcShardsCopyResponse - (*VolumeEcShardsDeleteRequest)(nil), // 48: volume_server_pb.VolumeEcShardsDeleteRequest - (*VolumeEcShardsDeleteResponse)(nil), // 49: volume_server_pb.VolumeEcShardsDeleteResponse - (*VolumeEcShardsMountRequest)(nil), // 50: volume_server_pb.VolumeEcShardsMountRequest - (*VolumeEcShardsMountResponse)(nil), // 51: volume_server_pb.VolumeEcShardsMountResponse - (*VolumeEcShardsUnmountRequest)(nil), // 52: volume_server_pb.VolumeEcShardsUnmountRequest - (*VolumeEcShardsUnmountResponse)(nil), // 53: volume_server_pb.VolumeEcShardsUnmountResponse - (*VolumeEcShardReadRequest)(nil), // 54: volume_server_pb.VolumeEcShardReadRequest - (*VolumeEcShardReadResponse)(nil), // 55: volume_server_pb.VolumeEcShardReadResponse - (*VolumeEcBlobDeleteRequest)(nil), // 56: volume_server_pb.VolumeEcBlobDeleteRequest - (*VolumeEcBlobDeleteResponse)(nil), // 57: volume_server_pb.VolumeEcBlobDeleteResponse - (*VolumeEcShardsToVolumeRequest)(nil), // 58: volume_server_pb.VolumeEcShardsToVolumeRequest - (*VolumeEcShardsToVolumeResponse)(nil), // 59: volume_server_pb.VolumeEcShardsToVolumeResponse - (*ReadVolumeFileStatusRequest)(nil), // 60: volume_server_pb.ReadVolumeFileStatusRequest - (*ReadVolumeFileStatusResponse)(nil), // 61: volume_server_pb.ReadVolumeFileStatusResponse - (*DiskStatus)(nil), // 62: volume_server_pb.DiskStatus - (*MemStatus)(nil), // 63: volume_server_pb.MemStatus - (*RemoteFile)(nil), // 64: volume_server_pb.RemoteFile - (*VolumeInfo)(nil), // 65: volume_server_pb.VolumeInfo - (*VolumeTierMoveDatToRemoteRequest)(nil), // 66: volume_server_pb.VolumeTierMoveDatToRemoteRequest - (*VolumeTierMoveDatToRemoteResponse)(nil), // 67: volume_server_pb.VolumeTierMoveDatToRemoteResponse - (*VolumeTierMoveDatFromRemoteRequest)(nil), // 68: volume_server_pb.VolumeTierMoveDatFromRemoteRequest - (*VolumeTierMoveDatFromRemoteResponse)(nil), // 69: volume_server_pb.VolumeTierMoveDatFromRemoteResponse - (*VolumeServerStatusRequest)(nil), // 70: volume_server_pb.VolumeServerStatusRequest - (*VolumeServerStatusResponse)(nil), // 71: volume_server_pb.VolumeServerStatusResponse - (*VolumeServerLeaveRequest)(nil), // 72: volume_server_pb.VolumeServerLeaveRequest - (*VolumeServerLeaveResponse)(nil), // 73: volume_server_pb.VolumeServerLeaveResponse - (*QueryRequest)(nil), // 74: volume_server_pb.QueryRequest - (*QueriedStripe)(nil), // 75: volume_server_pb.QueriedStripe - (*VolumeNeedleStatusRequest)(nil), // 76: volume_server_pb.VolumeNeedleStatusRequest - (*VolumeNeedleStatusResponse)(nil), // 77: volume_server_pb.VolumeNeedleStatusResponse - (*QueryRequest_Filter)(nil), // 78: volume_server_pb.QueryRequest.Filter - (*QueryRequest_InputSerialization)(nil), // 79: volume_server_pb.QueryRequest.InputSerialization - (*QueryRequest_OutputSerialization)(nil), // 80: volume_server_pb.QueryRequest.OutputSerialization - (*QueryRequest_InputSerialization_CSVInput)(nil), // 81: volume_server_pb.QueryRequest.InputSerialization.CSVInput - (*QueryRequest_InputSerialization_JSONInput)(nil), // 82: volume_server_pb.QueryRequest.InputSerialization.JSONInput - (*QueryRequest_InputSerialization_ParquetInput)(nil), // 83: volume_server_pb.QueryRequest.InputSerialization.ParquetInput - (*QueryRequest_OutputSerialization_CSVOutput)(nil), // 84: volume_server_pb.QueryRequest.OutputSerialization.CSVOutput - (*QueryRequest_OutputSerialization_JSONOutput)(nil), // 85: volume_server_pb.QueryRequest.OutputSerialization.JSONOutput + (*ReadNeedleBlobRequest)(nil), // 38: volume_server_pb.ReadNeedleBlobRequest + (*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 } var file_volume_server_proto_depIdxs = []int32{ 2, // 0: volume_server_pb.BatchDeleteResponse.results:type_name -> volume_server_pb.DeleteResult - 64, // 1: volume_server_pb.VolumeInfo.files:type_name -> volume_server_pb.RemoteFile - 62, // 2: volume_server_pb.VolumeServerStatusResponse.disk_statuses:type_name -> volume_server_pb.DiskStatus - 63, // 3: volume_server_pb.VolumeServerStatusResponse.memory_status:type_name -> volume_server_pb.MemStatus - 78, // 4: volume_server_pb.QueryRequest.filter:type_name -> volume_server_pb.QueryRequest.Filter - 79, // 5: volume_server_pb.QueryRequest.input_serialization:type_name -> volume_server_pb.QueryRequest.InputSerialization - 80, // 6: volume_server_pb.QueryRequest.output_serialization:type_name -> volume_server_pb.QueryRequest.OutputSerialization - 81, // 7: volume_server_pb.QueryRequest.InputSerialization.csv_input:type_name -> volume_server_pb.QueryRequest.InputSerialization.CSVInput - 82, // 8: volume_server_pb.QueryRequest.InputSerialization.json_input:type_name -> volume_server_pb.QueryRequest.InputSerialization.JSONInput - 83, // 9: volume_server_pb.QueryRequest.InputSerialization.parquet_input:type_name -> volume_server_pb.QueryRequest.InputSerialization.ParquetInput - 84, // 10: volume_server_pb.QueryRequest.OutputSerialization.csv_output:type_name -> volume_server_pb.QueryRequest.OutputSerialization.CSVOutput - 85, // 11: volume_server_pb.QueryRequest.OutputSerialization.json_output:type_name -> volume_server_pb.QueryRequest.OutputSerialization.JSONOutput + 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 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 @@ -5805,63 +6071,67 @@ 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 - 60, // 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.VolumeTailSender:input_type -> volume_server_pb.VolumeTailSenderRequest - 40, // 32: volume_server_pb.VolumeServer.VolumeTailReceiver:input_type -> volume_server_pb.VolumeTailReceiverRequest - 42, // 33: volume_server_pb.VolumeServer.VolumeEcShardsGenerate:input_type -> volume_server_pb.VolumeEcShardsGenerateRequest - 44, // 34: volume_server_pb.VolumeServer.VolumeEcShardsRebuild:input_type -> volume_server_pb.VolumeEcShardsRebuildRequest - 46, // 35: volume_server_pb.VolumeServer.VolumeEcShardsCopy:input_type -> volume_server_pb.VolumeEcShardsCopyRequest - 48, // 36: volume_server_pb.VolumeServer.VolumeEcShardsDelete:input_type -> volume_server_pb.VolumeEcShardsDeleteRequest - 50, // 37: volume_server_pb.VolumeServer.VolumeEcShardsMount:input_type -> volume_server_pb.VolumeEcShardsMountRequest - 52, // 38: volume_server_pb.VolumeServer.VolumeEcShardsUnmount:input_type -> volume_server_pb.VolumeEcShardsUnmountRequest - 54, // 39: volume_server_pb.VolumeServer.VolumeEcShardRead:input_type -> volume_server_pb.VolumeEcShardReadRequest - 56, // 40: volume_server_pb.VolumeServer.VolumeEcBlobDelete:input_type -> volume_server_pb.VolumeEcBlobDeleteRequest - 58, // 41: volume_server_pb.VolumeServer.VolumeEcShardsToVolume:input_type -> volume_server_pb.VolumeEcShardsToVolumeRequest - 66, // 42: volume_server_pb.VolumeServer.VolumeTierMoveDatToRemote:input_type -> volume_server_pb.VolumeTierMoveDatToRemoteRequest - 68, // 43: volume_server_pb.VolumeServer.VolumeTierMoveDatFromRemote:input_type -> volume_server_pb.VolumeTierMoveDatFromRemoteRequest - 70, // 44: volume_server_pb.VolumeServer.VolumeServerStatus:input_type -> volume_server_pb.VolumeServerStatusRequest - 72, // 45: volume_server_pb.VolumeServer.VolumeServerLeave:input_type -> volume_server_pb.VolumeServerLeaveRequest - 74, // 46: volume_server_pb.VolumeServer.Query:input_type -> volume_server_pb.QueryRequest - 76, // 47: volume_server_pb.VolumeServer.VolumeNeedleStatus:input_type -> volume_server_pb.VolumeNeedleStatusRequest - 1, // 48: volume_server_pb.VolumeServer.BatchDelete:output_type -> volume_server_pb.BatchDeleteResponse - 5, // 49: volume_server_pb.VolumeServer.VacuumVolumeCheck:output_type -> volume_server_pb.VacuumVolumeCheckResponse - 7, // 50: volume_server_pb.VolumeServer.VacuumVolumeCompact:output_type -> volume_server_pb.VacuumVolumeCompactResponse - 9, // 51: volume_server_pb.VolumeServer.VacuumVolumeCommit:output_type -> volume_server_pb.VacuumVolumeCommitResponse - 11, // 52: volume_server_pb.VolumeServer.VacuumVolumeCleanup:output_type -> volume_server_pb.VacuumVolumeCleanupResponse - 13, // 53: volume_server_pb.VolumeServer.DeleteCollection:output_type -> volume_server_pb.DeleteCollectionResponse - 15, // 54: volume_server_pb.VolumeServer.AllocateVolume:output_type -> volume_server_pb.AllocateVolumeResponse - 17, // 55: volume_server_pb.VolumeServer.VolumeSyncStatus:output_type -> volume_server_pb.VolumeSyncStatusResponse - 19, // 56: volume_server_pb.VolumeServer.VolumeIncrementalCopy:output_type -> volume_server_pb.VolumeIncrementalCopyResponse - 21, // 57: volume_server_pb.VolumeServer.VolumeMount:output_type -> volume_server_pb.VolumeMountResponse - 23, // 58: volume_server_pb.VolumeServer.VolumeUnmount:output_type -> volume_server_pb.VolumeUnmountResponse - 25, // 59: volume_server_pb.VolumeServer.VolumeDelete:output_type -> volume_server_pb.VolumeDeleteResponse - 27, // 60: volume_server_pb.VolumeServer.VolumeMarkReadonly:output_type -> volume_server_pb.VolumeMarkReadonlyResponse - 29, // 61: volume_server_pb.VolumeServer.VolumeMarkWritable:output_type -> volume_server_pb.VolumeMarkWritableResponse - 31, // 62: volume_server_pb.VolumeServer.VolumeConfigure:output_type -> volume_server_pb.VolumeConfigureResponse - 33, // 63: volume_server_pb.VolumeServer.VolumeStatus:output_type -> volume_server_pb.VolumeStatusResponse - 35, // 64: volume_server_pb.VolumeServer.VolumeCopy:output_type -> volume_server_pb.VolumeCopyResponse - 61, // 65: volume_server_pb.VolumeServer.ReadVolumeFileStatus:output_type -> volume_server_pb.ReadVolumeFileStatusResponse - 37, // 66: volume_server_pb.VolumeServer.CopyFile:output_type -> volume_server_pb.CopyFileResponse - 39, // 67: volume_server_pb.VolumeServer.VolumeTailSender:output_type -> volume_server_pb.VolumeTailSenderResponse - 41, // 68: volume_server_pb.VolumeServer.VolumeTailReceiver:output_type -> volume_server_pb.VolumeTailReceiverResponse - 43, // 69: volume_server_pb.VolumeServer.VolumeEcShardsGenerate:output_type -> volume_server_pb.VolumeEcShardsGenerateResponse - 45, // 70: volume_server_pb.VolumeServer.VolumeEcShardsRebuild:output_type -> volume_server_pb.VolumeEcShardsRebuildResponse - 47, // 71: volume_server_pb.VolumeServer.VolumeEcShardsCopy:output_type -> volume_server_pb.VolumeEcShardsCopyResponse - 49, // 72: volume_server_pb.VolumeServer.VolumeEcShardsDelete:output_type -> volume_server_pb.VolumeEcShardsDeleteResponse - 51, // 73: volume_server_pb.VolumeServer.VolumeEcShardsMount:output_type -> volume_server_pb.VolumeEcShardsMountResponse - 53, // 74: volume_server_pb.VolumeServer.VolumeEcShardsUnmount:output_type -> volume_server_pb.VolumeEcShardsUnmountResponse - 55, // 75: volume_server_pb.VolumeServer.VolumeEcShardRead:output_type -> volume_server_pb.VolumeEcShardReadResponse - 57, // 76: volume_server_pb.VolumeServer.VolumeEcBlobDelete:output_type -> volume_server_pb.VolumeEcBlobDeleteResponse - 59, // 77: volume_server_pb.VolumeServer.VolumeEcShardsToVolume:output_type -> volume_server_pb.VolumeEcShardsToVolumeResponse - 67, // 78: volume_server_pb.VolumeServer.VolumeTierMoveDatToRemote:output_type -> volume_server_pb.VolumeTierMoveDatToRemoteResponse - 69, // 79: volume_server_pb.VolumeServer.VolumeTierMoveDatFromRemote:output_type -> volume_server_pb.VolumeTierMoveDatFromRemoteResponse - 71, // 80: volume_server_pb.VolumeServer.VolumeServerStatus:output_type -> volume_server_pb.VolumeServerStatusResponse - 73, // 81: volume_server_pb.VolumeServer.VolumeServerLeave:output_type -> volume_server_pb.VolumeServerLeaveResponse - 75, // 82: volume_server_pb.VolumeServer.Query:output_type -> volume_server_pb.QueriedStripe - 77, // 83: volume_server_pb.VolumeServer.VolumeNeedleStatus:output_type -> volume_server_pb.VolumeNeedleStatusResponse - 48, // [48:84] is the sub-list for method output_type - 12, // [12:48] is the sub-list for method input_type + 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 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 @@ -6330,7 +6600,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeTailSenderRequest); i { + switch v := v.(*ReadNeedleBlobRequest); i { case 0: return &v.state case 1: @@ -6342,7 +6612,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeTailSenderResponse); i { + switch v := v.(*ReadNeedleBlobResponse); i { case 0: return &v.state case 1: @@ -6354,7 +6624,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeTailReceiverRequest); i { + switch v := v.(*WriteNeedleBlobRequest); i { case 0: return &v.state case 1: @@ -6366,7 +6636,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeTailReceiverResponse); i { + switch v := v.(*WriteNeedleBlobResponse); i { case 0: return &v.state case 1: @@ -6378,7 +6648,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsGenerateRequest); i { + switch v := v.(*VolumeTailSenderRequest); i { case 0: return &v.state case 1: @@ -6390,7 +6660,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsGenerateResponse); i { + switch v := v.(*VolumeTailSenderResponse); i { case 0: return &v.state case 1: @@ -6402,7 +6672,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsRebuildRequest); i { + switch v := v.(*VolumeTailReceiverRequest); i { case 0: return &v.state case 1: @@ -6414,7 +6684,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsRebuildResponse); i { + switch v := v.(*VolumeTailReceiverResponse); i { case 0: return &v.state case 1: @@ -6426,7 +6696,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsCopyRequest); i { + switch v := v.(*VolumeEcShardsGenerateRequest); i { case 0: return &v.state case 1: @@ -6438,7 +6708,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsCopyResponse); i { + switch v := v.(*VolumeEcShardsGenerateResponse); i { case 0: return &v.state case 1: @@ -6450,7 +6720,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsDeleteRequest); i { + switch v := v.(*VolumeEcShardsRebuildRequest); i { case 0: return &v.state case 1: @@ -6462,7 +6732,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsDeleteResponse); i { + switch v := v.(*VolumeEcShardsRebuildResponse); i { case 0: return &v.state case 1: @@ -6474,7 +6744,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsMountRequest); i { + switch v := v.(*VolumeEcShardsCopyRequest); i { case 0: return &v.state case 1: @@ -6486,7 +6756,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsMountResponse); i { + switch v := v.(*VolumeEcShardsCopyResponse); i { case 0: return &v.state case 1: @@ -6498,7 +6768,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsUnmountRequest); i { + switch v := v.(*VolumeEcShardsDeleteRequest); i { case 0: return &v.state case 1: @@ -6510,7 +6780,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsUnmountResponse); i { + switch v := v.(*VolumeEcShardsDeleteResponse); i { case 0: return &v.state case 1: @@ -6522,7 +6792,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardReadRequest); i { + switch v := v.(*VolumeEcShardsMountRequest); i { case 0: return &v.state case 1: @@ -6534,7 +6804,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardReadResponse); i { + switch v := v.(*VolumeEcShardsMountResponse); i { case 0: return &v.state case 1: @@ -6546,7 +6816,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcBlobDeleteRequest); i { + switch v := v.(*VolumeEcShardsUnmountRequest); i { case 0: return &v.state case 1: @@ -6558,7 +6828,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcBlobDeleteResponse); i { + switch v := v.(*VolumeEcShardsUnmountResponse); i { case 0: return &v.state case 1: @@ -6570,7 +6840,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsToVolumeRequest); i { + switch v := v.(*VolumeEcShardReadRequest); i { case 0: return &v.state case 1: @@ -6582,7 +6852,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeEcShardsToVolumeResponse); i { + switch v := v.(*VolumeEcShardReadResponse); i { case 0: return &v.state case 1: @@ -6594,7 +6864,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReadVolumeFileStatusRequest); i { + switch v := v.(*VolumeEcBlobDeleteRequest); i { case 0: return &v.state case 1: @@ -6606,7 +6876,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReadVolumeFileStatusResponse); i { + switch v := v.(*VolumeEcBlobDeleteResponse); i { case 0: return &v.state case 1: @@ -6618,7 +6888,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DiskStatus); i { + switch v := v.(*VolumeEcShardsToVolumeRequest); i { case 0: return &v.state case 1: @@ -6630,7 +6900,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MemStatus); i { + switch v := v.(*VolumeEcShardsToVolumeResponse); i { case 0: return &v.state case 1: @@ -6642,7 +6912,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoteFile); i { + switch v := v.(*ReadVolumeFileStatusRequest); i { case 0: return &v.state case 1: @@ -6654,7 +6924,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeInfo); i { + switch v := v.(*ReadVolumeFileStatusResponse); i { case 0: return &v.state case 1: @@ -6666,7 +6936,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeTierMoveDatToRemoteRequest); i { + switch v := v.(*DiskStatus); i { case 0: return &v.state case 1: @@ -6678,7 +6948,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeTierMoveDatToRemoteResponse); i { + switch v := v.(*MemStatus); i { case 0: return &v.state case 1: @@ -6690,7 +6960,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeTierMoveDatFromRemoteRequest); i { + switch v := v.(*RemoteFile); i { case 0: return &v.state case 1: @@ -6702,7 +6972,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeTierMoveDatFromRemoteResponse); i { + switch v := v.(*VolumeInfo); i { case 0: return &v.state case 1: @@ -6714,7 +6984,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeServerStatusRequest); i { + switch v := v.(*VolumeTierMoveDatToRemoteRequest); i { case 0: return &v.state case 1: @@ -6726,7 +6996,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeServerStatusResponse); i { + switch v := v.(*VolumeTierMoveDatToRemoteResponse); i { case 0: return &v.state case 1: @@ -6738,7 +7008,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeServerLeaveRequest); i { + switch v := v.(*VolumeTierMoveDatFromRemoteRequest); i { case 0: return &v.state case 1: @@ -6750,7 +7020,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeServerLeaveResponse); i { + switch v := v.(*VolumeTierMoveDatFromRemoteResponse); i { case 0: return &v.state case 1: @@ -6762,7 +7032,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryRequest); i { + switch v := v.(*VolumeServerStatusRequest); i { case 0: return &v.state case 1: @@ -6774,7 +7044,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueriedStripe); i { + switch v := v.(*VolumeServerStatusResponse); i { case 0: return &v.state case 1: @@ -6786,7 +7056,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeNeedleStatusRequest); i { + switch v := v.(*VolumeServerLeaveRequest); i { case 0: return &v.state case 1: @@ -6798,7 +7068,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeNeedleStatusResponse); i { + switch v := v.(*VolumeServerLeaveResponse); i { case 0: return &v.state case 1: @@ -6810,7 +7080,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryRequest_Filter); i { + switch v := v.(*QueryRequest); i { case 0: return &v.state case 1: @@ -6822,7 +7092,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryRequest_InputSerialization); i { + switch v := v.(*QueriedStripe); i { case 0: return &v.state case 1: @@ -6834,7 +7104,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryRequest_OutputSerialization); i { + switch v := v.(*VolumeNeedleStatusRequest); i { case 0: return &v.state case 1: @@ -6846,7 +7116,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryRequest_InputSerialization_CSVInput); i { + switch v := v.(*VolumeNeedleStatusResponse); i { case 0: return &v.state case 1: @@ -6858,7 +7128,7 @@ func file_volume_server_proto_init() { } } file_volume_server_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryRequest_InputSerialization_JSONInput); i { + switch v := v.(*QueryRequest_Filter); i { case 0: return &v.state case 1: @@ -6870,7 +7140,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_ParquetInput); i { + switch v := v.(*QueryRequest_InputSerialization); i { case 0: return &v.state case 1: @@ -6882,7 +7152,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_CSVOutput); i { + switch v := v.(*QueryRequest_OutputSerialization); i { case 0: return &v.state case 1: @@ -6894,6 +7164,54 @@ 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 { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_volume_server_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryRequest_InputSerialization_JSONInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_volume_server_proto_msgTypes[87].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[88].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[89].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryRequest_OutputSerialization_JSONOutput); i { case 0: return &v.state @@ -6912,7 +7230,7 @@ func file_volume_server_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_volume_server_proto_rawDesc, NumEnums: 0, - NumMessages: 86, + NumMessages: 90, NumExtensions: 0, NumServices: 1, }, @@ -6959,6 +7277,8 @@ type VolumeServerClient interface { VolumeCopy(ctx context.Context, in *VolumeCopyRequest, opts ...grpc.CallOption) (*VolumeCopyResponse, error) ReadVolumeFileStatus(ctx context.Context, in *ReadVolumeFileStatusRequest, opts ...grpc.CallOption) (*ReadVolumeFileStatusResponse, error) 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) 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 @@ -7206,6 +7526,24 @@ func (x *volumeServerCopyFileClient) Recv() (*CopyFileResponse, error) { return m, nil } +func (c *volumeServerClient) ReadNeedleBlob(ctx context.Context, in *ReadNeedleBlobRequest, opts ...grpc.CallOption) (*ReadNeedleBlobResponse, error) { + out := new(ReadNeedleBlobResponse) + err := c.cc.Invoke(ctx, "/volume_server_pb.VolumeServer/ReadNeedleBlob", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *volumeServerClient) WriteNeedleBlob(ctx context.Context, in *WriteNeedleBlobRequest, opts ...grpc.CallOption) (*WriteNeedleBlobResponse, error) { + out := new(WriteNeedleBlobResponse) + err := c.cc.Invoke(ctx, "/volume_server_pb.VolumeServer/WriteNeedleBlob", 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 { @@ -7497,6 +7835,8 @@ type VolumeServerServer interface { VolumeCopy(context.Context, *VolumeCopyRequest) (*VolumeCopyResponse, error) ReadVolumeFileStatus(context.Context, *ReadVolumeFileStatusRequest) (*ReadVolumeFileStatusResponse, error) CopyFile(*CopyFileRequest, VolumeServer_CopyFileServer) error + ReadNeedleBlob(context.Context, *ReadNeedleBlobRequest) (*ReadNeedleBlobResponse, error) + WriteNeedleBlob(context.Context, *WriteNeedleBlobRequest) (*WriteNeedleBlobResponse, error) VolumeTailSender(*VolumeTailSenderRequest, VolumeServer_VolumeTailSenderServer) error VolumeTailReceiver(context.Context, *VolumeTailReceiverRequest) (*VolumeTailReceiverResponse, error) // erasure coding @@ -7580,6 +7920,12 @@ func (*UnimplementedVolumeServerServer) ReadVolumeFileStatus(context.Context, *R func (*UnimplementedVolumeServerServer) CopyFile(*CopyFileRequest, VolumeServer_CopyFileServer) error { return status.Errorf(codes.Unimplemented, "method CopyFile not implemented") } +func (*UnimplementedVolumeServerServer) ReadNeedleBlob(context.Context, *ReadNeedleBlobRequest) (*ReadNeedleBlobResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ReadNeedleBlob not implemented") +} +func (*UnimplementedVolumeServerServer) WriteNeedleBlob(context.Context, *WriteNeedleBlobRequest) (*WriteNeedleBlobResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method WriteNeedleBlob not implemented") +} func (*UnimplementedVolumeServerServer) VolumeTailSender(*VolumeTailSenderRequest, VolumeServer_VolumeTailSenderServer) error { return status.Errorf(codes.Unimplemented, "method VolumeTailSender not implemented") } @@ -7984,6 +8330,42 @@ func (x *volumeServerCopyFileServer) Send(m *CopyFileResponse) error { return x.ServerStream.SendMsg(m) } +func _VolumeServer_ReadNeedleBlob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ReadNeedleBlobRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VolumeServerServer).ReadNeedleBlob(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/volume_server_pb.VolumeServer/ReadNeedleBlob", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VolumeServerServer).ReadNeedleBlob(ctx, req.(*ReadNeedleBlobRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _VolumeServer_WriteNeedleBlob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(WriteNeedleBlobRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VolumeServerServer).WriteNeedleBlob(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/volume_server_pb.VolumeServer/WriteNeedleBlob", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VolumeServerServer).WriteNeedleBlob(ctx, req.(*WriteNeedleBlobRequest)) + } + 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 { @@ -8377,6 +8759,14 @@ var _VolumeServer_serviceDesc = grpc.ServiceDesc{ MethodName: "ReadVolumeFileStatus", Handler: _VolumeServer_ReadVolumeFileStatus_Handler, }, + { + MethodName: "ReadNeedleBlob", + Handler: _VolumeServer_ReadNeedleBlob_Handler, + }, + { + MethodName: "WriteNeedleBlob", + Handler: _VolumeServer_WriteNeedleBlob_Handler, + }, { MethodName: "VolumeTailReceiver", Handler: _VolumeServer_VolumeTailReceiver_Handler, diff --git a/weed/server/volume_grpc_read_write.go b/weed/server/volume_grpc_read_write.go new file mode 100644 index 000000000..e1c583d87 --- /dev/null +++ b/weed/server/volume_grpc_read_write.go @@ -0,0 +1,38 @@ +package weed_server + +import ( + "context" + "fmt" + "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) ReadNeedleBlob(ctx context.Context, req *volume_server_pb.ReadNeedleBlobRequest) (resp *volume_server_pb.ReadNeedleBlobResponse, err error) { + resp = &volume_server_pb.ReadNeedleBlobResponse{} + v := vs.store.GetVolume(needle.VolumeId(req.VolumeId)) + if v == nil { + return nil, fmt.Errorf("not found volume id %d", req.VolumeId) + } + + resp.NeedleBlob, err = v.ReadNeedleBlob(req.Offset, types.Size(req.Size)) + if err != nil { + return nil, fmt.Errorf("read needle blob offset %d size %d: %v", req.Offset, req.Size, err) + } + + return resp, nil +} + +func (vs *VolumeServer) WriteNeedleBlob(ctx context.Context, req *volume_server_pb.WriteNeedleBlobRequest) (resp *volume_server_pb.WriteNeedleBlobResponse, err error) { + resp = &volume_server_pb.WriteNeedleBlobResponse{} + v := vs.store.GetVolume(needle.VolumeId(req.VolumeId)) + if v == nil { + return nil, fmt.Errorf("not found volume id %d", req.VolumeId) + } + + if err = v.WriteNeedleBlob(types.NeedleId(req.NeedleId), req.NeedleBlob, types.Size(req.Size)); err != nil { + return nil, fmt.Errorf("write blob needle %d: %v", req.NeedleId, req.Size, err) + } + + return resp, nil +} diff --git a/weed/shell/command_volume_check_disk.go b/weed/shell/command_volume_check_disk.go new file mode 100644 index 000000000..40c9e47ad --- /dev/null +++ b/weed/shell/command_volume_check_disk.go @@ -0,0 +1,243 @@ +package shell + +import ( + "bytes" + "context" + "flag" + "fmt" + "github.com/chrislusf/seaweedfs/weed/operation" + "github.com/chrislusf/seaweedfs/weed/pb/volume_server_pb" + "github.com/chrislusf/seaweedfs/weed/storage/needle_map" + "io" + "math" + "sort" +) + +func init() { + Commands = append(Commands, &commandVolumeCheckDisk{}) +} + +type commandVolumeCheckDisk struct { + env *CommandEnv +} + +func (c *commandVolumeCheckDisk) Name() string { + return "volume.check.disk" +} + +func (c *commandVolumeCheckDisk) Help() string { + return `check all replicated volumes to find and fix inconsistencies + + How it works: + + find all volumes that are replicated + for each volume id, if there are more than 2 replicas, find one pair with the largest 2 in file count. + for the pair volume A and B + append entries in A and not in B to B + append entries in B and not in A to A + +` +} + +func (c *commandVolumeCheckDisk) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { + + if err = commandEnv.confirmIsLocked(); err != nil { + return + } + + fsckCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) + verbose := fsckCommand.Bool("v", false, "verbose mode") + applyChanges := fsckCommand.Bool("force", false, "apply the fix") + if err = fsckCommand.Parse(args); err != nil { + return nil + } + + c.env = commandEnv + + // collect topology information + topologyInfo, _, err := collectTopologyInfo(commandEnv) + if err != nil { + return err + } + volumeReplicas, _ := collectVolumeReplicaLocations(topologyInfo) + + // pick 1 pairs of volume replica + fileCount := func(replica *VolumeReplica) uint64 { + return replica.info.FileCount - replica.info.DeleteCount + } + aDB, bDB := needle_map.NewMemDb(), needle_map.NewMemDb() + defer aDB.Close() + defer bDB.Close() + + for _, replicas := range volumeReplicas { + sort.Slice(replicas, func(i, j int) bool { + return fileCount(replicas[i]) > fileCount(replicas[j]) + }) + for len(replicas) >= 2 { + a, b := replicas[0], replicas[1] + if fileCount(a) == fileCount(b) { + replicas = replicas[1:] + continue + } + if a.info.ReadOnly || b.info.ReadOnly { + fmt.Fprintf(writer, "skipping readonly volume %d on %s and %s\n", a.info.Id, a.location.dataNode.Id, b.location.dataNode.Id) + continue + } + + // 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 differnces + if err := c.doVolumeCheckDisk(aDB, bDB, a, b, *verbose, writer, *applyChanges); err != nil { + return err + } + if err := c.doVolumeCheckDisk(bDB, aDB, b, a, *verbose, writer, *applyChanges); err != nil { + return err + } + replicas = replicas[1:] + } + } + + return nil +} + +func (c *commandVolumeCheckDisk) doVolumeCheckDisk(subtrahend, minuend *needle_map.MemDb, source, target *VolumeReplica, verbose bool, writer io.Writer, applyChanges bool) error { + + // find missing keys + // hash join, can be more efficient + var missingNeedles []needle_map.NeedleValue + var counter int + subtrahend.AscendingVisit(func(value needle_map.NeedleValue) error { + counter++ + if _, found := minuend.Get(value.Key); !found { + missingNeedles = append(missingNeedles, value) + } + return nil + }) + + fmt.Fprintf(writer, "%s has %d entries, %s missed %d entries\n", source.location.dataNode.Id, counter, target.location.dataNode.Id, len(missingNeedles)) + + for _, needleValue := range missingNeedles { + + needleBlob, err := c.readSourceNeedleBlob(source.location.dataNode.Id, source.info.Id, needleValue) + if err != nil { + return err + } + + if !applyChanges { + continue + } + + if verbose { + fmt.Fprintf(writer, "%s read %s \n", source.location.dataNode.Id, counter, target.location.dataNode.Id, len(missingNeedles)) + } + + if err := c.writeNeedleBlobToTarget(target.location.dataNode.Id, source.info.Id, needleValue, needleBlob); err != nil { + return err + } + + } + + + return nil +} + +func (c *commandVolumeCheckDisk) readSourceNeedleBlob(sourceVolumeServer string, volumeId uint32, needleValue needle_map.NeedleValue) (needleBlob []byte, err error) { + + err = operation.WithVolumeServerClient(sourceVolumeServer, c.env.option.GrpcDialOption, func(client volume_server_pb.VolumeServerClient) error { + resp, err := client.ReadNeedleBlob(context.Background(), &volume_server_pb.ReadNeedleBlobRequest{ + VolumeId: volumeId, + NeedleId: uint64(needleValue.Key), + Offset: needleValue.Offset.ToActualOffset(), + Size: int32(needleValue.Size), + }) + if err != nil { + return err + } + needleBlob = resp.NeedleBlob + return nil + }) + return +} + +func (c *commandVolumeCheckDisk) writeNeedleBlobToTarget(targetVolumeServer string, volumeId uint32, needleValue needle_map.NeedleValue, needleBlob []byte) error { + + return operation.WithVolumeServerClient(targetVolumeServer, c.env.option.GrpcDialOption, func(client volume_server_pb.VolumeServerClient) error { + _, err := client.WriteNeedleBlob(context.Background(), &volume_server_pb.WriteNeedleBlobRequest{ + VolumeId: volumeId, + NeedleId: uint64(needleValue.Key), + Size: int32(needleValue.Size), + NeedleBlob: needleBlob, + }) + return err + }) + +} + +func (c *commandVolumeCheckDisk) readIndexDatabase(db *needle_map.MemDb, collection string, volumeId uint32, volumeServer string, verbose bool, writer io.Writer) error { + + var buf bytes.Buffer + if err := c.copyVolumeIndexFile(collection, volumeId, volumeServer, &buf, verbose, writer); err != nil { + return err + } + + if verbose { + fmt.Fprintf(writer, "load collection %s volume %d index size %d from %s ...\n", collection, volumeId, buf.Len(), volumeServer) + } + + return db.LoadFromReaderAt(bytes.NewReader(buf.Bytes())) + +} + +func (c *commandVolumeCheckDisk) copyVolumeIndexFile(collection string, volumeId uint32, volumeServer string, buf *bytes.Buffer, verbose bool, writer io.Writer) error { + + return operation.WithVolumeServerClient(volumeServer, c.env.option.GrpcDialOption, func(volumeServerClient volume_server_pb.VolumeServerClient) error { + + ext := ".idx" + + copyFileClient, err := volumeServerClient.CopyFile(context.Background(), &volume_server_pb.CopyFileRequest{ + VolumeId: volumeId, + Ext: ".idx", + CompactionRevision: math.MaxUint32, + StopOffset: math.MaxInt64, + Collection: collection, + IsEcVolume: false, + IgnoreSourceFileNotFound: false, + }) + if err != nil { + return fmt.Errorf("failed to start copying volume %d%s: %v", volumeId, ext, err) + } + + err = writeToBuffer(copyFileClient, buf) + if err != nil { + return fmt.Errorf("failed to copy %d%s from %s: %v", volumeId, ext, volumeServer, err) + } + + return nil + + }) +} + +func writeToBuffer(client volume_server_pb.VolumeServer_CopyFileClient, buf *bytes.Buffer) error { + for { + resp, receiveErr := client.Recv() + if receiveErr == io.EOF { + break + } + if receiveErr != nil { + return fmt.Errorf("receiving: %v", receiveErr) + } + buf.Write(resp.FileContent) + } + return nil +} diff --git a/weed/storage/needle/needle_read_write.go b/weed/storage/needle/needle_read_write.go index e51df955e..2d7420639 100644 --- a/weed/storage/needle/needle_read_write.go +++ b/weed/storage/needle/needle_read_write.go @@ -3,13 +3,12 @@ package needle import ( "errors" "fmt" - "io" - "math" - "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/storage/backend" . "github.com/chrislusf/seaweedfs/weed/storage/types" "github.com/chrislusf/seaweedfs/weed/util" + "io" + "math" ) const ( @@ -156,6 +155,35 @@ func (n *Needle) Append(w backend.BackendStorageFile, version Version) (offset u return offset, size, actualSize, err } +func WriteNeedleBlob(w backend.BackendStorageFile, dataSlice []byte, size Size, appendAtNs uint64, version Version) (offset uint64, err error) { + + if end, _, e := w.GetStat(); e == nil { + defer func(w backend.BackendStorageFile, off int64) { + if err != nil { + if te := w.Truncate(end); te != nil { + glog.V(0).Infof("Failed to truncate %s back to %d with error: %v", w.Name(), end, te) + } + } + }(w, end) + offset = uint64(end) + } else { + err = fmt.Errorf("Cannot Read Current Volume Position: %v", e) + return + } + + if version == Version3 { + tsOffset := NeedleHeaderSize + size + NeedleChecksumSize + util.Uint64toBytes(dataSlice[tsOffset : tsOffset+TimestampSize], appendAtNs) + } + + if err == nil { + _, err = w.WriteAt(dataSlice, int64(offset)) + } + + return + +} + func ReadNeedleBlob(r backend.BackendStorageFile, offset int64, size Size, version Version) (dataSlice []byte, err error) { dataSize := GetActualSize(size, version) diff --git a/weed/storage/needle_map/memdb.go b/weed/storage/needle_map/memdb.go index b25b5e89a..ba1fd3d1e 100644 --- a/weed/storage/needle_map/memdb.go +++ b/weed/storage/needle_map/memdb.go @@ -2,6 +2,7 @@ package needle_map import ( "fmt" + "io" "os" "github.com/syndtr/goleveldb/leveldb" @@ -104,7 +105,13 @@ func (cm *MemDb) LoadFromIdx(idxName string) (ret error) { } defer idxFile.Close() - return idx.WalkIndexFile(idxFile, func(key NeedleId, offset Offset, size Size) error { + return cm.LoadFromReaderAt(idxFile) + +} + +func (cm *MemDb) LoadFromReaderAt(readerAt io.ReaderAt) (ret error) { + + return idx.WalkIndexFile(readerAt, func(key NeedleId, offset Offset, size Size) error { if offset.IsZero() || size.IsDeleted() { return cm.Delete(key) } diff --git a/weed/storage/volume_read.go b/weed/storage/volume_read.go index 31dd3c784..f689eeec0 100644 --- a/weed/storage/volume_read.go +++ b/weed/storage/volume_read.go @@ -58,6 +58,14 @@ func (v *Volume) readNeedle(n *needle.Needle, readOption *ReadOption) (int, erro return -1, ErrorNotFound } +// read fills in Needle content by looking up n.Id from NeedleMapper +func (v *Volume) ReadNeedleBlob(offset int64, size Size) ([]byte, error) { + v.dataFileAccessLock.RLock() + defer v.dataFileAccessLock.RUnlock() + + return needle.ReadNeedleBlob(v.DataBackend, offset, size, v.Version()) +} + type VolumeFileScanner interface { VisitSuperBlock(super_block.SuperBlock) error ReadNeedleBody() bool diff --git a/weed/storage/volume_write.go b/weed/storage/volume_write.go index c3cb813fb..a286c5dd5 100644 --- a/weed/storage/volume_write.go +++ b/weed/storage/volume_write.go @@ -299,3 +299,29 @@ func (v *Volume) startWorker() { } }() } + +func (v *Volume) WriteNeedleBlob(needleId NeedleId, needleBlob []byte, size Size) error { + + v.dataFileAccessLock.Lock() + defer v.dataFileAccessLock.Unlock() + + if MaxPossibleVolumeSize < v.nm.ContentSize()+uint64(len(needleBlob)) { + return fmt.Errorf("volume size limit %d exceeded! current size is %d", MaxPossibleVolumeSize, v.nm.ContentSize()) + } + + appendAtNs := uint64(time.Now().UnixNano()) + offset, err := needle.WriteNeedleBlob(v.DataBackend, needleBlob, size, appendAtNs, v.Version()) + + v.checkReadWriteError(err) + if err != nil { + return err + } + v.lastAppendAtNs = appendAtNs + + // add to needle map + if err = v.nm.Put(needleId, ToOffset(int64(offset)), size); err != nil { + glog.V(4).Infof("failed to put in needle map %d: %v", needleId, err) + } + + return err +} From 1dd5bc134cb896bfb9f05c9da36d298883e3f92f Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 22 Mar 2021 00:05:09 -0700 Subject: [PATCH 135/284] 2.35 --- 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 024e3d32d..7872de4c5 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.34" -version: 2.34 +appVersion: "2.35" +version: 2.35 diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index 2f4448026..e81ed4fba 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.34" - started using {.Chart.appVersion} + # imageTag: "2.35" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index a7d8cc0bf..d7f9451ce 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, 34) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 35) COMMIT = "" ) From f315eb2bb85a2e0ec73751962826a86b43a1749f Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 22 Mar 2021 00:12:53 -0700 Subject: [PATCH 136/284] fix build error --- weed/server/volume_grpc_read_write.go | 2 +- weed/shell/command_volume_check_disk.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/weed/server/volume_grpc_read_write.go b/weed/server/volume_grpc_read_write.go index e1c583d87..988e9e145 100644 --- a/weed/server/volume_grpc_read_write.go +++ b/weed/server/volume_grpc_read_write.go @@ -31,7 +31,7 @@ func (vs *VolumeServer) WriteNeedleBlob(ctx context.Context, req *volume_server_ } if err = v.WriteNeedleBlob(types.NeedleId(req.NeedleId), req.NeedleBlob, types.Size(req.Size)); err != nil { - return nil, fmt.Errorf("write blob needle %d: %v", req.NeedleId, req.Size, err) + 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_volume_check_disk.go b/weed/shell/command_volume_check_disk.go index 40c9e47ad..62eb55907 100644 --- a/weed/shell/command_volume_check_disk.go +++ b/weed/shell/command_volume_check_disk.go @@ -139,7 +139,7 @@ func (c *commandVolumeCheckDisk) doVolumeCheckDisk(subtrahend, minuend *needle_m } if verbose { - fmt.Fprintf(writer, "%s read %s \n", source.location.dataNode.Id, counter, target.location.dataNode.Id, len(missingNeedles)) + 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 { From 5d931eff2727be10ad01cd2920f8e47cf034e895 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 22 Mar 2021 13:24:07 -0700 Subject: [PATCH 137/284] avoid possible nil fix https://github.com/chrislusf/seaweedfs/issues/1928 The nil was because of `dn.Parent().UnlinkChildNode(dn.Id())` in topo.UnRegisterDataNode() function, when the dn leaves the cluster. --- weed/server/master_grpc_server.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/weed/server/master_grpc_server.go b/weed/server/master_grpc_server.go index 0f0b7f101..3e6d9bb9e 100644 --- a/weed/server/master_grpc_server.go +++ b/weed/server/master_grpc_server.go @@ -80,10 +80,14 @@ func (ms *MasterServer) SendHeartbeat(stream master_pb.Seaweed_SendHeartbeatServ dn.AdjustMaxVolumeCounts(heartbeat.MaxVolumeCounts) glog.V(4).Infof("master received heartbeat %s", heartbeat.String()) + var dataCenter string + if dc := dn.GetDataCenter(); dc != nil { + dataCenter = string(dc.Id()) + } message := &master_pb.VolumeLocation{ Url: dn.Url(), PublicUrl: dn.PublicUrl, - DataCenter: string(dn.GetDataCenter().Id()), + DataCenter: dataCenter, } if len(heartbeat.NewVolumes) > 0 || len(heartbeat.DeletedVolumes) > 0 { // process delta volume ids if exists for fast volume id updates From 288369cfc78b2e8d9d2f64a6769c9ce3f5e8ecc9 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 22 Mar 2021 16:22:19 -0700 Subject: [PATCH 138/284] mount: release resources when Forget() is called address https://github.com/chrislusf/seaweedfs/issues/1929 --- weed/filesys/file.go | 23 ++++++++++++++++------- weed/filesys/filehandle.go | 11 +++-------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/weed/filesys/file.go b/weed/filesys/file.go index da93e0fae..58605f2f1 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -151,7 +151,7 @@ func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *f } entry.Chunks = chunks file.entryViewCache, _ = filer.NonOverlappingVisibleIntervals(file.wfs.LookupFn(), chunks) - file.reader = nil + file.setReader(nil) } entry.Attributes.FileSize = req.Size file.dirtyMetadata = true @@ -261,6 +261,8 @@ func (file *File) Forget() { t := util.NewFullPath(file.dir.FullPath(), file.Name) glog.V(4).Infof("Forget file %s", t) file.wfs.fsNodeCache.DeleteFsNode(t) + file.wfs.ReleaseHandle(t, 0) + file.setReader(nil) } func (file *File) maybeLoadEntry(ctx context.Context) (entry *filer_pb.Entry, err error) { @@ -280,9 +282,6 @@ func (file *File) maybeLoadEntry(ctx context.Context) (entry *filer_pb.Entry, er return entry, err } if entry != nil { - if entry.Attributes == nil { - entry.Attributes = &filer_pb.FuseAttributes{} - } file.setEntry(entry) } else { glog.Warningf("maybeLoadEntry not found entry %s/%s: %v", file.dir.FullPath(), file.Name, err) @@ -330,19 +329,29 @@ func (file *File) addChunks(chunks []*filer_pb.FileChunk) { file.entryViewCache = filer.MergeIntoVisibles(file.entryViewCache, chunk) } - file.reader = nil + file.setReader(nil) glog.V(4).Infof("%s existing %d chunks adds %d more", file.fullpath(), len(entry.Chunks), len(chunks)) entry.Chunks = append(entry.Chunks, newChunks...) } +func (file *File) setReader(reader io.ReaderAt) { + r := file.reader + if r != nil { + if closer, ok := r.(io.Closer); ok { + closer.Close() + } + } + file.reader = reader +} + func (file *File) setEntry(entry *filer_pb.Entry) { file.entryLock.Lock() defer file.entryLock.Unlock() file.entry = entry file.entryViewCache, _ = filer.NonOverlappingVisibleIntervals(file.wfs.LookupFn(), entry.Chunks) - file.reader = nil + file.setReader(nil) } func (file *File) clearEntry() { @@ -350,7 +359,7 @@ func (file *File) clearEntry() { defer file.entryLock.Unlock() file.entry = nil file.entryViewCache = nil - file.reader = nil + file.setReader(nil) } func (file *File) saveEntry(entry *filer_pb.Entry) error { diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index 25eaf7033..53c1c23d5 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) { if chunkResolveErr != nil { return 0, fmt.Errorf("fail to resolve chunk manifest: %v", chunkResolveErr) } - fh.f.reader = nil + fh.f.setReader(nil) } reader := fh.f.reader @@ -138,7 +138,7 @@ func (fh *FileHandle) readFromChunks(buff []byte, offset int64) (int64, error) { chunkViews := filer.ViewFromVisibleIntervals(fh.f.entryViewCache, 0, math.MaxInt64) reader = filer.NewChunkReaderAtFromClient(fh.f.wfs.LookupFn(), chunkViews, fh.f.wfs.chunkCache, fileSize) } - fh.f.reader = reader + fh.f.setReader(reader) totalRead, err := reader.ReadAt(buff, offset) @@ -207,12 +207,7 @@ func (fh *FileHandle) Release(ctx context.Context, req *fuse.ReleaseRequest) err fh.f.isOpen-- fh.f.wfs.ReleaseHandle(fh.f.fullpath(), fuse.HandleID(fh.handle)) - if closer, ok := fh.f.reader.(io.Closer); ok { - if closer != nil { - closer.Close() - } - } - fh.f.reader = nil + fh.f.setReader(nil) } return nil From 8eb14967ef45732d5efbdf3b5cab97e3b2f65527 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 22 Mar 2021 21:01:43 -0700 Subject: [PATCH 139/284] shell: volume.check.disk adds optional slow mode fix https://github.com/chrislusf/seaweedfs/issues/1930 --- weed/shell/command_volume_check_disk.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/weed/shell/command_volume_check_disk.go b/weed/shell/command_volume_check_disk.go index 62eb55907..64b510383 100644 --- a/weed/shell/command_volume_check_disk.go +++ b/weed/shell/command_volume_check_disk.go @@ -46,6 +46,7 @@ func (c *commandVolumeCheckDisk) Do(args []string, commandEnv *CommandEnv, write } fsckCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) + slowMode := fsckCommand.Bool("slow", false, "slow mode checks all replicas even file counts are the same") verbose := fsckCommand.Bool("v", false, "verbose mode") applyChanges := fsckCommand.Bool("force", false, "apply the fix") if err = fsckCommand.Parse(args); err != nil { @@ -75,9 +76,11 @@ func (c *commandVolumeCheckDisk) Do(args []string, commandEnv *CommandEnv, write }) for len(replicas) >= 2 { a, b := replicas[0], replicas[1] - if fileCount(a) == fileCount(b) { - replicas = replicas[1:] - continue + if !*slowMode { + if fileCount(a) == fileCount(b) { + replicas = replicas[1:] + continue + } } if a.info.ReadOnly || b.info.ReadOnly { fmt.Fprintf(writer, "skipping readonly volume %d on %s and %s\n", a.info.Id, a.location.dataNode.Id, b.location.dataNode.Id) @@ -125,7 +128,7 @@ func (c *commandVolumeCheckDisk) doVolumeCheckDisk(subtrahend, minuend *needle_m return nil }) - fmt.Fprintf(writer, "%s has %d entries, %s missed %d entries\n", source.location.dataNode.Id, counter, target.location.dataNode.Id, len(missingNeedles)) + 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)) for _, needleValue := range missingNeedles { From d48dd0c73855a0c459ddf2ab4225675b5df31728 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 22 Mar 2021 22:12:57 -0700 Subject: [PATCH 140/284] use []byte directly instead of bytes.Buffer --- weed/filer/filechunk_manifest.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/weed/filer/filechunk_manifest.go b/weed/filer/filechunk_manifest.go index da530257a..b4bfc6842 100644 --- a/weed/filer/filechunk_manifest.go +++ b/weed/filer/filechunk_manifest.go @@ -97,20 +97,20 @@ func fetchChunk(lookupFileIdFn wdclient.LookupFileIdFunctionType, fileId string, func retriedFetchChunkData(urlStrings []string, cipherKey []byte, isGzipped bool, isFullChunk bool, isCheck bool, offset int64, size int) ([]byte, error) { var err error - var buffer bytes.Buffer var shouldRetry bool + receivedData := make([]byte, 0, size) for waitTime := time.Second; waitTime < util.RetryWaitTime; waitTime += waitTime / 2 { for _, urlString := range urlStrings { + receivedData = receivedData[:0] shouldRetry, err = util.ReadUrlAsStream(urlString+"?readDeleted=true", cipherKey, isGzipped, isFullChunk, offset, size, func(data []byte) { - buffer.Write(data) + receivedData = append(receivedData, data...) }) if !shouldRetry { break } if err != nil { glog.V(0).Infof("read %s failed, err: %v", urlString, err) - buffer.Reset() } else { break } @@ -123,7 +123,8 @@ func retriedFetchChunkData(urlStrings []string, cipherKey []byte, isGzipped bool } } - return buffer.Bytes(), err + return receivedData, err + } func MaybeManifestize(saveFunc SaveDataAsChunkFunctionType, inputChunks []*filer_pb.FileChunk) (chunks []*filer_pb.FileChunk, err error) { From 2f7c7afdec305caf2b1ea029f27b6e1b220ddc2d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 22 Mar 2021 22:13:19 -0700 Subject: [PATCH 141/284] refactor: remove unused parameter --- weed/filer/filechunk_manifest.go | 4 ++-- weed/filer/stream.go | 21 +++------------------ 2 files changed, 5 insertions(+), 20 deletions(-) diff --git a/weed/filer/filechunk_manifest.go b/weed/filer/filechunk_manifest.go index b4bfc6842..c709dc819 100644 --- a/weed/filer/filechunk_manifest.go +++ b/weed/filer/filechunk_manifest.go @@ -91,10 +91,10 @@ func fetchChunk(lookupFileIdFn wdclient.LookupFileIdFunctionType, fileId string, glog.Errorf("operation LookupFileId %s failed, err: %v", fileId, err) return nil, err } - return retriedFetchChunkData(urlStrings, cipherKey, isGzipped, true, false, 0, 0) + return retriedFetchChunkData(urlStrings, cipherKey, isGzipped, true, 0, 0) } -func retriedFetchChunkData(urlStrings []string, cipherKey []byte, isGzipped bool, isFullChunk bool, isCheck bool, offset int64, size int) ([]byte, error) { +func retriedFetchChunkData(urlStrings []string, cipherKey []byte, isGzipped bool, isFullChunk bool, offset int64, size int) ([]byte, error) { var err error var shouldRetry bool diff --git a/weed/filer/stream.go b/weed/filer/stream.go index 2584743c8..661a210ea 100644 --- a/weed/filer/stream.go +++ b/weed/filer/stream.go @@ -48,15 +48,7 @@ func StreamContent(masterClient wdclient.HasLookupFileIdFunction, w io.Writer, c for _, chunkView := range chunkViews { urlStrings := fileId2Url[chunkView.FileId] - data, err := retriedFetchChunkData( - urlStrings, - chunkView.CipherKey, - chunkView.IsGzipped, - chunkView.IsFullChunk(), - false, - chunkView.Offset, - int(chunkView.Size), - ) + data, err := retriedFetchChunkData(urlStrings, chunkView.CipherKey, chunkView.IsGzipped, chunkView.IsFullChunk(), chunkView.Offset, int(chunkView.Size)) if err != nil { glog.Errorf("read chunk: %v", err) return fmt.Errorf("read chunk: %v", err) @@ -78,14 +70,7 @@ func CheckAllChunkViews(chunkViews []*ChunkView, fileId2Url *map[string][]string urlStrings := (*fileId2Url)[chunkView.FileId] glog.V(9).Infof("Check chunk: %+v\n url: %v", chunkView, urlStrings) gErr.Go(func() error { - _, err := retriedFetchChunkData( - urlStrings, - chunkView.CipherKey, - chunkView.IsGzipped, - chunkView.IsFullChunk(), - true, - chunkView.Offset, - int(chunkView.Size)) + _, err := retriedFetchChunkData(urlStrings, chunkView.CipherKey, chunkView.IsGzipped, chunkView.IsFullChunk(), chunkView.Offset, int(chunkView.Size)) return err }) } @@ -110,7 +95,7 @@ func ReadAll(masterClient *wdclient.MasterClient, chunks []*filer_pb.FileChunk) return nil, err } - data, err := retriedFetchChunkData(urlStrings, chunkView.CipherKey, chunkView.IsGzipped, chunkView.IsFullChunk(), false, chunkView.Offset, int(chunkView.Size)) + data, err := retriedFetchChunkData(urlStrings, chunkView.CipherKey, chunkView.IsGzipped, chunkView.IsFullChunk(), chunkView.Offset, int(chunkView.Size)) if err != nil { return nil, err } From 3cbc40fa48689511dbb5a953399218e1a296a874 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 22 Mar 2021 22:32:47 -0700 Subject: [PATCH 142/284] avoid creating multiple reader --- weed/filesys/filehandle.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index 53c1c23d5..6d72e62ce 100644 --- a/weed/filesys/filehandle.go +++ b/weed/filesys/filehandle.go @@ -23,7 +23,7 @@ type FileHandle struct { dirtyPages *ContinuousDirtyPages contentType string handle uint64 - sync.RWMutex + sync.Mutex f *File RequestId fuse.RequestID // unique ID for request @@ -59,8 +59,8 @@ var _ = fs.HandleReleaser(&FileHandle{}) func (fh *FileHandle) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error { glog.V(4).Infof("%s read fh %d: [%d,%d) size %d resp.Data cap=%d", fh.f.fullpath(), fh.handle, req.Offset, req.Offset+int64(req.Size), req.Size, cap(resp.Data)) - fh.RLock() - defer fh.RUnlock() + fh.Lock() + defer fh.Unlock() if req.Size <= 0 { return nil From 4abb511db30ffc01b94013434e1d941a1e22cef1 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 22 Mar 2021 22:33:07 -0700 Subject: [PATCH 143/284] make a local copy of the in memory cached data --- weed/util/chunk_cache/chunk_cache_in_memory.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/weed/util/chunk_cache/chunk_cache_in_memory.go b/weed/util/chunk_cache/chunk_cache_in_memory.go index 1eb00e1fa..5f26b8c78 100644 --- a/weed/util/chunk_cache/chunk_cache_in_memory.go +++ b/weed/util/chunk_cache/chunk_cache_in_memory.go @@ -32,5 +32,7 @@ func (c *ChunkCacheInMemory) GetChunk(fileId string) []byte { } func (c *ChunkCacheInMemory) SetChunk(fileId string, data []byte) { - c.cache.Set(fileId, data, time.Hour) + localCopy := make([]byte, len(data)) + copy(localCopy, data) + c.cache.Set(fileId, localCopy, time.Hour) } From 5a78c6ca9928585b94b4b95bfe435ff9453bd2ee Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 22 Mar 2021 23:20:41 -0700 Subject: [PATCH 144/284] Java client: support windows --- .../src/main/java/seaweedfs/client/FilerClient.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/other/java/client/src/main/java/seaweedfs/client/FilerClient.java b/other/java/client/src/main/java/seaweedfs/client/FilerClient.java index c2ffe0ac6..257a9873d 100644 --- a/other/java/client/src/main/java/seaweedfs/client/FilerClient.java +++ b/other/java/client/src/main/java/seaweedfs/client/FilerClient.java @@ -94,7 +94,7 @@ public class FilerClient extends FilerGrpcClient { return true; } File pathFile = new File(path); - String parent = pathFile.getParent(); + String parent = pathFile.getParent().replace('\\','/'); String name = pathFile.getName(); mkdirs(parent, mode, uid, gid, userName, groupNames); @@ -115,11 +115,11 @@ public class FilerClient extends FilerGrpcClient { public boolean mv(String oldPath, String newPath) { File oldPathFile = new File(oldPath); - String oldParent = oldPathFile.getParent(); + String oldParent = oldPathFile.getParent().replace('\\','/'); String oldName = oldPathFile.getName(); File newPathFile = new File(newPath); - String newParent = newPathFile.getParent(); + String newParent = newPathFile.getParent().replace('\\','/'); String newName = newPathFile.getName(); return atomicRenameEntry(oldParent, oldName, newParent, newName); @@ -129,7 +129,7 @@ public class FilerClient extends FilerGrpcClient { public boolean rm(String path, boolean isRecursive, boolean ignoreRecusiveError) { File pathFile = new File(path); - String parent = pathFile.getParent(); + String parent = pathFile.getParent().replace('\\','/'); String name = pathFile.getName(); return deleteEntry( @@ -148,7 +148,7 @@ public class FilerClient extends FilerGrpcClient { public boolean touch(String path, int mode, int uid, int gid, String userName, String[] groupNames) { File pathFile = new File(path); - String parent = pathFile.getParent(); + String parent = pathFile.getParent().replace('\\','/'); String name = pathFile.getName(); FilerProto.Entry entry = lookupEntry(parent, name); From b5e10bf51141c543d588c08179e478e894886e98 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 22 Mar 2021 23:25:47 -0700 Subject: [PATCH 145/284] Java client 1.6.3 --- other/java/client/pom.xml | 4 ++-- other/java/client/pom.xml.deploy | 4 ++-- other/java/client/pom_debug.xml | 4 ++-- 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 +- test/random_access/pom.xml | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/other/java/client/pom.xml b/other/java/client/pom.xml index a7da16a93..e8022b8a1 100644 --- a/other/java/client/pom.xml +++ b/other/java/client/pom.xml @@ -5,7 +5,7 @@ com.github.chrislusf seaweedfs-client - 1.6.2 + 1.6.3 org.sonatype.oss @@ -86,7 +86,7 @@ kr.motd.maven os-maven-plugin - 1.6.2 + 1.6.3 diff --git a/other/java/client/pom.xml.deploy b/other/java/client/pom.xml.deploy index b45c193ec..94650f1d7 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.2 + 1.6.3 org.sonatype.oss @@ -81,7 +81,7 @@ kr.motd.maven os-maven-plugin - 1.6.2 + 1.6.3 diff --git a/other/java/client/pom_debug.xml b/other/java/client/pom_debug.xml index 217f708e9..7d5ff2aa2 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.2 + 1.6.3 org.sonatype.oss @@ -80,7 +80,7 @@ kr.motd.maven os-maven-plugin - 1.6.2 + 1.6.3 diff --git a/other/java/examples/pom.xml b/other/java/examples/pom.xml index d0f22a44d..a2137807d 100644 --- a/other/java/examples/pom.xml +++ b/other/java/examples/pom.xml @@ -11,13 +11,13 @@ com.github.chrislusf seaweedfs-client - 1.6.2 + 1.6.3 compile com.github.chrislusf seaweedfs-hadoop2-client - 1.6.2 + 1.6.3 compile diff --git a/other/java/hdfs2/dependency-reduced-pom.xml b/other/java/hdfs2/dependency-reduced-pom.xml index 64fb4da75..eb763ceda 100644 --- a/other/java/hdfs2/dependency-reduced-pom.xml +++ b/other/java/hdfs2/dependency-reduced-pom.xml @@ -301,7 +301,7 @@ - 1.6.2 + 1.6.3 2.9.2 diff --git a/other/java/hdfs2/pom.xml b/other/java/hdfs2/pom.xml index 3bc9709a7..e8efe6af9 100644 --- a/other/java/hdfs2/pom.xml +++ b/other/java/hdfs2/pom.xml @@ -5,7 +5,7 @@ 4.0.0 - 1.6.2 + 1.6.3 2.9.2 diff --git a/other/java/hdfs3/dependency-reduced-pom.xml b/other/java/hdfs3/dependency-reduced-pom.xml index ea7c08c17..d62afd6b4 100644 --- a/other/java/hdfs3/dependency-reduced-pom.xml +++ b/other/java/hdfs3/dependency-reduced-pom.xml @@ -309,7 +309,7 @@ - 1.6.2 + 1.6.3 3.1.1 diff --git a/other/java/hdfs3/pom.xml b/other/java/hdfs3/pom.xml index 3e0f373f7..b694ef21f 100644 --- a/other/java/hdfs3/pom.xml +++ b/other/java/hdfs3/pom.xml @@ -5,7 +5,7 @@ 4.0.0 - 1.6.2 + 1.6.3 3.1.1 diff --git a/test/random_access/pom.xml b/test/random_access/pom.xml index 44a3fd9df..8baaa01c7 100644 --- a/test/random_access/pom.xml +++ b/test/random_access/pom.xml @@ -40,7 +40,7 @@ kr.motd.maven os-maven-plugin - 1.6.2 + 1.6.3 From 5f0e68c21e9e7b87d9f4165714bedbb2d1827fae Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 22 Mar 2021 23:28:40 -0700 Subject: [PATCH 146/284] revert wrong change --- other/java/client/pom.xml | 2 +- other/java/client/pom.xml.deploy | 2 +- other/java/client/pom_debug.xml | 2 +- test/random_access/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/other/java/client/pom.xml b/other/java/client/pom.xml index e8022b8a1..e06d4cac6 100644 --- a/other/java/client/pom.xml +++ b/other/java/client/pom.xml @@ -86,7 +86,7 @@ kr.motd.maven os-maven-plugin - 1.6.3 + 1.6.2 diff --git a/other/java/client/pom.xml.deploy b/other/java/client/pom.xml.deploy index 94650f1d7..40ede4b99 100644 --- a/other/java/client/pom.xml.deploy +++ b/other/java/client/pom.xml.deploy @@ -81,7 +81,7 @@ kr.motd.maven os-maven-plugin - 1.6.3 + 1.6.2 diff --git a/other/java/client/pom_debug.xml b/other/java/client/pom_debug.xml index 7d5ff2aa2..5421a04af 100644 --- a/other/java/client/pom_debug.xml +++ b/other/java/client/pom_debug.xml @@ -80,7 +80,7 @@ kr.motd.maven os-maven-plugin - 1.6.3 + 1.6.2 diff --git a/test/random_access/pom.xml b/test/random_access/pom.xml index 8baaa01c7..44a3fd9df 100644 --- a/test/random_access/pom.xml +++ b/test/random_access/pom.xml @@ -40,7 +40,7 @@ kr.motd.maven os-maven-plugin - 1.6.3 + 1.6.2 From 85cff10787271fd94fec868e692cac7315d9d8fb Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 23 Mar 2021 00:46:50 -0700 Subject: [PATCH 147/284] mysql: ensure name column is case sensitive fix https://github.com/chrislusf/seaweedfs/issues/1931 --- weed/command/scaffold.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/weed/command/scaffold.go b/weed/command/scaffold.go index 07d448042..e990bb3ea 100644 --- a/weed/command/scaffold.go +++ b/weed/command/scaffold.go @@ -103,9 +103,9 @@ dir = "./filerrdb" # directory to store rocksdb files [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) COMMENT 'directory or file name', -# directory TEXT COMMENT 'full path to parent directory', +# 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; @@ -126,7 +126,7 @@ enabled = false createTable = """ CREATE TABLE IF NOT EXISTS ` + "`%s`" + ` ( dirhash BIGINT, - name VARCHAR(1000), + name VARCHAR(1000) BINARY, directory TEXT, meta LONGBLOB, PRIMARY KEY (dirhash, name) From d21a5bf5d0c4b0db1951058934701c142fbd7acc Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Tue, 23 Mar 2021 15:04:07 +0500 Subject: [PATCH 148/284] add missingKeysThreshold for fsck --- weed/shell/command_volume_check_disk.go | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/weed/shell/command_volume_check_disk.go b/weed/shell/command_volume_check_disk.go index 64b510383..b53229dbd 100644 --- a/weed/shell/command_volume_check_disk.go +++ b/weed/shell/command_volume_check_disk.go @@ -49,6 +49,8 @@ func (c *commandVolumeCheckDisk) Do(args []string, commandEnv *CommandEnv, write slowMode := fsckCommand.Bool("slow", false, "slow mode checks all replicas even file counts are the same") verbose := fsckCommand.Bool("v", false, "verbose mode") applyChanges := fsckCommand.Bool("force", false, "apply the fix") + missingKeysThreshold := fsckCommand.Float64("missingKeysThreshold", 0.3, "repair when missing keys is not more than this limit") + if err = fsckCommand.Parse(args); err != nil { return nil } @@ -101,10 +103,10 @@ func (c *commandVolumeCheckDisk) Do(args []string, commandEnv *CommandEnv, write } // find and make up the differnces - if err := c.doVolumeCheckDisk(aDB, bDB, a, b, *verbose, writer, *applyChanges); err != nil { + if err := c.doVolumeCheckDisk(aDB, bDB, a, b, *verbose, writer, *applyChanges, *missingKeysThreshold); err != nil { return err } - if err := c.doVolumeCheckDisk(bDB, aDB, b, a, *verbose, writer, *applyChanges); err != nil { + if err := c.doVolumeCheckDisk(bDB, aDB, b, a, *verbose, writer, *applyChanges, *missingKeysThreshold); err != nil { return err } replicas = replicas[1:] @@ -114,7 +116,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) error { +func (c *commandVolumeCheckDisk) doVolumeCheckDisk(subtrahend, minuend *needle_map.MemDb, source, target *VolumeReplica, verbose bool, writer io.Writer, applyChanges bool, missingKeysThreshold float64) error { // find missing keys // hash join, can be more efficient @@ -129,6 +131,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)) + missingNeedlesPercent := float64(len(missingNeedles)) / float64(counter) + if missingNeedlesPercent > missingKeysThreshold { + return fmt.Errorf( + "failed to start repair volume %d, percentage of missing keys is greater than the threshold: %.2f > %.2f", + source.info.Id, missingNeedlesPercent, missingKeysThreshold) + } for _, needleValue := range missingNeedles { @@ -151,7 +159,6 @@ func (c *commandVolumeCheckDisk) doVolumeCheckDisk(subtrahend, minuend *needle_m } - return nil } @@ -161,8 +168,8 @@ func (c *commandVolumeCheckDisk) readSourceNeedleBlob(sourceVolumeServer string, resp, err := client.ReadNeedleBlob(context.Background(), &volume_server_pb.ReadNeedleBlobRequest{ VolumeId: volumeId, NeedleId: uint64(needleValue.Key), - Offset: needleValue.Offset.ToActualOffset(), - Size: int32(needleValue.Size), + Offset: needleValue.Offset.ToActualOffset(), + Size: int32(needleValue.Size), }) if err != nil { return err @@ -177,9 +184,9 @@ func (c *commandVolumeCheckDisk) writeNeedleBlobToTarget(targetVolumeServer stri return operation.WithVolumeServerClient(targetVolumeServer, c.env.option.GrpcDialOption, func(client volume_server_pb.VolumeServerClient) error { _, err := client.WriteNeedleBlob(context.Background(), &volume_server_pb.WriteNeedleBlobRequest{ - VolumeId: volumeId, - NeedleId: uint64(needleValue.Key), - Size: int32(needleValue.Size), + VolumeId: volumeId, + NeedleId: uint64(needleValue.Key), + Size: int32(needleValue.Size), NeedleBlob: needleBlob, }) return err From 40a9e88c0710dffc780602e55cf14071c384276d Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Tue, 23 Mar 2021 21:42:35 +0500 Subject: [PATCH 149/284] rename var --- weed/shell/command_volume_check_disk.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/weed/shell/command_volume_check_disk.go b/weed/shell/command_volume_check_disk.go index b53229dbd..dc3b8ca06 100644 --- a/weed/shell/command_volume_check_disk.go +++ b/weed/shell/command_volume_check_disk.go @@ -131,11 +131,11 @@ 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)) - missingNeedlesPercent := float64(len(missingNeedles)) / float64(counter) - if missingNeedlesPercent > missingKeysThreshold { + missingNeedlesFraction := float64(len(missingNeedles)) / float64(counter) + if missingNeedlesFraction > missingKeysThreshold { return fmt.Errorf( "failed to start repair volume %d, percentage of missing keys is greater than the threshold: %.2f > %.2f", - source.info.Id, missingNeedlesPercent, missingKeysThreshold) + source.info.Id, missingNeedlesFraction, missingKeysThreshold) } for _, needleValue := range missingNeedles { From c42b95c596f762dcca2bc9c7e7a918ab8ca8b206 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 23 Mar 2021 17:27:57 -0700 Subject: [PATCH 150/284] more help message fix https://github.com/chrislusf/seaweedfs/issues/1937 --- weed/command/master.go | 2 +- weed/command/server.go | 2 +- weed/command/volume.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/weed/command/master.go b/weed/command/master.go index 40d9b9a16..82e33bae1 100644 --- a/weed/command/master.go +++ b/weed/command/master.go @@ -48,7 +48,7 @@ type MasterOptions struct { func init() { cmdMaster.Run = runMaster // break init cycle m.port = cmdMaster.Flag.Int("port", 9333, "http listen port") - m.ip = cmdMaster.Flag.String("ip", util.DetectedHostAddress(), "master | address") + m.ip = cmdMaster.Flag.String("ip", util.DetectedHostAddress(), "master | address, also used as identifier") m.ipBind = cmdMaster.Flag.String("ip.bind", "", "ip address to bind to") m.metaFolder = cmdMaster.Flag.String("mdir", os.TempDir(), "data directory to store meta data") m.peers = cmdMaster.Flag.String("peers", "", "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") diff --git a/weed/command/server.go b/weed/command/server.go index a9e1c94bb..7b184a329 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -49,7 +49,7 @@ var cmdServer = &Command{ } var ( - serverIp = cmdServer.Flag.String("ip", util.DetectedHostAddress(), "ip or server name") + serverIp = cmdServer.Flag.String("ip", util.DetectedHostAddress(), "ip or server name, also used as identifier") serverBindIp = cmdServer.Flag.String("ip.bind", "", "ip address to bind to") serverTimeout = cmdServer.Flag.Int("idleTimeout", 30, "connection idle seconds") serverDataCenter = cmdServer.Flag.String("dataCenter", "", "current volume server's data center name") diff --git a/weed/command/volume.go b/weed/command/volume.go index 0e8224dbc..7fd31665f 100644 --- a/weed/command/volume.go +++ b/weed/command/volume.go @@ -69,7 +69,7 @@ func init() { cmdVolume.Run = runVolume // break init cycle v.port = cmdVolume.Flag.Int("port", 8080, "http listen port") v.publicPort = cmdVolume.Flag.Int("port.public", 0, "port opened to public") - v.ip = cmdVolume.Flag.String("ip", util.DetectedHostAddress(), "ip or server name") + v.ip = cmdVolume.Flag.String("ip", util.DetectedHostAddress(), "ip or server name, also used as identifier") v.publicUrl = cmdVolume.Flag.String("publicUrl", "", "Publicly accessible address") v.bindIp = cmdVolume.Flag.String("ip.bind", "", "ip address to bind to") v.masters = cmdVolume.Flag.String("mserver", "localhost:9333", "comma-separated master servers") From a801332b0dc44ea3239e437b845e210c840e125e Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 24 Mar 2021 01:03:11 -0700 Subject: [PATCH 151/284] filer: return 409 if file conflicts with a directory fix https://github.com/chrislusf/seaweedfs/issues/1938 --- weed/server/filer_server_handlers_write_autochunk.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/weed/server/filer_server_handlers_write_autochunk.go b/weed/server/filer_server_handlers_write_autochunk.go index b990f6488..b44dc381a 100644 --- a/weed/server/filer_server_handlers_write_autochunk.go +++ b/weed/server/filer_server_handlers_write_autochunk.go @@ -59,6 +59,8 @@ func (fs *FilerServer) autoChunk(ctx context.Context, w http.ResponseWriter, r * if err != nil { if strings.HasPrefix(err.Error(), "read input:") { writeJsonError(w, r, 499, err) + }else if strings.HasSuffix(err.Error(), "is a file") { + writeJsonError(w, r, http.StatusConflict, err) } else { writeJsonError(w, r, http.StatusInternalServerError, err) } From 60972f1c9742f0eb10d712dae0d57459e7018a3d Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Wed, 24 Mar 2021 13:24:49 +0500 Subject: [PATCH 152/284] rename option repairThreshold --- weed/shell/command_volume_check_disk.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/weed/shell/command_volume_check_disk.go b/weed/shell/command_volume_check_disk.go index dc3b8ca06..a27c9a8ac 100644 --- a/weed/shell/command_volume_check_disk.go +++ b/weed/shell/command_volume_check_disk.go @@ -49,8 +49,7 @@ func (c *commandVolumeCheckDisk) Do(args []string, commandEnv *CommandEnv, write slowMode := fsckCommand.Bool("slow", false, "slow mode checks all replicas even file counts are the same") verbose := fsckCommand.Bool("v", false, "verbose mode") applyChanges := fsckCommand.Bool("force", false, "apply the fix") - missingKeysThreshold := fsckCommand.Float64("missingKeysThreshold", 0.3, "repair when missing keys is not more than this limit") - + repairThreshold := fsckCommand.Float64("repairThreshold", 0.3, "repair when missing keys is not more than this limit") if err = fsckCommand.Parse(args); err != nil { return nil } @@ -103,10 +102,10 @@ func (c *commandVolumeCheckDisk) Do(args []string, commandEnv *CommandEnv, write } // find and make up the differnces - if err := c.doVolumeCheckDisk(aDB, bDB, a, b, *verbose, writer, *applyChanges, *missingKeysThreshold); err != nil { + if err := c.doVolumeCheckDisk(aDB, bDB, a, b, *verbose, writer, *applyChanges, *repairThreshold); err != nil { return err } - if err := c.doVolumeCheckDisk(bDB, aDB, b, a, *verbose, writer, *applyChanges, *missingKeysThreshold); err != nil { + if err := c.doVolumeCheckDisk(bDB, aDB, b, a, *verbose, writer, *applyChanges, *repairThreshold); err != nil { return err } replicas = replicas[1:] @@ -116,7 +115,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, missingKeysThreshold float64) error { +func (c *commandVolumeCheckDisk) doVolumeCheckDisk(subtrahend, minuend *needle_map.MemDb, source, target *VolumeReplica, verbose bool, writer io.Writer, applyChanges bool, repairThreshold float64) error { // find missing keys // hash join, can be more efficient @@ -132,10 +131,10 @@ 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)) missingNeedlesFraction := float64(len(missingNeedles)) / float64(counter) - if missingNeedlesFraction > missingKeysThreshold { + if missingNeedlesFraction > repairThreshold { return fmt.Errorf( "failed to start repair volume %d, percentage of missing keys is greater than the threshold: %.2f > %.2f", - source.info.Id, missingNeedlesFraction, missingKeysThreshold) + source.info.Id, missingNeedlesFraction, repairThreshold) } for _, needleValue := range missingNeedles { From 9ce82a9cd288dc010354cfcf89bc3f0729a5272c Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Wed, 24 Mar 2021 18:45:58 +0500 Subject: [PATCH 153/284] GOMAXPROCS use defaults to the value of runtime.NumCPU https://github.com/chrislusf/seaweedfs/issues/1942 --- weed/command/master.go | 2 -- weed/command/server.go | 2 -- weed/command/volume.go | 3 --- 3 files changed, 7 deletions(-) diff --git a/weed/command/master.go b/weed/command/master.go index 82e33bae1..0f5e2156d 100644 --- a/weed/command/master.go +++ b/weed/command/master.go @@ -6,7 +6,6 @@ import ( "google.golang.org/grpc/reflection" "net/http" "os" - "runtime" "sort" "strconv" "strings" @@ -86,7 +85,6 @@ func runMaster(cmd *Command, args []string) bool { util.LoadConfiguration("security", false) util.LoadConfiguration("master", false) - runtime.GOMAXPROCS(runtime.NumCPU()) grace.SetupProfiling(*masterCpuProfile, *masterMemProfile) parent, _ := util.FullPath(*m.metaFolder).DirAndName() diff --git a/weed/command/server.go b/weed/command/server.go index 7b184a329..aef61a93c 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -3,7 +3,6 @@ package command import ( "fmt" "os" - "runtime" "runtime/pprof" "strings" "time" @@ -192,7 +191,6 @@ func runServer(cmd *Command, args []string) bool { webdavOptions.filer = &filerAddress msgBrokerOptions.filer = &filerAddress - runtime.GOMAXPROCS(runtime.NumCPU()) go stats_collect.StartMetricsServer(*serverMetricsHttpPort) folders := strings.Split(*volumeDataFolders, ",") diff --git a/weed/command/volume.go b/weed/command/volume.go index 7fd31665f..b75af0f71 100644 --- a/weed/command/volume.go +++ b/weed/command/volume.go @@ -6,7 +6,6 @@ import ( "net/http" httppprof "net/http/pprof" "os" - "runtime" "runtime/pprof" "strconv" "strings" @@ -111,8 +110,6 @@ func runVolume(cmd *Command, args []string) bool { util.LoadConfiguration("security", false) - runtime.GOMAXPROCS(runtime.NumCPU()) - // If --pprof is set we assume the caller wants to be able to collect // cpu and memory profiles via go tool pprof if !*v.pprof { From df6cf0a2fabe557a85427a865aa8256783555fae Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Wed, 24 Mar 2021 22:07:13 +0500 Subject: [PATCH 154/284] nonRepairThreshold --- weed/shell/command_volume_check_disk.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/weed/shell/command_volume_check_disk.go b/weed/shell/command_volume_check_disk.go index a27c9a8ac..05caa72e9 100644 --- a/weed/shell/command_volume_check_disk.go +++ b/weed/shell/command_volume_check_disk.go @@ -49,7 +49,7 @@ func (c *commandVolumeCheckDisk) Do(args []string, commandEnv *CommandEnv, write slowMode := fsckCommand.Bool("slow", false, "slow mode checks all replicas even file counts are the same") verbose := fsckCommand.Bool("v", false, "verbose mode") applyChanges := fsckCommand.Bool("force", false, "apply the fix") - repairThreshold := fsckCommand.Float64("repairThreshold", 0.3, "repair when missing keys is not more than this limit") + nonRepairThreshold := fsckCommand.Float64("nonRepairThreshold", 0.3, "repair when missing keys is not more than this limit") if err = fsckCommand.Parse(args); err != nil { return nil } @@ -102,10 +102,10 @@ func (c *commandVolumeCheckDisk) Do(args []string, commandEnv *CommandEnv, write } // find and make up the differnces - if err := c.doVolumeCheckDisk(aDB, bDB, a, b, *verbose, writer, *applyChanges, *repairThreshold); err != nil { + 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, *repairThreshold); err != nil { + if err := c.doVolumeCheckDisk(bDB, aDB, b, a, *verbose, writer, *applyChanges, *nonRepairThreshold); err != nil { return err } replicas = replicas[1:] @@ -115,7 +115,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, repairThreshold float64) error { +func (c *commandVolumeCheckDisk) doVolumeCheckDisk(subtrahend, minuend *needle_map.MemDb, source, target *VolumeReplica, verbose bool, writer io.Writer, applyChanges bool, nonRepairThreshold float64) error { // find missing keys // hash join, can be more efficient @@ -131,10 +131,10 @@ 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)) missingNeedlesFraction := float64(len(missingNeedles)) / float64(counter) - if missingNeedlesFraction > repairThreshold { + if missingNeedlesFraction > nonRepairThreshold { return fmt.Errorf( "failed to start repair volume %d, percentage of missing keys is greater than the threshold: %.2f > %.2f", - source.info.Id, missingNeedlesFraction, repairThreshold) + source.info.Id, missingNeedlesFraction, nonRepairThreshold) } for _, needleValue := range missingNeedles { From 020a5d40c32d458492a5ef4a960e58f24e12e991 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Wed, 24 Mar 2021 22:51:22 +0500 Subject: [PATCH 155/284] avoid counter is null --- weed/shell/command_volume_check_disk.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/weed/shell/command_volume_check_disk.go b/weed/shell/command_volume_check_disk.go index 05caa72e9..5a0d46869 100644 --- a/weed/shell/command_volume_check_disk.go +++ b/weed/shell/command_volume_check_disk.go @@ -130,6 +130,11 @@ 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 + } + missingNeedlesFraction := float64(len(missingNeedles)) / float64(counter) if missingNeedlesFraction > nonRepairThreshold { return fmt.Errorf( From 03c7953254e75994f98db56e616b5b3eec498a8c Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Wed, 9 Dec 2020 17:11:49 +0500 Subject: [PATCH 156/284] init Iam Api Server --- weed/command/command.go | 1 + weed/command/iam.go | 97 +++++++++++++++++++++++ weed/iamapi/iamapi_handlers.go | 81 +++++++++++++++++++ weed/iamapi/iamapi_management_handlers.go | 69 ++++++++++++++++ weed/iamapi/iamapi_server.go | 72 +++++++++++++++++ 5 files changed, 320 insertions(+) create mode 100644 weed/command/iam.go create mode 100644 weed/iamapi/iamapi_handlers.go create mode 100644 weed/iamapi/iamapi_management_handlers.go create mode 100644 weed/iamapi/iamapi_server.go diff --git a/weed/command/command.go b/weed/command/command.go index bbc2e0423..fea1dd9d3 100644 --- a/weed/command/command.go +++ b/weed/command/command.go @@ -23,6 +23,7 @@ var Commands = []*Command{ cmdMaster, cmdMount, cmdS3, + cmdIam, cmdMsgBroker, cmdScaffold, cmdServer, diff --git a/weed/command/iam.go b/weed/command/iam.go new file mode 100644 index 000000000..ddcddbec9 --- /dev/null +++ b/weed/command/iam.go @@ -0,0 +1,97 @@ +package command + +import ( + "context" + "fmt" + "net/http" + + "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/iamapi" + "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" + "github.com/gorilla/mux" + "time" +) + +var ( + iamStandaloneOptions IamOptions +) + +type IamOptions struct { + filer *string + masters *string + port *int +} + +func init() { + cmdIam.Run = runIam // break init cycle + iamStandaloneOptions.filer = cmdIam.Flag.String("filer", "localhost:8888", "filer server address") + iamStandaloneOptions.masters = cmdIam.Flag.String("master", "localhost:9333", "comma-separated master servers") + iamStandaloneOptions.port = cmdIam.Flag.Int("port", 8111, "iam server http listen port") +} + +var cmdIam = &Command{ + UsageLine: "iam [-port=8111] [-filer=] [-masters=,]", + Short: "start a iam API compatible server", + Long: "start a iam API compatible server.", +} + +func runIam(cmd *Command, args []string) bool { + return iamStandaloneOptions.startIamServer() +} + +func (iamopt *IamOptions) startIamServer() bool { + filerGrpcAddress, err := pb.ParseFilerGrpcAddress(*iamopt.filer) + if err != nil { + glog.Fatal(err) + return false + } + + grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client") + for { + err = pb.WithGrpcFilerClient(filerGrpcAddress, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { + resp, err := client.GetFilerConfiguration(context.Background(), &filer_pb.GetFilerConfigurationRequest{}) + if err != nil { + return fmt.Errorf("get filer %s configuration: %v", filerGrpcAddress, err) + } + glog.V(0).Infof("IAM read filer configuration: %s", resp) + return nil + }) + if err != nil { + glog.V(0).Infof("wait to connect to filer %s grpc address %s", *iamopt.filer, filerGrpcAddress) + time.Sleep(time.Second) + } else { + glog.V(0).Infof("connected to filer %s grpc address %s", *iamopt.filer, filerGrpcAddress) + break + } + } + + router := mux.NewRouter().SkipClean(true) + _, iamApiServer_err := iamapi.NewIamApiServer(router, &iamapi.IamServerOption{ + Filer: *iamopt.filer, + Port: *iamopt.port, + FilerGrpcAddress: filerGrpcAddress, + GrpcDialOption: grpcDialOption, + }) + glog.V(0).Info("NewIamApiServer created") + if iamApiServer_err != nil { + glog.Fatalf("IAM API Server startup error: %v", iamApiServer_err) + } + + httpS := &http.Server{Handler: router} + + listenAddress := fmt.Sprintf(":%d", *iamopt.port) + iamApiListener, err := util.NewListener(listenAddress, time.Duration(10)*time.Second) + if err != nil { + glog.Fatalf("IAM API Server listener on %s error: %v", listenAddress, err) + } + + glog.V(0).Infof("Start Seaweed IAM API Server %s at http port %d", util.Version(), *iamopt.port) + if err = httpS.Serve(iamApiListener); err != nil { + glog.Fatalf("IAM API Server Fail to serve: %v", err) + } + + return true +} diff --git a/weed/iamapi/iamapi_handlers.go b/weed/iamapi/iamapi_handlers.go new file mode 100644 index 000000000..c436ba998 --- /dev/null +++ b/weed/iamapi/iamapi_handlers.go @@ -0,0 +1,81 @@ +package iamapi + +import ( + "bytes" + "encoding/xml" + "fmt" + "strconv" + + "net/http" + "net/url" + "time" + + "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/s3api/s3err" +) + +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.URL) +} + +func writeErrorResponse(w http.ResponseWriter, errorCode s3err.ErrorCode, reqURL *url.URL) { + apiError := s3err.GetAPIError(errorCode) + errorResponse := getRESTErrorResponse(apiError, reqURL.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) +} diff --git a/weed/iamapi/iamapi_management_handlers.go b/weed/iamapi/iamapi_management_handlers.go new file mode 100644 index 000000000..a46a506f1 --- /dev/null +++ b/weed/iamapi/iamapi_management_handlers.go @@ -0,0 +1,69 @@ +package iamapi + +import ( + "encoding/xml" + "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/pb/iam_pb" + "github.com/chrislusf/seaweedfs/weed/s3api/s3err" + "net/http" + "net/url" + + // "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/iam" +) + +const ( + version = "2010-05-08" +) + +type ListUsersResponse struct { + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ ListUsersResponse"` + ListUsersResult struct { + Users []*iam.User `xml:"Users>member"` + IsTruncated bool `xml:"IsTruncated"` + } `xml:"ListUsersResult"` + ResponseMetadata struct { + RequestId string `xml:"RequestId"` + } `xml:"ResponseMetadata"` +} + +// {'Action': 'CreateUser', 'Version': '2010-05-08', 'UserName': 'Bob'} +// {'Action': 'ListUsers', 'Version': '2010-05-08'} +func (iama *IamApiServer) ListUsers(s3cfg *iam_pb.S3ApiConfiguration, values url.Values) ListUsersResponse { + glog.Info("Do ListUsers") + resp := ListUsersResponse{} + for _, ident := range s3cfg.Identities { + resp.ListUsersResult.Users = append(resp.ListUsersResult.Users, &iam.User{UserName: &ident.Name}) + } + return resp +} + +func (iama *IamApiServer) ListAccessKeys(values url.Values) ListUsersResponse { + return ListUsersResponse{} +} + +func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { + if err := r.ParseForm(); err != nil { + writeErrorResponse(w, s3err.ErrInvalidRequest, r.URL) + return + } + values := r.PostForm + s3cfg := &iam_pb.S3ApiConfiguration{} + if err := iama.GetS3ApiConfiguration(s3cfg); err != nil { + writeErrorResponse(w, s3err.ErrInternalError, r.URL) + return + } + + glog.Info("values ", values) + var response interface{} + switch r.Form.Get("Action") { + case "ListUsers": + response = iama.ListUsers(s3cfg, values) + case "ListAccessKeys": + response = iama.ListAccessKeys(values) + default: + writeErrorResponse(w, s3err.ErrNotImplemented, r.URL) + return + } + writeSuccessResponseXML(w, encodeResponse(response)) +} diff --git a/weed/iamapi/iamapi_server.go b/weed/iamapi/iamapi_server.go new file mode 100644 index 000000000..00c4a69a2 --- /dev/null +++ b/weed/iamapi/iamapi_server.go @@ -0,0 +1,72 @@ +package iamapi + +// https://docs.aws.amazon.com/cli/latest/reference/iam/list-roles.html +// https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html + +import ( + "bytes" + "github.com/chrislusf/seaweedfs/weed/filer" + "github.com/chrislusf/seaweedfs/weed/pb" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/chrislusf/seaweedfs/weed/pb/iam_pb" + "github.com/chrislusf/seaweedfs/weed/wdclient" + "github.com/gorilla/mux" + "google.golang.org/grpc" + "net/http" + "strings" +) + +type IamServerOption struct { + Masters string + Filer string + Port int + FilerGrpcAddress string + GrpcDialOption grpc.DialOption +} + +type IamApiServer struct { + option *IamServerOption + masterClient *wdclient.MasterClient + filerclient *filer_pb.SeaweedFilerClient +} + +func NewIamApiServer(router *mux.Router, option *IamServerOption) (iamApiServer *IamApiServer, err error) { + iamApiServer = &IamApiServer{ + option: option, + masterClient: wdclient.NewMasterClient(option.GrpcDialOption, pb.AdminShellClient, "", 0, "", strings.Split(option.Masters, ",")), + } + + iamApiServer.registerRouter(router) + + return iamApiServer, nil +} + +func (iama *IamApiServer) registerRouter(router *mux.Router) { + // API Router + apiRouter := router.PathPrefix("/").Subrouter() + // ListBuckets + + // apiRouter.Methods("GET").Path("/").HandlerFunc(track(s3a.iam.Auth(s3a.ListBucketsHandler, ACTION_ADMIN), "LIST")) + apiRouter.Path("/").Methods("POST").HandlerFunc(iama.DoActions) + // NotFound + apiRouter.NotFoundHandler = http.HandlerFunc(notFoundHandler) +} + +func (iama *IamApiServer) GetS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfiguration) (err error) { + var buf bytes.Buffer + err = pb.WithGrpcFilerClient(iama.option.FilerGrpcAddress, iama.option.GrpcDialOption, func(client filer_pb.SeaweedFilerClient) error { + if err = filer.ReadEntry(iama.masterClient, client, filer.IamConfigDirecotry, filer.IamIdentityFile, &buf); err != nil { + return err + } + return nil + }) + if err != nil { + return err + } + if buf.Len() > 0 { + if err = filer.ParseS3ConfigurationFromBytes(buf.Bytes(), s3cfg); err != nil { + return err + } + } + return nil +} From d7719d0542f58d9f12448b8bfe43c4ebc0374a17 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Thu, 10 Dec 2020 00:03:14 +0500 Subject: [PATCH 157/284] base handlers --- weed/iamapi/iamapi_management_handlers.go | 173 ++++++++++++++++++++-- 1 file changed, 158 insertions(+), 15 deletions(-) diff --git a/weed/iamapi/iamapi_management_handlers.go b/weed/iamapi/iamapi_management_handlers.go index a46a506f1..2347c9a80 100644 --- a/weed/iamapi/iamapi_management_handlers.go +++ b/weed/iamapi/iamapi_management_handlers.go @@ -2,44 +2,179 @@ package iamapi import ( "encoding/xml" + "fmt" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/iam_pb" "github.com/chrislusf/seaweedfs/weed/s3api/s3err" + "math/rand" "net/http" "net/url" + "time" // "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/iam" ) const ( - version = "2010-05-08" + version = "2010-05-08" + charsetUpper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + charset = charsetUpper + "abcdefghijklmnopqrstuvwxyz/" ) -type ListUsersResponse struct { - XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ ListUsersResponse"` - ListUsersResult struct { - Users []*iam.User `xml:"Users>member"` - IsTruncated bool `xml:"IsTruncated"` - } `xml:"ListUsersResult"` +var seededRand *rand.Rand = rand.New( + rand.NewSource(time.Now().UnixNano())) + +type Response interface { + SetRequestId() +} + +type CommonResponse struct { ResponseMetadata struct { RequestId string `xml:"RequestId"` } `xml:"ResponseMetadata"` } -// {'Action': 'CreateUser', 'Version': '2010-05-08', 'UserName': 'Bob'} -// {'Action': 'ListUsers', 'Version': '2010-05-08'} -func (iama *IamApiServer) ListUsers(s3cfg *iam_pb.S3ApiConfiguration, values url.Values) ListUsersResponse { - glog.Info("Do ListUsers") - resp := ListUsersResponse{} +type ListUsersResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ ListUsersResponse"` + ListUsersResult struct { + Users []*iam.User `xml:"Users>member"` + IsTruncated bool `xml:"IsTruncated"` + } `xml:"ListUsersResult"` +} + +type ListAccessKeysResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ ListAccessKeysResponse"` + ListAccessKeysResult struct { + AccessKeyMetadata []*iam.AccessKeyMetadata `xml:"AccessKeyMetadata>member"` + IsTruncated bool `xml:"IsTruncated"` + } `xml:"ListAccessKeysResult"` +} + +type DeleteUserResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ DeleteUserResponse"` +} + +type DeleteAccessKeyResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ DeleteAccessKeyResponse"` +} + +type CreateUserResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ CreateUserResponse"` + CreateUserResult struct { + User iam.User `xml:"User"` + } `xml:"CreateUserResult"` +} + +type CreateAccessKeyResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ CreateAccessKeyResponse"` + CreateAccessKeyResult struct { + AccessKey iam.AccessKey `xml:"AccessKey"` + } `xml:"CreateAccessKeyResult"` +} + +func (r *CommonResponse) SetRequestId() { + r.ResponseMetadata.RequestId = fmt.Sprintf("%d", time.Now().UnixNano()) +} + +func StringWithCharset(length int, charset string) string { + b := make([]byte, length) + for i := range b { + b[i] = charset[seededRand.Intn(len(charset))] + } + return string(b) +} + +func (iama *IamApiServer) ListUsers(s3cfg *iam_pb.S3ApiConfiguration, values url.Values) (resp ListUsersResponse) { for _, ident := range s3cfg.Identities { resp.ListUsersResult.Users = append(resp.ListUsersResult.Users, &iam.User{UserName: &ident.Name}) } return resp } -func (iama *IamApiServer) ListAccessKeys(values url.Values) ListUsersResponse { - return ListUsersResponse{} +func (iama *IamApiServer) ListAccessKeys(s3cfg *iam_pb.S3ApiConfiguration, values url.Values) (resp ListAccessKeysResponse) { + status := iam.StatusTypeActive + for _, ident := range s3cfg.Identities { + for _, cred := range ident.Credentials { + resp.ListAccessKeysResult.AccessKeyMetadata = append(resp.ListAccessKeysResult.AccessKeyMetadata, + &iam.AccessKeyMetadata{UserName: &ident.Name, AccessKeyId: &cred.AccessKey, Status: &status}, + ) + } + } + return resp +} + +func (iama *IamApiServer) CreateUser(s3cfg *iam_pb.S3ApiConfiguration, values url.Values) (resp CreateUserResponse) { + userName := values.Get("UserName") + resp.CreateUserResult.User.UserName = &userName + s3cfg.Identities = append(s3cfg.Identities, &iam_pb.Identity{Name: userName}) + return resp +} + +func (iama *IamApiServer) DeleteUser(s3cfg *iam_pb.S3ApiConfiguration, values url.Values) (resp DeleteUserResponse) { + userName := values.Get("UserName") + for i, ident := range s3cfg.Identities { + if userName == ident.Name { + ident.Credentials = append(ident.Credentials[:i], ident.Credentials[i+1:]...) + break + } + } + return resp +} + +func (iama *IamApiServer) CreateAccessKey(s3cfg *iam_pb.S3ApiConfiguration, values url.Values) (resp CreateAccessKeyResponse) { + userName := values.Get("UserName") + status := iam.StatusTypeActive + accessKeyId := StringWithCharset(21, charsetUpper) + secretAccessKey := StringWithCharset(42, charset) + resp.CreateAccessKeyResult.AccessKey.AccessKeyId = &accessKeyId + resp.CreateAccessKeyResult.AccessKey.SecretAccessKey = &secretAccessKey + resp.CreateAccessKeyResult.AccessKey.UserName = &userName + resp.CreateAccessKeyResult.AccessKey.Status = &status + changed := false + for _, ident := range s3cfg.Identities { + if userName == ident.Name { + ident.Credentials = append(ident.Credentials, + &iam_pb.Credential{AccessKey: accessKeyId, SecretKey: secretAccessKey}) + changed = true + break + } + } + if !changed { + s3cfg.Identities = append(s3cfg.Identities, + &iam_pb.Identity{Name: userName, + Credentials: []*iam_pb.Credential{ + { + AccessKey: accessKeyId, + SecretKey: secretAccessKey, + }, + }, + }, + ) + } + return resp +} + +func (iama *IamApiServer) DeleteAccessKey(s3cfg *iam_pb.S3ApiConfiguration, values url.Values) (resp DeleteAccessKeyResponse) { + userName := values.Get("UserName") + accessKeyId := values.Get("AccessKeyId") + for _, ident := range s3cfg.Identities { + if userName == ident.Name { + for i, cred := range ident.Credentials { + if cred.AccessKey == accessKeyId { + ident.Credentials = append(ident.Credentials[:i], ident.Credentials[i+1:]...) + break + } + } + break + } + } + return resp } func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { @@ -60,7 +195,15 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { case "ListUsers": response = iama.ListUsers(s3cfg, values) case "ListAccessKeys": - response = iama.ListAccessKeys(values) + response = iama.ListAccessKeys(s3cfg, values) + case "CreateUser": + response = iama.CreateUser(s3cfg, values) + case "DeleteUser": + response = iama.DeleteUser(s3cfg, values) + case "CreateAccessKey": + response = iama.CreateAccessKey(s3cfg, values) + case "DeleteAccessKey": + response = iama.DeleteAccessKey(s3cfg, values) default: writeErrorResponse(w, s3err.ErrNotImplemented, r.URL) return From 82b0463fac817d434fd9272d2745bd4c2fe75329 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Thu, 10 Dec 2020 15:36:04 +0500 Subject: [PATCH 158/284] handler PutUserPolicy https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutUserPolicy.html --- weed/iamapi/iamapi_management_handlers.go | 143 +++++++++++++++++++++- 1 file changed, 139 insertions(+), 4 deletions(-) diff --git a/weed/iamapi/iamapi_management_handlers.go b/weed/iamapi/iamapi_management_handlers.go index 2347c9a80..22bc8748a 100644 --- a/weed/iamapi/iamapi_management_handlers.go +++ b/weed/iamapi/iamapi_management_handlers.go @@ -1,14 +1,18 @@ package iamapi import ( + "crypto/sha1" + "encoding/json" "encoding/xml" "fmt" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/iam_pb" + "github.com/chrislusf/seaweedfs/weed/s3api/s3_constants" "github.com/chrislusf/seaweedfs/weed/s3api/s3err" "math/rand" "net/http" "net/url" + "strings" "time" // "github.com/aws/aws-sdk-go/aws" @@ -21,11 +25,19 @@ const ( charset = charsetUpper + "abcdefghijklmnopqrstuvwxyz/" ) -var seededRand *rand.Rand = rand.New( - rand.NewSource(time.Now().UnixNano())) +var ( + seededRand *rand.Rand = rand.New( + rand.NewSource(time.Now().UnixNano())) + policyDocuments = map[string]*PolicyDocument{} +) -type Response interface { - SetRequestId() +type PolicyDocument struct { + Version string `json:"Version"` + Statement []struct { + Effect string `json:"Effect"` + Action []string `json:"Action"` + Resource []string `json:"Resource"` + } `json:"Statement"` } type CommonResponse struct { @@ -62,6 +74,14 @@ type DeleteAccessKeyResponse struct { XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ DeleteAccessKeyResponse"` } +type CreatePolicyResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ CreatePolicyResponse"` + CreatePolicyResult struct { + Policy iam.Policy `xml:"Policy"` + } `xml:"CreatePolicyResult"` +} + type CreateUserResponse struct { CommonResponse XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ CreateUserResponse"` @@ -78,10 +98,21 @@ type CreateAccessKeyResponse struct { } `xml:"CreateAccessKeyResult"` } +type PutUserPolicyResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ PutUserPolicyResponse"` +} + func (r *CommonResponse) SetRequestId() { r.ResponseMetadata.RequestId = fmt.Sprintf("%d", time.Now().UnixNano()) } +func Hash(s *string) string { + h := sha1.New() + h.Write([]byte(*s)) + return fmt.Sprintf("%x", h.Sum(nil)) +} + func StringWithCharset(length int, charset string) string { b := make([]byte, length) for i := range b { @@ -115,6 +146,96 @@ func (iama *IamApiServer) CreateUser(s3cfg *iam_pb.S3ApiConfiguration, values ur s3cfg.Identities = append(s3cfg.Identities, &iam_pb.Identity{Name: userName}) return resp } +func GetPolicyDocument(policy *string) (policyDocument PolicyDocument, err error) { + if err = json.Unmarshal([]byte(*policy), &policyDocument); err != nil { + return PolicyDocument{}, err + } + return policyDocument, err +} + +func (iama *IamApiServer) CreatePolicy(s3cfg *iam_pb.S3ApiConfiguration, values url.Values) (resp CreatePolicyResponse, err error) { + policyName := values.Get("PolicyName") + policyDocumentString := values.Get("PolicyDocument") + policyDocument, err := GetPolicyDocument(&policyDocumentString) + if err != nil { + return CreatePolicyResponse{}, err + } + policyId := Hash(&policyDocumentString) + arn := fmt.Sprintf("arn:aws:iam:::policy/%s", policyName) + resp.CreatePolicyResult.Policy.PolicyName = &policyName + resp.CreatePolicyResult.Policy.Arn = &arn + resp.CreatePolicyResult.Policy.PolicyId = &policyId + policyDocuments[policyName] = &policyDocument + return resp, nil +} + +func (iama *IamApiServer) PutUserPolicy(s3cfg *iam_pb.S3ApiConfiguration, values url.Values) (resp PutUserPolicyResponse, err error) { + userName := values.Get("UserName") + policyName := values.Get("PolicyName") + policyDocumentString := values.Get("PolicyDocument") + policyDocument, err := GetPolicyDocument(&policyDocumentString) + if err != nil { + return PutUserPolicyResponse{}, err + } + policyDocuments[policyName] = &policyDocument + actions := GetActions(&policyDocument) + for _, ident := range s3cfg.Identities { + if userName == ident.Name { + for _, action := range actions { + ident.Actions = append(ident.Actions, action) + } + break + } + } + return resp, nil +} + +func MapAction(action string) string { + switch action { + case "*": + return s3_constants.ACTION_ADMIN + case "Put*": + return s3_constants.ACTION_WRITE + case "Get*": + return s3_constants.ACTION_READ + case "List*": + return s3_constants.ACTION_LIST + default: + return s3_constants.ACTION_TAGGING + } +} + +func GetActions(policy *PolicyDocument) (actions []string) { + for _, statement := range policy.Statement { + if statement.Effect != "Allow" { + continue + } + for _, resource := range statement.Resource { + // Parse "arn:aws:s3:::my-bucket/shared/*" + res := strings.Split(resource, ":") + if len(res) != 6 || res[0] != "arn:" || res[1] != "aws" || res[2] != "s3" { + continue + } + for _, action := range statement.Action { + // Parse "s3:Get*" + act := strings.Split(action, ":") + if len(act) != 2 || act[0] != "s3" { + continue + } + if res[5] == "*" { + actions = append(actions, MapAction(act[1])) + continue + } + // Parse my-bucket/shared/* + path := strings.Split(res[5], "/") + if len(path) != 2 || path[1] != "*" { + actions = append(actions, fmt.Sprintf("%s:%s", MapAction(act[1]), path[0])) + } + } + } + } + return actions +} func (iama *IamApiServer) DeleteUser(s3cfg *iam_pb.S3ApiConfiguration, values url.Values) (resp DeleteUserResponse) { userName := values.Get("UserName") @@ -204,6 +325,20 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { response = iama.CreateAccessKey(s3cfg, values) case "DeleteAccessKey": response = iama.DeleteAccessKey(s3cfg, values) + case "CreatePolicy": + var err error + response, err = iama.CreatePolicy(s3cfg, values) + if err != nil { + writeErrorResponse(w, s3err.ErrInvalidRequest, r.URL) + return + } + case "PutUserPolicy": + var err error + response, err = iama.PutUserPolicy(s3cfg, values) + if err != nil { + writeErrorResponse(w, s3err.ErrInvalidRequest, r.URL) + return + } default: writeErrorResponse(w, s3err.ErrNotImplemented, r.URL) return From 9f26f2815c756d2125bf35032058ddd0d0efba1d Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Thu, 10 Dec 2020 17:03:55 +0500 Subject: [PATCH 159/284] SaveAs S3 Configuration --- weed/filer/read_write.go | 8 ++++-- weed/iamapi/iamapi_management_handlers.go | 33 +++++++++++++++++++++-- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/weed/filer/read_write.go b/weed/filer/read_write.go index 7a6da3beb..bf9159b41 100644 --- a/weed/filer/read_write.go +++ b/weed/filer/read_write.go @@ -41,8 +41,12 @@ func ReadContent(filerAddress string, dir, name string) ([]byte, error) { } func SaveAs(host string, port int, dir, name string, contentType string, byteBuffer *bytes.Buffer) error { - - target := fmt.Sprintf("http://%s:%d%s/%s", host, port, dir, name) + 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) + } // set the HTTP method, url, and request body req, err := http.NewRequest(http.MethodPut, target, byteBuffer) diff --git a/weed/iamapi/iamapi_management_handlers.go b/weed/iamapi/iamapi_management_handlers.go index 22bc8748a..4316f0fd5 100644 --- a/weed/iamapi/iamapi_management_handlers.go +++ b/weed/iamapi/iamapi_management_handlers.go @@ -1,10 +1,12 @@ package iamapi import ( + "bytes" "crypto/sha1" "encoding/json" "encoding/xml" "fmt" + "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/iam_pb" "github.com/chrislusf/seaweedfs/weed/s3api/s3_constants" @@ -213,13 +215,15 @@ func GetActions(policy *PolicyDocument) (actions []string) { for _, resource := range statement.Resource { // Parse "arn:aws:s3:::my-bucket/shared/*" res := strings.Split(resource, ":") - if len(res) != 6 || res[0] != "arn:" || res[1] != "aws" || res[2] != "s3" { + if len(res) != 6 || res[0] != "arn" || res[1] != "aws" || res[2] != "s3" { + glog.Infof("not math resource: %s", res) continue } for _, action := range statement.Action { // Parse "s3:Get*" act := strings.Split(action, ":") if len(act) != 2 || act[0] != "s3" { + glog.Infof("not match action: %s", act) continue } if res[5] == "*" { @@ -229,8 +233,11 @@ func GetActions(policy *PolicyDocument) (actions []string) { // Parse my-bucket/shared/* path := strings.Split(res[5], "/") if len(path) != 2 || path[1] != "*" { - actions = append(actions, fmt.Sprintf("%s:%s", MapAction(act[1]), path[0])) + glog.Infof("not match bucket: %s", path) + continue } + actions = append(actions, fmt.Sprintf("%s:%s", MapAction(act[1]), path[0])) + } } } @@ -312,11 +319,14 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { glog.Info("values ", values) var response interface{} + changed := true switch r.Form.Get("Action") { case "ListUsers": response = iama.ListUsers(s3cfg, values) + changed = false case "ListAccessKeys": response = iama.ListAccessKeys(s3cfg, values) + changed = false case "CreateUser": response = iama.CreateUser(s3cfg, values) case "DeleteUser": @@ -343,5 +353,24 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { writeErrorResponse(w, s3err.ErrNotImplemented, r.URL) return } + if changed { + buf := bytes.Buffer{} + if err := filer.S3ConfigurationToText(&buf, s3cfg); err != nil { + glog.Error("S3ConfigurationToText: ", err) + writeErrorResponse(w, s3err.ErrInternalError, r.URL) + return + } + if err := filer.SaveAs( + iama.option.Filer, + 0, + filer.IamConfigDirecotry, + filer.IamIdentityFile, + "text/plain; charset=utf-8", + &buf); err != nil { + glog.Error("SaveAs: ", err) + writeErrorResponse(w, s3err.ErrInternalError, r.URL) + return + } + } writeSuccessResponseXML(w, encodeResponse(response)) } From 40938d6a47136a47f612d7a4c93862ff5e17ec45 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Thu, 10 Dec 2020 21:03:25 +0500 Subject: [PATCH 160/284] SaveInsideFiler S3 Configuration --- weed/iamapi/iamapi_management_handlers.go | 24 +++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/weed/iamapi/iamapi_management_handlers.go b/weed/iamapi/iamapi_management_handlers.go index 4316f0fd5..322c16d73 100644 --- a/weed/iamapi/iamapi_management_handlers.go +++ b/weed/iamapi/iamapi_management_handlers.go @@ -8,6 +8,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" "github.com/chrislusf/seaweedfs/weed/s3api/s3_constants" "github.com/chrislusf/seaweedfs/weed/s3api/s3err" @@ -216,7 +218,7 @@ func GetActions(policy *PolicyDocument) (actions []string) { // Parse "arn:aws:s3:::my-bucket/shared/*" res := strings.Split(resource, ":") if len(res) != 6 || res[0] != "arn" || res[1] != "aws" || res[2] != "s3" { - glog.Infof("not math resource: %s", res) + glog.Infof("not match resource: %s", res) continue } for _, action := range statement.Action { @@ -237,7 +239,6 @@ func GetActions(policy *PolicyDocument) (actions []string) { continue } actions = append(actions, fmt.Sprintf("%s:%s", MapAction(act[1]), path[0])) - } } } @@ -360,14 +361,17 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { writeErrorResponse(w, s3err.ErrInternalError, r.URL) return } - if err := filer.SaveAs( - iama.option.Filer, - 0, - filer.IamConfigDirecotry, - filer.IamIdentityFile, - "text/plain; charset=utf-8", - &buf); err != nil { - glog.Error("SaveAs: ", err) + err := pb.WithGrpcFilerClient( + iama.option.FilerGrpcAddress, + iama.option.GrpcDialOption, + func(client filer_pb.SeaweedFilerClient) error { + if err := filer.SaveInsideFiler(client, filer.IamConfigDirecotry, filer.IamIdentityFile, buf.Bytes()); err != nil { + return err + } + return nil + }, + ) + if err != nil { writeErrorResponse(w, s3err.ErrInternalError, r.URL) return } From 69b2dab9c6a6f0c7f2bb2e2e19f76f7887a5fb83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B5=B7?= Date: Thu, 25 Mar 2021 18:49:26 +0800 Subject: [PATCH 161/284] add a snowflake sequencer as more robust fid generator, but less compressable than small auto-inc id --- go.mod | 1 + go.sum | 2 ++ weed/command/scaffold.go | 2 +- weed/sequence/snowflake_sequencer.go | 43 ++++++++++++++++++++++++++++ weed/server/master_server.go | 8 ++++++ 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 weed/sequence/snowflake_sequencer.go diff --git a/go.mod b/go.mod index 028d16cf4..e792af37b 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( github.com/Shopify/sarama v1.23.1 github.com/aws/aws-sdk-go v1.34.30 github.com/buraksezer/consistent v0.0.0-20191006190839-693edf70fd72 + github.com/bwmarrin/snowflake v0.3.0 github.com/cespare/xxhash v1.1.0 github.com/chrislusf/raft v1.0.4 github.com/coreos/go-semver v0.3.0 // indirect diff --git a/go.sum b/go.sum index b49485dc6..31f5520a8 100644 --- a/go.sum +++ b/go.sum @@ -141,6 +141,8 @@ github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4Yn github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/buraksezer/consistent v0.0.0-20191006190839-693edf70fd72 h1:fUmDBbSvv1uOzo/t8WaxZMVb7BxJ8JECo5lGoR9c5bA= github.com/buraksezer/consistent v0.0.0-20191006190839-693edf70fd72/go.mod h1:OEE5igu/CDjGegM1Jn6ZMo7R6LlV/JChAkjfQQIRLpg= +github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0= +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= diff --git a/weed/command/scaffold.go b/weed/command/scaffold.go index e990bb3ea..52b547563 100644 --- a/weed/command/scaffold.go +++ b/weed/command/scaffold.go @@ -506,7 +506,7 @@ default = "localhost:8888" # used by maintenance scripts if the scripts needs [master.sequencer] -type = "raft" # Choose [raft|etcd] type for storing the file id sequence +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" diff --git a/weed/sequence/snowflake_sequencer.go b/weed/sequence/snowflake_sequencer.go new file mode 100644 index 000000000..d6479fc68 --- /dev/null +++ b/weed/sequence/snowflake_sequencer.go @@ -0,0 +1,43 @@ +package sequence + +import ( + "fmt" + "hash/fnv" + + "github.com/bwmarrin/snowflake" +) + +// a simple snowflake Sequencer +type SnowflakeSequencer struct { + node *snowflake.Node +} + +func NewSnowflakeSequencer(nodeid string) (*SnowflakeSequencer, error) { + node, err := snowflake.NewNode(int64(hash(nodeid) & 0x3ff)) + if err != nil { + fmt.Println(err) + return nil, err + } + + sequencer := &SnowflakeSequencer{node: node} + return sequencer, nil +} + +func hash(s string) uint32 { + h := fnv.New32a() + h.Write([]byte(s)) + return h.Sum32() +} + +func (m *SnowflakeSequencer) NextFileId(count uint64) uint64 { + return uint64(m.node.Generate().Int64()) +} + +// ignore setmax as we are snowflake +func (m *SnowflakeSequencer) SetMax(seenValue uint64) { +} + +// return a new id as no Peek is stored +func (m *SnowflakeSequencer) Peek() uint64 { + return uint64(m.node.Generate().Int64()) +} diff --git a/weed/server/master_server.go b/weed/server/master_server.go index 9404081b4..f5bad53fa 100644 --- a/weed/server/master_server.go +++ b/weed/server/master_server.go @@ -277,6 +277,14 @@ func (ms *MasterServer) createSequencer(option *MasterOption) sequence.Sequencer glog.Error(err) seq = nil } + case "snowflake": + var err error + glog.V(0).Infof("use a snowfalke seq id, nodeid %s:%d", option.Host, option.Port) + seq, err = sequence.NewSnowflakeSequencer(fmt.Sprintf("%s:%d", option.Host, option.Port)) + if err != nil { + glog.Error(err) + seq = nil + } default: seq = sequence.NewMemorySequencer() } From 06be5dc6c3cd50c461656e35a53585dd44d94793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B5=B7?= Date: Thu, 25 Mar 2021 18:59:40 +0800 Subject: [PATCH 162/284] log snowflake sequencer nodeid's hex when start, it'll be in part of new assigned fid --- weed/sequence/snowflake_sequencer.go | 5 ++++- weed/server/master_server.go | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/weed/sequence/snowflake_sequencer.go b/weed/sequence/snowflake_sequencer.go index d6479fc68..679588120 100644 --- a/weed/sequence/snowflake_sequencer.go +++ b/weed/sequence/snowflake_sequencer.go @@ -5,6 +5,7 @@ import ( "hash/fnv" "github.com/bwmarrin/snowflake" + "github.com/chrislusf/seaweedfs/weed/glog" ) // a simple snowflake Sequencer @@ -13,7 +14,9 @@ type SnowflakeSequencer struct { } func NewSnowflakeSequencer(nodeid string) (*SnowflakeSequencer, error) { - node, err := snowflake.NewNode(int64(hash(nodeid) & 0x3ff)) + nodeid_hash := hash(nodeid) & 0x3ff + glog.V(0).Infof("use snowfalke seq id generator, nodeid:%s hex_of_nodeid: %x", nodeid, nodeid_hash) + node, err := snowflake.NewNode(int64(nodeid_hash)) if err != nil { fmt.Println(err) return nil, err diff --git a/weed/server/master_server.go b/weed/server/master_server.go index f5bad53fa..e2b2df18d 100644 --- a/weed/server/master_server.go +++ b/weed/server/master_server.go @@ -279,7 +279,6 @@ func (ms *MasterServer) createSequencer(option *MasterOption) sequence.Sequencer } case "snowflake": var err error - glog.V(0).Infof("use a snowfalke seq id, nodeid %s:%d", option.Host, option.Port) seq, err = sequence.NewSnowflakeSequencer(fmt.Sprintf("%s:%d", option.Host, option.Port)) if err != nil { glog.Error(err) From bd7471d877614db267b8ada1bbb28544a8c401ec Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 25 Mar 2021 12:05:51 -0700 Subject: [PATCH 163/284] refactor --- weed/filer/abstract_sql/abstract_sql_store.go | 18 +++++----- weed/filer/mysql/mysql_sql_gen.go | 36 +++++++++---------- weed/filer/postgres/postgres_sql_gen.go | 36 +++++++++---------- 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/weed/filer/abstract_sql/abstract_sql_store.go b/weed/filer/abstract_sql/abstract_sql_store.go index 6f37a118b..9e52d9f87 100644 --- a/weed/filer/abstract_sql/abstract_sql_store.go +++ b/weed/filer/abstract_sql/abstract_sql_store.go @@ -13,15 +13,15 @@ import ( ) type SqlGenerator interface { - GetSqlInsert(bucket string) string - GetSqlUpdate(bucket string) string - GetSqlFind(bucket string) string - GetSqlDelete(bucket string) string - GetSqlDeleteFolderChildren(bucket string) string - GetSqlListExclusive(bucket string) string - GetSqlListInclusive(bucket string) string - GetSqlCreateTable(bucket string) string - GetSqlDropTable(bucket string) string + GetSqlInsert(tableName string) string + GetSqlUpdate(tableName string) string + GetSqlFind(tableName string) string + GetSqlDelete(tableName string) string + GetSqlDeleteFolderChildren(tableName string) string + GetSqlListExclusive(tableName string) string + GetSqlListInclusive(tableName string) string + GetSqlCreateTable(tableName string) string + GetSqlDropTable(tableName string) string } type AbstractSqlStore struct { diff --git a/weed/filer/mysql/mysql_sql_gen.go b/weed/filer/mysql/mysql_sql_gen.go index 4213cf965..2f86a5798 100644 --- a/weed/filer/mysql/mysql_sql_gen.go +++ b/weed/filer/mysql/mysql_sql_gen.go @@ -15,38 +15,38 @@ var ( _ = abstract_sql.SqlGenerator(&SqlGenMysql{}) ) -func (gen *SqlGenMysql) GetSqlInsert(bucket string) string { - return fmt.Sprintf("INSERT INTO `%s` (dirhash,name,directory,meta) VALUES(?,?,?,?)", bucket) +func (gen *SqlGenMysql) GetSqlInsert(tableName string) string { + return fmt.Sprintf("INSERT INTO `%s` (dirhash,name,directory,meta) VALUES(?,?,?,?)", tableName) } -func (gen *SqlGenMysql) GetSqlUpdate(bucket string) string { - return fmt.Sprintf("UPDATE `%s` SET meta=? WHERE dirhash=? AND name=? AND directory=?", bucket) +func (gen *SqlGenMysql) GetSqlUpdate(tableName string) string { + return fmt.Sprintf("UPDATE `%s` SET meta=? WHERE dirhash=? AND name=? AND directory=?", tableName) } -func (gen *SqlGenMysql) GetSqlFind(bucket string) string { - return fmt.Sprintf("SELECT meta FROM `%s` WHERE dirhash=? AND name=? AND directory=?", bucket) +func (gen *SqlGenMysql) GetSqlFind(tableName string) string { + return fmt.Sprintf("SELECT meta FROM `%s` WHERE dirhash=? AND name=? AND directory=?", tableName) } -func (gen *SqlGenMysql) GetSqlDelete(bucket string) string { - return fmt.Sprintf("DELETE FROM `%s` WHERE dirhash=? AND name=? AND directory=?", bucket) +func (gen *SqlGenMysql) GetSqlDelete(tableName string) string { + return fmt.Sprintf("DELETE FROM `%s` WHERE dirhash=? AND name=? AND directory=?", tableName) } -func (gen *SqlGenMysql) GetSqlDeleteFolderChildren(bucket string) string { - return fmt.Sprintf("DELETE FROM `%s` WHERE dirhash=? AND directory=?", bucket) +func (gen *SqlGenMysql) GetSqlDeleteFolderChildren(tableName string) string { + return fmt.Sprintf("DELETE FROM `%s` WHERE dirhash=? AND directory=?", tableName) } -func (gen *SqlGenMysql) GetSqlListExclusive(bucket string) string { - return fmt.Sprintf("SELECT NAME, meta FROM `%s` WHERE dirhash=? AND name>? AND directory=? AND name like ? ORDER BY NAME ASC LIMIT ?", bucket) +func (gen *SqlGenMysql) GetSqlListExclusive(tableName string) string { + return fmt.Sprintf("SELECT NAME, meta FROM `%s` WHERE dirhash=? AND name>? AND directory=? AND name like ? ORDER BY NAME ASC LIMIT ?", tableName) } -func (gen *SqlGenMysql) GetSqlListInclusive(bucket string) string { - return fmt.Sprintf("SELECT NAME, meta FROM `%s` WHERE dirhash=? AND name>=? AND directory=? AND name like ? ORDER BY NAME ASC LIMIT ?", bucket) +func (gen *SqlGenMysql) GetSqlListInclusive(tableName string) string { + return fmt.Sprintf("SELECT NAME, meta FROM `%s` WHERE dirhash=? AND name>=? AND directory=? AND name like ? ORDER BY NAME ASC LIMIT ?", tableName) } -func (gen *SqlGenMysql) GetSqlCreateTable(bucket string) string { - return fmt.Sprintf(gen.CreateTableSqlTemplate, bucket) +func (gen *SqlGenMysql) GetSqlCreateTable(tableName string) string { + return fmt.Sprintf(gen.CreateTableSqlTemplate, tableName) } -func (gen *SqlGenMysql) GetSqlDropTable(bucket string) string { - return fmt.Sprintf(gen.DropTableSqlTemplate, bucket) +func (gen *SqlGenMysql) GetSqlDropTable(tableName string) string { + return fmt.Sprintf(gen.DropTableSqlTemplate, tableName) } diff --git a/weed/filer/postgres/postgres_sql_gen.go b/weed/filer/postgres/postgres_sql_gen.go index e13070c3d..0d1c343c5 100644 --- a/weed/filer/postgres/postgres_sql_gen.go +++ b/weed/filer/postgres/postgres_sql_gen.go @@ -16,38 +16,38 @@ var ( _ = abstract_sql.SqlGenerator(&SqlGenPostgres{}) ) -func (gen *SqlGenPostgres) GetSqlInsert(bucket string) string { - return fmt.Sprintf(`INSERT INTO "%s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4)`, bucket) +func (gen *SqlGenPostgres) GetSqlInsert(tableName string) string { + return fmt.Sprintf(`INSERT INTO "%s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4)`, tableName) } -func (gen *SqlGenPostgres) GetSqlUpdate(bucket string) string { - return fmt.Sprintf(`UPDATE "%s" SET meta=$1 WHERE dirhash=$2 AND name=$3 AND directory=$4`, bucket) +func (gen *SqlGenPostgres) GetSqlUpdate(tableName string) string { + return fmt.Sprintf(`UPDATE "%s" SET meta=$1 WHERE dirhash=$2 AND name=$3 AND directory=$4`, tableName) } -func (gen *SqlGenPostgres) GetSqlFind(bucket string) string { - return fmt.Sprintf(`SELECT meta FROM "%s" WHERE dirhash=$1 AND name=$2 AND directory=$3`, bucket) +func (gen *SqlGenPostgres) GetSqlFind(tableName string) string { + return fmt.Sprintf(`SELECT meta FROM "%s" WHERE dirhash=$1 AND name=$2 AND directory=$3`, tableName) } -func (gen *SqlGenPostgres) GetSqlDelete(bucket string) string { - return fmt.Sprintf(`DELETE FROM "%s" WHERE dirhash=$1 AND name=$2 AND directory=$3`, bucket) +func (gen *SqlGenPostgres) GetSqlDelete(tableName string) string { + return fmt.Sprintf(`DELETE FROM "%s" WHERE dirhash=$1 AND name=$2 AND directory=$3`, tableName) } -func (gen *SqlGenPostgres) GetSqlDeleteFolderChildren(bucket string) string { - return fmt.Sprintf(`DELETE FROM "%s" WHERE dirhash=$1 AND directory=$2`, bucket) +func (gen *SqlGenPostgres) GetSqlDeleteFolderChildren(tableName string) string { + return fmt.Sprintf(`DELETE FROM "%s" WHERE dirhash=$1 AND directory=$2`, tableName) } -func (gen *SqlGenPostgres) GetSqlListExclusive(bucket string) string { - return fmt.Sprintf(`SELECT NAME, meta FROM "%s" WHERE dirhash=$1 AND name>$2 AND directory=$3 AND name like $4 ORDER BY NAME ASC LIMIT $5`, bucket) +func (gen *SqlGenPostgres) GetSqlListExclusive(tableName string) string { + return fmt.Sprintf(`SELECT NAME, meta FROM "%s" WHERE dirhash=$1 AND name>$2 AND directory=$3 AND name like $4 ORDER BY NAME ASC LIMIT $5`, tableName) } -func (gen *SqlGenPostgres) GetSqlListInclusive(bucket string) string { - return fmt.Sprintf(`SELECT NAME, meta FROM "%s" WHERE dirhash=$1 AND name>=$2 AND directory=$3 AND name like $4 ORDER BY NAME ASC LIMIT $5`, bucket) +func (gen *SqlGenPostgres) GetSqlListInclusive(tableName string) string { + return fmt.Sprintf(`SELECT NAME, meta FROM "%s" WHERE dirhash=$1 AND name>=$2 AND directory=$3 AND name like $4 ORDER BY NAME ASC LIMIT $5`, tableName) } -func (gen *SqlGenPostgres) GetSqlCreateTable(bucket string) string { - return fmt.Sprintf(gen.CreateTableSqlTemplate, bucket) +func (gen *SqlGenPostgres) GetSqlCreateTable(tableName string) string { + return fmt.Sprintf(gen.CreateTableSqlTemplate, tableName) } -func (gen *SqlGenPostgres) GetSqlDropTable(bucket string) string { - return fmt.Sprintf(gen.DropTableSqlTemplate, bucket) +func (gen *SqlGenPostgres) GetSqlDropTable(tableName string) string { + return fmt.Sprintf(gen.DropTableSqlTemplate, tableName) } From 6b7aa9633fcffe36b29961108d1d811952ab093a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 28 Mar 2021 19:09:06 -0700 Subject: [PATCH 164/284] 2.36 --- 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 7872de4c5..17f72ed5e 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.35" -version: 2.35 +appVersion: "2.36" +version: 2.36 diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index e81ed4fba..389ff2503 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.35" - started using {.Chart.appVersion} + # imageTag: "2.36" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index d7f9451ce..11f250c73 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, 35) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 36) COMMIT = "" ) From 4a02389eb08c3b7fcb7fe157f51e526df5220ac4 Mon Sep 17 00:00:00 2001 From: LazyDBA247-Anyvision Date: Mon, 29 Mar 2021 09:58:13 +0300 Subject: [PATCH 165/284] Adding custom insertQuery support for postgres/2 mysql/2 --- weed/filer/mysql/mysql_sql_gen.go | 8 +++++++- weed/filer/mysql/mysql_store.go | 7 +++++-- weed/filer/mysql2/mysql2_store.go | 4 +++- weed/filer/postgres/postgres_sql_gen.go | 7 ++++++- weed/filer/postgres/postgres_store.go | 4 +++- weed/filer/postgres2/postgres2_store.go | 4 +++- 6 files changed, 27 insertions(+), 7 deletions(-) diff --git a/weed/filer/mysql/mysql_sql_gen.go b/weed/filer/mysql/mysql_sql_gen.go index 2f86a5798..105f3e62a 100644 --- a/weed/filer/mysql/mysql_sql_gen.go +++ b/weed/filer/mysql/mysql_sql_gen.go @@ -2,6 +2,7 @@ package mysql import ( "fmt" + "github.com/chrislusf/seaweedfs/weed/filer/abstract_sql" _ "github.com/go-sql-driver/mysql" ) @@ -9,6 +10,7 @@ import ( type SqlGenMysql struct { CreateTableSqlTemplate string DropTableSqlTemplate string + InsertQueryTemplate string } var ( @@ -16,7 +18,11 @@ var ( ) func (gen *SqlGenMysql) GetSqlInsert(tableName string) string { - return fmt.Sprintf("INSERT INTO `%s` (dirhash,name,directory,meta) VALUES(?,?,?,?)", tableName) + if gen.InsertQueryTemplate != "" { + return fmt.Sprintf(gen.InsertQueryTemplate, tableName) + } else { + return fmt.Sprintf("INSERT INTO `%s` (dirhash,name,directory,meta) VALUES(?,?,?,?)", tableName) + } } func (gen *SqlGenMysql) GetSqlUpdate(tableName string) string { diff --git a/weed/filer/mysql/mysql_store.go b/weed/filer/mysql/mysql_store.go index 501ab1d39..4b73faacf 100644 --- a/weed/filer/mysql/mysql_store.go +++ b/weed/filer/mysql/mysql_store.go @@ -3,9 +3,10 @@ package mysql import ( "database/sql" "fmt" - "github.com/chrislusf/seaweedfs/weed/filer" "time" + "github.com/chrislusf/seaweedfs/weed/filer" + "github.com/chrislusf/seaweedfs/weed/filer/abstract_sql" "github.com/chrislusf/seaweedfs/weed/util" _ "github.com/go-sql-driver/mysql" @@ -29,6 +30,7 @@ func (store *MysqlStore) GetName() string { func (store *MysqlStore) Initialize(configuration util.Configuration, prefix string) (err error) { return store.initialize( + configuration.GetString(prefix+"insertQuery"), configuration.GetString(prefix+"username"), configuration.GetString(prefix+"password"), configuration.GetString(prefix+"hostname"), @@ -41,13 +43,14 @@ func (store *MysqlStore) Initialize(configuration util.Configuration, prefix str ) } -func (store *MysqlStore) initialize(user, password, hostname string, port int, database string, maxIdle, maxOpen, +func (store *MysqlStore) initialize(insertQuery, user, password, hostname string, port int, database string, maxIdle, maxOpen, maxLifetimeSeconds int, interpolateParams bool) (err error) { store.SupportBucketTable = false store.SqlGenerator = &SqlGenMysql{ CreateTableSqlTemplate: "", DropTableSqlTemplate: "drop table `%s`", + InsertQueryTemplate: insertQuery, } sqlUrl := fmt.Sprintf(CONNECTION_URL_PATTERN, user, password, hostname, port, database) diff --git a/weed/filer/mysql2/mysql2_store.go b/weed/filer/mysql2/mysql2_store.go index c796cd6aa..3c51f9363 100644 --- a/weed/filer/mysql2/mysql2_store.go +++ b/weed/filer/mysql2/mysql2_store.go @@ -32,6 +32,7 @@ func (store *MysqlStore2) GetName() string { func (store *MysqlStore2) Initialize(configuration util.Configuration, prefix string) (err error) { return store.initialize( configuration.GetString(prefix+"createTable"), + configuration.GetString(prefix+"insertQuery"), configuration.GetString(prefix+"username"), configuration.GetString(prefix+"password"), configuration.GetString(prefix+"hostname"), @@ -44,13 +45,14 @@ func (store *MysqlStore2) Initialize(configuration util.Configuration, prefix st ) } -func (store *MysqlStore2) initialize(createTable, user, password, hostname string, port int, database string, maxIdle, maxOpen, +func (store *MysqlStore2) initialize(createTable, insertQuery, user, password, hostname string, port int, database string, maxIdle, maxOpen, maxLifetimeSeconds int, interpolateParams bool) (err error) { store.SupportBucketTable = true store.SqlGenerator = &mysql.SqlGenMysql{ CreateTableSqlTemplate: createTable, DropTableSqlTemplate: "drop table `%s`", + InsertQueryTemplate: insertQuery, } sqlUrl := fmt.Sprintf(CONNECTION_URL_PATTERN, user, password, hostname, port, database) diff --git a/weed/filer/postgres/postgres_sql_gen.go b/weed/filer/postgres/postgres_sql_gen.go index 0d1c343c5..21a87ef5a 100644 --- a/weed/filer/postgres/postgres_sql_gen.go +++ b/weed/filer/postgres/postgres_sql_gen.go @@ -10,6 +10,7 @@ import ( type SqlGenPostgres struct { CreateTableSqlTemplate string DropTableSqlTemplate string + InsertQueryTemplate string } var ( @@ -17,7 +18,11 @@ var ( ) func (gen *SqlGenPostgres) GetSqlInsert(tableName string) string { - return fmt.Sprintf(`INSERT INTO "%s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4)`, tableName) + if gen.InsertQueryTemplate != "" { + return fmt.Sprintf(gen.InsertQueryTemplate, tableName) + } else { + return fmt.Sprintf(`INSERT INTO "%s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4)`, tableName) + } } func (gen *SqlGenPostgres) GetSqlUpdate(tableName string) string { diff --git a/weed/filer/postgres/postgres_store.go b/weed/filer/postgres/postgres_store.go index 9e4ff7c32..ea9b1c71e 100644 --- a/weed/filer/postgres/postgres_store.go +++ b/weed/filer/postgres/postgres_store.go @@ -29,6 +29,7 @@ func (store *PostgresStore) GetName() string { func (store *PostgresStore) Initialize(configuration util.Configuration, prefix string) (err error) { return store.initialize( + configuration.GetString(prefix+"insertQuery"), configuration.GetString(prefix+"username"), configuration.GetString(prefix+"password"), configuration.GetString(prefix+"hostname"), @@ -42,12 +43,13 @@ func (store *PostgresStore) Initialize(configuration util.Configuration, prefix ) } -func (store *PostgresStore) initialize(user, password, hostname string, port int, database, schema, sslmode string, maxIdle, maxOpen, maxLifetimeSeconds int) (err error) { +func (store *PostgresStore) initialize(insertQuery, user, password, hostname string, port int, database, schema, sslmode string, maxIdle, maxOpen, maxLifetimeSeconds int) (err error) { store.SupportBucketTable = false store.SqlGenerator = &SqlGenPostgres{ CreateTableSqlTemplate: "", DropTableSqlTemplate: `drop table "%s"`, + InsertQueryTemplate: insertQuery, } sqlUrl := fmt.Sprintf(CONNECTION_URL_PATTERN, hostname, port, sslmode) diff --git a/weed/filer/postgres2/postgres2_store.go b/weed/filer/postgres2/postgres2_store.go index 92893bf7a..b83945db6 100644 --- a/weed/filer/postgres2/postgres2_store.go +++ b/weed/filer/postgres2/postgres2_store.go @@ -32,6 +32,7 @@ func (store *PostgresStore2) GetName() string { func (store *PostgresStore2) Initialize(configuration util.Configuration, prefix string) (err error) { return store.initialize( configuration.GetString(prefix+"createTable"), + configuration.GetString(prefix+"insertQuery"), configuration.GetString(prefix+"username"), configuration.GetString(prefix+"password"), configuration.GetString(prefix+"hostname"), @@ -45,12 +46,13 @@ func (store *PostgresStore2) Initialize(configuration util.Configuration, prefix ) } -func (store *PostgresStore2) initialize(createTable, user, password, hostname string, port int, database, schema, sslmode string, maxIdle, maxOpen, maxLifetimeSeconds int) (err error) { +func (store *PostgresStore2) initialize(createTable, insertQuery, user, password, hostname string, port int, database, schema, sslmode string, maxIdle, maxOpen, maxLifetimeSeconds int) (err error) { store.SupportBucketTable = true store.SqlGenerator = &postgres.SqlGenPostgres{ CreateTableSqlTemplate: createTable, DropTableSqlTemplate: `drop table "%s"`, + InsertQueryTemplate: insertQuery, } sqlUrl := fmt.Sprintf(CONNECTION_URL_PATTERN, hostname, port, sslmode) From 96c62bd34d4d2c99dea3164a9c062abaddb4eaab Mon Sep 17 00:00:00 2001 From: LazyDBA247-Anyvision Date: Mon, 29 Mar 2021 10:01:12 +0300 Subject: [PATCH 166/284] scaffold - insertQuery Example for upsert query for mysql & postgres variants --- weed/command/scaffold.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/weed/command/scaffold.go b/weed/command/scaffold.go index 52b547563..3296ebf21 100644 --- a/weed/command/scaffold.go +++ b/weed/command/scaffold.go @@ -102,6 +102,10 @@ enabled = false dir = "./filerrdb" # directory to store rocksdb files [mysql] # or memsql, tidb +# Empty insertQuery will use the default insert query +# example insertQuery can be for UPSERT syntax: +# insertQuery = """INSERT INTO ` + "`%s`" + ` (dirhash,name,directory,meta) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE meta = VALUES(meta)""" +insertQuery = "" # 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', @@ -123,6 +127,10 @@ interpolateParams = false [mysql2] # or memsql, tidb enabled = false +# Empty insertQuery will use the default insert query +# example insertQuery can be for UPSERT syntax: +# insertQuery = """INSERT INTO ` + "`%s`" + ` (dirhash,name,directory,meta) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE meta = VALUES(meta)""" +insertQuery = "" createTable = """ CREATE TABLE IF NOT EXISTS ` + "`%s`" + ` ( dirhash BIGINT, @@ -143,6 +151,10 @@ connection_max_lifetime_seconds = 0 interpolateParams = false [postgres] # or cockroachdb, YugabyteDB +# Empty insertQuery will use the default insert query +# example insertQuery can be for UPSERT syntax: +# insertQuery = """INSERT INTO "%[1]s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4) ON CONFLICT ON CONSTRAINT "%[1]s_pkey" DO UPDATE SET meta = EXCLUDED.meta WHERE "%[1]s".meta != EXCLUDED.meta""" +insertQuery = "" # CREATE TABLE IF NOT EXISTS filemeta ( # dirhash BIGINT, # name VARCHAR(65535), @@ -164,6 +176,10 @@ connection_max_lifetime_seconds = 0 [postgres2] enabled = false +# Empty insertQuery will use the default insert query +# example insertQuery can be for UPSERT syntax: +# insertQuery = """INSERT INTO "%[1]s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4) ON CONFLICT ON CONSTRAINT "%[1]s_pkey" DO UPDATE SET meta = EXCLUDED.meta WHERE "%[1]s".meta != EXCLUDED.meta""" +insertQuery = "" createTable = """ CREATE TABLE IF NOT EXISTS "%s" ( dirhash BIGINT, From 8a95f9c10c3d4c9e1f6761f5620da3e5253398f5 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Mon, 29 Mar 2021 12:01:44 +0500 Subject: [PATCH 167/284] iam GetUser --- weed/command/filer.go | 25 ++++- weed/iamapi/iamapi_handlers.go | 18 ++++ weed/iamapi/iamapi_management_handlers.go | 119 +++++++--------------- weed/iamapi/iamapi_response.go | 93 +++++++++++++++++ 4 files changed, 167 insertions(+), 88 deletions(-) create mode 100644 weed/iamapi/iamapi_response.go diff --git a/weed/command/filer.go b/weed/command/filer.go index 534bd9e04..b256e385f 100644 --- a/weed/command/filer.go +++ b/weed/command/filer.go @@ -25,6 +25,8 @@ var ( filerS3Options S3Options filerStartWebDav *bool filerWebDavOptions WebDavOption + filerStartIam *bool + filerIamOptions IamOptions ) type FilerOptions struct { @@ -89,6 +91,10 @@ func init() { filerWebDavOptions.tlsCertificate = cmdFiler.Flag.String("webdav.cert.file", "", "path to the TLS certificate file") filerWebDavOptions.cacheDir = cmdFiler.Flag.String("webdav.cacheDir", os.TempDir(), "local cache directory for file chunks") filerWebDavOptions.cacheSizeMB = cmdFiler.Flag.Int64("webdav.cacheCapacityMB", 1000, "local cache capacity in MB") + + // start iam on filer + filerStartIam = cmdFiler.Flag.Bool("iam", false, "whether to start IAM service") + filerIamOptions.port = cmdFiler.Flag.Int("iam.port", 8111, "iam server http listen port") } var cmdFiler = &Command{ @@ -119,22 +125,33 @@ func runFiler(cmd *Command, args []string) bool { go stats_collect.StartMetricsServer(*f.metricsHttpPort) + filerAddress := fmt.Sprintf("%s:%d", *f.ip, *f.port) + startDelay := time.Duration(2) if *filerStartS3 { - filerAddress := fmt.Sprintf("%s:%d", *f.ip, *f.port) filerS3Options.filer = &filerAddress go func() { - time.Sleep(2 * time.Second) + time.Sleep(startDelay * time.Second) filerS3Options.startS3Server() }() + startDelay++ } if *filerStartWebDav { - filerAddress := fmt.Sprintf("%s:%d", *f.ip, *f.port) filerWebDavOptions.filer = &filerAddress go func() { - time.Sleep(2 * time.Second) + time.Sleep(startDelay * time.Second) filerWebDavOptions.startWebDav() }() + startDelay++ + } + + if *filerStartIam { + filerIamOptions.filer = &filerAddress + filerIamOptions.masters = f.masters + go func() { + time.Sleep(startDelay * time.Second) + filerIamOptions.startIamServer() + }() } f.startFiler() diff --git a/weed/iamapi/iamapi_handlers.go b/weed/iamapi/iamapi_handlers.go index c436ba998..962717ad9 100644 --- a/weed/iamapi/iamapi_handlers.go +++ b/weed/iamapi/iamapi_handlers.go @@ -12,6 +12,8 @@ import ( "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/s3api/s3err" + + "github.com/aws/aws-sdk-go/service/iam" ) type mimeType string @@ -48,6 +50,22 @@ func writeErrorResponse(w http.ResponseWriter, errorCode s3err.ErrorCode, reqURL writeResponse(w, apiError.HTTPStatusCode, encodedErrorResponse, mimeXML) } +func writeIamErrorResponse(w http.ResponseWriter, err error, object string, value string) { + errCode := err.Error() + errorResp := ErrorResponse{} + errorResp.Error.Type = "Sender" + errorResp.Error.Code = &errCode + switch errCode { + 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) + default: + writeResponse(w, http.StatusInternalServerError, encodeResponse(errorResp), mimeXML) + + } +} + func getRESTErrorResponse(err s3err.APIError, resource string) s3err.RESTErrorResponse { return s3err.RESTErrorResponse{ Code: err.Code, diff --git a/weed/iamapi/iamapi_management_handlers.go b/weed/iamapi/iamapi_management_handlers.go index 322c16d73..e4daa081f 100644 --- a/weed/iamapi/iamapi_management_handlers.go +++ b/weed/iamapi/iamapi_management_handlers.go @@ -4,7 +4,6 @@ import ( "bytes" "crypto/sha1" "encoding/json" - "encoding/xml" "fmt" "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/glog" @@ -19,12 +18,10 @@ import ( "strings" "time" - // "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/iam" ) const ( - version = "2010-05-08" charsetUpper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" charset = charsetUpper + "abcdefghijklmnopqrstuvwxyz/" ) @@ -44,73 +41,6 @@ type PolicyDocument struct { } `json:"Statement"` } -type CommonResponse struct { - ResponseMetadata struct { - RequestId string `xml:"RequestId"` - } `xml:"ResponseMetadata"` -} - -type ListUsersResponse struct { - CommonResponse - XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ ListUsersResponse"` - ListUsersResult struct { - Users []*iam.User `xml:"Users>member"` - IsTruncated bool `xml:"IsTruncated"` - } `xml:"ListUsersResult"` -} - -type ListAccessKeysResponse struct { - CommonResponse - XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ ListAccessKeysResponse"` - ListAccessKeysResult struct { - AccessKeyMetadata []*iam.AccessKeyMetadata `xml:"AccessKeyMetadata>member"` - IsTruncated bool `xml:"IsTruncated"` - } `xml:"ListAccessKeysResult"` -} - -type DeleteUserResponse struct { - CommonResponse - XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ DeleteUserResponse"` -} - -type DeleteAccessKeyResponse struct { - CommonResponse - XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ DeleteAccessKeyResponse"` -} - -type CreatePolicyResponse struct { - CommonResponse - XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ CreatePolicyResponse"` - CreatePolicyResult struct { - Policy iam.Policy `xml:"Policy"` - } `xml:"CreatePolicyResult"` -} - -type CreateUserResponse struct { - CommonResponse - XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ CreateUserResponse"` - CreateUserResult struct { - User iam.User `xml:"User"` - } `xml:"CreateUserResult"` -} - -type CreateAccessKeyResponse struct { - CommonResponse - XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ CreateAccessKeyResponse"` - CreateAccessKeyResult struct { - AccessKey iam.AccessKey `xml:"AccessKey"` - } `xml:"CreateAccessKeyResult"` -} - -type PutUserPolicyResponse struct { - CommonResponse - XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ PutUserPolicyResponse"` -} - -func (r *CommonResponse) SetRequestId() { - r.ResponseMetadata.RequestId = fmt.Sprintf("%d", time.Now().UnixNano()) -} - func Hash(s *string) string { h := sha1.New() h.Write([]byte(*s)) @@ -150,6 +80,27 @@ func (iama *IamApiServer) CreateUser(s3cfg *iam_pb.S3ApiConfiguration, values ur s3cfg.Identities = append(s3cfg.Identities, &iam_pb.Identity{Name: userName}) return resp } + +func (iama *IamApiServer) DeleteUser(s3cfg *iam_pb.S3ApiConfiguration, userName string) (resp DeleteUserResponse, err error) { + for i, ident := range s3cfg.Identities { + if userName == ident.Name { + ident.Credentials = append(ident.Credentials[:i], ident.Credentials[i+1:]...) + return resp, nil + } + } + return resp, fmt.Errorf(iam.ErrCodeNoSuchEntityException) +} + +func (iama *IamApiServer) GetUser(s3cfg *iam_pb.S3ApiConfiguration, userName string) (resp GetUserResponse, err error) { + for _, ident := range s3cfg.Identities { + if userName == ident.Name { + resp.GetUserResult.User = iam.User{UserName: &ident.Name} + return resp, nil + } + } + return resp, fmt.Errorf(iam.ErrCodeNoSuchEntityException) +} + func GetPolicyDocument(policy *string) (policyDocument PolicyDocument, err error) { if err = json.Unmarshal([]byte(*policy), &policyDocument); err != nil { return PolicyDocument{}, err @@ -245,17 +196,6 @@ func GetActions(policy *PolicyDocument) (actions []string) { return actions } -func (iama *IamApiServer) DeleteUser(s3cfg *iam_pb.S3ApiConfiguration, values url.Values) (resp DeleteUserResponse) { - userName := values.Get("UserName") - for i, ident := range s3cfg.Identities { - if userName == ident.Name { - ident.Credentials = append(ident.Credentials[:i], ident.Credentials[i+1:]...) - break - } - } - return resp -} - func (iama *IamApiServer) CreateAccessKey(s3cfg *iam_pb.S3ApiConfiguration, values url.Values) (resp CreateAccessKeyResponse) { userName := values.Get("UserName") status := iam.StatusTypeActive @@ -320,6 +260,7 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { glog.Info("values ", values) var response interface{} + var err error changed := true switch r.Form.Get("Action") { case "ListUsers": @@ -330,21 +271,31 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { changed = false case "CreateUser": response = iama.CreateUser(s3cfg, values) + case "GetUser": + userName := values.Get("UserName") + response, err = iama.GetUser(s3cfg, userName) + if err != nil { + writeIamErrorResponse(w, err, "user", userName) + return + } case "DeleteUser": - response = iama.DeleteUser(s3cfg, values) + userName := values.Get("UserName") + response, err = iama.DeleteUser(s3cfg, userName) + if err != nil { + writeIamErrorResponse(w, err, "user", userName) + return + } case "CreateAccessKey": response = iama.CreateAccessKey(s3cfg, values) case "DeleteAccessKey": response = iama.DeleteAccessKey(s3cfg, values) case "CreatePolicy": - var err error response, err = iama.CreatePolicy(s3cfg, values) if err != nil { writeErrorResponse(w, s3err.ErrInvalidRequest, r.URL) return } case "PutUserPolicy": - var err error response, err = iama.PutUserPolicy(s3cfg, values) if err != nil { writeErrorResponse(w, s3err.ErrInvalidRequest, r.URL) diff --git a/weed/iamapi/iamapi_response.go b/weed/iamapi/iamapi_response.go new file mode 100644 index 000000000..26dd0f263 --- /dev/null +++ b/weed/iamapi/iamapi_response.go @@ -0,0 +1,93 @@ +package iamapi + +import ( + "encoding/xml" + "fmt" + "time" + + "github.com/aws/aws-sdk-go/service/iam" +) + +type CommonResponse struct { + ResponseMetadata struct { + RequestId string `xml:"RequestId"` + } `xml:"ResponseMetadata"` +} + +type ListUsersResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ ListUsersResponse"` + ListUsersResult struct { + Users []*iam.User `xml:"Users>member"` + IsTruncated bool `xml:"IsTruncated"` + } `xml:"ListUsersResult"` +} + +type ListAccessKeysResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ ListAccessKeysResponse"` + ListAccessKeysResult struct { + AccessKeyMetadata []*iam.AccessKeyMetadata `xml:"AccessKeyMetadata>member"` + IsTruncated bool `xml:"IsTruncated"` + } `xml:"ListAccessKeysResult"` +} + +type DeleteAccessKeyResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ DeleteAccessKeyResponse"` +} + +type CreatePolicyResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ CreatePolicyResponse"` + CreatePolicyResult struct { + Policy iam.Policy `xml:"Policy"` + } `xml:"CreatePolicyResult"` +} + +type CreateUserResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ CreateUserResponse"` + CreateUserResult struct { + User iam.User `xml:"User"` + } `xml:"CreateUserResult"` +} + +type DeleteUserResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ DeleteUserResponse"` +} + +type GetUserResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ GetUserResponse"` + GetUserResult struct { + User iam.User `xml:"User"` + } `xml:"GetUserResult"` +} + +type CreateAccessKeyResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ CreateAccessKeyResponse"` + CreateAccessKeyResult struct { + AccessKey iam.AccessKey `xml:"AccessKey"` + } `xml:"CreateAccessKeyResult"` +} + +type PutUserPolicyResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ PutUserPolicyResponse"` +} + +type ErrorResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ ErrorResponse"` + Error struct { + iam.ErrorDetails + Type string `xml:"Type"` + } `xml:"Error"` +} + +func (r *CommonResponse) SetRequestId() { + r.ResponseMetadata.RequestId = fmt.Sprintf("%d", time.Now().UnixNano()) +} From b61e9f6a1a7bec60d783d04cb457e6d50647e67d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 29 Mar 2021 00:49:50 -0700 Subject: [PATCH 168/284] adjust ordering --- weed/command/scaffold.go | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/weed/command/scaffold.go b/weed/command/scaffold.go index 3296ebf21..337adaa22 100644 --- a/weed/command/scaffold.go +++ b/weed/command/scaffold.go @@ -102,10 +102,6 @@ enabled = false dir = "./filerrdb" # directory to store rocksdb files [mysql] # or memsql, tidb -# Empty insertQuery will use the default insert query -# example insertQuery can be for UPSERT syntax: -# insertQuery = """INSERT INTO ` + "`%s`" + ` (dirhash,name,directory,meta) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE meta = VALUES(meta)""" -insertQuery = "" # 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', @@ -124,13 +120,13 @@ connection_max_idle = 2 connection_max_open = 100 connection_max_lifetime_seconds = 0 interpolateParams = false - -[mysql2] # or memsql, tidb -enabled = false # Empty insertQuery will use the default insert query # example insertQuery can be for UPSERT syntax: # insertQuery = """INSERT INTO ` + "`%s`" + ` (dirhash,name,directory,meta) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE meta = VALUES(meta)""" insertQuery = "" + +[mysql2] # or memsql, tidb +enabled = false createTable = """ CREATE TABLE IF NOT EXISTS ` + "`%s`" + ` ( dirhash BIGINT, @@ -149,12 +145,12 @@ connection_max_idle = 2 connection_max_open = 100 connection_max_lifetime_seconds = 0 interpolateParams = false - -[postgres] # or cockroachdb, YugabyteDB # Empty insertQuery will use the default insert query # example insertQuery can be for UPSERT syntax: -# insertQuery = """INSERT INTO "%[1]s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4) ON CONFLICT ON CONSTRAINT "%[1]s_pkey" DO UPDATE SET meta = EXCLUDED.meta WHERE "%[1]s".meta != EXCLUDED.meta""" +# insertQuery = """INSERT INTO ` + "`%s`" + ` (dirhash,name,directory,meta) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE meta = VALUES(meta)""" insertQuery = "" + +[postgres] # or cockroachdb, YugabyteDB # CREATE TABLE IF NOT EXISTS filemeta ( # dirhash BIGINT, # name VARCHAR(65535), @@ -173,13 +169,13 @@ sslmode = "disable" connection_max_idle = 100 connection_max_open = 100 connection_max_lifetime_seconds = 0 - -[postgres2] -enabled = false # Empty insertQuery will use the default insert query # example insertQuery can be for UPSERT syntax: # insertQuery = """INSERT INTO "%[1]s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4) ON CONFLICT ON CONSTRAINT "%[1]s_pkey" DO UPDATE SET meta = EXCLUDED.meta WHERE "%[1]s".meta != EXCLUDED.meta""" insertQuery = "" + +[postgres2] +enabled = false createTable = """ CREATE TABLE IF NOT EXISTS "%s" ( dirhash BIGINT, @@ -199,6 +195,10 @@ sslmode = "disable" connection_max_idle = 100 connection_max_open = 100 connection_max_lifetime_seconds = 0 +# Empty insertQuery will use the default insert query +# example insertQuery can be for UPSERT syntax: +# insertQuery = """INSERT INTO "%[1]s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4) ON CONFLICT ON CONSTRAINT "%[1]s_pkey" DO UPDATE SET meta = EXCLUDED.meta WHERE "%[1]s".meta != EXCLUDED.meta""" +insertQuery = "" [cassandra] # CREATE TABLE filemeta ( From 6b3cc94ac4e248a86c80ae0c93acd30ba414121d Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Mon, 29 Mar 2021 14:59:59 +0500 Subject: [PATCH 169/284] minio gateway s3 docker compose file --- .../compose/local-minio-gateway-compose.yml | 50 +++++++++++++++++++ docker/compose/local-registry-compose.yml | 14 ++---- 2 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 docker/compose/local-minio-gateway-compose.yml diff --git a/docker/compose/local-minio-gateway-compose.yml b/docker/compose/local-minio-gateway-compose.yml new file mode 100644 index 000000000..fafee59c8 --- /dev/null +++ b/docker/compose/local-minio-gateway-compose.yml @@ -0,0 +1,50 @@ +version: '2' + +services: + master: + image: chrislusf/seaweedfs:local + ports: + - 9333:9333 + - 19333:19333 + command: "master -ip=master -volumeSizeLimitMB=1024" + volume: + image: chrislusf/seaweedfs:local + ports: + - 8080:8080 + - 18080:18080 + command: "volume -mserver=master:9333 -port=8080 -ip=volume -max=0 -preStopSeconds=1" + depends_on: + - master + s3: + image: chrislusf/seaweedfs:local + ports: + - 8888:8888 + - 18888:18888 + - 8333:8333 + command: '-v 1 filer -master="master:9333" -s3 -s3.config=/etc/seaweedfs/s3.json -s3.port=8333' + volumes: + - ./s3.json:/etc/seaweedfs/s3.json + depends_on: + - master + - volume + minio-gateway-s3: + image: minio/minio + ports: + - 9000:9000 + command: 'minio gateway s3 http://s3:8333' + restart: on-failure + environment: + MINIO_ACCESS_KEY: "some_access_key1" + MINIO_SECRET_KEY: "some_secret_key1" + depends_on: + - s3 + minio-warp: + image: minio/warp + command: 'mixed --duration=5m --obj.size=3mb --autoterm' + restart: on-failure + environment: + WARP_HOST: "minio-gateway-s3:9000" + WARP_ACCESS_KEY: "some_access_key1" + WARP_SECRET_KEY: "some_secret_key1" + depends_on: + - minio-gateway-s3 \ No newline at end of file diff --git a/docker/compose/local-registry-compose.yml b/docker/compose/local-registry-compose.yml index 7f3672cd0..b61278d66 100644 --- a/docker/compose/local-registry-compose.yml +++ b/docker/compose/local-registry-compose.yml @@ -15,24 +15,18 @@ services: command: "volume -mserver=master:9333 -port=8080 -ip=volume -max=0 -preStopSeconds=1" depends_on: - master - filer: + s3: image: chrislusf/seaweedfs:local ports: - 8888:8888 - 18888:18888 - command: 'filer -master="master:9333"' - depends_on: - - master - - volume - s3: - image: chrislusf/seaweedfs:local - ports: - 8333:8333 - command: '-v 9 s3 -filer="filer:8888"' + command: '-v 9 filer -master="master:9333" -s3 -s3.config=/etc/seaweedfs/s3.json -s3.port=8333' + volumes: + - ./s3.json:/etc/seaweedfs/s3.json depends_on: - master - volume - - filer minio: image: minio/minio ports: From 4c51e6a6605ce4592957c047c73c345a0a12bae3 Mon Sep 17 00:00:00 2001 From: LazyDBA247-Anyvision Date: Tue, 30 Mar 2021 00:32:03 +0300 Subject: [PATCH 170/284] add enableUpsert=true and rename config to upsertQuery --- weed/command/scaffold.go | 28 +++++++++++-------------- weed/filer/mysql/mysql_sql_gen.go | 6 +++--- weed/filer/mysql/mysql_store.go | 10 ++++++--- weed/filer/mysql2/mysql2_store.go | 10 ++++++--- weed/filer/postgres/postgres_sql_gen.go | 6 +++--- weed/filer/postgres/postgres_store.go | 10 ++++++--- weed/filer/postgres2/postgres2_store.go | 10 ++++++--- 7 files changed, 46 insertions(+), 34 deletions(-) diff --git a/weed/command/scaffold.go b/weed/command/scaffold.go index 337adaa22..babcdcdc7 100644 --- a/weed/command/scaffold.go +++ b/weed/command/scaffold.go @@ -120,10 +120,9 @@ connection_max_idle = 2 connection_max_open = 100 connection_max_lifetime_seconds = 0 interpolateParams = false -# Empty insertQuery will use the default insert query -# example insertQuery can be for UPSERT syntax: -# insertQuery = """INSERT INTO ` + "`%s`" + ` (dirhash,name,directory,meta) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE meta = VALUES(meta)""" -insertQuery = "" +# if insert/upsert failing, you can disable upsert or update query syntax to match your RDBMS syntax: +upsertQuery = """INSERT INTO ` + "`%s`" + ` (dirhash,name,directory,meta) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE meta = VALUES(meta)""" +enableUpsert = true [mysql2] # or memsql, tidb enabled = false @@ -145,10 +144,9 @@ connection_max_idle = 2 connection_max_open = 100 connection_max_lifetime_seconds = 0 interpolateParams = false -# Empty insertQuery will use the default insert query -# example insertQuery can be for UPSERT syntax: -# insertQuery = """INSERT INTO ` + "`%s`" + ` (dirhash,name,directory,meta) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE meta = VALUES(meta)""" -insertQuery = "" +# if insert/upsert failing, you can disable upsert or update query syntax to match your RDBMS syntax: +upsertQuery = """INSERT INTO ` + "`%s`" + ` (dirhash,name,directory,meta) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE meta = VALUES(meta)""" +enableUpsert = true [postgres] # or cockroachdb, YugabyteDB # CREATE TABLE IF NOT EXISTS filemeta ( @@ -169,10 +167,9 @@ sslmode = "disable" connection_max_idle = 100 connection_max_open = 100 connection_max_lifetime_seconds = 0 -# Empty insertQuery will use the default insert query -# example insertQuery can be for UPSERT syntax: -# insertQuery = """INSERT INTO "%[1]s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4) ON CONFLICT ON CONSTRAINT "%[1]s_pkey" DO UPDATE SET meta = EXCLUDED.meta WHERE "%[1]s".meta != EXCLUDED.meta""" -insertQuery = "" +# if insert/upsert failing, you can disable upsert or update query syntax to match your RDBMS syntax: +upsertQuery = """INSERT INTO "%[1]s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4) ON CONFLICT ON CONSTRAINT "%[1]s_pkey" DO UPDATE SET meta = EXCLUDED.meta WHERE "%[1]s".meta != EXCLUDED.meta""" +enableUpsert = true [postgres2] enabled = false @@ -195,10 +192,9 @@ sslmode = "disable" connection_max_idle = 100 connection_max_open = 100 connection_max_lifetime_seconds = 0 -# Empty insertQuery will use the default insert query -# example insertQuery can be for UPSERT syntax: -# insertQuery = """INSERT INTO "%[1]s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4) ON CONFLICT ON CONSTRAINT "%[1]s_pkey" DO UPDATE SET meta = EXCLUDED.meta WHERE "%[1]s".meta != EXCLUDED.meta""" -insertQuery = "" +# if insert/upsert failing, you can disable upsert or update query syntax to match your RDBMS syntax: +upsertQuery = """INSERT INTO "%[1]s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4) ON CONFLICT ON CONSTRAINT "%[1]s_pkey" DO UPDATE SET meta = EXCLUDED.meta WHERE "%[1]s".meta != EXCLUDED.meta""" +enableUpsert = true [cassandra] # CREATE TABLE filemeta ( diff --git a/weed/filer/mysql/mysql_sql_gen.go b/weed/filer/mysql/mysql_sql_gen.go index 105f3e62a..93d3e3f9e 100644 --- a/weed/filer/mysql/mysql_sql_gen.go +++ b/weed/filer/mysql/mysql_sql_gen.go @@ -10,7 +10,7 @@ import ( type SqlGenMysql struct { CreateTableSqlTemplate string DropTableSqlTemplate string - InsertQueryTemplate string + UpsertQueryTemplate string } var ( @@ -18,8 +18,8 @@ var ( ) func (gen *SqlGenMysql) GetSqlInsert(tableName string) string { - if gen.InsertQueryTemplate != "" { - return fmt.Sprintf(gen.InsertQueryTemplate, tableName) + if gen.UpsertQueryTemplate != "" { + return fmt.Sprintf(gen.UpsertQueryTemplate, tableName) } else { return fmt.Sprintf("INSERT INTO `%s` (dirhash,name,directory,meta) VALUES(?,?,?,?)", tableName) } diff --git a/weed/filer/mysql/mysql_store.go b/weed/filer/mysql/mysql_store.go index 4b73faacf..ccefa745e 100644 --- a/weed/filer/mysql/mysql_store.go +++ b/weed/filer/mysql/mysql_store.go @@ -30,7 +30,8 @@ func (store *MysqlStore) GetName() string { func (store *MysqlStore) Initialize(configuration util.Configuration, prefix string) (err error) { return store.initialize( - configuration.GetString(prefix+"insertQuery"), + configuration.GetString(prefix+"upsertQuery"), + configuration.GetString(prefix+"enableUpsert"), configuration.GetString(prefix+"username"), configuration.GetString(prefix+"password"), configuration.GetString(prefix+"hostname"), @@ -43,14 +44,17 @@ func (store *MysqlStore) Initialize(configuration util.Configuration, prefix str ) } -func (store *MysqlStore) initialize(insertQuery, user, password, hostname string, port int, database string, maxIdle, maxOpen, +func (store *MysqlStore) initialize(upsertQuery, enableUpsert, user, password, hostname string, port int, database string, maxIdle, maxOpen, maxLifetimeSeconds int, interpolateParams bool) (err error) { store.SupportBucketTable = false + if !enableUpsert { + upsertQuery = "" + } store.SqlGenerator = &SqlGenMysql{ CreateTableSqlTemplate: "", DropTableSqlTemplate: "drop table `%s`", - InsertQueryTemplate: insertQuery, + UpsertQueryTemplate: upsertQuery, } sqlUrl := fmt.Sprintf(CONNECTION_URL_PATTERN, user, password, hostname, port, database) diff --git a/weed/filer/mysql2/mysql2_store.go b/weed/filer/mysql2/mysql2_store.go index 3c51f9363..a4b55c7f4 100644 --- a/weed/filer/mysql2/mysql2_store.go +++ b/weed/filer/mysql2/mysql2_store.go @@ -32,7 +32,8 @@ func (store *MysqlStore2) GetName() string { func (store *MysqlStore2) Initialize(configuration util.Configuration, prefix string) (err error) { return store.initialize( configuration.GetString(prefix+"createTable"), - configuration.GetString(prefix+"insertQuery"), + configuration.GetString(prefix+"upsertQuery"), + configuration.GetString(prefix+"enableUpsert"), configuration.GetString(prefix+"username"), configuration.GetString(prefix+"password"), configuration.GetString(prefix+"hostname"), @@ -45,14 +46,17 @@ func (store *MysqlStore2) Initialize(configuration util.Configuration, prefix st ) } -func (store *MysqlStore2) initialize(createTable, insertQuery, user, password, hostname string, port int, database string, maxIdle, maxOpen, +func (store *MysqlStore2) initialize(createTable, upsertQuery, enableUpsert, user, password, hostname string, port int, database string, maxIdle, maxOpen, maxLifetimeSeconds int, interpolateParams bool) (err error) { store.SupportBucketTable = true + if !enableUpsert { + upsertQuery = "" + } store.SqlGenerator = &mysql.SqlGenMysql{ CreateTableSqlTemplate: createTable, DropTableSqlTemplate: "drop table `%s`", - InsertQueryTemplate: insertQuery, + UpsertQueryTemplate: upsertQuery, } sqlUrl := fmt.Sprintf(CONNECTION_URL_PATTERN, user, password, hostname, port, database) diff --git a/weed/filer/postgres/postgres_sql_gen.go b/weed/filer/postgres/postgres_sql_gen.go index 21a87ef5a..6cee3d2da 100644 --- a/weed/filer/postgres/postgres_sql_gen.go +++ b/weed/filer/postgres/postgres_sql_gen.go @@ -10,7 +10,7 @@ import ( type SqlGenPostgres struct { CreateTableSqlTemplate string DropTableSqlTemplate string - InsertQueryTemplate string + UpsertQueryTemplate string } var ( @@ -18,8 +18,8 @@ var ( ) func (gen *SqlGenPostgres) GetSqlInsert(tableName string) string { - if gen.InsertQueryTemplate != "" { - return fmt.Sprintf(gen.InsertQueryTemplate, tableName) + if gen.UpsertQueryTemplate != "" { + return fmt.Sprintf(gen.UpsertQueryTemplate, tableName) } else { return fmt.Sprintf(`INSERT INTO "%s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4)`, tableName) } diff --git a/weed/filer/postgres/postgres_store.go b/weed/filer/postgres/postgres_store.go index ea9b1c71e..498c98f65 100644 --- a/weed/filer/postgres/postgres_store.go +++ b/weed/filer/postgres/postgres_store.go @@ -29,7 +29,8 @@ func (store *PostgresStore) GetName() string { func (store *PostgresStore) Initialize(configuration util.Configuration, prefix string) (err error) { return store.initialize( - configuration.GetString(prefix+"insertQuery"), + configuration.GetString(prefix+"upsertQuery"), + configuration.GetString(prefix+"enableUpsert"), configuration.GetString(prefix+"username"), configuration.GetString(prefix+"password"), configuration.GetString(prefix+"hostname"), @@ -43,13 +44,16 @@ func (store *PostgresStore) Initialize(configuration util.Configuration, prefix ) } -func (store *PostgresStore) initialize(insertQuery, user, password, hostname string, port int, database, schema, sslmode string, maxIdle, maxOpen, maxLifetimeSeconds int) (err error) { +func (store *PostgresStore) initialize(upsertQuery, enableUpsert, user, password, hostname string, port int, database, schema, sslmode string, maxIdle, maxOpen, maxLifetimeSeconds int) (err error) { store.SupportBucketTable = false + if !enableUpsert { + upsertQuery = "" + } store.SqlGenerator = &SqlGenPostgres{ CreateTableSqlTemplate: "", DropTableSqlTemplate: `drop table "%s"`, - InsertQueryTemplate: insertQuery, + UpsertQueryTemplate: upsertQuery, } sqlUrl := fmt.Sprintf(CONNECTION_URL_PATTERN, hostname, port, sslmode) diff --git a/weed/filer/postgres2/postgres2_store.go b/weed/filer/postgres2/postgres2_store.go index b83945db6..b5947bb96 100644 --- a/weed/filer/postgres2/postgres2_store.go +++ b/weed/filer/postgres2/postgres2_store.go @@ -32,7 +32,8 @@ func (store *PostgresStore2) GetName() string { func (store *PostgresStore2) Initialize(configuration util.Configuration, prefix string) (err error) { return store.initialize( configuration.GetString(prefix+"createTable"), - configuration.GetString(prefix+"insertQuery"), + configuration.GetString(prefix+"upsertQuery"), + configuration.GetString(prefix+"enableUpsert"), configuration.GetString(prefix+"username"), configuration.GetString(prefix+"password"), configuration.GetString(prefix+"hostname"), @@ -46,13 +47,16 @@ func (store *PostgresStore2) Initialize(configuration util.Configuration, prefix ) } -func (store *PostgresStore2) initialize(createTable, insertQuery, user, password, hostname string, port int, database, schema, sslmode string, maxIdle, maxOpen, maxLifetimeSeconds int) (err error) { +func (store *PostgresStore2) initialize(createTable, upsertQuery, enableUpsert, user, password, hostname string, port int, database, schema, sslmode string, maxIdle, maxOpen, maxLifetimeSeconds int) (err error) { store.SupportBucketTable = true + if !enableUpsert { + upsertQuery = "" + } store.SqlGenerator = &postgres.SqlGenPostgres{ CreateTableSqlTemplate: createTable, DropTableSqlTemplate: `drop table "%s"`, - InsertQueryTemplate: insertQuery, + UpsertQueryTemplate: upsertQuery, } sqlUrl := fmt.Sprintf(CONNECTION_URL_PATTERN, hostname, port, sslmode) From 7f44d953b56dc74281b6de3dcac184d97c9715f1 Mon Sep 17 00:00:00 2001 From: LazyDBA247-Anyvision Date: Tue, 30 Mar 2021 01:36:02 +0300 Subject: [PATCH 171/284] fix GetBool --- weed/filer/mysql/mysql_store.go | 4 ++-- weed/filer/mysql2/mysql2_store.go | 4 ++-- weed/filer/postgres/postgres_store.go | 4 ++-- weed/filer/postgres2/postgres2_store.go | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/weed/filer/mysql/mysql_store.go b/weed/filer/mysql/mysql_store.go index ccefa745e..423b01392 100644 --- a/weed/filer/mysql/mysql_store.go +++ b/weed/filer/mysql/mysql_store.go @@ -31,7 +31,7 @@ func (store *MysqlStore) GetName() string { func (store *MysqlStore) Initialize(configuration util.Configuration, prefix string) (err error) { return store.initialize( configuration.GetString(prefix+"upsertQuery"), - configuration.GetString(prefix+"enableUpsert"), + configuration.GetBool(prefix+"enableUpsert"), configuration.GetString(prefix+"username"), configuration.GetString(prefix+"password"), configuration.GetString(prefix+"hostname"), @@ -44,7 +44,7 @@ func (store *MysqlStore) Initialize(configuration util.Configuration, prefix str ) } -func (store *MysqlStore) initialize(upsertQuery, enableUpsert, user, password, hostname string, port int, database string, maxIdle, maxOpen, +func (store *MysqlStore) initialize(upsertQuery string, enableUpsert bool, user, password, hostname string, port int, database string, maxIdle, maxOpen, maxLifetimeSeconds int, interpolateParams bool) (err error) { store.SupportBucketTable = false diff --git a/weed/filer/mysql2/mysql2_store.go b/weed/filer/mysql2/mysql2_store.go index a4b55c7f4..071352111 100644 --- a/weed/filer/mysql2/mysql2_store.go +++ b/weed/filer/mysql2/mysql2_store.go @@ -33,7 +33,7 @@ func (store *MysqlStore2) Initialize(configuration util.Configuration, prefix st return store.initialize( configuration.GetString(prefix+"createTable"), configuration.GetString(prefix+"upsertQuery"), - configuration.GetString(prefix+"enableUpsert"), + configuration.GetBool(prefix+"enableUpsert"), configuration.GetString(prefix+"username"), configuration.GetString(prefix+"password"), configuration.GetString(prefix+"hostname"), @@ -46,7 +46,7 @@ func (store *MysqlStore2) Initialize(configuration util.Configuration, prefix st ) } -func (store *MysqlStore2) initialize(createTable, upsertQuery, enableUpsert, user, password, hostname string, port int, database string, maxIdle, maxOpen, +func (store *MysqlStore2) initialize(createTable, upsertQuery string, enableUpsert bool, user, password, hostname string, port int, database string, maxIdle, maxOpen, maxLifetimeSeconds int, interpolateParams bool) (err error) { store.SupportBucketTable = true diff --git a/weed/filer/postgres/postgres_store.go b/weed/filer/postgres/postgres_store.go index 498c98f65..21b79d1fe 100644 --- a/weed/filer/postgres/postgres_store.go +++ b/weed/filer/postgres/postgres_store.go @@ -30,7 +30,7 @@ func (store *PostgresStore) GetName() string { func (store *PostgresStore) Initialize(configuration util.Configuration, prefix string) (err error) { return store.initialize( configuration.GetString(prefix+"upsertQuery"), - configuration.GetString(prefix+"enableUpsert"), + configuration.GetBool(prefix+"enableUpsert"), configuration.GetString(prefix+"username"), configuration.GetString(prefix+"password"), configuration.GetString(prefix+"hostname"), @@ -44,7 +44,7 @@ func (store *PostgresStore) Initialize(configuration util.Configuration, prefix ) } -func (store *PostgresStore) initialize(upsertQuery, enableUpsert, user, password, hostname string, port int, database, schema, sslmode string, maxIdle, maxOpen, maxLifetimeSeconds int) (err error) { +func (store *PostgresStore) initialize(upsertQuery string, enableUpsert bool, user, password, hostname string, port int, database, schema, sslmode string, maxIdle, maxOpen, maxLifetimeSeconds int) (err error) { store.SupportBucketTable = false if !enableUpsert { diff --git a/weed/filer/postgres2/postgres2_store.go b/weed/filer/postgres2/postgres2_store.go index b5947bb96..01fc4a869 100644 --- a/weed/filer/postgres2/postgres2_store.go +++ b/weed/filer/postgres2/postgres2_store.go @@ -33,7 +33,7 @@ func (store *PostgresStore2) Initialize(configuration util.Configuration, prefix return store.initialize( configuration.GetString(prefix+"createTable"), configuration.GetString(prefix+"upsertQuery"), - configuration.GetString(prefix+"enableUpsert"), + configuration.GetBool(prefix+"enableUpsert"), configuration.GetString(prefix+"username"), configuration.GetString(prefix+"password"), configuration.GetString(prefix+"hostname"), @@ -47,7 +47,7 @@ func (store *PostgresStore2) Initialize(configuration util.Configuration, prefix ) } -func (store *PostgresStore2) initialize(createTable, upsertQuery, enableUpsert, user, password, hostname string, port int, database, schema, sslmode string, maxIdle, maxOpen, maxLifetimeSeconds int) (err error) { +func (store *PostgresStore2) initialize(createTable, upsertQuery string, enableUpsert bool, user, password, hostname string, port int, database, schema, sslmode string, maxIdle, maxOpen, maxLifetimeSeconds int) (err error) { store.SupportBucketTable = true if !enableUpsert { From e72e3453e85b8afe20e2db7c8579afc9c6d117db Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 29 Mar 2021 21:42:22 -0700 Subject: [PATCH 172/284] Java client: ByteBuffer.clear supports higher JDK versions --- .../client/src/main/java/seaweedfs/client/ByteBufferPool.java | 3 ++- 1 file changed, 2 insertions(+), 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 994bcaa2b..51053becd 100644 --- a/other/java/client/src/main/java/seaweedfs/client/ByteBufferPool.java +++ b/other/java/client/src/main/java/seaweedfs/client/ByteBufferPool.java @@ -3,6 +3,7 @@ package seaweedfs.client; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; @@ -34,7 +35,7 @@ public class ByteBufferPool { } public static synchronized void release(ByteBuffer obj) { - obj.clear(); + ((Buffer)obj).clear(); bufferList.add(0, obj); } From be25bc67669a0c1472476c689e9e856159664750 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 30 Mar 2021 00:17:35 -0700 Subject: [PATCH 173/284] Java client 1.6.4 --- other/java/client/pom.xml | 2 +- other/java/client/pom.xml.deploy | 2 +- other/java/client/pom_debug.xml | 2 +- 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 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/other/java/client/pom.xml b/other/java/client/pom.xml index e06d4cac6..0c3e3f00e 100644 --- a/other/java/client/pom.xml +++ b/other/java/client/pom.xml @@ -5,7 +5,7 @@ com.github.chrislusf seaweedfs-client - 1.6.3 + 1.6.4 org.sonatype.oss diff --git a/other/java/client/pom.xml.deploy b/other/java/client/pom.xml.deploy index 40ede4b99..9c8c4f45e 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.3 + 1.6.4 org.sonatype.oss diff --git a/other/java/client/pom_debug.xml b/other/java/client/pom_debug.xml index 5421a04af..12ea860c2 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.3 + 1.6.4 org.sonatype.oss diff --git a/other/java/examples/pom.xml b/other/java/examples/pom.xml index a2137807d..950a3f494 100644 --- a/other/java/examples/pom.xml +++ b/other/java/examples/pom.xml @@ -11,13 +11,13 @@ com.github.chrislusf seaweedfs-client - 1.6.3 + 1.6.4 compile com.github.chrislusf seaweedfs-hadoop2-client - 1.6.3 + 1.6.4 compile diff --git a/other/java/hdfs2/dependency-reduced-pom.xml b/other/java/hdfs2/dependency-reduced-pom.xml index eb763ceda..503e5fbdf 100644 --- a/other/java/hdfs2/dependency-reduced-pom.xml +++ b/other/java/hdfs2/dependency-reduced-pom.xml @@ -301,7 +301,7 @@ - 1.6.3 + 1.6.4 2.9.2 diff --git a/other/java/hdfs2/pom.xml b/other/java/hdfs2/pom.xml index e8efe6af9..6eeba912e 100644 --- a/other/java/hdfs2/pom.xml +++ b/other/java/hdfs2/pom.xml @@ -5,7 +5,7 @@ 4.0.0 - 1.6.3 + 1.6.4 2.9.2 diff --git a/other/java/hdfs3/dependency-reduced-pom.xml b/other/java/hdfs3/dependency-reduced-pom.xml index d62afd6b4..590d725d0 100644 --- a/other/java/hdfs3/dependency-reduced-pom.xml +++ b/other/java/hdfs3/dependency-reduced-pom.xml @@ -309,7 +309,7 @@ - 1.6.3 + 1.6.4 3.1.1 diff --git a/other/java/hdfs3/pom.xml b/other/java/hdfs3/pom.xml index b694ef21f..2b11035f5 100644 --- a/other/java/hdfs3/pom.xml +++ b/other/java/hdfs3/pom.xml @@ -5,7 +5,7 @@ 4.0.0 - 1.6.3 + 1.6.4 3.1.1 From a95929e53ca609181dddda04ece0e6d482234161 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 30 Mar 2021 00:17:52 -0700 Subject: [PATCH 174/284] reduce default concurrentWriters to 32 --- weed/command/mount.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/command/mount.go b/weed/command/mount.go index ea439af7c..1e5d106fc 100644 --- a/weed/command/mount.go +++ b/weed/command/mount.go @@ -45,7 +45,7 @@ func init() { mountOptions.diskType = cmdMount.Flag.String("disk", "", "[hdd|ssd|] hard drive or solid state drive or any tag") mountOptions.ttlSec = cmdMount.Flag.Int("ttl", 0, "file ttl in seconds") mountOptions.chunkSizeLimitMB = cmdMount.Flag.Int("chunkSizeLimitMB", 2, "local write buffer size, also chunk large files") - mountOptions.concurrentWriters = cmdMount.Flag.Int("concurrentWriters", 128, "limit concurrent goroutine writers if not 0") + mountOptions.concurrentWriters = cmdMount.Flag.Int("concurrentWriters", 32, "limit concurrent goroutine writers if not 0") mountOptions.cacheDir = cmdMount.Flag.String("cacheDir", os.TempDir(), "local cache directory for file chunks and meta data") mountOptions.cacheSizeMB = cmdMount.Flag.Int64("cacheCapacityMB", 1000, "local file chunk cache capacity in MB (0 will disable cache)") mountOptions.dataCenter = cmdMount.Flag.String("dataCenter", "", "prefer to write to the data center") From 9f1cab179c1c41deb1db627e8bfbc632a2dffba7 Mon Sep 17 00:00:00 2001 From: LazyDBA247-Anyvision Date: Tue, 30 Mar 2021 10:21:27 +0300 Subject: [PATCH 175/284] use a compatible pg syntax for upsert --- weed/command/scaffold.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/command/scaffold.go b/weed/command/scaffold.go index babcdcdc7..7df69e211 100644 --- a/weed/command/scaffold.go +++ b/weed/command/scaffold.go @@ -168,7 +168,7 @@ 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: -upsertQuery = """INSERT INTO "%[1]s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4) ON CONFLICT ON CONSTRAINT "%[1]s_pkey" DO UPDATE SET meta = EXCLUDED.meta WHERE "%[1]s".meta != EXCLUDED.meta""" +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""" enableUpsert = true [postgres2] From a5662c9e5e1f214971bdbcaea9b45afd30e77421 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 30 Mar 2021 00:26:57 -0700 Subject: [PATCH 176/284] adjust ordering --- weed/command/scaffold.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/weed/command/scaffold.go b/weed/command/scaffold.go index 7df69e211..668bb1b0d 100644 --- a/weed/command/scaffold.go +++ b/weed/command/scaffold.go @@ -121,8 +121,8 @@ 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: -upsertQuery = """INSERT INTO ` + "`%s`" + ` (dirhash,name,directory,meta) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE meta = VALUES(meta)""" enableUpsert = true +upsertQuery = """INSERT INTO ` + "`%s`" + ` (dirhash,name,directory,meta) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE meta = VALUES(meta)""" [mysql2] # or memsql, tidb enabled = false @@ -145,8 +145,8 @@ 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: -upsertQuery = """INSERT INTO ` + "`%s`" + ` (dirhash,name,directory,meta) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE meta = VALUES(meta)""" 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 ( @@ -168,8 +168,8 @@ 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: -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""" 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 @@ -193,8 +193,8 @@ 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: -upsertQuery = """INSERT INTO "%[1]s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4) ON CONFLICT ON CONSTRAINT "%[1]s_pkey" DO UPDATE SET meta = EXCLUDED.meta WHERE "%[1]s".meta != EXCLUDED.meta""" enableUpsert = true +upsertQuery = """INSERT INTO "%[1]s" (dirhash,name,directory,meta) VALUES($1,$2,$3,$4) ON CONFLICT ON CONSTRAINT "%[1]s_pkey" DO UPDATE SET meta = EXCLUDED.meta WHERE "%[1]s".meta != EXCLUDED.meta""" [cassandra] # CREATE TABLE filemeta ( From fb04fda28bd06cf1ec195d7f28d24be351da8dfa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Mar 2021 07:46:24 +0000 Subject: [PATCH 177/284] Bump guava from 28.0-jre to 29.0-jre in /test/random_access Bumps [guava](https://github.com/google/guava) from 28.0-jre to 29.0-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) Signed-off-by: dependabot[bot] --- test/random_access/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/random_access/pom.xml b/test/random_access/pom.xml index 44a3fd9df..0e3628cca 100644 --- a/test/random_access/pom.xml +++ b/test/random_access/pom.xml @@ -8,7 +8,7 @@ 1.0-SNAPSHOT - 28.0-jre + 29.0-jre From 9401890f183719ff4f2b78b96ef03025af5e96f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Mar 2021 07:46:34 +0000 Subject: [PATCH 178/284] Bump guava from 28.0-jre to 29.0-jre in /other/java/client Bumps [guava](https://github.com/google/guava) from 28.0-jre to 29.0-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) Signed-off-by: dependabot[bot] --- other/java/client/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/other/java/client/pom.xml b/other/java/client/pom.xml index 0c3e3f00e..b715368a7 100644 --- a/other/java/client/pom.xml +++ b/other/java/client/pom.xml @@ -17,7 +17,7 @@ 3.9.1 1.23.0 - 28.0-jre + 29.0-jre From 9385e2224da32378eff633ed2b0f4d209a0e834d Mon Sep 17 00:00:00 2001 From: LazyDBA247-Anyvision Date: Tue, 30 Mar 2021 10:51:52 +0300 Subject: [PATCH 179/284] fix postgres2 upsertQuery syntax also --- weed/command/scaffold.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/command/scaffold.go b/weed/command/scaffold.go index 668bb1b0d..4794da18e 100644 --- a/weed/command/scaffold.go +++ b/weed/command/scaffold.go @@ -194,7 +194,7 @@ 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 ON CONSTRAINT "%[1]s_pkey" DO UPDATE SET meta = EXCLUDED.meta WHERE "%[1]s".meta != EXCLUDED.meta""" +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 ( From a1e18a1384fa9bb6223471a7ac843884056392e2 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 30 Mar 2021 01:25:28 -0700 Subject: [PATCH 180/284] server add memory profiling --- weed/command/server.go | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/weed/command/server.go b/weed/command/server.go index aef61a93c..c0ac5ee4c 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -2,8 +2,8 @@ package command import ( "fmt" + "github.com/chrislusf/seaweedfs/weed/util/grace" "os" - "runtime/pprof" "strings" "time" @@ -15,6 +15,7 @@ import ( type ServerOptions struct { cpuprofile *string + memprofile *string v VolumeServerOptions } @@ -75,6 +76,7 @@ var ( func init() { serverOptions.cpuprofile = cmdServer.Flag.String("cpuprofile", "", "cpu profile output file") + serverOptions.memprofile = cmdServer.Flag.String("memprofile", "", "memory profile output file") 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") @@ -137,14 +139,7 @@ func runServer(cmd *Command, args []string) bool { util.LoadConfiguration("security", false) util.LoadConfiguration("master", false) - if *serverOptions.cpuprofile != "" { - f, err := os.Create(*serverOptions.cpuprofile) - if err != nil { - glog.Fatal(err) - } - pprof.StartCPUProfile(f) - defer pprof.StopCPUProfile() - } + grace.SetupProfiling(*serverOptions.cpuprofile, *serverOptions.memprofile) if *isStartingS3 { *isStartingFiler = true From ac875976c0731597ae3df324e71b7ec2b8b4b83d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 30 Mar 2021 02:10:50 -0700 Subject: [PATCH 181/284] filer, volume: add concurrent upload size limit to avoid OOM add some back pressure when writes are slow --- weed/command/filer.go | 33 +++++++++-------- weed/command/server.go | 2 + weed/command/volume.go | 53 ++++++++++++++------------- weed/server/filer_server.go | 43 ++++++++++++---------- weed/server/filer_server_handlers.go | 39 ++++++++++++++------ weed/server/volume_server.go | 8 ++++ weed/server/volume_server_handlers.go | 30 +++++++++++++++ 7 files changed, 138 insertions(+), 70 deletions(-) diff --git a/weed/command/filer.go b/weed/command/filer.go index 68edb8e69..82994b971 100644 --- a/weed/command/filer.go +++ b/weed/command/filer.go @@ -47,6 +47,7 @@ type FilerOptions struct { metricsHttpPort *int saveToFilerLimit *int defaultLevelDbDirectory *string + concurrentUploadLimitMB *int } func init() { @@ -69,6 +70,7 @@ func init() { f.metricsHttpPort = cmdFiler.Flag.Int("metricsPort", 0, "Prometheus metrics listen port") 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") // start s3 on filer filerStartS3 = cmdFiler.Flag.Bool("s3", false, "whether to start S3 gateway") @@ -159,21 +161,22 @@ func (fo *FilerOptions) startFiler() { } fs, nfs_err := weed_server.NewFilerServer(defaultMux, publicVolumeMux, &weed_server.FilerOption{ - Masters: strings.Split(*fo.masters, ","), - Collection: *fo.collection, - DefaultReplication: *fo.defaultReplicaPlacement, - DisableDirListing: *fo.disableDirListing, - MaxMB: *fo.maxMB, - DirListingLimit: *fo.dirListingLimit, - DataCenter: *fo.dataCenter, - Rack: *fo.rack, - DefaultLevelDbDir: defaultLevelDbDirectory, - DisableHttp: *fo.disableHttp, - Host: *fo.ip, - Port: uint32(*fo.port), - Cipher: *fo.cipher, - SaveToFilerLimit: *fo.saveToFilerLimit, - Filers: peers, + Masters: strings.Split(*fo.masters, ","), + Collection: *fo.collection, + DefaultReplication: *fo.defaultReplicaPlacement, + DisableDirListing: *fo.disableDirListing, + MaxMB: *fo.maxMB, + DirListingLimit: *fo.dirListingLimit, + DataCenter: *fo.dataCenter, + Rack: *fo.rack, + DefaultLevelDbDir: defaultLevelDbDirectory, + DisableHttp: *fo.disableHttp, + Host: *fo.ip, + Port: uint32(*fo.port), + Cipher: *fo.cipher, + SaveToFilerLimit: *fo.saveToFilerLimit, + Filers: peers, + ConcurrentUploadLimit: int64(*fo.concurrentUploadLimitMB) * 1024 * 1024, }) if nfs_err != nil { glog.Fatalf("Filer startup error: %v", nfs_err) diff --git a/weed/command/server.go b/weed/command/server.go index c0ac5ee4c..eef2945fc 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -99,6 +99,7 @@ func init() { filerOptions.cipher = cmdServer.Flag.Bool("filer.encryptVolumeData", false, "encrypt data on volume servers") filerOptions.peers = cmdServer.Flag.String("filer.peers", "", "all filers sharing the same filer store in comma separated ip:port list") filerOptions.saveToFilerLimit = cmdServer.Flag.Int("filer.saveToFilerLimit", 0, "Small files smaller than this limit can be cached in filer store.") + filerOptions.concurrentUploadLimitMB = cmdServer.Flag.Int("filer.concurrentUploadLimitMB", 64, "limit total concurrent upload size") serverOptions.v.port = cmdServer.Flag.Int("volume.port", 8080, "volume server http listen port") serverOptions.v.publicPort = cmdServer.Flag.Int("volume.port.public", 0, "volume server public port") @@ -108,6 +109,7 @@ func init() { serverOptions.v.readRedirect = cmdServer.Flag.Bool("volume.read.redirect", true, "Redirect moved or non-local volumes.") 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.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 b75af0f71..8014feaa6 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 - readRedirect *bool - cpuProfile *string - memProfile *string - compactionMBPerSecond *int - fileSizeLimitMB *int - minFreeSpacePercents []float32 - 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 + readRedirect *bool + cpuProfile *string + memProfile *string + compactionMBPerSecond *int + fileSizeLimitMB *int + concurrentUploadLimitMB *int + minFreeSpacePercents []float32 + pprof *bool + preStopSeconds *int + metricsHttpPort *int // pulseSeconds *int enableTcp *bool } @@ -85,6 +86,7 @@ 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.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") @@ -237,6 +239,7 @@ func (v VolumeServerOptions) startVolumeServer(volumeFolders, maxVolumeCounts, v *v.fixJpgOrientation, *v.readRedirect, *v.compactionMBPerSecond, *v.fileSizeLimitMB, + int64(*v.concurrentUploadLimitMB) * 1024 * 1024, ) // starting grpc server grpcS := v.startGrpcService(volumeServer) diff --git a/weed/server/filer_server.go b/weed/server/filer_server.go index 9e0770afa..a876b6d83 100644 --- a/weed/server/filer_server.go +++ b/weed/server/filer_server.go @@ -45,22 +45,23 @@ import ( ) type FilerOption struct { - Masters []string - Collection string - DefaultReplication string - DisableDirListing bool - MaxMB int - DirListingLimit int - DataCenter string - Rack string - DefaultLevelDbDir string - DisableHttp bool - Host string - Port uint32 - recursiveDelete bool - Cipher bool - SaveToFilerLimit int - Filers []string + Masters []string + Collection string + DefaultReplication string + DisableDirListing bool + MaxMB int + DirListingLimit int + DataCenter string + Rack string + DefaultLevelDbDir string + DisableHttp bool + Host string + Port uint32 + recursiveDelete bool + Cipher bool + SaveToFilerLimit int + Filers []string + ConcurrentUploadLimit int64 } type FilerServer struct { @@ -79,14 +80,18 @@ type FilerServer struct { brokers map[string]map[string]bool brokersLock sync.Mutex + + inFlightDataSize int64 + inFlightDataLimitCond *sync.Cond } func NewFilerServer(defaultMux, readonlyMux *http.ServeMux, option *FilerOption) (fs *FilerServer, err error) { fs = &FilerServer{ - option: option, - grpcDialOption: security.LoadClientTLS(util.GetViper(), "grpc.filer"), - brokers: make(map[string]map[string]bool), + option: option, + grpcDialOption: security.LoadClientTLS(util.GetViper(), "grpc.filer"), + brokers: make(map[string]map[string]bool), + inFlightDataLimitCond: sync.NewCond(new(sync.Mutex)), } fs.listenersCond = sync.NewCond(&fs.listenersLock) diff --git a/weed/server/filer_server_handlers.go b/weed/server/filer_server_handlers.go index 3bc0c5d0d..0df00aa5c 100644 --- a/weed/server/filer_server_handlers.go +++ b/weed/server/filer_server_handlers.go @@ -4,6 +4,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" "net/http" "strings" + "sync/atomic" "time" "github.com/chrislusf/seaweedfs/weed/stats" @@ -47,18 +48,34 @@ func (fs *FilerServer) filerHandler(w http.ResponseWriter, r *http.Request) { fs.DeleteHandler(w, r) } stats.FilerRequestHistogram.WithLabelValues("delete").Observe(time.Since(start).Seconds()) - case "PUT": - stats.FilerRequestCounter.WithLabelValues("put").Inc() - if _, ok := r.URL.Query()["tagging"]; ok { - fs.PutTaggingHandler(w, r) - } else { - fs.PostHandler(w, r) + case "POST", "PUT": + + // 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 { + fs.inFlightDataLimitCond.Wait() + } + atomic.AddInt64(&fs.inFlightDataSize, contentLength) + fs.inFlightDataLimitCond.L.Unlock() + defer func() { + atomic.AddInt64(&fs.inFlightDataSize, -contentLength) + fs.inFlightDataLimitCond.Signal() + }() + + if r.Method == "PUT" { + stats.FilerRequestCounter.WithLabelValues("put").Inc() + if _, ok := r.URL.Query()["tagging"]; ok { + fs.PutTaggingHandler(w, r) + } else { + fs.PostHandler(w, r) + } + stats.FilerRequestHistogram.WithLabelValues("put").Observe(time.Since(start).Seconds()) + } else { // method == "POST" + stats.FilerRequestCounter.WithLabelValues("post").Inc() + fs.PostHandler(w, r) + stats.FilerRequestHistogram.WithLabelValues("post").Observe(time.Since(start).Seconds()) } - stats.FilerRequestHistogram.WithLabelValues("put").Observe(time.Since(start).Seconds()) - case "POST": - stats.FilerRequestCounter.WithLabelValues("post").Inc() - fs.PostHandler(w, r) - stats.FilerRequestHistogram.WithLabelValues("post").Observe(time.Since(start).Seconds()) case "OPTIONS": stats.FilerRequestCounter.WithLabelValues("options").Inc() OptionsHandler(w, r, false) diff --git a/weed/server/volume_server.go b/weed/server/volume_server.go index e496b1ce2..e11d607a4 100644 --- a/weed/server/volume_server.go +++ b/weed/server/volume_server.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/chrislusf/seaweedfs/weed/storage/types" "net/http" + "sync" "google.golang.org/grpc" @@ -34,6 +35,10 @@ 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, @@ -48,6 +53,7 @@ func NewVolumeServer(adminMux, publicMux *http.ServeMux, ip string, readRedirect bool, compactionMBPerSecond int, fileSizeLimitMB int, + concurrentUploadLimit int64, ) *VolumeServer { v := util.GetViper() @@ -72,6 +78,8 @@ func NewVolumeServer(adminMux, publicMux *http.ServeMux, ip string, fileSizeLimitBytes: int64(fileSizeLimitMB) * 1024 * 1024, isHeartbeating: true, stopChan: make(chan bool), + inFlightDataLimitCond: 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 7852c950a..4527add44 100644 --- a/weed/server/volume_server_handlers.go +++ b/weed/server/volume_server_handlers.go @@ -2,7 +2,9 @@ package weed_server import ( "net/http" + "strconv" "strings" + "sync/atomic" "github.com/chrislusf/seaweedfs/weed/util" @@ -40,8 +42,24 @@ func (vs *VolumeServer) privateStoreHandler(w http.ResponseWriter, r *http.Reque stats.DeleteRequest() vs.guard.WhiteList(vs.DeleteHandler)(w, r) case "PUT", "POST": + + // wait until in flight data is less than the limit + contentLength := getContentLength(r) + vs.inFlightDataLimitCond.L.Lock() + for atomic.LoadInt64(&vs.inFlightDataSize) > vs.concurrentUploadLimit { + vs.inFlightDataLimitCond.Wait() + } + atomic.AddInt64(&vs.inFlightDataSize, contentLength) + vs.inFlightDataLimitCond.L.Unlock() + defer func() { + atomic.AddInt64(&vs.inFlightDataSize, -contentLength) + vs.inFlightDataLimitCond.Signal() + }() + + // processs uploads stats.WriteRequest() vs.guard.WhiteList(vs.PostHandler)(w, r) + case "OPTIONS": stats.ReadRequest() w.Header().Add("Access-Control-Allow-Methods", "PUT, POST, GET, DELETE, OPTIONS") @@ -49,6 +67,18 @@ func (vs *VolumeServer) privateStoreHandler(w http.ResponseWriter, r *http.Reque } } +func getContentLength(r *http.Request) int64 { + contentLength := r.Header.Get("Content-Length") + if contentLength != "" { + length, err := strconv.ParseInt(contentLength, 10, 64) + if err != nil { + return 0 + } + return length + } + return 0 +} + func (vs *VolumeServer) publicReadOnlyHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Server", "SeaweedFS Volume "+util.VERSION) if r.Header.Get("Origin") != "" { From a4db1fe32fc5c7e60ceb8a01ed831959eb7edc17 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 30 Mar 2021 02:30:34 -0700 Subject: [PATCH 182/284] patch https://github.com/advisories/GHSA-5mg8-w23w-74h3 https://github.com/advisories/GHSA-5mg8-w23w-74h3 --- other/java/client/pom.xml | 2 +- test/random_access/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/other/java/client/pom.xml b/other/java/client/pom.xml index b715368a7..f4e522a3e 100644 --- a/other/java/client/pom.xml +++ b/other/java/client/pom.xml @@ -17,7 +17,7 @@ 3.9.1 1.23.0 - 29.0-jre + 30.0-jre diff --git a/test/random_access/pom.xml b/test/random_access/pom.xml index 0e3628cca..36fe6b256 100644 --- a/test/random_access/pom.xml +++ b/test/random_access/pom.xml @@ -8,7 +8,7 @@ 1.0-SNAPSHOT - 29.0-jre + 30.0-jre From e06807a55bd50b4a59766cb0694fdd664c189845 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 30 Mar 2021 20:36:06 -0700 Subject: [PATCH 183/284] adjust logs --- weed/filer/filer.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/weed/filer/filer.go b/weed/filer/filer.go index e59887763..effdc0e4e 100644 --- a/weed/filer/filer.go +++ b/weed/filer/filer.go @@ -241,12 +241,12 @@ func (f *Filer) UpdateEntry(ctx context.Context, oldEntry, entry *Entry) (err er if oldEntry != nil { entry.Attr.Crtime = oldEntry.Attr.Crtime if oldEntry.IsDirectory() && !entry.IsDirectory() { - glog.Errorf("existing %s is a directory", entry.FullPath) - return fmt.Errorf("existing %s is a directory", entry.FullPath) + glog.Errorf("existing %s is a directory", oldEntry.FullPath) + return fmt.Errorf("existing %s is a directory", oldEntry.FullPath) } if !oldEntry.IsDirectory() && entry.IsDirectory() { - glog.Errorf("existing %s is a file", entry.FullPath) - return fmt.Errorf("existing %s is a file", entry.FullPath) + glog.Errorf("existing %s is a file", oldEntry.FullPath) + return fmt.Errorf("existing %s is a file", oldEntry.FullPath) } } return f.Store.UpdateEntry(ctx, entry) From e79e2ddeedf5d0807ae99bccfe5c464b8117cbaa Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 30 Mar 2021 20:42:44 -0700 Subject: [PATCH 184/284] remove unused MoveEvents --- weed/server/filer_grpc_server_rename.go | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/weed/server/filer_grpc_server_rename.go b/weed/server/filer_grpc_server_rename.go index 5b68b64de..c1e5bc789 100644 --- a/weed/server/filer_grpc_server_rename.go +++ b/weed/server/filer_grpc_server_rename.go @@ -33,8 +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) } - var events MoveEvents - moveErr := fs.moveEntry(ctx, oldParent, oldEntry, newParent, req.NewName, &events) + moveErr := fs.moveEntry(ctx, oldParent, oldEntry, newParent, req.NewName) if moveErr != nil { fs.filer.RollbackTransaction(ctx) return nil, fmt.Errorf("%s/%s move error: %v", req.OldDirectory, req.OldName, moveErr) @@ -48,11 +47,11 @@ 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, events *MoveEvents) error { +func (fs *FilerServer) moveEntry(ctx context.Context, oldParent util.FullPath, entry *filer.Entry, newParent util.FullPath, newName string) error { - if err := fs.moveSelfEntry(ctx, oldParent, entry, newParent, newName, events, func() error { + if err := fs.moveSelfEntry(ctx, oldParent, entry, newParent, newName, func() error { if entry.IsDirectory() { - if err := fs.moveFolderSubEntries(ctx, oldParent, entry, newParent, newName, events); err != nil { + if err := fs.moveFolderSubEntries(ctx, oldParent, entry, newParent, newName); err != nil { return err } } @@ -64,7 +63,7 @@ func (fs *FilerServer) moveEntry(ctx context.Context, oldParent util.FullPath, e return nil } -func (fs *FilerServer) moveFolderSubEntries(ctx context.Context, oldParent util.FullPath, entry *filer.Entry, newParent util.FullPath, newName string, events *MoveEvents) error { +func (fs *FilerServer) moveFolderSubEntries(ctx context.Context, oldParent util.FullPath, entry *filer.Entry, newParent util.FullPath, newName string) error { currentDirPath := oldParent.Child(entry.Name()) newDirPath := newParent.Child(newName) @@ -85,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(), events) + err := fs.moveEntry(ctx, currentDirPath, item, newDirPath, item.Name()) if err != nil { return err } @@ -97,8 +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, events *MoveEvents, - 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) error { oldPath, newPath := oldParent.Child(entry.Name()), newParent.Child(newName) @@ -122,8 +120,6 @@ func (fs *FilerServer) moveSelfEntry(ctx context.Context, oldParent util.FullPat return createErr } - events.newEntries = append(events.newEntries, newEntry) - if moveFolderSubEntries != nil { if moveChildrenErr := moveFolderSubEntries(); moveChildrenErr != nil { return moveChildrenErr @@ -136,13 +132,6 @@ func (fs *FilerServer) moveSelfEntry(ctx context.Context, oldParent util.FullPat return deleteErr } - events.oldEntries = append(events.oldEntries, entry) - return nil } - -type MoveEvents struct { - oldEntries []*filer.Entry - newEntries []*filer.Entry -} From b5880334fce31d1c4d728b2ca5c5141ef11b908a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 30 Mar 2021 21:07:34 -0700 Subject: [PATCH 185/284] refactor --- weed/server/filer_server_handlers.go | 4 +- weed/server/filer_server_handlers_write.go | 4 +- .../filer_server_handlers_write_autochunk.go | 104 ++--------------- .../filer_server_handlers_write_upload.go | 105 ++++++++++++++++++ 4 files changed, 116 insertions(+), 101 deletions(-) create mode 100644 weed/server/filer_server_handlers_write_upload.go diff --git a/weed/server/filer_server_handlers.go b/weed/server/filer_server_handlers.go index 0df00aa5c..ed6bbb6f6 100644 --- a/weed/server/filer_server_handlers.go +++ b/weed/server/filer_server_handlers.go @@ -68,12 +68,12 @@ func (fs *FilerServer) filerHandler(w http.ResponseWriter, r *http.Request) { if _, ok := r.URL.Query()["tagging"]; ok { fs.PutTaggingHandler(w, r) } else { - fs.PostHandler(w, r) + fs.PostHandler(w, r, contentLength) } stats.FilerRequestHistogram.WithLabelValues("put").Observe(time.Since(start).Seconds()) } else { // method == "POST" stats.FilerRequestCounter.WithLabelValues("post").Inc() - fs.PostHandler(w, r) + fs.PostHandler(w, r, contentLength) stats.FilerRequestHistogram.WithLabelValues("post").Observe(time.Since(start).Seconds()) } case "OPTIONS": diff --git a/weed/server/filer_server_handlers_write.go b/weed/server/filer_server_handlers_write.go index 0ce3e4a58..95eba9d3d 100644 --- a/weed/server/filer_server_handlers_write.go +++ b/weed/server/filer_server_handlers_write.go @@ -52,7 +52,7 @@ func (fs *FilerServer) assignNewFileInfo(so *operation.StorageOption) (fileId, u return } -func (fs *FilerServer) PostHandler(w http.ResponseWriter, r *http.Request) { +func (fs *FilerServer) PostHandler(w http.ResponseWriter, r *http.Request, contentLength int64) { ctx := context.Background() @@ -66,7 +66,7 @@ func (fs *FilerServer) PostHandler(w http.ResponseWriter, r *http.Request) { query.Get("rack"), ) - fs.autoChunk(ctx, w, r, so) + fs.autoChunk(ctx, w, r, contentLength, so) util.CloseRequest(r) } diff --git a/weed/server/filer_server_handlers_write_autochunk.go b/weed/server/filer_server_handlers_write_autochunk.go index b44dc381a..2005da740 100644 --- a/weed/server/filer_server_handlers_write_autochunk.go +++ b/weed/server/filer_server_handlers_write_autochunk.go @@ -2,11 +2,8 @@ package weed_server import ( "context" - "crypto/md5" "fmt" - "hash" "io" - "io/ioutil" "net/http" "os" "path" @@ -19,13 +16,12 @@ import ( "github.com/chrislusf/seaweedfs/weed/operation" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" xhttp "github.com/chrislusf/seaweedfs/weed/s3api/http" - "github.com/chrislusf/seaweedfs/weed/security" "github.com/chrislusf/seaweedfs/weed/stats" "github.com/chrislusf/seaweedfs/weed/storage/needle" "github.com/chrislusf/seaweedfs/weed/util" ) -func (fs *FilerServer) autoChunk(ctx context.Context, w http.ResponseWriter, r *http.Request, so *operation.StorageOption) { +func (fs *FilerServer) autoChunk(ctx context.Context, w http.ResponseWriter, r *http.Request, contentLength int64, so *operation.StorageOption) { // autoChunking can be set at the command-line level or as a query param. Query param overrides command-line query := r.URL.Query() @@ -51,10 +47,10 @@ func (fs *FilerServer) autoChunk(ctx context.Context, w http.ResponseWriter, r * if r.Header.Get("Content-Type") == "" && strings.HasSuffix(r.URL.Path, "/") { reply, err = fs.mkdir(ctx, w, r) } else { - reply, md5bytes, err = fs.doPostAutoChunk(ctx, w, r, chunkSize, so) + reply, md5bytes, err = fs.doPostAutoChunk(ctx, w, r, chunkSize, contentLength, so) } } else { - reply, md5bytes, err = fs.doPutAutoChunk(ctx, w, r, chunkSize, so) + reply, md5bytes, err = fs.doPutAutoChunk(ctx, w, r, chunkSize, contentLength, so) } if err != nil { if strings.HasPrefix(err.Error(), "read input:") { @@ -72,7 +68,7 @@ func (fs *FilerServer) autoChunk(ctx context.Context, w http.ResponseWriter, r * } } -func (fs *FilerServer) doPostAutoChunk(ctx context.Context, w http.ResponseWriter, r *http.Request, chunkSize int32, so *operation.StorageOption) (filerResult *FilerPostResult, md5bytes []byte, replyerr error) { +func (fs *FilerServer) doPostAutoChunk(ctx context.Context, w http.ResponseWriter, r *http.Request, chunkSize int32, contentLength int64, so *operation.StorageOption) (filerResult *FilerPostResult, md5bytes []byte, replyerr error) { multipartReader, multipartReaderErr := r.MultipartReader() if multipartReaderErr != nil { @@ -93,7 +89,7 @@ func (fs *FilerServer) doPostAutoChunk(ctx context.Context, w http.ResponseWrite contentType = "" } - fileChunks, md5Hash, chunkOffset, err, smallContent := fs.uploadReaderToChunks(w, r, part1, chunkSize, fileName, contentType, so) + fileChunks, md5Hash, chunkOffset, err, smallContent := fs.uploadReaderToChunks(w, r, part1, chunkSize, fileName, contentType, contentLength, so) if err != nil { return nil, nil, err } @@ -104,7 +100,7 @@ func (fs *FilerServer) doPostAutoChunk(ctx context.Context, w http.ResponseWrite return } -func (fs *FilerServer) doPutAutoChunk(ctx context.Context, w http.ResponseWriter, r *http.Request, chunkSize int32, so *operation.StorageOption) (filerResult *FilerPostResult, md5bytes []byte, replyerr error) { +func (fs *FilerServer) doPutAutoChunk(ctx context.Context, w http.ResponseWriter, r *http.Request, chunkSize int32, contentLength int64, so *operation.StorageOption) (filerResult *FilerPostResult, md5bytes []byte, replyerr error) { fileName := path.Base(r.URL.Path) contentType := r.Header.Get("Content-Type") @@ -112,7 +108,7 @@ func (fs *FilerServer) doPutAutoChunk(ctx context.Context, w http.ResponseWriter contentType = "" } - fileChunks, md5Hash, chunkOffset, err, smallContent := fs.uploadReaderToChunks(w, r, r.Body, chunkSize, fileName, contentType, so) + fileChunks, md5Hash, chunkOffset, err, smallContent := fs.uploadReaderToChunks(w, r, r.Body, chunkSize, fileName, contentType, contentLength, so) if err != nil { return nil, nil, err } @@ -231,92 +227,6 @@ func (fs *FilerServer) saveMetaData(ctx context.Context, r *http.Request, fileNa return filerResult, replyerr } -func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Request, reader io.Reader, chunkSize int32, fileName, contentType string, 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)) - - chunkOffset := int64(0) - var smallContent []byte - - for { - limitedReader := io.LimitReader(partReader, int64(chunkSize)) - - data, err := ioutil.ReadAll(limitedReader) - if err != nil { - return nil, nil, 0, err, nil - } - if chunkOffset == 0 && !isAppend(r) { - if len(data) < fs.option.SaveToFilerLimit || strings.HasPrefix(r.URL.Path, filer.DirectoryEtcRoot) && len(data) < 4*1024 { - smallContent = data - chunkOffset += int64(len(data)) - break - } - } - dataReader := util.NewBytesReader(data) - - // 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 - } - - // 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 { - break - } - - // Save to chunk manifest structure - fileChunks = append(fileChunks, uploadResult.ToPbFileChunk(fileId, chunkOffset)) - - glog.V(4).Infof("uploaded %s chunk %d to %s [%d,%d)", fileName, len(fileChunks), fileId, chunkOffset, chunkOffset+int64(uploadResult.Size)) - - // reset variables for the next chunk - chunkOffset = chunkOffset + int64(uploadResult.Size) - - // if last chunk was not at full chunk size, but already exhausted the reader - if int64(uploadResult.Size) < int64(chunkSize) { - break - } - } - - 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) { - - stats.FilerRequestCounter.WithLabelValues("chunkUpload").Inc() - start := time.Now() - defer func() { - stats.FilerRequestHistogram.WithLabelValues("chunkUpload").Observe(time.Since(start).Seconds()) - }() - - uploadResult, err, data := operation.Upload(urlLocation, fileName, fs.option.Cipher, limitedReader, false, contentType, pairMap, auth) - if uploadResult != nil && uploadResult.RetryCount > 0 { - stats.FilerRequestCounter.WithLabelValues("chunkUploadRetry").Add(float64(uploadResult.RetryCount)) - } - return uploadResult, err, data -} - func (fs *FilerServer) saveAsChunk(so *operation.StorageOption) filer.SaveDataAsChunkFunctionType { return func(reader io.Reader, name string, offset int64) (*filer_pb.FileChunk, string, string, error) { diff --git a/weed/server/filer_server_handlers_write_upload.go b/weed/server/filer_server_handlers_write_upload.go new file mode 100644 index 000000000..cf8cdf3d8 --- /dev/null +++ b/weed/server/filer_server_handlers_write_upload.go @@ -0,0 +1,105 @@ +package weed_server + +import ( + "crypto/md5" + "hash" + "io" + "io/ioutil" + "net/http" + "strings" + "time" + + "github.com/chrislusf/seaweedfs/weed/filer" + "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/operation" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/chrislusf/seaweedfs/weed/security" + "github.com/chrislusf/seaweedfs/weed/stats" + "github.com/chrislusf/seaweedfs/weed/util" +) + +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)) + + chunkOffset := int64(0) + var smallContent []byte + + for { + limitedReader := io.LimitReader(partReader, int64(chunkSize)) + + data, err := ioutil.ReadAll(limitedReader) + if err != nil { + return nil, nil, 0, err, nil + } + if chunkOffset == 0 && !isAppend(r) { + if len(data) < fs.option.SaveToFilerLimit || strings.HasPrefix(r.URL.Path, filer.DirectoryEtcRoot) && len(data) < 4*1024 { + smallContent = data + chunkOffset += int64(len(data)) + break + } + } + dataReader := util.NewBytesReader(data) + + // 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 + } + + // 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 { + break + } + + // Save to chunk manifest structure + fileChunks = append(fileChunks, uploadResult.ToPbFileChunk(fileId, chunkOffset)) + + glog.V(4).Infof("uploaded %s chunk %d to %s [%d,%d)", fileName, len(fileChunks), fileId, chunkOffset, chunkOffset+int64(uploadResult.Size)) + + // reset variables for the next chunk + chunkOffset = chunkOffset + int64(uploadResult.Size) + + // if last chunk was not at full chunk size, but already exhausted the reader + if int64(uploadResult.Size) < int64(chunkSize) { + break + } + } + + 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) { + + stats.FilerRequestCounter.WithLabelValues("chunkUpload").Inc() + start := time.Now() + defer func() { + stats.FilerRequestHistogram.WithLabelValues("chunkUpload").Observe(time.Since(start).Seconds()) + }() + + uploadResult, err, data := operation.Upload(urlLocation, fileName, fs.option.Cipher, limitedReader, false, contentType, pairMap, auth) + if uploadResult != nil && uploadResult.RetryCount > 0 { + stats.FilerRequestCounter.WithLabelValues("chunkUploadRetry").Add(float64(uploadResult.RetryCount)) + } + return uploadResult, err, data +} From 1f984d26453bc97c95a8aa51e69d05ac74942685 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 1 Apr 2021 02:20:00 -0700 Subject: [PATCH 186/284] refactor buffer pool --- weed/command/filer.go | 2 +- weed/operation/buffer_pool.go | 23 +++++++++++++++++++++++ weed/operation/upload_content.go | 5 ++--- 3 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 weed/operation/buffer_pool.go diff --git a/weed/command/filer.go b/weed/command/filer.go index 82994b971..e9e3237df 100644 --- a/weed/command/filer.go +++ b/weed/command/filer.go @@ -174,7 +174,7 @@ func (fo *FilerOptions) startFiler() { Host: *fo.ip, Port: uint32(*fo.port), Cipher: *fo.cipher, - SaveToFilerLimit: *fo.saveToFilerLimit, + SaveToFilerLimit: int64(*fo.saveToFilerLimit), Filers: peers, ConcurrentUploadLimit: int64(*fo.concurrentUploadLimitMB) * 1024 * 1024, }) diff --git a/weed/operation/buffer_pool.go b/weed/operation/buffer_pool.go new file mode 100644 index 000000000..4003f7d70 --- /dev/null +++ b/weed/operation/buffer_pool.go @@ -0,0 +1,23 @@ +package operation + +import ( + "github.com/valyala/bytebufferpool" + "sync/atomic" +) + +var bufferCounter int64 +func GetBuffer() *bytebufferpool.ByteBuffer { + defer func() { + atomic.AddInt64(&bufferCounter, 1) + // println("+", bufferCounter) + }() + return bytebufferpool.Get() +} + +func PutBuffer(buf *bytebufferpool.ByteBuffer) { + defer func() { + atomic.AddInt64(&bufferCounter, -1) + // println("-", bufferCounter) + }() + bytebufferpool.Put(buf) +} diff --git a/weed/operation/upload_content.go b/weed/operation/upload_content.go index 9957a04cd..e891ae03b 100644 --- a/weed/operation/upload_content.go +++ b/weed/operation/upload_content.go @@ -19,7 +19,6 @@ import ( "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/security" "github.com/chrislusf/seaweedfs/weed/util" - "github.com/valyala/bytebufferpool" ) type UploadResult struct { @@ -190,8 +189,8 @@ func doUploadData(uploadUrl string, filename string, cipher bool, data []byte, i } func upload_content(uploadUrl string, fillBufferFunction func(w io.Writer) error, filename string, isGzipped bool, originalDataSize int, mtype string, pairMap map[string]string, jwt security.EncodedJwt) (*UploadResult, error) { - buf := bytebufferpool.Get() - defer bytebufferpool.Put(buf) + buf := GetBuffer() + defer PutBuffer(buf) body_writer := multipart.NewWriter(buf) h := make(textproto.MIMEHeader) h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="file"; filename="%s"`, fileNameEscaper.Replace(filename))) From cefe66f1592855b26544f7a84162a3803ed7cda2 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 1 Apr 2021 02:21:40 -0700 Subject: [PATCH 187/284] dedicated upload processor avoid thundering effect of overloading volume servers --- weed/operation/upload_processor.go | 61 ++++++ weed/server/filer_server.go | 2 +- .../filer_server_handlers_write_upload.go | 182 ++++++++++++------ 3 files changed, 180 insertions(+), 65 deletions(-) create mode 100644 weed/operation/upload_processor.go diff --git a/weed/operation/upload_processor.go b/weed/operation/upload_processor.go new file mode 100644 index 000000000..903ae72ce --- /dev/null +++ b/weed/operation/upload_processor.go @@ -0,0 +1,61 @@ +package operation + +import ( + "reflect" + "runtime" + "sync" + "sync/atomic" +) + +type OperationRequest func() + +var ( + requestSlots = uint32(32) + requests = make([]chan OperationRequest, requestSlots) // increase slots to increase fairness + ConcurrentUploadLimit = int32(runtime.NumCPU()) // directly related to memory usage + concurrentLimitCond = sync.NewCond(new(sync.Mutex)) + concurrentUpload int32 +) + +func init() { + + for i := 0; i < int(requestSlots); i++ { + requests[i] = make(chan OperationRequest) + } + + cases := make([]reflect.SelectCase, requestSlots) + for i, ch := range requests { + cases[i] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)} + } + + go func() { + for { + _, value, ok := reflect.Select(cases) + if !ok { + continue + } + + request := value.Interface().(OperationRequest) + + concurrentLimitCond.L.Lock() + for atomic.LoadInt32(&concurrentUpload) > ConcurrentUploadLimit { + concurrentLimitCond.Wait() + } + atomic.AddInt32(&concurrentUpload, 1) + concurrentLimitCond.L.Unlock() + + go func() { + defer atomic.AddInt32(&concurrentUpload, -1) + defer concurrentLimitCond.Signal() + request() + }() + + } + }() + +} + +func AsyncOutOfOrderProcess(slotKey uint32, request OperationRequest) { + index := slotKey % requestSlots + requests[index] <- request +} diff --git a/weed/server/filer_server.go b/weed/server/filer_server.go index a876b6d83..2734223ea 100644 --- a/weed/server/filer_server.go +++ b/weed/server/filer_server.go @@ -59,7 +59,7 @@ type FilerOption struct { Port uint32 recursiveDelete bool Cipher bool - SaveToFilerLimit int + SaveToFilerLimit int64 Filers []string ConcurrentUploadLimit int64 } diff --git a/weed/server/filer_server_handlers_write_upload.go b/weed/server/filer_server_handlers_write_upload.go index cf8cdf3d8..21af6a109 100644 --- a/weed/server/filer_server_handlers_write_upload.go +++ b/weed/server/filer_server_handlers_write_upload.go @@ -5,8 +5,10 @@ import ( "hash" "io" "io/ioutil" + "math/rand" "net/http" "strings" + "sync" "time" "github.com/chrislusf/seaweedfs/weed/filer" @@ -18,75 +20,127 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" ) -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 +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, dataSize int64, err error, smallContent []byte) { - md5Hash := md5.New() + md5Hash = md5.New() var partReader = ioutil.NopCloser(io.TeeReader(reader, md5Hash)) - chunkOffset := int64(0) - var smallContent []byte - - for { - limitedReader := io.LimitReader(partReader, int64(chunkSize)) - - data, err := ioutil.ReadAll(limitedReader) - if err != nil { - return nil, nil, 0, err, nil - } - if chunkOffset == 0 && !isAppend(r) { - if len(data) < fs.option.SaveToFilerLimit || strings.HasPrefix(r.URL.Path, filer.DirectoryEtcRoot) && len(data) < 4*1024 { - smallContent = data - chunkOffset += int64(len(data)) - break - } - } - dataReader := util.NewBytesReader(data) - - // 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 - } - - // 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 { - break - } - - // Save to chunk manifest structure - fileChunks = append(fileChunks, uploadResult.ToPbFileChunk(fileId, chunkOffset)) - - glog.V(4).Infof("uploaded %s chunk %d to %s [%d,%d)", fileName, len(fileChunks), fileId, chunkOffset, chunkOffset+int64(uploadResult.Size)) - - // reset variables for the next chunk - chunkOffset = chunkOffset + int64(uploadResult.Size) - - // if last chunk was not at full chunk size, but already exhausted the reader - if int64(uploadResult.Size) < int64(chunkSize) { - break - } + // save small content directly + if !isAppend(r) && ((0 < contentLength && contentLength < fs.option.SaveToFilerLimit) || strings.HasPrefix(r.URL.Path, filer.DirectoryEtcRoot) && contentLength < 4*1024) { + smallContent, err = ioutil.ReadAll(partReader) + dataSize = int64(len(smallContent)) + return } - return fileChunks, md5Hash, chunkOffset, nil, smallContent + resultsChan := make(chan *ChunkCreationResult, operation.ConcurrentUploadLimit) + + var waitForAllData sync.WaitGroup + waitForAllData.Add(1) + go func() { + // process upload results + defer waitForAllData.Done() + for result := range resultsChan { + if result.err != nil { + err = result.err + continue + } + + // Save to chunk manifest structure + fileChunks = append(fileChunks, result.chunk) + } + }() + + var lock sync.Mutex + readOffset := int64(0) + var wg sync.WaitGroup + var readErr error + + for readErr == nil { + + wg.Add(1) + operation.AsyncOutOfOrderProcess(rand.Uint32(), func() { + defer wg.Done() + + var localOffset int64 + var data []byte + // read from the input + lock.Lock() + localOffset = readOffset + limitedReader := io.LimitReader(partReader, int64(chunkSize)) + data, readErr = ioutil.ReadAll(limitedReader) + readOffset += int64(len(data)) + lock.Unlock() + // handle read errors + if readErr != nil { + if readErr != io.EOF { + resultsChan <- &ChunkCreationResult{ + err: readErr, + } + } + return + } + if len(data) == 0 { + readErr = io.EOF + return + } + + // upload + dataReader := util.NewBytesReader(data) + fileId, uploadResult, uploadErr := fs.doCreateChunk(w, r, so, dataReader, fileName, contentType) + if uploadErr != nil { + resultsChan <- &ChunkCreationResult{ + err: uploadErr, + } + return + } + + glog.V(4).Infof("uploaded %s to %s [%d,%d)", fileName, fileId, localOffset, localOffset+int64(uploadResult.Size)) + + // send back uploaded file chunk + resultsChan <- &ChunkCreationResult{ + chunk: uploadResult.ToPbFileChunk(fileId, localOffset), + } + + }) + } + + go func() { + wg.Wait() + close(resultsChan) + }() + + waitForAllData.Wait() + + return fileChunks, md5Hash, readOffset, err, nil +} + +type ChunkCreationResult struct { + chunk *filer_pb.FileChunk + err error +} + +func (fs *FilerServer) doCreateChunk(w http.ResponseWriter, r *http.Request, so *operation.StorageOption, dataReader *util.BytesReader, fileName string, contentType string) (string, *operation.UploadResult, error) { + // 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, assignErr + } + + // 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 + } + return fileId, uploadResult, uploadErr } 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) { From cc0df36a9e767b27e313885a79119e6b14c3cbad Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 1 Apr 2021 02:21:59 -0700 Subject: [PATCH 188/284] smaller file chunks are faster --- weed/command/filer.go | 2 +- weed/command/filer_copy.go | 2 +- weed/command/server.go | 2 +- weed/command/upload.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/weed/command/filer.go b/weed/command/filer.go index e9e3237df..1b31dbcc7 100644 --- a/weed/command/filer.go +++ b/weed/command/filer.go @@ -60,7 +60,7 @@ func init() { f.publicPort = cmdFiler.Flag.Int("port.readonly", 0, "readonly port opened to public") f.defaultReplicaPlacement = cmdFiler.Flag.String("defaultReplicaPlacement", "", "default replication type. If not specified, use master setting.") f.disableDirListing = cmdFiler.Flag.Bool("disableDirListing", false, "turn off directory listing") - f.maxMB = cmdFiler.Flag.Int("maxMB", 32, "split files larger than the limit") + f.maxMB = cmdFiler.Flag.Int("maxMB", 4, "split files larger than the limit") f.dirListingLimit = cmdFiler.Flag.Int("dirListLimit", 100000, "limit sub dir listing size") f.dataCenter = cmdFiler.Flag.String("dataCenter", "", "prefer to read and write to volumes in this data center") f.rack = cmdFiler.Flag.String("rack", "", "prefer to write to volumes in this rack") diff --git a/weed/command/filer_copy.go b/weed/command/filer_copy.go index 42f5ec4c3..a36bb8cea 100644 --- a/weed/command/filer_copy.go +++ b/weed/command/filer_copy.go @@ -56,7 +56,7 @@ func init() { 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", 32, "split files larger than the limit") + 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") } diff --git a/weed/command/server.go b/weed/command/server.go index eef2945fc..6eb3bf97c 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -94,7 +94,7 @@ func init() { filerOptions.publicPort = cmdServer.Flag.Int("filer.port.public", 0, "filer server public http listen port") filerOptions.defaultReplicaPlacement = cmdServer.Flag.String("filer.defaultReplicaPlacement", "", "default replication type. If not specified, use master setting.") filerOptions.disableDirListing = cmdServer.Flag.Bool("filer.disableDirListing", false, "turn off directory listing") - filerOptions.maxMB = cmdServer.Flag.Int("filer.maxMB", 32, "split files larger than the limit") + filerOptions.maxMB = cmdServer.Flag.Int("filer.maxMB", 4, "split files larger than the limit") filerOptions.dirListingLimit = cmdServer.Flag.Int("filer.dirListLimit", 1000, "limit sub dir listing size") filerOptions.cipher = cmdServer.Flag.Bool("filer.encryptVolumeData", false, "encrypt data on volume servers") filerOptions.peers = cmdServer.Flag.String("filer.peers", "", "all filers sharing the same filer store in comma separated ip:port list") diff --git a/weed/command/upload.go b/weed/command/upload.go index 67fde2185..0f9361b40 100644 --- a/weed/command/upload.go +++ b/weed/command/upload.go @@ -43,7 +43,7 @@ func init() { upload.dataCenter = cmdUpload.Flag.String("dataCenter", "", "optional data center name") upload.diskType = cmdUpload.Flag.String("disk", "", "[hdd|ssd|] hard drive or solid state drive or any tag") upload.ttl = cmdUpload.Flag.String("ttl", "", "time to live, e.g.: 1m, 1h, 1d, 1M, 1y") - upload.maxMB = cmdUpload.Flag.Int("maxMB", 32, "split files larger than the limit") + upload.maxMB = cmdUpload.Flag.Int("maxMB", 4, "split files larger than the limit") upload.usePublicUrl = cmdUpload.Flag.Bool("usePublicUrl", false, "upload to public url from volume server") } From 7e8edc3c4adaf1251f5c773cbeaf3a868269f97a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 2 Apr 2021 01:10:24 -0700 Subject: [PATCH 189/284] refactoring --- weed/filesys/wfs.go | 4 +- weed/operation/upload_processor.go | 61 -------------- .../filer_server_handlers_write_upload.go | 8 +- weed/util/limiter.go | 82 +++++++++++++------ 4 files changed, 64 insertions(+), 91 deletions(-) delete mode 100644 weed/operation/upload_processor.go diff --git a/weed/filesys/wfs.go b/weed/filesys/wfs.go index c6d9080a1..f0ac6d80d 100644 --- a/weed/filesys/wfs.go +++ b/weed/filesys/wfs.go @@ -77,7 +77,7 @@ type WFS struct { signature int32 // throttle writers - concurrentWriters *util.LimitedConcurrentExecutor + concurrentWriters *util.LimitedOutOfOrderProcessor Server *fs.Server } type statsCache struct { @@ -135,7 +135,7 @@ func NewSeaweedFileSystem(option *Option) *WFS { wfs.fsNodeCache = newFsCache(wfs.root) if wfs.option.ConcurrentWriters > 0 { - wfs.concurrentWriters = util.NewLimitedConcurrentExecutor(wfs.option.ConcurrentWriters) + wfs.concurrentWriters = util.NewLimitedOutOfOrderProcessor(int32(wfs.option.ConcurrentWriters)) } return wfs diff --git a/weed/operation/upload_processor.go b/weed/operation/upload_processor.go deleted file mode 100644 index 903ae72ce..000000000 --- a/weed/operation/upload_processor.go +++ /dev/null @@ -1,61 +0,0 @@ -package operation - -import ( - "reflect" - "runtime" - "sync" - "sync/atomic" -) - -type OperationRequest func() - -var ( - requestSlots = uint32(32) - requests = make([]chan OperationRequest, requestSlots) // increase slots to increase fairness - ConcurrentUploadLimit = int32(runtime.NumCPU()) // directly related to memory usage - concurrentLimitCond = sync.NewCond(new(sync.Mutex)) - concurrentUpload int32 -) - -func init() { - - for i := 0; i < int(requestSlots); i++ { - requests[i] = make(chan OperationRequest) - } - - cases := make([]reflect.SelectCase, requestSlots) - for i, ch := range requests { - cases[i] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)} - } - - go func() { - for { - _, value, ok := reflect.Select(cases) - if !ok { - continue - } - - request := value.Interface().(OperationRequest) - - concurrentLimitCond.L.Lock() - for atomic.LoadInt32(&concurrentUpload) > ConcurrentUploadLimit { - concurrentLimitCond.Wait() - } - atomic.AddInt32(&concurrentUpload, 1) - concurrentLimitCond.L.Unlock() - - go func() { - defer atomic.AddInt32(&concurrentUpload, -1) - defer concurrentLimitCond.Signal() - request() - }() - - } - }() - -} - -func AsyncOutOfOrderProcess(slotKey uint32, request OperationRequest) { - index := slotKey % requestSlots - requests[index] <- request -} diff --git a/weed/server/filer_server_handlers_write_upload.go b/weed/server/filer_server_handlers_write_upload.go index 21af6a109..25275cf05 100644 --- a/weed/server/filer_server_handlers_write_upload.go +++ b/weed/server/filer_server_handlers_write_upload.go @@ -5,8 +5,8 @@ import ( "hash" "io" "io/ioutil" - "math/rand" "net/http" + "runtime" "strings" "sync" "time" @@ -20,6 +20,10 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" ) +var ( + limitedUploadProcessor = util.NewLimitedOutOfOrderProcessor(int32(runtime.NumCPU())) +) + 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, dataSize int64, err error, smallContent []byte) { md5Hash = md5.New() @@ -58,7 +62,7 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque for readErr == nil { wg.Add(1) - operation.AsyncOutOfOrderProcess(rand.Uint32(), func() { + limitedUploadProcessor.Execute(func() { defer wg.Done() var localOffset int64 diff --git a/weed/util/limiter.go b/weed/util/limiter.go index 91499632c..2e5168d3d 100644 --- a/weed/util/limiter.go +++ b/weed/util/limiter.go @@ -1,40 +1,70 @@ package util -// initial version comes from https://github.com/korovkin/limiter/blob/master/limiter.go +import ( + "math/rand" + "reflect" + "sync" + "sync/atomic" +) -// LimitedConcurrentExecutor object -type LimitedConcurrentExecutor struct { - limit int - tokenChan chan int +type OperationRequest func() + +type LimitedOutOfOrderProcessor struct { + processorSlots uint32 + processors []chan OperationRequest + processorLimit int32 + processorLimitCond *sync.Cond + currentProcessor int32 } -func NewLimitedConcurrentExecutor(limit int) *LimitedConcurrentExecutor { +func NewLimitedOutOfOrderProcessor(limit int32) (c *LimitedOutOfOrderProcessor) { - // allocate a limiter instance - c := &LimitedConcurrentExecutor{ - limit: limit, - tokenChan: make(chan int, limit), + processorSlots := uint32(32) + c = &LimitedOutOfOrderProcessor{ + processorSlots: processorSlots, + processors: make([]chan OperationRequest, processorSlots), + processorLimit: limit, + processorLimitCond: sync.NewCond(new(sync.Mutex)), } - // allocate the tokenChan: - for i := 0; i < c.limit; i++ { - c.tokenChan <- i + for i := 0; i < int(processorSlots); i++ { + c.processors[i] = make(chan OperationRequest) } + cases := make([]reflect.SelectCase, processorSlots) + for i, ch := range c.processors { + cases[i] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)} + } + + go func() { + for { + _, value, ok := reflect.Select(cases) + if !ok { + continue + } + + request := value.Interface().(OperationRequest) + + c.processorLimitCond.L.Lock() + for atomic.LoadInt32(&c.currentProcessor) > c.processorLimit { + c.processorLimitCond.Wait() + } + atomic.AddInt32(&c.currentProcessor, 1) + c.processorLimitCond.L.Unlock() + + go func() { + defer atomic.AddInt32(&c.currentProcessor, -1) + defer c.processorLimitCond.Signal() + request() + }() + + } + }() + return c } -// Execute adds a function to the execution queue. -// if num of go routines allocated by this instance is < limit -// launch a new go routine to execute job -// else wait until a go routine becomes available -func (c *LimitedConcurrentExecutor) Execute(job func()) { - token := <-c.tokenChan - go func() { - defer func() { - c.tokenChan <- token - }() - // run the job - job() - }() +func (c *LimitedOutOfOrderProcessor) Execute(request OperationRequest) { + index := rand.Uint32() % c.processorSlots + c.processors[index] <- request } From 67e019d54b2f7bde826584c1b752305ec1702ca4 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 2 Apr 2021 01:11:44 -0700 Subject: [PATCH 190/284] add missing changes --- 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 25275cf05..748079d97 100644 --- a/weed/server/filer_server_handlers_write_upload.go +++ b/weed/server/filer_server_handlers_write_upload.go @@ -36,7 +36,7 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque return } - resultsChan := make(chan *ChunkCreationResult, operation.ConcurrentUploadLimit) + resultsChan := make(chan *ChunkCreationResult, 2) var waitForAllData sync.WaitGroup waitForAllData.Add(1) From bdf2ddddfdccbc3d48e763457a779c8cc9ece6ac Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 2 Apr 2021 02:21:38 -0700 Subject: [PATCH 191/284] revert to same implementation as before This reverts commit 7e8edc3c4adaf1251f5c773cbeaf3a868269f97a. --- weed/filesys/wfs.go | 4 ++-- weed/util/limiter.go | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/weed/filesys/wfs.go b/weed/filesys/wfs.go index f0ac6d80d..c6d9080a1 100644 --- a/weed/filesys/wfs.go +++ b/weed/filesys/wfs.go @@ -77,7 +77,7 @@ type WFS struct { signature int32 // throttle writers - concurrentWriters *util.LimitedOutOfOrderProcessor + concurrentWriters *util.LimitedConcurrentExecutor Server *fs.Server } type statsCache struct { @@ -135,7 +135,7 @@ func NewSeaweedFileSystem(option *Option) *WFS { wfs.fsNodeCache = newFsCache(wfs.root) if wfs.option.ConcurrentWriters > 0 { - wfs.concurrentWriters = util.NewLimitedOutOfOrderProcessor(int32(wfs.option.ConcurrentWriters)) + wfs.concurrentWriters = util.NewLimitedConcurrentExecutor(wfs.option.ConcurrentWriters) } return wfs diff --git a/weed/util/limiter.go b/weed/util/limiter.go index 2e5168d3d..ccdaa701e 100644 --- a/weed/util/limiter.go +++ b/weed/util/limiter.go @@ -7,6 +7,46 @@ import ( "sync/atomic" ) +// initial version comes from https://github.com/korovkin/limiter/blob/master/limiter.go + +// LimitedConcurrentExecutor object +type LimitedConcurrentExecutor struct { + limit int + tokenChan chan int +} + +func NewLimitedConcurrentExecutor(limit int) *LimitedConcurrentExecutor { + + // allocate a limiter instance + c := &LimitedConcurrentExecutor{ + limit: limit, + tokenChan: make(chan int, limit), + } + + // allocate the tokenChan: + for i := 0; i < c.limit; i++ { + c.tokenChan <- i + } + + return c +} + +// Execute adds a function to the execution queue. +// if num of go routines allocated by this instance is < limit +// launch a new go routine to execute job +// else wait until a go routine becomes available +func (c *LimitedConcurrentExecutor) Execute(job func()) { + token := <-c.tokenChan + go func() { + defer func() { + c.tokenChan <- token + }() + // run the job + job() + }() +} + +// a different implementation, but somehow more "conservative" type OperationRequest func() type LimitedOutOfOrderProcessor struct { From 8e404a1433fe437de22b3356176cf36eb3719018 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 2 Apr 2021 02:22:26 -0700 Subject: [PATCH 192/284] go fmt --- weed/command/volume.go | 2 +- weed/filer/mysql/mysql_store.go | 2 +- weed/filer/mysql2/mysql2_store.go | 2 +- weed/filer/postgres/postgres_store.go | 2 +- weed/filer/postgres2/postgres2_store.go | 2 +- weed/server/filer_server_handlers_write_autochunk.go | 2 +- weed/storage/needle/needle_read_write.go | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/weed/command/volume.go b/weed/command/volume.go index 8014feaa6..9df500178 100644 --- a/weed/command/volume.go +++ b/weed/command/volume.go @@ -239,7 +239,7 @@ func (v VolumeServerOptions) startVolumeServer(volumeFolders, maxVolumeCounts, v *v.fixJpgOrientation, *v.readRedirect, *v.compactionMBPerSecond, *v.fileSizeLimitMB, - int64(*v.concurrentUploadLimitMB) * 1024 * 1024, + int64(*v.concurrentUploadLimitMB)*1024*1024, ) // starting grpc server grpcS := v.startGrpcService(volumeServer) diff --git a/weed/filer/mysql/mysql_store.go b/weed/filer/mysql/mysql_store.go index 423b01392..fbaa4d5f9 100644 --- a/weed/filer/mysql/mysql_store.go +++ b/weed/filer/mysql/mysql_store.go @@ -49,7 +49,7 @@ func (store *MysqlStore) initialize(upsertQuery string, enableUpsert bool, user, store.SupportBucketTable = false if !enableUpsert { - upsertQuery = "" + upsertQuery = "" } store.SqlGenerator = &SqlGenMysql{ CreateTableSqlTemplate: "", diff --git a/weed/filer/mysql2/mysql2_store.go b/weed/filer/mysql2/mysql2_store.go index 071352111..a1f54455a 100644 --- a/weed/filer/mysql2/mysql2_store.go +++ b/weed/filer/mysql2/mysql2_store.go @@ -51,7 +51,7 @@ func (store *MysqlStore2) initialize(createTable, upsertQuery string, enableUpse store.SupportBucketTable = true if !enableUpsert { - upsertQuery = "" + upsertQuery = "" } store.SqlGenerator = &mysql.SqlGenMysql{ CreateTableSqlTemplate: createTable, diff --git a/weed/filer/postgres/postgres_store.go b/weed/filer/postgres/postgres_store.go index 21b79d1fe..a1e16a92a 100644 --- a/weed/filer/postgres/postgres_store.go +++ b/weed/filer/postgres/postgres_store.go @@ -48,7 +48,7 @@ func (store *PostgresStore) initialize(upsertQuery string, enableUpsert bool, us store.SupportBucketTable = false if !enableUpsert { - upsertQuery = "" + upsertQuery = "" } store.SqlGenerator = &SqlGenPostgres{ CreateTableSqlTemplate: "", diff --git a/weed/filer/postgres2/postgres2_store.go b/weed/filer/postgres2/postgres2_store.go index 01fc4a869..0f573d8d0 100644 --- a/weed/filer/postgres2/postgres2_store.go +++ b/weed/filer/postgres2/postgres2_store.go @@ -51,7 +51,7 @@ func (store *PostgresStore2) initialize(createTable, upsertQuery string, enableU store.SupportBucketTable = true if !enableUpsert { - upsertQuery = "" + upsertQuery = "" } store.SqlGenerator = &postgres.SqlGenPostgres{ CreateTableSqlTemplate: createTable, diff --git a/weed/server/filer_server_handlers_write_autochunk.go b/weed/server/filer_server_handlers_write_autochunk.go index 2005da740..2808042c7 100644 --- a/weed/server/filer_server_handlers_write_autochunk.go +++ b/weed/server/filer_server_handlers_write_autochunk.go @@ -55,7 +55,7 @@ func (fs *FilerServer) autoChunk(ctx context.Context, w http.ResponseWriter, r * if err != nil { if strings.HasPrefix(err.Error(), "read input:") { writeJsonError(w, r, 499, err) - }else if strings.HasSuffix(err.Error(), "is a file") { + } else if strings.HasSuffix(err.Error(), "is a file") { writeJsonError(w, r, http.StatusConflict, err) } else { writeJsonError(w, r, http.StatusInternalServerError, err) diff --git a/weed/storage/needle/needle_read_write.go b/weed/storage/needle/needle_read_write.go index 2d7420639..16c2fd06b 100644 --- a/weed/storage/needle/needle_read_write.go +++ b/weed/storage/needle/needle_read_write.go @@ -173,7 +173,7 @@ func WriteNeedleBlob(w backend.BackendStorageFile, dataSlice []byte, size Size, if version == Version3 { tsOffset := NeedleHeaderSize + size + NeedleChecksumSize - util.Uint64toBytes(dataSlice[tsOffset : tsOffset+TimestampSize], appendAtNs) + util.Uint64toBytes(dataSlice[tsOffset:tsOffset+TimestampSize], appendAtNs) } if err == nil { From 319743d33078262e50d6e0e5d4fae04015f1dfd4 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 2 Apr 2021 02:22:59 -0700 Subject: [PATCH 193/284] go fmt --- weed/operation/buffer_pool.go | 1 + 1 file changed, 1 insertion(+) diff --git a/weed/operation/buffer_pool.go b/weed/operation/buffer_pool.go index 4003f7d70..9cbe4787f 100644 --- a/weed/operation/buffer_pool.go +++ b/weed/operation/buffer_pool.go @@ -6,6 +6,7 @@ import ( ) var bufferCounter int64 + func GetBuffer() *bytebufferpool.ByteBuffer { defer func() { atomic.AddInt64(&bufferCounter, 1) From 5e64f65632d562cde549fe1d929628af95611824 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 2 Apr 2021 12:02:26 -0700 Subject: [PATCH 194/284] ensure tables are created fix https://github.com/chrislusf/seaweedfs/issues/1957 --- weed/filer/abstract_sql/abstract_sql_store.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/weed/filer/abstract_sql/abstract_sql_store.go b/weed/filer/abstract_sql/abstract_sql_store.go index 9e52d9f87..120a1d139 100644 --- a/weed/filer/abstract_sql/abstract_sql_store.go +++ b/weed/filer/abstract_sql/abstract_sql_store.go @@ -36,6 +36,8 @@ func (store *AbstractSqlStore) OnBucketCreation(bucket string) { store.dbsLock.Lock() defer store.dbsLock.Unlock() + store.CreateTable(context.Background(), bucket) + if store.dbs == nil { return } @@ -45,6 +47,8 @@ func (store *AbstractSqlStore) OnBucketDeletion(bucket string) { store.dbsLock.Lock() defer store.dbsLock.Unlock() + store.deleteTable(context.Background(), bucket) + if store.dbs == nil { return } From 5dca98fe71948c355ff608b59f4fa8389faa8ece Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 3 Apr 2021 11:37:13 -0700 Subject: [PATCH 195/284] fix typo --- weed/sequence/snowflake_sequencer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/sequence/snowflake_sequencer.go b/weed/sequence/snowflake_sequencer.go index 679588120..300449fa0 100644 --- a/weed/sequence/snowflake_sequencer.go +++ b/weed/sequence/snowflake_sequencer.go @@ -15,7 +15,7 @@ type SnowflakeSequencer struct { func NewSnowflakeSequencer(nodeid string) (*SnowflakeSequencer, error) { nodeid_hash := hash(nodeid) & 0x3ff - glog.V(0).Infof("use snowfalke seq id generator, nodeid:%s hex_of_nodeid: %x", nodeid, nodeid_hash) + 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 { fmt.Println(err) From 404cf9db47b8c91a07cee42122d83fd6f319c437 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sim=C3=A3o=20Gomes=20Viana?= Date: Sun, 4 Apr 2021 20:38:38 +0200 Subject: [PATCH 196/284] README: fix typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit thoudsands → thousands --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 408a621dd..51c45f9e6 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ Table of Contents * 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 thoudsands of machines. That is it! +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! ## Introduction ## From 8251d1140ee8077f6b17d960000928b1d791fd18 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 4 Apr 2021 18:37:56 -0700 Subject: [PATCH 197/284] refactor --- weed/server/filer_server_handlers_write_upload.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/weed/server/filer_server_handlers_write_upload.go b/weed/server/filer_server_handlers_write_upload.go index 748079d97..28aad8c5a 100644 --- a/weed/server/filer_server_handlers_write_upload.go +++ b/weed/server/filer_server_handlers_write_upload.go @@ -62,7 +62,7 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque for readErr == nil { wg.Add(1) - limitedUploadProcessor.Execute(func() { + request := func() { defer wg.Done() var localOffset int64 @@ -105,7 +105,8 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque chunk: uploadResult.ToPbFileChunk(fileId, localOffset), } - }) + } + limitedUploadProcessor.Execute(request) } go func() { From fbb82a5c9c3ea9aef26041f47da27bf362b132e6 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 4 Apr 2021 18:38:30 -0700 Subject: [PATCH 198/284] skip limiting if limit is zero --- weed/util/limiter.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/weed/util/limiter.go b/weed/util/limiter.go index ccdaa701e..2debaaa85 100644 --- a/weed/util/limiter.go +++ b/weed/util/limiter.go @@ -85,16 +85,20 @@ func NewLimitedOutOfOrderProcessor(limit int32) (c *LimitedOutOfOrderProcessor) request := value.Interface().(OperationRequest) - c.processorLimitCond.L.Lock() - for atomic.LoadInt32(&c.currentProcessor) > c.processorLimit { - c.processorLimitCond.Wait() + if c.processorLimit > 0 { + c.processorLimitCond.L.Lock() + for atomic.LoadInt32(&c.currentProcessor) > c.processorLimit { + c.processorLimitCond.Wait() + } + atomic.AddInt32(&c.currentProcessor, 1) + c.processorLimitCond.L.Unlock() } - atomic.AddInt32(&c.currentProcessor, 1) - c.processorLimitCond.L.Unlock() go func() { - defer atomic.AddInt32(&c.currentProcessor, -1) - defer c.processorLimitCond.Signal() + if c.processorLimit > 0 { + defer atomic.AddInt32(&c.currentProcessor, -1) + defer c.processorLimitCond.Signal() + } request() }() From 6eee200c13b98088ebc6bb540b78fc7fe136a401 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 4 Apr 2021 18:45:48 -0700 Subject: [PATCH 199/284] 2.37 --- 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 17f72ed5e..13669986a 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.36" -version: 2.36 +appVersion: "2.37" +version: 2.37 diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index 389ff2503..19a065bb1 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.36" - started using {.Chart.appVersion} + # imageTag: "2.37" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index 11f250c73..e40288fbe 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, 36) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 37) COMMIT = "" ) From 0f64f5b9c8bea153171c8070f423b9910820bbb1 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 4 Apr 2021 21:40:58 -0700 Subject: [PATCH 200/284] mount: add readOnly option fix https://github.com/chrislusf/seaweedfs/issues/1961 --- weed/command/mount.go | 2 ++ weed/command/mount_std.go | 1 + weed/filesys/dir.go | 29 +++++++++++++++++++++++++++++ weed/filesys/dir_link.go | 8 ++++++++ weed/filesys/dir_rename.go | 4 ++++ weed/filesys/file.go | 12 ++++++++++++ weed/filesys/filehandle.go | 4 ++++ weed/filesys/wfs.go | 1 + 8 files changed, 61 insertions(+) diff --git a/weed/command/mount.go b/weed/command/mount.go index 1e5d106fc..5811f0b99 100644 --- a/weed/command/mount.go +++ b/weed/command/mount.go @@ -25,6 +25,7 @@ type MountOptions struct { volumeServerAccess *string uidMap *string gidMap *string + readOnly *bool } var ( @@ -55,6 +56,7 @@ func init() { mountOptions.volumeServerAccess = cmdMount.Flag.String("volumeServerAccess", "direct", "access volume servers by [direct|publicUrl|filerProxy]") mountOptions.uidMap = cmdMount.Flag.String("map.uid", "", "map local uid to uid on filer, comma-separated :") mountOptions.gidMap = cmdMount.Flag.String("map.gid", "", "map local gid to gid on filer, comma-separated :") + mountOptions.readOnly = cmdMount.Flag.Bool("readOnly", false, "read only") mountCpuProfile = cmdMount.Flag.String("cpuprofile", "", "cpu profile output file") mountMemProfile = cmdMount.Flag.String("memprofile", "", "memory profile output file") diff --git a/weed/command/mount_std.go b/weed/command/mount_std.go index f6f7b1d55..8e5b7a483 100644 --- a/weed/command/mount_std.go +++ b/weed/command/mount_std.go @@ -203,6 +203,7 @@ func RunMount(option *MountOptions, umask os.FileMode) bool { VolumeServerAccess: *mountOptions.volumeServerAccess, Cipher: cipher, UidGidMapper: uidGidMapper, + ReadOnly: *option.readOnly, }) // mount diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index 33e1a0a3a..46457f858 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -128,6 +128,10 @@ func (dir *Dir) newDirectory(fullpath util.FullPath, entry *filer_pb.Entry) fs.N func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest, resp *fuse.CreateResponse) (fs.Node, fs.Handle, error) { + if dir.wfs.option.ReadOnly { + return nil, nil, fuse.EPERM + } + request, err := dir.doCreateEntry(req.Name, req.Mode, req.Uid, req.Gid, req.Flags&fuse.OpenExclusive != 0) if err != nil { @@ -148,6 +152,10 @@ func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest, func (dir *Dir) Mknod(ctx context.Context, req *fuse.MknodRequest) (fs.Node, error) { + if dir.wfs.option.ReadOnly { + return nil, fuse.EPERM + } + request, err := dir.doCreateEntry(req.Name, req.Mode, req.Uid, req.Gid, false) if err != nil { @@ -202,6 +210,10 @@ func (dir *Dir) doCreateEntry(name string, mode os.FileMode, uid, gid uint32, ex func (dir *Dir) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs.Node, error) { + if dir.wfs.option.ReadOnly { + return nil, fuse.EPERM + } + glog.V(4).Infof("mkdir %s: %s", dir.FullPath(), req.Name) newEntry := &filer_pb.Entry{ @@ -356,6 +368,11 @@ func findFileType(mode uint16) fuse.DirentType { func (dir *Dir) Remove(ctx context.Context, req *fuse.RemoveRequest) error { + if dir.wfs.option.ReadOnly { + return fuse.EPERM + } + + if !req.Dir { return dir.removeOneFile(req) } @@ -429,6 +446,10 @@ func (dir *Dir) removeFolder(req *fuse.RemoveRequest) error { func (dir *Dir) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error { + if dir.wfs.option.ReadOnly { + return fuse.EPERM + } + glog.V(4).Infof("%v dir setattr %+v", dir.FullPath(), req) if err := dir.maybeLoadEntry(); err != nil { @@ -457,6 +478,10 @@ func (dir *Dir) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fus func (dir *Dir) Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error { + if dir.wfs.option.ReadOnly { + return fuse.EPERM + } + glog.V(4).Infof("dir Setxattr %s: %s", dir.FullPath(), req.Name) if err := dir.maybeLoadEntry(); err != nil { @@ -473,6 +498,10 @@ func (dir *Dir) Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error { func (dir *Dir) Removexattr(ctx context.Context, req *fuse.RemovexattrRequest) error { + if dir.wfs.option.ReadOnly { + return fuse.EPERM + } + glog.V(4).Infof("dir Removexattr %s: %s", dir.FullPath(), req.Name) if err := dir.maybeLoadEntry(); err != nil { diff --git a/weed/filesys/dir_link.go b/weed/filesys/dir_link.go index 606e52fcb..6266e492d 100644 --- a/weed/filesys/dir_link.go +++ b/weed/filesys/dir_link.go @@ -24,6 +24,10 @@ const ( func (dir *Dir) Link(ctx context.Context, req *fuse.LinkRequest, old fs.Node) (fs.Node, error) { + if dir.wfs.option.ReadOnly { + return nil, fuse.EPERM + } + oldFile, ok := old.(*File) if !ok { glog.Errorf("old node is not a file: %+v", old) @@ -105,6 +109,10 @@ func (dir *Dir) Link(ctx context.Context, req *fuse.LinkRequest, old fs.Node) (f func (dir *Dir) Symlink(ctx context.Context, req *fuse.SymlinkRequest) (fs.Node, error) { + if dir.wfs.option.ReadOnly { + return nil, fuse.EPERM + } + glog.V(4).Infof("Symlink: %v/%v to %v", dir.FullPath(), req.NewName, req.Target) request := &filer_pb.CreateEntryRequest{ diff --git a/weed/filesys/dir_rename.go b/weed/filesys/dir_rename.go index d2acad4b2..28316c3bd 100644 --- a/weed/filesys/dir_rename.go +++ b/weed/filesys/dir_rename.go @@ -13,6 +13,10 @@ import ( func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirectory fs.Node) error { + if dir.wfs.option.ReadOnly { + return fuse.EPERM + } + newDir := newDirectory.(*Dir) newPath := util.NewFullPath(newDir.FullPath(), req.NewName) diff --git a/weed/filesys/file.go b/weed/filesys/file.go index 58605f2f1..2433be590 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -110,6 +110,10 @@ func (file *File) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.Op func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error { + if file.wfs.option.ReadOnly { + return fuse.EPERM + } + glog.V(4).Infof("%v file setattr %+v", file.fullpath(), req) entry, err := file.maybeLoadEntry(ctx) @@ -200,6 +204,10 @@ func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *f func (file *File) Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error { + if file.wfs.option.ReadOnly { + return fuse.EPERM + } + glog.V(4).Infof("file Setxattr %s: %s", file.fullpath(), req.Name) entry, err := file.maybeLoadEntry(ctx) @@ -217,6 +225,10 @@ func (file *File) Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error func (file *File) Removexattr(ctx context.Context, req *fuse.RemovexattrRequest) error { + if file.wfs.option.ReadOnly { + return fuse.EPERM + } + glog.V(4).Infof("file Removexattr %s: %s", file.fullpath(), req.Name) entry, err := file.maybeLoadEntry(ctx) diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index 6d72e62ce..4419888c4 100644 --- a/weed/filesys/filehandle.go +++ b/weed/filesys/filehandle.go @@ -154,6 +154,10 @@ func (fh *FileHandle) readFromChunks(buff []byte, offset int64) (int64, error) { // Write to the file handle func (fh *FileHandle) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error { + if fh.f.wfs.option.ReadOnly { + return fuse.EPERM + } + fh.Lock() defer fh.Unlock() diff --git a/weed/filesys/wfs.go b/weed/filesys/wfs.go index c6d9080a1..ba5eb4b6b 100644 --- a/weed/filesys/wfs.go +++ b/weed/filesys/wfs.go @@ -43,6 +43,7 @@ type Option struct { DataCenter string EntryCacheTtl time.Duration Umask os.FileMode + ReadOnly bool MountUid uint32 MountGid uint32 From 0a9d76c9eb4cab98498d42c69fd3c698d97779fb Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 5 Apr 2021 00:44:50 -0700 Subject: [PATCH 201/284] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 51c45f9e6..e463092bc 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ [![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.svg?maxAge=4800)](https://hub.docker.com/r/chrislusf/seaweedfs/) +[![SeaweedFS on Maven Central](https://img.shields.io/maven-central/v/com.github.chrislusf/seaweedfs-client)](https://search.maven.org/search?q=g:com.github.chrislusf) ![SeaweedFS Logo](https://raw.githubusercontent.com/chrislusf/seaweedfs/master/note/seaweedfs.png) From c131764c348060ae6103c2a3f83b1b42e5ec04b0 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 5 Apr 2021 19:40:12 -0700 Subject: [PATCH 202/284] ensure error is sent back in channel fix https://github.com/chrislusf/seaweedfs/issues/1966 avoid shared readErr variable --- weed/server/filer_server_handlers_write_upload.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/weed/server/filer_server_handlers_write_upload.go b/weed/server/filer_server_handlers_write_upload.go index 28aad8c5a..03db942c6 100644 --- a/weed/server/filer_server_handlers_write_upload.go +++ b/weed/server/filer_server_handlers_write_upload.go @@ -57,26 +57,27 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque var lock sync.Mutex readOffset := int64(0) var wg sync.WaitGroup - var readErr error - for readErr == nil { + for err == nil { wg.Add(1) request := func() { defer wg.Done() var localOffset int64 - var data []byte // read from the input lock.Lock() localOffset = readOffset limitedReader := io.LimitReader(partReader, int64(chunkSize)) - data, readErr = ioutil.ReadAll(limitedReader) + data, readErr := ioutil.ReadAll(limitedReader) readOffset += int64(len(data)) lock.Unlock() // handle read errors if readErr != nil { if readErr != io.EOF { + if err == nil { + err = readErr + } resultsChan <- &ChunkCreationResult{ err: readErr, } @@ -92,6 +93,9 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque dataReader := util.NewBytesReader(data) fileId, uploadResult, uploadErr := fs.doCreateChunk(w, r, so, dataReader, fileName, contentType) if uploadErr != nil { + if err == nil { + err = uploadErr + } resultsChan <- &ChunkCreationResult{ err: uploadErr, } From a37eca78cd680858d021cd864766b0847328a8d7 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 5 Apr 2021 19:41:54 -0700 Subject: [PATCH 203/284] 2.38 --- 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 13669986a..d8d069032 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.37" -version: 2.37 +appVersion: "2.38" +version: 2.38 diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index 19a065bb1..19c0c78a1 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.37" - started using {.Chart.appVersion} + # imageTag: "2.38" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index e40288fbe..40f4deae2 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, 37) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 38) COMMIT = "" ) From 6b8892c5acc8c44c3183e0a4e1b9b673a58c9729 Mon Sep 17 00:00:00 2001 From: limd Date: Tue, 6 Apr 2021 13:42:51 +0800 Subject: [PATCH 204/284] add HCFS over ftp --- other/java/hdfs-over-ftp/pom.xml | 120 +++++ .../hadoop/seaweed/ftp/ApplicationServer.java | 14 + .../seaweed/ftp/config/SwaggerConfig.java | 27 ++ .../ftp/controller/FtpManagerController.java | 71 +++ .../ftp/controller/UserController.java | 98 ++++ .../seaweed/ftp/controller/vo/FtpUser.java | 71 +++ .../seaweed/ftp/controller/vo/Result.java | 43 ++ .../seaweed/ftp/service/HFtpService.java | 102 ++++ .../service/filesystem/HdfsFileObject.java | 333 +++++++++++++ .../filesystem/HdfsFileSystemManager.java | 14 + .../filesystem/HdfsFileSystemView.java | 104 ++++ .../service/filesystem/HdfsOverFtpSystem.java | 72 +++ .../hadoop/seaweed/ftp/users/HdfsUser.java | 239 +++++++++ .../seaweed/ftp/users/HdfsUserManager.java | 453 ++++++++++++++++++ .../src/main/resources/application.yml | 15 + .../src/main/resources/assembly.xml | 39 ++ .../src/main/resources/logback-spring.xml | 40 ++ other/java/hdfs-over-ftp/users.properties | 12 + 18 files changed, 1867 insertions(+) create mode 100644 other/java/hdfs-over-ftp/pom.xml create mode 100644 other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/ApplicationServer.java create mode 100644 other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/config/SwaggerConfig.java create mode 100644 other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/controller/FtpManagerController.java create mode 100644 other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/controller/UserController.java create mode 100644 other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/controller/vo/FtpUser.java create mode 100644 other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/controller/vo/Result.java create mode 100644 other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/HFtpService.java create mode 100644 other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/filesystem/HdfsFileObject.java create mode 100644 other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/filesystem/HdfsFileSystemManager.java create mode 100644 other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/filesystem/HdfsFileSystemView.java create mode 100644 other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/filesystem/HdfsOverFtpSystem.java create mode 100644 other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/users/HdfsUser.java create mode 100644 other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/users/HdfsUserManager.java create mode 100644 other/java/hdfs-over-ftp/src/main/resources/application.yml create mode 100644 other/java/hdfs-over-ftp/src/main/resources/assembly.xml create mode 100644 other/java/hdfs-over-ftp/src/main/resources/logback-spring.xml create mode 100644 other/java/hdfs-over-ftp/users.properties diff --git a/other/java/hdfs-over-ftp/pom.xml b/other/java/hdfs-over-ftp/pom.xml new file mode 100644 index 000000000..0db422db5 --- /dev/null +++ b/other/java/hdfs-over-ftp/pom.xml @@ -0,0 +1,120 @@ + + + 4.0.0 + + hdfs-over-ftp + hdfs-over-ftp + 1.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.4.3 + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + + + io.springfox + springfox-swagger2 + 2.9.2 + + + io.springfox + springfox-swagger-ui + 2.9.2 + + + org.apache.hadoop + hadoop-common + 3.2.1 + + + org.apache.hadoop + hadoop-client + 3.2.1 + + + org.apache.ftpserver + ftpserver-core + 1.1.1 + + + com.github.chrislusf + seaweedfs-hadoop3-client + 1.6.2 + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + UTF-8 + + + ${java.home}/lib/rt.jar + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.6 + + + + org.apache.hadoop.seaweed.ftp.ApplicationServer + true + lib/ + + + ./ + + + + + + + maven-assembly-plugin + + false + + src/main/resources/assembly.xml + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/ApplicationServer.java b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/ApplicationServer.java new file mode 100644 index 000000000..b8ef1d840 --- /dev/null +++ b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/ApplicationServer.java @@ -0,0 +1,14 @@ +package org.apache.hadoop.seaweed.ftp; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + + +@SpringBootApplication +public class ApplicationServer { + + public static void main(String[] args) { + SpringApplication.run(ApplicationServer.class, args); + } + +} diff --git a/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/config/SwaggerConfig.java b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/config/SwaggerConfig.java new file mode 100644 index 000000000..3c395493d --- /dev/null +++ b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/config/SwaggerConfig.java @@ -0,0 +1,27 @@ +package org.apache.hadoop.seaweed.ftp.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Configuration +@EnableSwagger2 +public class SwaggerConfig { + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .pathMapping("/") + .select() + .apis(RequestHandlerSelectors.basePackage("org.apache.hadoop.seaweed.ftp")) + .paths(PathSelectors.any()) + .build().apiInfo(new ApiInfoBuilder() + .title("FTP API Doc") + .version("1.0") + .build()); + } +} \ No newline at end of file diff --git a/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/controller/FtpManagerController.java b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/controller/FtpManagerController.java new file mode 100644 index 000000000..7a5a4e74d --- /dev/null +++ b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/controller/FtpManagerController.java @@ -0,0 +1,71 @@ +package org.apache.hadoop.seaweed.ftp.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.hadoop.seaweed.ftp.service.HFtpService; +import org.apache.hadoop.seaweed.ftp.controller.vo.Result; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/manager") +@Api(tags = "FTP操作管理") +public class FtpManagerController { + + private static Logger log = Logger.getLogger(FtpManagerController.class); + + @Autowired + private HFtpService hdfsOverFtpServer; + + @GetMapping("/status") + @ApiOperation("查看FTP服务状态") + public Result status() { + Map map = new HashMap<>(); + try { + boolean status = hdfsOverFtpServer.statusServer(); + map.put("is_running", status); + return new Result(true, map, "FTP 服务状态获取成功"); + }catch (Exception e) { + log.error(e); + map.put("is_running", false); + return new Result(true, map, "FTP 服务状态获取成功"); + } + } + + @PutMapping("/start") + @ApiOperation("启动FTP服务") + public Result start() { + try { + boolean status = hdfsOverFtpServer.statusServer(); + if(!status) { + hdfsOverFtpServer.startServer(); + } + return new Result(true, "FTP 服务启动成功"); + }catch (Exception e) { + log.error(e); + return new Result(false, "FTP 服务启动失败"); + } + } + + @PutMapping("/stop") + @ApiOperation("停止FTP服务") + public Result stop() { + try { + boolean status = hdfsOverFtpServer.statusServer(); + if(status) { + hdfsOverFtpServer.stopServer(); + } + return new Result(true, "FTP 服务停止成功"); + }catch (Exception e) { + log.error(e); + return new Result(false, "FTP 服务停止失败"); + } + } +} diff --git a/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/controller/UserController.java b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/controller/UserController.java new file mode 100644 index 000000000..c4d2261b3 --- /dev/null +++ b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/controller/UserController.java @@ -0,0 +1,98 @@ +package org.apache.hadoop.seaweed.ftp.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.ftpserver.ftplet.User; +import org.apache.ftpserver.usermanager.Md5PasswordEncryptor; +import org.apache.ftpserver.usermanager.UserFactory; +import org.apache.hadoop.seaweed.ftp.controller.vo.FtpUser; +import org.apache.hadoop.seaweed.ftp.controller.vo.Result; +import org.apache.hadoop.seaweed.ftp.users.HdfsUserManager; +import org.apache.log4j.Logger; +import org.springframework.web.bind.annotation.*; + +import java.io.File; + +@RestController +@RequestMapping("/user") +@Api(tags = "FTP用户管理") +public class UserController { + + private static Logger log = Logger.getLogger(UserController.class); + + /*** + * { + * "name": "test", + * "password": "test", + * "homeDirectory": "/buckets/test/" + * } + * @param ftpUser + * @return + */ + @PostMapping("/add") + @ApiOperation("新增/编辑用户") + public Result add(@RequestBody FtpUser ftpUser) { + try { + HdfsUserManager userManagerFactory = new HdfsUserManager(); + userManagerFactory.setFile(new File(System.getProperty("user.dir") + File.separator + "users.properties")); + userManagerFactory.setPasswordEncryptor(new Md5PasswordEncryptor()); + + UserFactory userFactory = new UserFactory(); + userFactory.setHomeDirectory(ftpUser.getHomeDirectory()); + userFactory.setName(ftpUser.getName()); + userFactory.setPassword(ftpUser.getPassword()); + userFactory.setEnabled(ftpUser.isEnabled()); + userFactory.setMaxIdleTime(ftpUser.getMaxIdleTime()); + + User user = userFactory.createUser(); + userManagerFactory.save(user, ftpUser.isRenamePush()); + return new Result(true, "新建用户成功"); + }catch (Exception e) { + log.error(e); + return new Result(false, "新建用户失败"); + } + } + + @DeleteMapping("/delete/{user}") + @ApiOperation("删除用户") + public Result delete(@PathVariable(value = "user") String user) { + try { + HdfsUserManager userManagerFactory = new HdfsUserManager(); + userManagerFactory.setFile(new File(System.getProperty("user.dir") + File.separator + "users.properties")); + userManagerFactory.delete(user); + return new Result(true, "删除用户成功"); + }catch (Exception e) { + log.error(e); + return new Result(false, "删除用户失败"); + } + } + + @GetMapping("/show/{userName}") + @ApiOperation("查看用户") + public Result show(@PathVariable(value = "userName") String userName) { + try { + HdfsUserManager userManagerFactory = new HdfsUserManager(); + userManagerFactory.setFile(new File(System.getProperty("user.dir") + File.separator + "users.properties")); + User user = userManagerFactory.getUserByName(userName); + FtpUser ftpUser = new FtpUser(user.getHomeDirectory(), user.getPassword(), user.getEnabled(), user.getName(), user.getMaxIdleTime(), HdfsUserManager.getUserRenamePush(userName)); + return new Result(true, ftpUser, "获取用户信息成功"); + }catch (Exception e) { + log.error(e); + return new Result(false, "获取用户信息失败"); + } + } + + @GetMapping("/list") + @ApiOperation("列举用户") + public Result list() { + try { + HdfsUserManager userManagerFactory = new HdfsUserManager(); + userManagerFactory.setFile(new File(System.getProperty("user.dir") + File.separator + "users.properties")); + String[] allUserNames = userManagerFactory.getAllUserNames(); + return new Result(true, allUserNames, "列举用户成功"); + }catch (Exception e) { + log.error(e); + return new Result(false, "列举用户失败"); + } + } +} diff --git a/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/controller/vo/FtpUser.java b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/controller/vo/FtpUser.java new file mode 100644 index 000000000..953d08603 --- /dev/null +++ b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/controller/vo/FtpUser.java @@ -0,0 +1,71 @@ +package org.apache.hadoop.seaweed.ftp.controller.vo; + +public class FtpUser { + + private String homeDirectory; + private String password; + private boolean enabled; + private String name; + private int maxIdleTime; + private boolean renamePush; + + public FtpUser() { + } + + public FtpUser(String homeDirectory, String password, boolean enabled, String name, int maxIdleTime, boolean renamePush) { + this.homeDirectory = homeDirectory; + this.password = password; + this.enabled = enabled; + this.name = name; + this.maxIdleTime = maxIdleTime; + this.renamePush = renamePush; + } + + public String getHomeDirectory() { + return homeDirectory; + } + + public void setHomeDirectory(String homeDirectory) { + this.homeDirectory = homeDirectory; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getMaxIdleTime() { + return maxIdleTime; + } + + public void setMaxIdleTime(int maxIdleTime) { + this.maxIdleTime = maxIdleTime; + } + + public boolean isRenamePush() { + return renamePush; + } + + public void setRenamePush(boolean renamePush) { + this.renamePush = renamePush; + } +} diff --git a/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/controller/vo/Result.java b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/controller/vo/Result.java new file mode 100644 index 000000000..b6a480ba7 --- /dev/null +++ b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/controller/vo/Result.java @@ -0,0 +1,43 @@ +package org.apache.hadoop.seaweed.ftp.controller.vo; + +public class Result { + + private boolean status; + private Object data; + private String message; + + public Result(boolean status, String message) { + this.status = status; + this.message = message; + } + + public Result(boolean status, Object data, String message) { + this.status = status; + this.message = message; + this.data = data; + } + + public boolean isStatus() { + return status; + } + + public void setStatus(boolean status) { + this.status = status; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } +} diff --git a/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/HFtpService.java b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/HFtpService.java new file mode 100644 index 000000000..c3fa31872 --- /dev/null +++ b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/HFtpService.java @@ -0,0 +1,102 @@ +package org.apache.hadoop.seaweed.ftp.service; + +import org.apache.ftpserver.DataConnectionConfiguration; +import org.apache.ftpserver.DataConnectionConfigurationFactory; +import org.apache.ftpserver.FtpServer; +import org.apache.ftpserver.FtpServerFactory; +import org.apache.ftpserver.command.CommandFactoryFactory; +import org.apache.ftpserver.listener.ListenerFactory; +import org.apache.hadoop.seaweed.ftp.service.filesystem.HdfsFileSystemManager; +import org.apache.hadoop.seaweed.ftp.service.filesystem.HdfsOverFtpSystem; +import org.apache.hadoop.seaweed.ftp.users.HdfsUserManager; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.io.File; + +/** + * reference: https://github.com/iponweb/hdfs-over-ftp + */ +@Component +public class HFtpService { + + private static Logger log = Logger.getLogger(HFtpService.class); + + @Value("${ftp.port}") + private int port = 0; + + @Value("${ftp.passive-address}") + private String passiveAddress; + + @Value("${ftp.passive-ports}") + private String passivePorts; + + @Value("${hdfs.uri}") + private String hdfsUri; + + @Value("${seaweedFs.enable}") + private boolean seaweedFsEnable; + + @Value("${seaweedFs.access}") + private String seaweedFsAccess; + + @Value("${seaweedFs.replication}") + private String seaweedFsReplication; + + private FtpServer ftpServer = null; + + public void startServer() throws Exception { + log.info("Starting HDFS-Over-Ftp server. port: " + port + " passive-address: " + passiveAddress + " passive-ports: " + passivePorts + " hdfs-uri: " + hdfsUri); + + HdfsOverFtpSystem.setHdfsUri(hdfsUri); + HdfsOverFtpSystem.setSeaweedFsEnable(seaweedFsEnable); + HdfsOverFtpSystem.setSeaweedFsAccess(seaweedFsAccess); + HdfsOverFtpSystem.setSeaweedFsReplication(seaweedFsReplication); + + FtpServerFactory server = new FtpServerFactory(); + server.setFileSystem(new HdfsFileSystemManager()); + + ListenerFactory factory = new ListenerFactory(); + factory.setPort(port); + + DataConnectionConfigurationFactory dccFactory = new DataConnectionConfigurationFactory(); + dccFactory.setPassiveAddress("0.0.0.0"); + dccFactory.setPassivePorts(passivePorts); + dccFactory.setPassiveExternalAddress(passiveAddress); + DataConnectionConfiguration dcc = dccFactory.createDataConnectionConfiguration(); + factory.setDataConnectionConfiguration(dcc); + + server.addListener("default", factory.createListener()); + + HdfsUserManager userManager = new HdfsUserManager(); + final File file = loadResource("/users.properties"); + userManager.setFile(file); + server.setUserManager(userManager); + + CommandFactoryFactory cmFact = new CommandFactoryFactory(); + cmFact.setUseDefaultCommands(true); + server.setCommandFactory(cmFact.createCommandFactory()); + + // start the server + ftpServer = server.createServer(); + ftpServer.start(); + } + + public void stopServer() { + log.info("Stopping Hdfs-Over-Ftp server. port: " + port + " passive-address: " + passiveAddress + " passive-ports: " + passivePorts + " hdfs-uri: " + hdfsUri); + ftpServer.stop(); + } + + public boolean statusServer() { + try { + return !ftpServer.isStopped(); + }catch (Exception e) { + return false; + } + } + + private static File loadResource(String resourceName) { + return new File(System.getProperty("user.dir") + resourceName); + } +} \ No newline at end of file diff --git a/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/filesystem/HdfsFileObject.java b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/filesystem/HdfsFileObject.java new file mode 100644 index 000000000..e97c2dc14 --- /dev/null +++ b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/filesystem/HdfsFileObject.java @@ -0,0 +1,333 @@ +package org.apache.hadoop.seaweed.ftp.service.filesystem; + +import org.apache.ftpserver.ftplet.FtpFile; +import org.apache.ftpserver.ftplet.User; +import org.apache.hadoop.fs.*; +import org.apache.hadoop.seaweed.ftp.users.HdfsUser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * This class implements all actions to HDFS + */ +public class HdfsFileObject implements FtpFile { + + private final Logger log = LoggerFactory.getLogger(HdfsFileObject.class); + + private Path homePath; + private Path path; + private Path fullPath; + private HdfsUser user; + + /** + * Constructs HdfsFileObject from path + * + * @param path path to represent object + * @param user accessor of the object + */ + public HdfsFileObject(String homePath, String path, User user) { + this.homePath = new Path(homePath); + this.path = new Path(path); + this.fullPath = new Path(homePath + path); + this.user = (HdfsUser) user; + } + + public String getAbsolutePath() { + // strip the last '/' if necessary + String fullName = path.toString(); + int filelen = fullName.length(); + if ((filelen != 1) && (fullName.charAt(filelen - 1) == '/')) { + fullName = fullName.substring(0, filelen - 1); + } + + return fullName; + } + + public String getName() { + return path.getName(); + } + + /** + * HDFS has no hidden objects + * + * @return always false + */ + public boolean isHidden() { + return false; + } + + /** + * Checks if the object is a directory + * + * @return true if the object is a directory + */ + public boolean isDirectory() { + try { + log.debug("is directory? : " + fullPath); + FileSystem dfs = HdfsOverFtpSystem.getDfs(); + FileStatus fs = dfs.getFileStatus(fullPath); + return fs.isDir(); + } catch (IOException e) { + log.debug(fullPath + " is not dir", e); + return false; + } + } + + /** + * Checks if the object is a file + * + * @return true if the object is a file + */ + public boolean isFile() { + try { + FileSystem dfs = HdfsOverFtpSystem.getDfs(); + return dfs.isFile(fullPath); + } catch (IOException e) { + log.debug(fullPath + " is not file", e); + return false; + } + } + + /** + * Checks if the object does exist + * + * @return true if the object does exist + */ + public boolean doesExist() { + try { + FileSystem dfs = HdfsOverFtpSystem.getDfs(); + dfs.getFileStatus(fullPath); + return true; + } catch (IOException e) { + // log.debug(path + " does not exist", e); + return false; + } + } + + public boolean isReadable() { + return true; + } + + public boolean isWritable() { + return true; + } + + public boolean isRemovable() { + return true; + } + + /** + * Get owner of the object + * + * @return owner of the object + */ + public String getOwnerName() { + return "root"; + /* + try { + FileSystem dfs = HdfsOverFtpSystem.getDfs(); + FileStatus fs = dfs.getFileStatus(fullPath); + String owner = fs.getOwner(); + if(owner.length() == 0) { + return "root"; + } + return owner; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + */ + } + + /** + * Get group of the object + * + * @return group of the object + */ + public String getGroupName() { + return "root"; + /* + try { + FileSystem dfs = HdfsOverFtpSystem.getDfs(); + FileStatus fs = dfs.getFileStatus(fullPath); + String group = fs.getGroup(); + if(group.length() == 0) { + return "root"; + } + return group; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + */ + } + + /** + * Get link count + * + * @return 3 is for a directory and 1 is for a file + */ + public int getLinkCount() { + return isDirectory() ? 3 : 1; + } + + /** + * Get last modification date + * + * @return last modification date as a long + */ + public long getLastModified() { + try { + FileSystem dfs = HdfsOverFtpSystem.getDfs(); + FileStatus fs = dfs.getFileStatus(fullPath); + return fs.getModificationTime(); + } catch (IOException e) { + e.printStackTrace(); + return 0; + } + } + + public boolean setLastModified(long l) { + return false; + } + + /** + * Get a size of the object + * + * @return size of the object in bytes + */ + public long getSize() { + try { + FileSystem dfs = HdfsOverFtpSystem.getDfs(); + FileStatus fs = dfs.getFileStatus(fullPath); + log.debug("getSize(): " + fullPath + " : " + fs.getLen()); + return fs.getLen(); + } catch (IOException e) { + e.printStackTrace(); + return 0; + } + } + + public Object getPhysicalFile() { + return null; + } + + /** + * Create a new dir from the object + * + * @return true if dir is created + */ + public boolean mkdir() { + try { + FileSystem fs = HdfsOverFtpSystem.getDfs(); + fs.mkdirs(fullPath); +// fs.setOwner(path, user.getName(), user.getMainGroup()); + return true; + } catch (IOException e) { + e.printStackTrace(); + return false; + } + } + + /** + * Delete object from the HDFS filesystem + * + * @return true if the object is deleted + */ + public boolean delete() { + try { + FileSystem dfs = HdfsOverFtpSystem.getDfs(); + dfs.delete(fullPath, true); + return true; + } catch (IOException e) { + e.printStackTrace(); + return false; + } + } + + public boolean move(FtpFile ftpFile) { + try { + FileSystem dfs = HdfsOverFtpSystem.getDfs(); + dfs.rename(fullPath, new Path(fullPath.getParent() + File.separator + ftpFile.getName())); + return true; + } catch (IOException e) { + e.printStackTrace(); + return false; + } + } + + + /** + * List files of the directory + * + * @return List of files in the directory + */ + public List listFiles() { + try { + FileSystem dfs = HdfsOverFtpSystem.getDfs(); + FileStatus fileStats[] = dfs.listStatus(fullPath); + + // get the virtual name of the base directory + String virtualFileStr = getAbsolutePath(); + if (virtualFileStr.charAt(virtualFileStr.length() - 1) != '/') { + virtualFileStr += '/'; + } + + FtpFile[] virtualFiles = new FtpFile[fileStats.length]; + for (int i = 0; i < fileStats.length; i++) { + File fileObj = new File(fileStats[i].getPath().toString()); + String fileName = virtualFileStr + fileObj.getName(); + virtualFiles[i] = new HdfsFileObject(homePath.toString(), fileName, user); + } + return Collections.unmodifiableList(Arrays.asList(virtualFiles)); + } catch (IOException e) { + log.debug("", e); + return null; + } + } + + /** + * Creates output stream to write to the object + * + * @param l is not used here + * @return OutputStream + * @throws IOException + */ + public OutputStream createOutputStream(long l) { + try { + FileSystem fs = HdfsOverFtpSystem.getDfs(); + FSDataOutputStream out = fs.create(fullPath); +// fs.setOwner(fullPath, user.getName(), user.getMainGroup()); + return out; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + /** + * Creates input stream to read from the object + * + * @param l is not used here + * @return OutputStream + * @throws IOException + */ + public InputStream createInputStream(long l) { + try { + FileSystem dfs = HdfsOverFtpSystem.getDfs(); + FSDataInputStream in = dfs.open(fullPath); + return in; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/filesystem/HdfsFileSystemManager.java b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/filesystem/HdfsFileSystemManager.java new file mode 100644 index 000000000..533c2c3aa --- /dev/null +++ b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/filesystem/HdfsFileSystemManager.java @@ -0,0 +1,14 @@ +package org.apache.hadoop.seaweed.ftp.service.filesystem; + +import org.apache.ftpserver.ftplet.FileSystemFactory; +import org.apache.ftpserver.ftplet.FileSystemView; +import org.apache.ftpserver.ftplet.User; + +/** + * Impelented FileSystemManager to use HdfsFileSystemView + */ +public class HdfsFileSystemManager implements FileSystemFactory { + public FileSystemView createFileSystemView(User user) { + return new HdfsFileSystemView(user); + } +} diff --git a/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/filesystem/HdfsFileSystemView.java b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/filesystem/HdfsFileSystemView.java new file mode 100644 index 000000000..8b910e775 --- /dev/null +++ b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/filesystem/HdfsFileSystemView.java @@ -0,0 +1,104 @@ +package org.apache.hadoop.seaweed.ftp.service.filesystem; + +import org.apache.ftpserver.ftplet.FileSystemView; +import org.apache.ftpserver.ftplet.FtpFile; +import org.apache.ftpserver.ftplet.User; +import org.apache.hadoop.fs.Path; + +import java.io.File; + +/** + * Implemented FileSystemView to use HdfsFileObject + */ +public class HdfsFileSystemView implements FileSystemView { + + private String homePath; + private String currPath = File.separator; + private User user; + + /** + * Constructor - set the user object. + */ + protected HdfsFileSystemView(User user) { + if (user == null) { + throw new IllegalArgumentException("user can not be null"); + } + if (user.getHomeDirectory() == null) { + throw new IllegalArgumentException( + "User home directory can not be null"); + } + + this.homePath = user.getHomeDirectory(); + this.user = user; + } + + public FtpFile getHomeDirectory() { + return new HdfsFileObject(homePath, File.separator, user); + } + + public FtpFile getWorkingDirectory() { + FtpFile fileObj; + if (currPath.equals(File.separator)) { + fileObj = new HdfsFileObject(homePath, File.separator, user); + } else { + fileObj = new HdfsFileObject(homePath, currPath, user); + + } + return fileObj; + } + + public boolean changeWorkingDirectory(String dir) { + + Path path; + if (dir.startsWith(File.separator) || new Path(currPath).equals(new Path(dir))) { + path = new Path(dir); + } else if (currPath.length() > 1) { + path = new Path(currPath + File.separator + dir); + } else { + if(dir.startsWith("/")) { + path = new Path(dir); + }else { + path = new Path(File.separator + dir); + } + } + + // 防止退回根目录 + if (path.getName().equals("..")) { + path = new Path(File.separator); + } + + HdfsFileObject file = new HdfsFileObject(homePath, path.toString(), user); + if (file.isDirectory()) { + currPath = path.toString(); + return true; + } else { + return false; + } + } + + public FtpFile getFile(String file) { + String path; + if (file.startsWith(File.separator)) { + path = file; + } else if (currPath.length() > 1) { + path = currPath + File.separator + file; + } else { + path = File.separator + file; + } + return new HdfsFileObject(homePath, path, user); + } + + /** + * Is the file content random accessible? + */ + public boolean isRandomAccessible() { + return true; + } + + /** + * Dispose file system view - does nothing. + */ + public void dispose() { + } + +} diff --git a/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/filesystem/HdfsOverFtpSystem.java b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/filesystem/HdfsOverFtpSystem.java new file mode 100644 index 000000000..149fd6857 --- /dev/null +++ b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/service/filesystem/HdfsOverFtpSystem.java @@ -0,0 +1,72 @@ +package org.apache.hadoop.seaweed.ftp.service.filesystem; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FileSystem; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; + +/** + * Class to store DFS connection + */ +public class HdfsOverFtpSystem { + + private static FileSystem fs = null; + + private static String hdfsUri; + + private static boolean seaweedFsEnable; + + private static String seaweedFsAccess; + + private static String seaweedFsReplication; + + private final static Logger log = LoggerFactory.getLogger(HdfsOverFtpSystem.class); + + private static void hdfsInit() throws IOException { + Configuration configuration = new Configuration(); + + configuration.set("fs.defaultFS", hdfsUri); + if(seaweedFsEnable) { + configuration.set("fs.seaweedfs.impl", "seaweed.hdfs.SeaweedFileSystem"); + configuration.set("fs.seaweed.volume.server.access", seaweedFsAccess); + configuration.set("fs.seaweed.replication", seaweedFsReplication); + } + fs = FileSystem.get(configuration); + log.info("HDFS load success"); + } + + /** + * Get dfs + * + * @return dfs + * @throws IOException + */ + public static FileSystem getDfs() throws IOException { + if (fs == null) { + hdfsInit(); + } + return fs; + } + + public static void setHdfsUri(String hdfsUri) { + HdfsOverFtpSystem.hdfsUri = hdfsUri; + } + + public static String getHdfsUri() { + return hdfsUri; + } + + public static void setSeaweedFsEnable(boolean seaweedFsEnable) { + HdfsOverFtpSystem.seaweedFsEnable = seaweedFsEnable; + } + + public static void setSeaweedFsAccess(String seaweedFsAccess) { + HdfsOverFtpSystem.seaweedFsAccess = seaweedFsAccess; + } + + public static void setSeaweedFsReplication(String seaweedFsReplication) { + HdfsOverFtpSystem.seaweedFsReplication = seaweedFsReplication; + } +} \ No newline at end of file diff --git a/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/users/HdfsUser.java b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/users/HdfsUser.java new file mode 100644 index 000000000..c82f6516f --- /dev/null +++ b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/users/HdfsUser.java @@ -0,0 +1,239 @@ +package org.apache.hadoop.seaweed.ftp.users; + +import org.apache.ftpserver.ftplet.Authority; +import org.apache.ftpserver.ftplet.AuthorizationRequest; +import org.apache.ftpserver.ftplet.User; +import org.apache.log4j.Logger; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class HdfsUser implements User, Serializable { + + private static final long serialVersionUID = -47371353779731294L; + + private String name = null; + + private String password = null; + + private int maxIdleTimeSec = 0; // no limit + + private String homeDir = null; + + private boolean isEnabled = true; + + private List authorities = new ArrayList(); + + private ArrayList groups = new ArrayList(); + + private Logger log = Logger.getLogger(HdfsUser.class); + + /** + * Default constructor. + */ + public HdfsUser() { + } + + /** + * Copy constructor. + */ + public HdfsUser(User user) { + name = user.getName(); + password = user.getPassword(); + authorities = user.getAuthorities(); + maxIdleTimeSec = user.getMaxIdleTime(); + homeDir = user.getHomeDirectory(); + isEnabled = user.getEnabled(); + } + + public ArrayList getGroups() { + return groups; + } + + /** + * Get the main group of the user + * + * @return main group of the user + */ + public String getMainGroup() { + if (groups.size() > 0) { + return groups.get(0); + } else { + log.error("User " + name + " is not a memer of any group"); + return "error"; + } + } + + /** + * Checks if user is a member of the group + * + * @param group to check + * @return true if the user id a member of the group + */ + public boolean isGroupMember(String group) { + for (String userGroup : groups) { + if (userGroup.equals(group)) { + return true; + } + } + return false; + } + + /** + * Set users' groups + * + * @param groups to set + */ + public void setGroups(ArrayList groups) { + if (groups.size() < 1) { + log.error("User " + name + " is not a memer of any group"); + } + this.groups = groups; + } + + /** + * Get the user name. + */ + public String getName() { + return name; + } + + /** + * Set user name. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Get the user password. + */ + public String getPassword() { + return password; + } + + /** + * Set user password. + */ + public void setPassword(String pass) { + password = pass; + } + + public List getAuthorities() { + if (authorities != null) { + return Collections.unmodifiableList(authorities); + } else { + return null; + } + } + + public void setAuthorities(List authorities) { + if (authorities != null) { + this.authorities = Collections.unmodifiableList(authorities); + } else { + this.authorities = null; + } + } + + /** + * Get the maximum idle time in second. + */ + public int getMaxIdleTime() { + return maxIdleTimeSec; + } + + /** + * Set the maximum idle time in second. + */ + public void setMaxIdleTime(int idleSec) { + maxIdleTimeSec = idleSec; + if (maxIdleTimeSec < 0) { + maxIdleTimeSec = 0; + } + } + + /** + * Get the user enable status. + */ + public boolean getEnabled() { + return isEnabled; + } + + /** + * Set the user enable status. + */ + public void setEnabled(boolean enb) { + isEnabled = enb; + } + + /** + * Get the user home directory. + */ + public String getHomeDirectory() { + return homeDir; + } + + /** + * Set the user home directory. + */ + public void setHomeDirectory(String home) { + homeDir = home; + } + + /** + * String representation. + */ + public String toString() { + return name; + } + + /** + * {@inheritDoc} + */ + public AuthorizationRequest authorize(AuthorizationRequest request) { + List authorities = getAuthorities(); + + // check for no authorities at all + if (authorities == null) { + return null; + } + + boolean someoneCouldAuthorize = false; + for (Authority authority : authorities) { + if (authority.canAuthorize(request)) { + someoneCouldAuthorize = true; + + request = authority.authorize(request); + + // authorization failed, return null + if (request == null) { + return null; + } + } + + } + + if (someoneCouldAuthorize) { + return request; + } else { + return null; + } + } + + /** + * {@inheritDoc} + */ + public List getAuthorities(Class clazz) { + List selected = new ArrayList(); + + for (Authority authority : authorities) { + if (authority.getClass().equals(clazz)) { + selected.add(authority); + } + } + + return selected; + } +} diff --git a/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/users/HdfsUserManager.java b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/users/HdfsUserManager.java new file mode 100644 index 000000000..7eb296160 --- /dev/null +++ b/other/java/hdfs-over-ftp/src/main/java/org/apache/hadoop/seaweed/ftp/users/HdfsUserManager.java @@ -0,0 +1,453 @@ +package org.apache.hadoop.seaweed.ftp.users; + +import org.apache.ftpserver.FtpServerConfigurationException; +import org.apache.ftpserver.ftplet.*; +import org.apache.ftpserver.usermanager.*; +import org.apache.ftpserver.usermanager.impl.*; +import org.apache.ftpserver.util.BaseProperties; +import org.apache.ftpserver.util.IoUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.*; + +public class HdfsUserManager extends AbstractUserManager { + + private final Logger LOG = LoggerFactory + .getLogger(HdfsUserManager.class); + + private final static String DEPRECATED_PREFIX = "FtpServer.user."; + + private final static String PREFIX = "ftpserver.user."; + + private static BaseProperties userDataProp; + + private File userDataFile = new File("users.conf"); + + private boolean isConfigured = false; + + private PasswordEncryptor passwordEncryptor = new Md5PasswordEncryptor(); + + + /** + * Retrieve the file used to load and store users + * + * @return The file + */ + public File getFile() { + return userDataFile; + } + + /** + * Set the file used to store and read users. Must be set before + * {@link #configure()} is called. + * + * @param propFile A file containing users + */ + public void setFile(File propFile) { + if (isConfigured) { + throw new IllegalStateException("Must be called before configure()"); + } + + this.userDataFile = propFile; + } + + + /** + * Retrieve the password encryptor used for this user manager + * + * @return The password encryptor. Default to {@link Md5PasswordEncryptor} + * if no other has been provided + */ + public PasswordEncryptor getPasswordEncryptor() { + return passwordEncryptor; + } + + + /** + * Set the password encryptor to use for this user manager + * + * @param passwordEncryptor The password encryptor + */ + public void setPasswordEncryptor(PasswordEncryptor passwordEncryptor) { + this.passwordEncryptor = passwordEncryptor; + } + + + /** + * Lazy init the user manager + */ + private void lazyInit() { + if (!isConfigured) { + configure(); + } + } + + /** + * Configure user manager. + */ + public void configure() { + isConfigured = true; + try { + userDataProp = new BaseProperties(); + + if (userDataFile != null && userDataFile.exists()) { + FileInputStream fis = null; + try { + fis = new FileInputStream(userDataFile); + userDataProp.load(fis); + } finally { + IoUtils.close(fis); + } + } + } catch (IOException e) { + throw new FtpServerConfigurationException( + "Error loading user data file : " + + userDataFile.getAbsolutePath(), e); + } + + convertDeprecatedPropertyNames(); + } + + private void convertDeprecatedPropertyNames() { + Enumeration keys = userDataProp.propertyNames(); + + boolean doSave = false; + + while (keys.hasMoreElements()) { + String key = (String) keys.nextElement(); + + if (key.startsWith(DEPRECATED_PREFIX)) { + String newKey = PREFIX + + key.substring(DEPRECATED_PREFIX.length()); + userDataProp.setProperty(newKey, userDataProp.getProperty(key)); + userDataProp.remove(key); + + doSave = true; + } + } + + if (doSave) { + try { + saveUserData(); + } catch (FtpException e) { + throw new FtpServerConfigurationException( + "Failed to save updated user data", e); + } + } + } + + public synchronized void save(User usr, boolean renamePush) throws FtpException { + lazyInit(); + userDataProp.setProperty(PREFIX + usr.getName() + ".rename.push", renamePush); + save(usr); + } + + /** + * Save user data. Store the properties. + */ + public synchronized void save(User usr) throws FtpException { + lazyInit(); + + // null value check + if (usr.getName() == null) { + throw new NullPointerException("User name is null."); + } + String thisPrefix = PREFIX + usr.getName() + '.'; + + // set other properties + userDataProp.setProperty(thisPrefix + ATTR_PASSWORD, getPassword(usr)); + + String home = usr.getHomeDirectory(); + if (home == null) { + home = "/"; + } + userDataProp.setProperty(thisPrefix + ATTR_HOME, home); + userDataProp.setProperty(thisPrefix + ATTR_ENABLE, usr.getEnabled()); + userDataProp.setProperty(thisPrefix + ATTR_WRITE_PERM, usr + .authorize(new WriteRequest()) != null); + userDataProp.setProperty(thisPrefix + ATTR_MAX_IDLE_TIME, usr + .getMaxIdleTime()); + + TransferRateRequest transferRateRequest = new TransferRateRequest(); + transferRateRequest = (TransferRateRequest) usr + .authorize(transferRateRequest); + + if (transferRateRequest != null) { + userDataProp.setProperty(thisPrefix + ATTR_MAX_UPLOAD_RATE, + transferRateRequest.getMaxUploadRate()); + userDataProp.setProperty(thisPrefix + ATTR_MAX_DOWNLOAD_RATE, + transferRateRequest.getMaxDownloadRate()); + } else { + userDataProp.remove(thisPrefix + ATTR_MAX_UPLOAD_RATE); + userDataProp.remove(thisPrefix + ATTR_MAX_DOWNLOAD_RATE); + } + + // request that always will succeed + ConcurrentLoginRequest concurrentLoginRequest = new ConcurrentLoginRequest( + 0, 0); + concurrentLoginRequest = (ConcurrentLoginRequest) usr + .authorize(concurrentLoginRequest); + + if (concurrentLoginRequest != null) { + userDataProp.setProperty(thisPrefix + ATTR_MAX_LOGIN_NUMBER, + concurrentLoginRequest.getMaxConcurrentLogins()); + userDataProp.setProperty(thisPrefix + ATTR_MAX_LOGIN_PER_IP, + concurrentLoginRequest.getMaxConcurrentLoginsPerIP()); + } else { + userDataProp.remove(thisPrefix + ATTR_MAX_LOGIN_NUMBER); + userDataProp.remove(thisPrefix + ATTR_MAX_LOGIN_PER_IP); + } + + saveUserData(); + } + + /** + * @throws FtpException + */ + private void saveUserData() throws FtpException { + File dir = userDataFile.getAbsoluteFile().getParentFile(); + if (dir != null && !dir.exists() && !dir.mkdirs()) { + String dirName = dir.getAbsolutePath(); + throw new FtpServerConfigurationException( + "Cannot create directory for user data file : " + dirName); + } + + // save user data + FileOutputStream fos = null; + try { + fos = new FileOutputStream(userDataFile); + userDataProp.store(fos, "Generated file - don't edit (please)"); + } catch (IOException ex) { + LOG.error("Failed saving user data", ex); + throw new FtpException("Failed saving user data", ex); + } finally { + IoUtils.close(fos); + } + } + + + public synchronized void list() throws FtpException { + lazyInit(); + + Map dataMap = new HashMap(); + Enumeration propNames = (Enumeration) userDataProp.propertyNames(); + ArrayList a = Collections.list(propNames); + a.remove("i18nMap");//去除i18nMap + for(String attrName : a){ +// dataMap.put(attrName, propNames.); + } + + } + + /** + * Delete an user. Removes all this user entries from the properties. After + * removing the corresponding from the properties, save the data. + */ + public synchronized void delete(String usrName) throws FtpException { + lazyInit(); + + // remove entries from properties + String thisPrefix = PREFIX + usrName + '.'; + Enumeration propNames = userDataProp.propertyNames(); + ArrayList remKeys = new ArrayList(); + while (propNames.hasMoreElements()) { + String thisKey = propNames.nextElement().toString(); + if (thisKey.startsWith(thisPrefix)) { + remKeys.add(thisKey); + } + } + Iterator remKeysIt = remKeys.iterator(); + while (remKeysIt.hasNext()) { + userDataProp.remove(remKeysIt.next()); + } + + saveUserData(); + } + + /** + * Get user password. Returns the encrypted value. + *

      + *

      +	 * If the password value is not null
      +	 *    password = new password
      +	 * else
      +	 *   if user does exist
      +	 *     password = old password
      +	 *   else
      +	 *     password = ""
      +	 * 
      + */ + private String getPassword(User usr) { + String name = usr.getName(); + String password = usr.getPassword(); + + if (password != null) { + password = passwordEncryptor.encrypt(password); + } else { + String blankPassword = passwordEncryptor.encrypt(""); + + if (doesExist(name)) { + String key = PREFIX + name + '.' + ATTR_PASSWORD; + password = userDataProp.getProperty(key, blankPassword); + } else { + password = blankPassword; + } + } + return password; + } + + /** + * Get all user names. + */ + public synchronized String[] getAllUserNames() { + lazyInit(); + + // get all user names + String suffix = '.' + ATTR_HOME; + ArrayList ulst = new ArrayList(); + Enumeration allKeys = userDataProp.propertyNames(); + int prefixlen = PREFIX.length(); + int suffixlen = suffix.length(); + while (allKeys.hasMoreElements()) { + String key = (String) allKeys.nextElement(); + if (key.endsWith(suffix)) { + String name = key.substring(prefixlen); + int endIndex = name.length() - suffixlen; + name = name.substring(0, endIndex); + ulst.add(name); + } + } + + Collections.sort(ulst); + return ulst.toArray(new String[0]); + } + + private ArrayList parseGroups(String groupsLine) { + String groupsArray[] = groupsLine.split(","); + return new ArrayList(Arrays.asList(groupsArray)); + } + + public static synchronized boolean getUserRenamePush(String userName) { + return userDataProp.getBoolean(PREFIX + userName + ".rename.push", false); + } + + /** + * Load user data. + */ + public synchronized User getUserByName(String userName) { + lazyInit(); + + if (!doesExist(userName)) { + return null; + } + + String baseKey = PREFIX + userName + '.'; + HdfsUser user = new HdfsUser(); + user.setName(userName); + user.setEnabled(userDataProp.getBoolean(baseKey + ATTR_ENABLE, true)); + user.setHomeDirectory(userDataProp + .getProperty(baseKey + ATTR_HOME, "/")); + +// user.setGroups(parseGroups(userDataProp +// .getProperty(baseKey + "groups"))); + + List authorities = new ArrayList(); + + if (userDataProp.getBoolean(baseKey + ATTR_WRITE_PERM, false)) { + authorities.add(new WritePermission()); + } + + int maxLogin = userDataProp.getInteger(baseKey + ATTR_MAX_LOGIN_NUMBER, + 0); + int maxLoginPerIP = userDataProp.getInteger(baseKey + + ATTR_MAX_LOGIN_PER_IP, 0); + + authorities.add(new ConcurrentLoginPermission(maxLogin, maxLoginPerIP)); + + int uploadRate = userDataProp.getInteger( + baseKey + ATTR_MAX_UPLOAD_RATE, 0); + int downloadRate = userDataProp.getInteger(baseKey + + ATTR_MAX_DOWNLOAD_RATE, 0); + + authorities.add(new TransferRatePermission(downloadRate, uploadRate)); + + user.setAuthorities(authorities); + + user.setMaxIdleTime(userDataProp.getInteger(baseKey + + ATTR_MAX_IDLE_TIME, 0)); + + return user; + } + + /** + * User existance check + */ + public synchronized boolean doesExist(String name) { + lazyInit(); + + String key = PREFIX + name + '.' + ATTR_HOME; + return userDataProp.containsKey(key); + } + + /** + * User authenticate method + */ + public synchronized User authenticate(Authentication authentication) + throws AuthenticationFailedException { + lazyInit(); + + if (authentication instanceof UsernamePasswordAuthentication) { + UsernamePasswordAuthentication upauth = (UsernamePasswordAuthentication) authentication; + + String user = upauth.getUsername(); + String password = upauth.getPassword(); + + if (user == null) { + throw new AuthenticationFailedException("Authentication failed"); + } + + if (password == null) { + password = ""; + } + + String storedPassword = userDataProp.getProperty(PREFIX + user + '.' + + ATTR_PASSWORD); + + if (storedPassword == null) { + // user does not exist + throw new AuthenticationFailedException("Authentication failed"); + } + + if (passwordEncryptor.matches(password, storedPassword)) { + return getUserByName(user); + } else { + throw new AuthenticationFailedException("Authentication failed"); + } + + } else if (authentication instanceof AnonymousAuthentication) { + if (doesExist("anonymous")) { + return getUserByName("anonymous"); + } else { + throw new AuthenticationFailedException("Authentication failed"); + } + } else { + throw new IllegalArgumentException( + "Authentication not supported by this user manager"); + } + } + + /** + * Close the user manager - remove existing entries. + */ + public synchronized void dispose() { + if (userDataProp != null) { + userDataProp.clear(); + userDataProp = null; + } + } +} diff --git a/other/java/hdfs-over-ftp/src/main/resources/application.yml b/other/java/hdfs-over-ftp/src/main/resources/application.yml new file mode 100644 index 000000000..128bab1f9 --- /dev/null +++ b/other/java/hdfs-over-ftp/src/main/resources/application.yml @@ -0,0 +1,15 @@ +server: + port: 8080 + +ftp: + port: 2222 + passive-address: localhost + passive-ports: 30000-30999 + +hdfs: + uri: seaweedfs://localhost:8888 + +seaweedFs: + enable: true + access: direct # direct/filerProxy/publicUrl + replication: "000" \ No newline at end of file diff --git a/other/java/hdfs-over-ftp/src/main/resources/assembly.xml b/other/java/hdfs-over-ftp/src/main/resources/assembly.xml new file mode 100644 index 000000000..84fef56f8 --- /dev/null +++ b/other/java/hdfs-over-ftp/src/main/resources/assembly.xml @@ -0,0 +1,39 @@ + + + + package + + + tar.gz + + false + + + + src/main/resources + / + + application.yml + logback-spring.xml + users.properties + kafka-producer.properties + + + + ${project.build.directory} + / + + *.jar + + + + + + false + lib + runtime + false + + + diff --git a/other/java/hdfs-over-ftp/src/main/resources/logback-spring.xml b/other/java/hdfs-over-ftp/src/main/resources/logback-spring.xml new file mode 100644 index 000000000..96b4c1d71 --- /dev/null +++ b/other/java/hdfs-over-ftp/src/main/resources/logback-spring.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + + + + + + + ${LOG_HOME}/fileLog.log + + ${LOG_HOME}/fileLog.log.%d.%i + + 100 MB + + + + + %d %p (%file:%line\)- %m%n + + UTF-8 + + + + + + + + + + \ No newline at end of file diff --git a/other/java/hdfs-over-ftp/users.properties b/other/java/hdfs-over-ftp/users.properties new file mode 100644 index 000000000..aeeab8e35 --- /dev/null +++ b/other/java/hdfs-over-ftp/users.properties @@ -0,0 +1,12 @@ +#Generated file - don't edit (please) +#Thu Mar 11 19:11:12 CST 2021 +ftpserver.user.test.idletime=0 +ftpserver.user.test.maxloginperip=0 +ftpserver.user.test.userpassword=44664D4D827C740293D2AA244FB60445 +ftpserver.user.test.enableflag=true +ftpserver.user.test.maxloginnumber=0 +ftpserver.user.test.rename.push=true +ftpserver.user.test.homedirectory=/buckets/test/ +ftpserver.user.test.downloadrate=0 +ftpserver.user.test.writepermission=true +ftpserver.user.test.uploadrate=0 From 2327c0756bf0d4da8d376377948bcbcc0a553d6e Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 5 Apr 2021 23:24:26 -0700 Subject: [PATCH 205/284] fix to avoid loop --- weed/server/filer_server_handlers_write_upload.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/weed/server/filer_server_handlers_write_upload.go b/weed/server/filer_server_handlers_write_upload.go index 03db942c6..81b2ce1b0 100644 --- a/weed/server/filer_server_handlers_write_upload.go +++ b/weed/server/filer_server_handlers_write_upload.go @@ -74,10 +74,10 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque lock.Unlock() // handle read errors if readErr != nil { + if err == nil { + err = readErr + } if readErr != io.EOF { - if err == nil { - err = readErr - } resultsChan <- &ChunkCreationResult{ err: readErr, } @@ -86,6 +86,9 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque } if len(data) == 0 { readErr = io.EOF + if err == nil { + err = readErr + } return } @@ -120,6 +123,10 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque waitForAllData.Wait() + if err == io.EOF { + err = nil + } + return fileChunks, md5Hash, readOffset, err, nil } From ed79baa30fe5687a35a9a61e2dcf3b4750064d36 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Tue, 6 Apr 2021 13:43:08 +0500 Subject: [PATCH 206/284] add tests --- weed/iamapi/iamapi_handlers.go | 1 + weed/iamapi/iamapi_management_handlers.go | 47 +++---- weed/iamapi/iamapi_server.go | 48 +++++-- weed/iamapi/iamapi_test.go | 157 ++++++++++++++++++++++ 4 files changed, 217 insertions(+), 36 deletions(-) create mode 100644 weed/iamapi/iamapi_test.go diff --git a/weed/iamapi/iamapi_handlers.go b/weed/iamapi/iamapi_handlers.go index 962717ad9..fdaf4dd69 100644 --- a/weed/iamapi/iamapi_handlers.go +++ b/weed/iamapi/iamapi_handlers.go @@ -55,6 +55,7 @@ func writeIamErrorResponse(w http.ResponseWriter, err error, object string, valu errorResp := ErrorResponse{} errorResp.Error.Type = "Sender" errorResp.Error.Code = &errCode + glog.Errorf("Response %+v", err) switch errCode { case iam.ErrCodeNoSuchEntityException: msg := fmt.Sprintf("The %s with name %s cannot be found.", object, value) diff --git a/weed/iamapi/iamapi_management_handlers.go b/weed/iamapi/iamapi_management_handlers.go index e4daa081f..470731064 100644 --- a/weed/iamapi/iamapi_management_handlers.go +++ b/weed/iamapi/iamapi_management_handlers.go @@ -1,14 +1,10 @@ package iamapi import ( - "bytes" "crypto/sha1" "encoding/json" "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" "github.com/chrislusf/seaweedfs/weed/s3api/s3_constants" "github.com/chrislusf/seaweedfs/weed/s3api/s3err" @@ -16,6 +12,7 @@ import ( "net/http" "net/url" "strings" + "sync" "time" "github.com/aws/aws-sdk-go/service/iam" @@ -32,13 +29,15 @@ var ( policyDocuments = map[string]*PolicyDocument{} ) +type Statement struct { + Effect string `json:"Effect"` + Action []string `json:"Action"` + Resource []string `json:"Resource"` +} + type PolicyDocument struct { - Version string `json:"Version"` - Statement []struct { - Effect string `json:"Effect"` - Action []string `json:"Action"` - Resource []string `json:"Resource"` - } `json:"Statement"` + Version string `json:"Version"` + Statement []*Statement `json:"Statement"` } func Hash(s *string) string { @@ -252,13 +251,16 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { return } values := r.PostForm + var s3cfgLock sync.RWMutex + s3cfgLock.RLock() s3cfg := &iam_pb.S3ApiConfiguration{} - if err := iama.GetS3ApiConfiguration(s3cfg); err != nil { + if err := iama.s3ApiConfig.GetS3ApiConfiguration(s3cfg); err != nil { writeErrorResponse(w, s3err.ErrInternalError, r.URL) return } + s3cfgLock.RUnlock() - glog.Info("values ", values) + glog.V(4).Infof("DoActions: %+v", values) var response interface{} var err error changed := true @@ -292,12 +294,14 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { case "CreatePolicy": response, err = iama.CreatePolicy(s3cfg, values) if err != nil { + glog.Errorf("CreatePolicy: %+v", err) writeErrorResponse(w, s3err.ErrInvalidRequest, r.URL) return } case "PutUserPolicy": response, err = iama.PutUserPolicy(s3cfg, values) if err != nil { + glog.Errorf("PutUserPolicy: %+v", err) writeErrorResponse(w, s3err.ErrInvalidRequest, r.URL) return } @@ -306,22 +310,9 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { return } if changed { - buf := bytes.Buffer{} - if err := filer.S3ConfigurationToText(&buf, s3cfg); err != nil { - glog.Error("S3ConfigurationToText: ", err) - writeErrorResponse(w, s3err.ErrInternalError, r.URL) - return - } - err := pb.WithGrpcFilerClient( - iama.option.FilerGrpcAddress, - iama.option.GrpcDialOption, - func(client filer_pb.SeaweedFilerClient) error { - if err := filer.SaveInsideFiler(client, filer.IamConfigDirecotry, filer.IamIdentityFile, buf.Bytes()); err != nil { - return err - } - return nil - }, - ) + s3cfgLock.Lock() + err := iama.s3ApiConfig.PutS3ApiConfiguration(s3cfg) + s3cfgLock.Unlock() if err != nil { writeErrorResponse(w, s3err.ErrInternalError, r.URL) return diff --git a/weed/iamapi/iamapi_server.go b/weed/iamapi/iamapi_server.go index 00c4a69a2..7698fab71 100644 --- a/weed/iamapi/iamapi_server.go +++ b/weed/iamapi/iamapi_server.go @@ -1,10 +1,10 @@ package iamapi // https://docs.aws.amazon.com/cli/latest/reference/iam/list-roles.html -// https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html import ( "bytes" + "fmt" "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/pb" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" @@ -16,6 +16,16 @@ import ( "strings" ) +type IamS3ApiConfig interface { + GetS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfiguration) (err error) + PutS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfiguration) (err error) +} + +type IamS3ApiConfigure struct { + option *IamServerOption + masterClient *wdclient.MasterClient +} + type IamServerOption struct { Masters string Filer string @@ -25,17 +35,22 @@ type IamServerOption struct { } type IamApiServer struct { - option *IamServerOption - masterClient *wdclient.MasterClient - filerclient *filer_pb.SeaweedFilerClient + s3ApiConfig IamS3ApiConfig + filerclient *filer_pb.SeaweedFilerClient } +var s3ApiConfigure IamS3ApiConfig + func NewIamApiServer(router *mux.Router, option *IamServerOption) (iamApiServer *IamApiServer, err error) { - iamApiServer = &IamApiServer{ + s3ApiConfigure = IamS3ApiConfigure{ option: option, masterClient: wdclient.NewMasterClient(option.GrpcDialOption, pb.AdminShellClient, "", 0, "", strings.Split(option.Masters, ",")), } + iamApiServer = &IamApiServer{ + s3ApiConfig: s3ApiConfigure, + } + iamApiServer.registerRouter(router) return iamApiServer, nil @@ -52,10 +67,10 @@ func (iama *IamApiServer) registerRouter(router *mux.Router) { apiRouter.NotFoundHandler = http.HandlerFunc(notFoundHandler) } -func (iama *IamApiServer) GetS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfiguration) (err error) { +func (iam IamS3ApiConfigure) GetS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfiguration) (err error) { var buf bytes.Buffer - err = pb.WithGrpcFilerClient(iama.option.FilerGrpcAddress, iama.option.GrpcDialOption, func(client filer_pb.SeaweedFilerClient) error { - if err = filer.ReadEntry(iama.masterClient, client, filer.IamConfigDirecotry, filer.IamIdentityFile, &buf); err != nil { + err = pb.WithGrpcFilerClient(iam.option.FilerGrpcAddress, iam.option.GrpcDialOption, func(client filer_pb.SeaweedFilerClient) error { + if err = filer.ReadEntry(iam.masterClient, client, filer.IamConfigDirecotry, filer.IamIdentityFile, &buf); err != nil { return err } return nil @@ -70,3 +85,20 @@ func (iama *IamApiServer) GetS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfiguration } return nil } + +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) + } + return pb.WithGrpcFilerClient( + 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 { + return err + } + return nil + }, + ) +} diff --git a/weed/iamapi/iamapi_test.go b/weed/iamapi/iamapi_test.go new file mode 100644 index 000000000..f989626e6 --- /dev/null +++ b/weed/iamapi/iamapi_test.go @@ -0,0 +1,157 @@ +package iamapi + +import ( + "encoding/xml" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/iam" + "github.com/chrislusf/seaweedfs/weed/pb/iam_pb" + "github.com/gorilla/mux" + "github.com/stretchr/testify/assert" + "net/http" + "net/http/httptest" + "testing" +) + +var S3config iam_pb.S3ApiConfiguration +var GetS3ApiConfiguration func(s3cfg *iam_pb.S3ApiConfiguration) (err error) +var PutS3ApiConfiguration func(s3cfg *iam_pb.S3ApiConfiguration) (err error) + +type iamS3ApiConfigureMock struct{} + +func (iam iamS3ApiConfigureMock) GetS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfiguration) (err error) { + s3cfg = &S3config + return nil +} + +func (iam iamS3ApiConfigureMock) PutS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfiguration) (err error) { + S3config = *s3cfg + return nil +} + +var a = IamApiServer{} + +func TestCreateUser(t *testing.T) { + userName := aws.String("Test") + params := &iam.CreateUserInput{UserName: userName} + req, _ := iam.New(session.New()).CreateUserRequest(params) + _ = req.Build() + out := CreateUserResponse{} + response, err := executeRequest(req.HTTPRequest, out) + assert.Equal(t, nil, err) + assert.Equal(t, http.StatusOK, response.Code) + //assert.Equal(t, out.XMLName, "lol") +} + +func TestListUsers(t *testing.T) { + params := &iam.ListUsersInput{} + req, _ := iam.New(session.New()).ListUsersRequest(params) + _ = req.Build() + out := ListUsersResponse{} + response, err := executeRequest(req.HTTPRequest, out) + assert.Equal(t, nil, err) + assert.Equal(t, http.StatusOK, response.Code) +} + +func TestListAccessKeys(t *testing.T) { + svc := iam.New(session.New()) + params := &iam.ListAccessKeysInput{} + req, _ := svc.ListAccessKeysRequest(params) + _ = req.Build() + out := ListAccessKeysResponse{} + response, err := executeRequest(req.HTTPRequest, out) + assert.Equal(t, nil, err) + assert.Equal(t, http.StatusOK, response.Code) +} + +func TestDeleteUser(t *testing.T) { + userName := aws.String("Test") + params := &iam.DeleteUserInput{UserName: userName} + req, _ := iam.New(session.New()).DeleteUserRequest(params) + _ = req.Build() + out := DeleteUserResponse{} + response, err := executeRequest(req.HTTPRequest, out) + assert.Equal(t, nil, err) + assert.Equal(t, http.StatusNotFound, response.Code) +} + +func TestGetUser(t *testing.T) { + userName := aws.String("Test") + params := &iam.GetUserInput{UserName: userName} + req, _ := iam.New(session.New()).GetUserRequest(params) + _ = req.Build() + out := GetUserResponse{} + response, err := executeRequest(req.HTTPRequest, out) + assert.Equal(t, nil, err) + assert.Equal(t, http.StatusNotFound, response.Code) +} + +// Todo flat statement +func TestCreatePolicy(t *testing.T) { + params := &iam.CreatePolicyInput{ + PolicyName: aws.String("S3-read-only-example-bucket"), + PolicyDocument: aws.String(` + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "s3:Get*", + "s3:List*" + ], + "Resource": [ + "arn:aws:s3:::EXAMPLE-BUCKET", + "arn:aws:s3:::EXAMPLE-BUCKET/*" + ] + } + ] + }`), + } + req, _ := iam.New(session.New()).CreatePolicyRequest(params) + _ = req.Build() + out := CreatePolicyResponse{} + response, err := executeRequest(req.HTTPRequest, out) + assert.Equal(t, nil, err) + assert.Equal(t, http.StatusOK, response.Code) +} + +func TestPutUserPolicy(t *testing.T) { + userName := aws.String("Test") + params := &iam.PutUserPolicyInput{ + UserName: userName, + PolicyName: aws.String("S3-read-only-example-bucket"), + PolicyDocument: aws.String( + `{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "s3:Get*", + "s3:List*" + ], + "Resource": [ + "arn:aws:s3:::EXAMPLE-BUCKET", + "arn:aws:s3:::EXAMPLE-BUCKET/*" + ] + } + ] + }`), + } + req, _ := iam.New(session.New()).PutUserPolicyRequest(params) + _ = req.Build() + out := PutUserPolicyResponse{} + response, err := executeRequest(req.HTTPRequest, out) + assert.Equal(t, nil, err) + assert.Equal(t, http.StatusOK, response.Code) +} + +func executeRequest(req *http.Request, v interface{}) (*httptest.ResponseRecorder, error) { + rr := httptest.NewRecorder() + apiRouter := mux.NewRouter().SkipClean(true) + a.s3ApiConfig = iamS3ApiConfigureMock{} + apiRouter.Path("/").Methods("POST").HandlerFunc(a.DoActions) + apiRouter.ServeHTTP(rr, req) + return rr, xml.Unmarshal(rr.Body.Bytes(), &v) +} From f5f8eec8e2f75045d7cc8685dc5fb86508700d2b Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Tue, 6 Apr 2021 13:53:56 +0500 Subject: [PATCH 207/284] fix get filerGrpcAddress --- weed/command/iam.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/command/iam.go b/weed/command/iam.go index ddcddbec9..17d0832cb 100644 --- a/weed/command/iam.go +++ b/weed/command/iam.go @@ -43,7 +43,7 @@ func runIam(cmd *Command, args []string) bool { } func (iamopt *IamOptions) startIamServer() bool { - filerGrpcAddress, err := pb.ParseFilerGrpcAddress(*iamopt.filer) + filerGrpcAddress, err := pb.ParseServerToGrpcAddress(*iamopt.filer) if err != nil { glog.Fatal(err) return false From c5b08bac1b5bfed90b824bc089681ae6eca9a053 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 5 Apr 2021 23:29:29 -0700 Subject: [PATCH 208/284] remove mac specific mount options --- weed/command/mount_std.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/weed/command/mount_std.go b/weed/command/mount_std.go index 8e5b7a483..f0c59b331 100644 --- a/weed/command/mount_std.go +++ b/weed/command/mount_std.go @@ -149,8 +149,6 @@ func RunMount(option *MountOptions, umask os.FileMode) bool { fuse.Subtype("seaweedfs"), // fuse.NoAppleDouble(), // include .DS_Store, otherwise can not delete non-empty folders fuse.NoAppleXattr(), - fuse.NoBrowse(), - fuse.AutoXattr(), fuse.ExclCreate(), fuse.DaemonTimeout("3600"), fuse.AllowSUID(), From 3be061994fbaecf2bae8ad155064df6b580063d7 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 7 Apr 2021 00:54:06 -0700 Subject: [PATCH 209/284] skip connection reset error fix https://github.com/chrislusf/seaweedfs/issues/1971 this is because the connections are pooled but the volume server has reset the connection --- weed/operation/upload_content.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/weed/operation/upload_content.go b/weed/operation/upload_content.go index e891ae03b..40e96fd8c 100644 --- a/weed/operation/upload_content.go +++ b/weed/operation/upload_content.go @@ -235,8 +235,10 @@ func upload_content(uploadUrl string, fillBufferFunction func(w io.Writer) error // print("+") resp, post_err := HttpClient.Do(req) if post_err != nil { - glog.Errorf("upload %s %d bytes to %v: %v", filename, originalDataSize, uploadUrl, post_err) - debug.PrintStack() + if !strings.Contains(post_err.Error(), "connection reset by peer"){ + glog.Errorf("upload %s %d bytes to %v: %v", filename, originalDataSize, uploadUrl, post_err) + debug.PrintStack() + } return nil, fmt.Errorf("upload %s %d bytes to %v: %v", filename, originalDataSize, uploadUrl, post_err) } // print("-") From 42a761ee201ec0ef7315b68f8d280431ddc07b57 Mon Sep 17 00:00:00 2001 From: Philippe Pepiot Date: Wed, 7 Apr 2021 22:47:23 +0200 Subject: [PATCH 210/284] Fix typo in weed filer long help --- weed/command/filer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/command/filer.go b/weed/command/filer.go index 08385e62c..a723b4d8a 100644 --- a/weed/command/filer.go +++ b/weed/command/filer.go @@ -114,7 +114,7 @@ var cmdFiler = &Command{ GET /path/to/ The configuration file "filer.toml" is read from ".", "$HOME/.seaweedfs/", "/usr/local/etc/seaweedfs/", or "/etc/seaweedfs/", in that order. - If the "filer.toml" is not found, an embedded filer store will be craeted under "-defaultStoreDir". + If the "filer.toml" is not found, an embedded filer store will be created under "-defaultStoreDir". The example filer.toml configuration file can be generated by "weed scaffold -config=filer" From b06c5b9d9907063fb4a3fddbcce1cfcc67be38d9 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 7 Apr 2021 20:59:48 -0700 Subject: [PATCH 211/284] upgrade raft to v1.0.5 fix https://github.com/chrislusf/seaweedfs/issues/1974 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index e792af37b..2a187d6a7 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/buraksezer/consistent v0.0.0-20191006190839-693edf70fd72 github.com/bwmarrin/snowflake v0.3.0 github.com/cespare/xxhash v1.1.0 - github.com/chrislusf/raft v1.0.4 + github.com/chrislusf/raft v1.0.5 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 diff --git a/go.sum b/go.sum index 31f5520a8..043b9b0dc 100644 --- a/go.sum +++ b/go.sum @@ -155,6 +155,8 @@ github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+ 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/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= From 995ae9100758921f16f02a8134269433142efcdb Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Thu, 8 Apr 2021 11:16:36 +0500 Subject: [PATCH 212/284] add DeleteUserPolicy --- docker/compose/local-dev-compose.yml | 3 ++- weed/iamapi/iamapi_handlers.go | 9 ++++++-- weed/iamapi/iamapi_management_handlers.go | 27 +++++++++++++++++++---- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/docker/compose/local-dev-compose.yml b/docker/compose/local-dev-compose.yml index 05103a7fc..01d0594a6 100644 --- a/docker/compose/local-dev-compose.yml +++ b/docker/compose/local-dev-compose.yml @@ -26,9 +26,10 @@ services: filer: image: chrislusf/seaweedfs:local ports: + - 8111:8111 - 8888:8888 - 18888:18888 - command: '-v=1 filer -master="master:9333"' + command: '-v=1 filer -master="master:9333" -iam' depends_on: - master - volume diff --git a/weed/iamapi/iamapi_handlers.go b/weed/iamapi/iamapi_handlers.go index fdaf4dd69..2e5f709f3 100644 --- a/weed/iamapi/iamapi_handlers.go +++ b/weed/iamapi/iamapi_handlers.go @@ -50,20 +50,25 @@ func writeErrorResponse(w http.ResponseWriter, errorCode s3err.ErrorCode, reqURL writeResponse(w, apiError.HTTPStatusCode, encodedErrorResponse, mimeXML) } -func writeIamErrorResponse(w http.ResponseWriter, err error, object string, value string) { +func writeIamErrorResponse(w http.ResponseWriter, err error, object string, value string, msg error) { errCode := err.Error() errorResp := ErrorResponse{} errorResp.Error.Type = "Sender" errorResp.Error.Code = &errCode + if msg != nil { + errMsg := msg.Error() + errorResp.Error.Message = &errMsg + } glog.Errorf("Response %+v", err) switch errCode { 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) + case iam.ErrCodeServiceFailureException: + writeResponse(w, http.StatusInternalServerError, encodeResponse(errorResp), mimeXML) default: writeResponse(w, http.StatusInternalServerError, encodeResponse(errorResp), mimeXML) - } } diff --git a/weed/iamapi/iamapi_management_handlers.go b/weed/iamapi/iamapi_management_handlers.go index 470731064..4ca3525ec 100644 --- a/weed/iamapi/iamapi_management_handlers.go +++ b/weed/iamapi/iamapi_management_handlers.go @@ -144,6 +144,17 @@ func (iama *IamApiServer) PutUserPolicy(s3cfg *iam_pb.S3ApiConfiguration, values return resp, nil } +func (iama *IamApiServer) DeleteUserPolicy(s3cfg *iam_pb.S3ApiConfiguration, values url.Values) (resp PutUserPolicyResponse, err error) { + userName := values.Get("UserName") + for i, ident := range s3cfg.Identities { + if ident.Name == userName { + s3cfg.Identities = append(s3cfg.Identities[:i], s3cfg.Identities[i+1:]...) + return resp, nil + } + } + return resp, fmt.Errorf(iam.ErrCodeNoSuchEntityException) +} + func MapAction(action string) string { switch action { case "*": @@ -277,14 +288,14 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { userName := values.Get("UserName") response, err = iama.GetUser(s3cfg, userName) if err != nil { - writeIamErrorResponse(w, err, "user", userName) + writeIamErrorResponse(w, err, "user", userName, nil) return } case "DeleteUser": userName := values.Get("UserName") response, err = iama.DeleteUser(s3cfg, userName) if err != nil { - writeIamErrorResponse(w, err, "user", userName) + writeIamErrorResponse(w, err, "user", userName, nil) return } case "CreateAccessKey": @@ -305,8 +316,16 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { writeErrorResponse(w, s3err.ErrInvalidRequest, r.URL) return } + case "DeleteUserPolicy": + if response, err = iama.DeleteUserPolicy(s3cfg, values); err != nil { + writeIamErrorResponse(w, err, "user", values.Get("UserName"), nil) + } default: - writeErrorResponse(w, s3err.ErrNotImplemented, r.URL) + errNotImplemented := s3err.GetAPIError(s3err.ErrNotImplemented) + errorResponse := ErrorResponse{} + errorResponse.Error.Code = &errNotImplemented.Code + errorResponse.Error.Message = &errNotImplemented.Description + writeResponse(w, errNotImplemented.HTTPStatusCode, encodeResponse(errorResponse), mimeXML) return } if changed { @@ -314,7 +333,7 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { err := iama.s3ApiConfig.PutS3ApiConfiguration(s3cfg) s3cfgLock.Unlock() if err != nil { - writeErrorResponse(w, s3err.ErrInternalError, r.URL) + writeIamErrorResponse(w, fmt.Errorf(iam.ErrCodeServiceFailureException), "", "", err) return } } From ba175f81b5bd95dbc283b6b3f7681659dbd45aa8 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Thu, 8 Apr 2021 17:40:47 +0500 Subject: [PATCH 213/284] add auth aws signV4 --- weed/iamapi/iamapi_server.go | 10 +++++++--- weed/s3api/auth_signature_v4.go | 30 ++++++++++++++++++++++------ weed/s3api/auto_signature_v4_test.go | 2 +- weed/s3api/chunked_reader_v4.go | 4 ++-- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/weed/iamapi/iamapi_server.go b/weed/iamapi/iamapi_server.go index 7698fab71..d0a033ed6 100644 --- a/weed/iamapi/iamapi_server.go +++ b/weed/iamapi/iamapi_server.go @@ -9,6 +9,8 @@ import ( "github.com/chrislusf/seaweedfs/weed/pb" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "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/wdclient" "github.com/gorilla/mux" "google.golang.org/grpc" @@ -36,7 +38,7 @@ type IamServerOption struct { type IamApiServer struct { s3ApiConfig IamS3ApiConfig - filerclient *filer_pb.SeaweedFilerClient + iam *s3api.IdentityAccessManagement } var s3ApiConfigure IamS3ApiConfig @@ -46,9 +48,10 @@ func NewIamApiServer(router *mux.Router, option *IamServerOption) (iamApiServer option: option, masterClient: wdclient.NewMasterClient(option.GrpcDialOption, pb.AdminShellClient, "", 0, "", strings.Split(option.Masters, ",")), } - + s3Option := s3api.S3ApiServerOption{Filer: option.Filer} iamApiServer = &IamApiServer{ s3ApiConfig: s3ApiConfigure, + iam: s3api.NewIdentityAccessManagement(&s3Option), } iamApiServer.registerRouter(router) @@ -62,7 +65,8 @@ func (iama *IamApiServer) registerRouter(router *mux.Router) { // ListBuckets // apiRouter.Methods("GET").Path("/").HandlerFunc(track(s3a.iam.Auth(s3a.ListBucketsHandler, ACTION_ADMIN), "LIST")) - apiRouter.Path("/").Methods("POST").HandlerFunc(iama.DoActions) + apiRouter.Methods("POST").Path("/").HandlerFunc(iama.iam.Auth(iama.DoActions, ACTION_ADMIN)) + // // NotFound apiRouter.NotFoundHandler = http.HandlerFunc(notFoundHandler) } diff --git a/weed/s3api/auth_signature_v4.go b/weed/s3api/auth_signature_v4.go index 5ef7439c8..0df26e6fc 100644 --- a/weed/s3api/auth_signature_v4.go +++ b/weed/s3api/auth_signature_v4.go @@ -24,6 +24,7 @@ import ( "crypto/subtle" "encoding/hex" "github.com/chrislusf/seaweedfs/weed/s3api/s3err" + "io/ioutil" "net/http" "net/url" "regexp" @@ -132,6 +133,17 @@ func (iam *IdentityAccessManagement) doesSignatureMatch(hashedPayload string, r // Query string. queryStr := req.URL.Query().Encode() + // Get hashed Payload + if signV4Values.Credential.scope.service != "s3" && hashedPayload == emptySHA256 && r.Body != nil { + buf, _ := ioutil.ReadAll(r.Body) + r.Body = ioutil.NopCloser(bytes.NewBuffer(buf)) + b, _ := ioutil.ReadAll(bytes.NewBuffer(buf)) + if len(b) != 0 { + bodyHash := sha256.Sum256(b) + hashedPayload = hex.EncodeToString(bodyHash[:]) + } + } + // Get canonical request. canonicalRequest := getCanonicalRequest(extractedSignedHeaders, hashedPayload, queryStr, req.URL.Path, req.Method) @@ -139,7 +151,10 @@ func (iam *IdentityAccessManagement) doesSignatureMatch(hashedPayload string, r stringToSign := getStringToSign(canonicalRequest, t, signV4Values.Credential.getScope()) // Get hmac signing key. - signingKey := getSigningKey(cred.SecretKey, signV4Values.Credential.scope.date, signV4Values.Credential.scope.region) + signingKey := getSigningKey(cred.SecretKey, + signV4Values.Credential.scope.date, + signV4Values.Credential.scope.region, + signV4Values.Credential.scope.service) // Calculate signature. newSignature := getSignature(signingKey, stringToSign) @@ -310,7 +325,7 @@ func (iam *IdentityAccessManagement) doesPolicySignatureV4Match(formValues http. } // Get signing key. - signingKey := getSigningKey(cred.SecretKey, credHeader.scope.date, credHeader.scope.region) + signingKey := getSigningKey(cred.SecretKey, credHeader.scope.date, credHeader.scope.region, credHeader.scope.service) // Get signature. newSignature := getSignature(signingKey, formValues.Get("Policy")) @@ -427,7 +442,10 @@ func (iam *IdentityAccessManagement) doesPresignedSignatureMatch(hashedPayload s presignedStringToSign := getStringToSign(presignedCanonicalReq, t, pSignValues.Credential.getScope()) // Get hmac presigned signing key. - presignedSigningKey := getSigningKey(cred.SecretKey, pSignValues.Credential.scope.date, pSignValues.Credential.scope.region) + presignedSigningKey := getSigningKey(cred.SecretKey, + pSignValues.Credential.scope.date, + pSignValues.Credential.scope.region, + pSignValues.Credential.scope.service) // Get new signature. newSignature := getSignature(presignedSigningKey, presignedStringToSign) @@ -655,11 +673,11 @@ func sumHMAC(key []byte, data []byte) []byte { } // getSigningKey hmac seed to calculate final signature. -func getSigningKey(secretKey string, t time.Time, region string) []byte { +func getSigningKey(secretKey string, t time.Time, region string, service string) []byte { date := sumHMAC([]byte("AWS4"+secretKey), []byte(t.Format(yyyymmdd))) regionBytes := sumHMAC(date, []byte(region)) - service := sumHMAC(regionBytes, []byte("s3")) - signingKey := sumHMAC(service, []byte("aws4_request")) + serviceBytes := sumHMAC(regionBytes, []byte(service)) + signingKey := sumHMAC(serviceBytes, []byte("aws4_request")) return signingKey } diff --git a/weed/s3api/auto_signature_v4_test.go b/weed/s3api/auto_signature_v4_test.go index 4c8255768..b47cd5f2d 100644 --- a/weed/s3api/auto_signature_v4_test.go +++ b/weed/s3api/auto_signature_v4_test.go @@ -370,7 +370,7 @@ func preSignV4(req *http.Request, accessKeyID, secretAccessKey string, expires i queryStr := strings.Replace(query.Encode(), "+", "%20", -1) canonicalRequest := getCanonicalRequest(extractedSignedHeaders, unsignedPayload, queryStr, req.URL.Path, req.Method) stringToSign := getStringToSign(canonicalRequest, date, scope) - signingKey := getSigningKey(secretAccessKey, date, region) + signingKey := getSigningKey(secretAccessKey, date, region, "s3") signature := getSignature(signingKey, stringToSign) req.URL.RawQuery = query.Encode() diff --git a/weed/s3api/chunked_reader_v4.go b/weed/s3api/chunked_reader_v4.go index 734c9faee..b163ec2f6 100644 --- a/weed/s3api/chunked_reader_v4.go +++ b/weed/s3api/chunked_reader_v4.go @@ -45,7 +45,7 @@ func getChunkSignature(secretKey string, seedSignature string, region string, da hashedChunk // Get hmac signing key. - signingKey := getSigningKey(secretKey, date, region) + signingKey := getSigningKey(secretKey, date, region, "s3") // Calculate signature. newSignature := getSignature(signingKey, stringToSign) @@ -117,7 +117,7 @@ func (iam *IdentityAccessManagement) calculateSeedSignature(r *http.Request) (cr stringToSign := getStringToSign(canonicalRequest, date, signV4Values.Credential.getScope()) // Get hmac signing key. - signingKey := getSigningKey(cred.SecretKey, signV4Values.Credential.scope.date, region) + signingKey := getSigningKey(cred.SecretKey, signV4Values.Credential.scope.date, region, "s3") // Calculate signature. newSignature := getSignature(signingKey, stringToSign) From 6deb647a8f07fe3828ce87a7cdd6c5925ea7f09e Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 8 Apr 2021 19:47:31 -0700 Subject: [PATCH 214/284] mount: fix possible memory leak if many files are read repeatedly, their metadata are accumulated in memory. This fix cleared the metadata after the file is read. --- weed/filesys/filehandle.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index 4419888c4..57aa41b8a 100644 --- a/weed/filesys/filehandle.go +++ b/weed/filesys/filehandle.go @@ -200,6 +200,8 @@ func (fh *FileHandle) Release(ctx context.Context, req *fuse.ReleaseRequest) err fh.Lock() defer fh.Unlock() + fh.f.clearEntry() + if fh.f.isOpen <= 0 { glog.V(0).Infof("Release reset %s open count %d => %d", fh.f.Name, fh.f.isOpen, 0) fh.f.isOpen = 0 @@ -211,7 +213,6 @@ func (fh *FileHandle) Release(ctx context.Context, req *fuse.ReleaseRequest) err fh.f.isOpen-- fh.f.wfs.ReleaseHandle(fh.f.fullpath(), fuse.HandleID(fh.handle)) - fh.f.setReader(nil) } return nil From 4d4acc715e517ae8f7cdaed220908dbd8e0b7773 Mon Sep 17 00:00:00 2001 From: Merlin Gaillard Date: Fri, 9 Apr 2021 12:13:19 +0200 Subject: [PATCH 215/284] s3api: handle 304 response code from filer --- weed/s3api/s3api_object_handlers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index b3cfd9ec7..f1a539ac5 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -311,7 +311,7 @@ func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, des } defer util.CloseResponse(resp) - if resp.ContentLength == -1 || resp.StatusCode == 404 { + if (resp.ContentLength == -1 || resp.StatusCode == 404) && resp.StatusCode != 304 { if r.Method != "DELETE" { writeErrorResponse(w, s3err.ErrNoSuchKey, r.URL) return From f952f979d1cc6a0975d73491d7e6aa5c4e1b522c Mon Sep 17 00:00:00 2001 From: Merlin Gaillard Date: Fri, 9 Apr 2021 15:04:17 +0200 Subject: [PATCH 216/284] filer: return 304 when If-Modified-Since == Last-Modified --- 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 f90b070a2..cdfdf9b49 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -79,7 +79,7 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, w.Header().Set("Last-Modified", entry.Attr.Mtime.UTC().Format(http.TimeFormat)) if r.Header.Get("If-Modified-Since") != "" { if t, parseError := time.Parse(http.TimeFormat, r.Header.Get("If-Modified-Since")); parseError == nil { - if t.After(entry.Attr.Mtime) { + if t.After(entry.Attr.Mtime) || t.Equal(entry.Attr.Mtime) { w.WriteHeader(http.StatusNotModified) return } From 93f4146ffa91c3a7851add1dcb19af4297e299c5 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 9 Apr 2021 12:36:39 -0700 Subject: [PATCH 217/284] properly release the view cache --- weed/filesys/filehandle.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index 57aa41b8a..f04952e96 100644 --- a/weed/filesys/filehandle.go +++ b/weed/filesys/filehandle.go @@ -200,7 +200,7 @@ func (fh *FileHandle) Release(ctx context.Context, req *fuse.ReleaseRequest) err fh.Lock() defer fh.Unlock() - fh.f.clearEntry() + fh.f.entryViewCache = nil if fh.f.isOpen <= 0 { glog.V(0).Infof("Release reset %s open count %d => %d", fh.f.Name, fh.f.isOpen, 0) @@ -213,6 +213,7 @@ func (fh *FileHandle) Release(ctx context.Context, req *fuse.ReleaseRequest) err fh.f.isOpen-- fh.f.wfs.ReleaseHandle(fh.f.fullpath(), fuse.HandleID(fh.handle)) + fh.f.setReader(nil) } return nil From 0b82edc0d28424597b6537308756971d017f59ce Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 9 Apr 2021 13:05:15 -0700 Subject: [PATCH 218/284] filer: avoid stuck uploader fix https://github.com/chrislusf/seaweedfs/issues/1980 reverting the file upload batch executor --- .../filer_server_handlers_write_upload.go | 186 ++++++------------ 1 file changed, 58 insertions(+), 128 deletions(-) diff --git a/weed/server/filer_server_handlers_write_upload.go b/weed/server/filer_server_handlers_write_upload.go index 81b2ce1b0..3ab45453e 100644 --- a/weed/server/filer_server_handlers_write_upload.go +++ b/weed/server/filer_server_handlers_write_upload.go @@ -6,9 +6,7 @@ import ( "io" "io/ioutil" "net/http" - "runtime" "strings" - "sync" "time" "github.com/chrislusf/seaweedfs/weed/filer" @@ -20,143 +18,75 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" ) -var ( - limitedUploadProcessor = util.NewLimitedOutOfOrderProcessor(int32(runtime.NumCPU())) -) +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 -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, dataSize int64, err error, smallContent []byte) { - - md5Hash = md5.New() + md5Hash := md5.New() var partReader = ioutil.NopCloser(io.TeeReader(reader, md5Hash)) - // save small content directly - if !isAppend(r) && ((0 < contentLength && contentLength < fs.option.SaveToFilerLimit) || strings.HasPrefix(r.URL.Path, filer.DirectoryEtcRoot) && contentLength < 4*1024) { - smallContent, err = ioutil.ReadAll(partReader) - dataSize = int64(len(smallContent)) - return - } + chunkOffset := int64(0) + var smallContent []byte - resultsChan := make(chan *ChunkCreationResult, 2) + for { + limitedReader := io.LimitReader(partReader, int64(chunkSize)) - var waitForAllData sync.WaitGroup - waitForAllData.Add(1) - go func() { - // process upload results - defer waitForAllData.Done() - for result := range resultsChan { - if result.err != nil { - err = result.err + 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)) + break + } + } + dataReader := util.NewBytesReader(data) + + // 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 + } + + // 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 } - - // Save to chunk manifest structure - fileChunks = append(fileChunks, result.chunk) + break } - }() - - var lock sync.Mutex - readOffset := int64(0) - var wg sync.WaitGroup - - for err == nil { - - wg.Add(1) - request := func() { - defer wg.Done() - - var localOffset int64 - // read from the input - lock.Lock() - localOffset = readOffset - limitedReader := io.LimitReader(partReader, int64(chunkSize)) - data, readErr := ioutil.ReadAll(limitedReader) - readOffset += int64(len(data)) - lock.Unlock() - // handle read errors - if readErr != nil { - if err == nil { - err = readErr - } - if readErr != io.EOF { - resultsChan <- &ChunkCreationResult{ - err: readErr, - } - } - return - } - if len(data) == 0 { - readErr = io.EOF - if err == nil { - err = readErr - } - return - } - - // upload - dataReader := util.NewBytesReader(data) - fileId, uploadResult, uploadErr := fs.doCreateChunk(w, r, so, dataReader, fileName, contentType) - if uploadErr != nil { - if err == nil { - err = uploadErr - } - resultsChan <- &ChunkCreationResult{ - err: uploadErr, - } - return - } - - glog.V(4).Infof("uploaded %s to %s [%d,%d)", fileName, fileId, localOffset, localOffset+int64(uploadResult.Size)) - - // send back uploaded file chunk - resultsChan <- &ChunkCreationResult{ - chunk: uploadResult.ToPbFileChunk(fileId, localOffset), - } - - } - limitedUploadProcessor.Execute(request) - } - - go func() { - wg.Wait() - close(resultsChan) - }() - - waitForAllData.Wait() - - if err == io.EOF { - err = nil - } - - return fileChunks, md5Hash, readOffset, err, nil -} - -type ChunkCreationResult struct { - chunk *filer_pb.FileChunk - err error -} - -func (fs *FilerServer) doCreateChunk(w http.ResponseWriter, r *http.Request, so *operation.StorageOption, dataReader *util.BytesReader, fileName string, contentType string) (string, *operation.UploadResult, error) { - // 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, assignErr - } - - // 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 + return nil, nil, 0, uploadErr, nil + } + + // if last chunk exhausted the reader exactly at the border + if uploadResult.Size == 0 { + break + } + + // Save to chunk manifest structure + fileChunks = append(fileChunks, uploadResult.ToPbFileChunk(fileId, chunkOffset)) + + glog.V(4).Infof("uploaded %s chunk %d to %s [%d,%d)", fileName, len(fileChunks), fileId, chunkOffset, chunkOffset+int64(uploadResult.Size)) + + // reset variables for the next chunk + chunkOffset = chunkOffset + int64(uploadResult.Size) + + // if last chunk was not at full chunk size, but already exhausted the reader + if int64(uploadResult.Size) < int64(chunkSize) { + break } - break } - return fileId, uploadResult, uploadErr + + 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) { From 98c08a3dcd3d3a3115828dc04b5f11e56cd67489 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 10 Apr 2021 02:36:53 -0700 Subject: [PATCH 219/284] raft: fix possible nil panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x1962c8a] goroutine 68239935 [running]: github.com/chrislusf/raft.(*LogEntry).Term(...) /home/travis/gopath/pkg/mod/github.com/chrislusf/raft@v1.0.4/log_entry.go:59 github.com/chrislusf/raft.(*server).TakeSnapshot(0xc00014f320, 0xc028b5a600, 0xc03995bc00) /home/travis/gopath/pkg/mod/github.com/chrislusf/raft@v1.0.4/server.go:1276 +0x50a github.com/chrislusf/raft.(*server).maybeTakeSnapshot.func1(0xc00014f320) /home/travis/gopath/pkg/mod/github.com/chrislusf/raft@v1.0.4/server.go:1221 +0x5b created by github.com/chrislusf/raft.(*server).maybeTakeSnapshot /home/travis/gopath/pkg/mod/github.com/chrislusf/raft@v1.0.4/server.go:1219 +0x98 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 2a187d6a7..310f5585e 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/buraksezer/consistent v0.0.0-20191006190839-693edf70fd72 github.com/bwmarrin/snowflake v0.3.0 github.com/cespare/xxhash v1.1.0 - github.com/chrislusf/raft v1.0.5 + github.com/chrislusf/raft v1.0.6 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 diff --git a/go.sum b/go.sum index 043b9b0dc..1ea4ee761 100644 --- a/go.sum +++ b/go.sum @@ -157,6 +157,8 @@ 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/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= From 5021bea69838a5946b4b0bfa37c6269bfe66fa27 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Sat, 10 Apr 2021 23:57:45 +0500 Subject: [PATCH 220/284] GetUserPolicy --- go.mod | 1 + go.sum | 2 + weed/filer/filer_conf.go | 1 + weed/iamapi/iamapi_management_handlers.go | 150 +++++++++++++++++++--- weed/iamapi/iamapi_response.go | 10 ++ weed/iamapi/iamapi_server.go | 41 ++++++ weed/iamapi/iamapi_test.go | 60 ++++++--- 7 files changed, 226 insertions(+), 39 deletions(-) diff --git a/go.mod b/go.mod index 2a187d6a7..ee33926c0 100644 --- a/go.mod +++ b/go.mod @@ -42,6 +42,7 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 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/karlseguin/ccache v2.0.3+incompatible // indirect github.com/karlseguin/ccache/v2 v2.0.7 diff --git a/go.sum b/go.sum index 043b9b0dc..52166e601 100644 --- a/go.sum +++ b/go.sum @@ -437,6 +437,8 @@ github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03 h1:FUwcHNlEqkqLjL 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= diff --git a/weed/filer/filer_conf.go b/weed/filer/filer_conf.go index 8e549f5ad..ab5afc5cc 100644 --- a/weed/filer/filer_conf.go +++ b/weed/filer/filer_conf.go @@ -18,6 +18,7 @@ const ( FilerConfName = "filer.conf" IamConfigDirecotry = "/etc/iam" IamIdentityFile = "identity.json" + IamPoliciesFile = "policies.json" ) type FilerConf struct { diff --git a/weed/iamapi/iamapi_management_handlers.go b/weed/iamapi/iamapi_management_handlers.go index 4ca3525ec..b00ada234 100644 --- a/weed/iamapi/iamapi_management_handlers.go +++ b/weed/iamapi/iamapi_management_handlers.go @@ -11,6 +11,7 @@ import ( "math/rand" "net/http" "net/url" + "reflect" "strings" "sync" "time" @@ -19,27 +20,77 @@ import ( ) const ( - charsetUpper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" - charset = charsetUpper + "abcdefghijklmnopqrstuvwxyz/" + charsetUpper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + charset = charsetUpper + "abcdefghijklmnopqrstuvwxyz/" + policyDocumentVersion = "2012-10-17" + StatementActionAdmin = "*" + StatementActionWrite = "Put*" + StatementActionRead = "Get*" + StatementActionList = "List*" + StatementActionTagging = "Tagging*" ) var ( seededRand *rand.Rand = rand.New( rand.NewSource(time.Now().UnixNano())) policyDocuments = map[string]*PolicyDocument{} + policyLock = sync.RWMutex{} ) +func MapToStatementAction(action string) string { + switch action { + case StatementActionAdmin: + return s3_constants.ACTION_ADMIN + case StatementActionWrite: + return s3_constants.ACTION_WRITE + case StatementActionRead: + return s3_constants.ACTION_READ + case StatementActionList: + return s3_constants.ACTION_LIST + case StatementActionTagging: + return s3_constants.ACTION_TAGGING + default: + return "" + } +} + +func MapToIdentitiesAction(action string) string { + switch action { + case s3_constants.ACTION_ADMIN: + return StatementActionAdmin + case s3_constants.ACTION_WRITE: + return StatementActionWrite + case s3_constants.ACTION_READ: + return StatementActionRead + case s3_constants.ACTION_LIST: + return StatementActionList + case s3_constants.ACTION_TAGGING: + return StatementActionTagging + default: + return "" + } +} + type Statement struct { Effect string `json:"Effect"` Action []string `json:"Action"` Resource []string `json:"Resource"` } +type Policies struct { + Policies map[string]PolicyDocument `json:"policies"` +} + type PolicyDocument struct { Version string `json:"Version"` Statement []*Statement `json:"Statement"` } +func (p PolicyDocument) String() string { + b, _ := json.Marshal(p) + return string(b) +} + func Hash(s *string) string { h := sha1.New() h.Write([]byte(*s)) @@ -83,7 +134,7 @@ func (iama *IamApiServer) CreateUser(s3cfg *iam_pb.S3ApiConfiguration, values ur func (iama *IamApiServer) DeleteUser(s3cfg *iam_pb.S3ApiConfiguration, userName string) (resp DeleteUserResponse, err error) { for i, ident := range s3cfg.Identities { if userName == ident.Name { - ident.Credentials = append(ident.Credentials[:i], ident.Credentials[i+1:]...) + s3cfg.Identities = append(s3cfg.Identities[:i], s3cfg.Identities[i+1:]...) return resp, nil } } @@ -119,7 +170,16 @@ func (iama *IamApiServer) CreatePolicy(s3cfg *iam_pb.S3ApiConfiguration, values resp.CreatePolicyResult.Policy.PolicyName = &policyName resp.CreatePolicyResult.Policy.Arn = &arn resp.CreatePolicyResult.Policy.PolicyId = &policyId - policyDocuments[policyName] = &policyDocument + policies := Policies{} + policyLock.Lock() + defer policyLock.Unlock() + if err = iama.s3ApiConfig.GetPolicies(&policies); err != nil { + return resp, err + } + policies.Policies[policyName] = policyDocument + if err = iama.s3ApiConfig.PutPolicies(&policies); err != nil { + return resp, err + } return resp, nil } @@ -144,6 +204,60 @@ func (iama *IamApiServer) PutUserPolicy(s3cfg *iam_pb.S3ApiConfiguration, values return resp, nil } +func (iama *IamApiServer) GetUserPolicy(s3cfg *iam_pb.S3ApiConfiguration, values url.Values) (resp GetUserPolicyResponse, err error) { + userName := values.Get("UserName") + policyName := values.Get("PolicyName") + for _, ident := range s3cfg.Identities { + if userName != ident.Name { + continue + } + + resp.GetUserPolicyResult.UserName = userName + resp.GetUserPolicyResult.PolicyName = policyName + if len(ident.Actions) == 0 { + return resp, fmt.Errorf(iam.ErrCodeNoSuchEntityException) + } + + policyDocument := PolicyDocument{Version: policyDocumentVersion} + statements := make(map[string][]string) + for _, action := range ident.Actions { + // parse "Read:EXAMPLE-BUCKET" + act := strings.Split(action, ":") + + resource := "*" + if len(act) == 2 { + resource = fmt.Sprintf("arn:aws:s3:::%s/*", act[1]) + } + statements[resource] = append(statements[resource], + fmt.Sprintf("s3:%s", MapToIdentitiesAction(act[0])), + ) + } + for resource, actions := range statements { + isEqAction := false + for i, statement := range policyDocument.Statement { + if reflect.DeepEqual(statement.Action, actions) { + policyDocument.Statement[i].Resource = append( + policyDocument.Statement[i].Resource, resource) + isEqAction = true + break + } + } + if isEqAction { + continue + } + policyDocumentStatement := Statement{ + Effect: "Allow", + Action: actions, + } + policyDocumentStatement.Resource = append(policyDocumentStatement.Resource, resource) + policyDocument.Statement = append(policyDocument.Statement, &policyDocumentStatement) + } + resp.GetUserPolicyResult.PolicyDocument = policyDocument.String() + return resp, nil + } + return resp, fmt.Errorf(iam.ErrCodeNoSuchEntityException) +} + func (iama *IamApiServer) DeleteUserPolicy(s3cfg *iam_pb.S3ApiConfiguration, values url.Values) (resp PutUserPolicyResponse, err error) { userName := values.Get("UserName") for i, ident := range s3cfg.Identities { @@ -155,21 +269,6 @@ func (iama *IamApiServer) DeleteUserPolicy(s3cfg *iam_pb.S3ApiConfiguration, val return resp, fmt.Errorf(iam.ErrCodeNoSuchEntityException) } -func MapAction(action string) string { - switch action { - case "*": - return s3_constants.ACTION_ADMIN - case "Put*": - return s3_constants.ACTION_WRITE - case "Get*": - return s3_constants.ACTION_READ - case "List*": - return s3_constants.ACTION_LIST - default: - return s3_constants.ACTION_TAGGING - } -} - func GetActions(policy *PolicyDocument) (actions []string) { for _, statement := range policy.Statement { if statement.Effect != "Allow" { @@ -189,8 +288,9 @@ func GetActions(policy *PolicyDocument) (actions []string) { glog.Infof("not match action: %s", act) continue } + statementAction := MapToStatementAction(act[1]) if res[5] == "*" { - actions = append(actions, MapAction(act[1])) + actions = append(actions, statementAction) continue } // Parse my-bucket/shared/* @@ -199,7 +299,7 @@ func GetActions(policy *PolicyDocument) (actions []string) { glog.Infof("not match bucket: %s", path) continue } - actions = append(actions, fmt.Sprintf("%s:%s", MapAction(act[1]), path[0])) + actions = append(actions, fmt.Sprintf("%s:%s", statementAction, path[0])) } } } @@ -291,6 +391,7 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { writeIamErrorResponse(w, err, "user", userName, nil) return } + changed = false case "DeleteUser": userName := values.Get("UserName") response, err = iama.DeleteUser(s3cfg, userName) @@ -316,6 +417,13 @@ func (iama *IamApiServer) DoActions(w http.ResponseWriter, r *http.Request) { writeErrorResponse(w, s3err.ErrInvalidRequest, r.URL) return } + case "GetUserPolicy": + response, err = iama.GetUserPolicy(s3cfg, values) + if err != nil { + writeIamErrorResponse(w, err, "user", values.Get("UserName"), nil) + return + } + changed = false case "DeleteUserPolicy": if response, err = iama.DeleteUserPolicy(s3cfg, values); err != nil { writeIamErrorResponse(w, err, "user", values.Get("UserName"), nil) diff --git a/weed/iamapi/iamapi_response.go b/weed/iamapi/iamapi_response.go index 26dd0f263..77328b608 100644 --- a/weed/iamapi/iamapi_response.go +++ b/weed/iamapi/iamapi_response.go @@ -79,6 +79,16 @@ type PutUserPolicyResponse struct { XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ PutUserPolicyResponse"` } +type GetUserPolicyResponse struct { + CommonResponse + XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ GetUserPolicyResponse"` + GetUserPolicyResult struct { + UserName string `xml:"UserName"` + PolicyName string `xml:"PolicyName"` + PolicyDocument string `xml:"PolicyDocument"` + } `xml:"GetUserPolicyResult"` +} + type ErrorResponse struct { CommonResponse XMLName xml.Name `xml:"https://iam.amazonaws.com/doc/2010-05-08/ ErrorResponse"` diff --git a/weed/iamapi/iamapi_server.go b/weed/iamapi/iamapi_server.go index d0a033ed6..18af1a919 100644 --- a/weed/iamapi/iamapi_server.go +++ b/weed/iamapi/iamapi_server.go @@ -4,6 +4,7 @@ package iamapi import ( "bytes" + "encoding/json" "fmt" "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/pb" @@ -21,6 +22,8 @@ import ( type IamS3ApiConfig interface { GetS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfiguration) (err error) PutS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfiguration) (err error) + GetPolicies(policies *Policies) (err error) + PutPolicies(policies *Policies) (err error) } type IamS3ApiConfigure struct { @@ -106,3 +109,41 @@ func (iam IamS3ApiConfigure) PutS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfigurat }, ) } + +func (iam IamS3ApiConfigure) GetPolicies(policies *Policies) (err error) { + var buf bytes.Buffer + err = pb.WithGrpcFilerClient(iam.option.FilerGrpcAddress, iam.option.GrpcDialOption, func(client filer_pb.SeaweedFilerClient) error { + if err = filer.ReadEntry(iam.masterClient, client, filer.IamConfigDirecotry, filer.IamPoliciesFile, &buf); err != nil { + return err + } + return nil + }) + if err != nil { + return err + } + if buf.Len() == 0 { + policies.Policies = make(map[string]PolicyDocument) + return nil + } + if err := json.Unmarshal(buf.Bytes(), policies); err != nil { + return err + } + return nil +} + +func (iam IamS3ApiConfigure) PutPolicies(policies *Policies) (err error) { + var b []byte + if b, err = json.Marshal(policies); err != nil { + return err + } + return pb.WithGrpcFilerClient( + iam.option.FilerGrpcAddress, + iam.option.GrpcDialOption, + func(client filer_pb.SeaweedFilerClient) error { + if err := filer.SaveInsideFiler(client, filer.IamConfigDirecotry, filer.IamPoliciesFile, b); err != nil { + return err + } + return nil + }, + ) +} diff --git a/weed/iamapi/iamapi_test.go b/weed/iamapi/iamapi_test.go index f989626e6..09aaf0ac8 100644 --- a/weed/iamapi/iamapi_test.go +++ b/weed/iamapi/iamapi_test.go @@ -7,29 +7,43 @@ import ( "github.com/aws/aws-sdk-go/service/iam" "github.com/chrislusf/seaweedfs/weed/pb/iam_pb" "github.com/gorilla/mux" + "github.com/jinzhu/copier" "github.com/stretchr/testify/assert" "net/http" "net/http/httptest" "testing" ) -var S3config iam_pb.S3ApiConfiguration var GetS3ApiConfiguration func(s3cfg *iam_pb.S3ApiConfiguration) (err error) var PutS3ApiConfiguration func(s3cfg *iam_pb.S3ApiConfiguration) (err error) +var GetPolicies func(policies *Policies) (err error) +var PutPolicies func(policies *Policies) (err error) + +var s3config = iam_pb.S3ApiConfiguration{} +var policiesFile = Policies{Policies: make(map[string]PolicyDocument)} +var ias = IamApiServer{s3ApiConfig: iamS3ApiConfigureMock{}} type iamS3ApiConfigureMock struct{} func (iam iamS3ApiConfigureMock) GetS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfiguration) (err error) { - s3cfg = &S3config + _ = copier.Copy(&s3cfg.Identities, &s3config.Identities) return nil } func (iam iamS3ApiConfigureMock) PutS3ApiConfiguration(s3cfg *iam_pb.S3ApiConfiguration) (err error) { - S3config = *s3cfg + _ = copier.Copy(&s3config.Identities, &s3cfg.Identities) return nil } -var a = IamApiServer{} +func (iam iamS3ApiConfigureMock) GetPolicies(policies *Policies) (err error) { + _ = copier.Copy(&policies, &policiesFile) + return nil +} + +func (iam iamS3ApiConfigureMock) PutPolicies(policies *Policies) (err error) { + _ = copier.Copy(&policiesFile, &policies) + return nil +} func TestCreateUser(t *testing.T) { userName := aws.String("Test") @@ -64,17 +78,6 @@ func TestListAccessKeys(t *testing.T) { assert.Equal(t, http.StatusOK, response.Code) } -func TestDeleteUser(t *testing.T) { - userName := aws.String("Test") - params := &iam.DeleteUserInput{UserName: userName} - req, _ := iam.New(session.New()).DeleteUserRequest(params) - _ = req.Build() - out := DeleteUserResponse{} - response, err := executeRequest(req.HTTPRequest, out) - assert.Equal(t, nil, err) - assert.Equal(t, http.StatusNotFound, response.Code) -} - func TestGetUser(t *testing.T) { userName := aws.String("Test") params := &iam.GetUserInput{UserName: userName} @@ -83,7 +86,7 @@ func TestGetUser(t *testing.T) { out := GetUserResponse{} response, err := executeRequest(req.HTTPRequest, out) assert.Equal(t, nil, err) - assert.Equal(t, http.StatusNotFound, response.Code) + assert.Equal(t, http.StatusOK, response.Code) } // Todo flat statement @@ -147,11 +150,32 @@ func TestPutUserPolicy(t *testing.T) { assert.Equal(t, http.StatusOK, response.Code) } +func TestGetUserPolicy(t *testing.T) { + userName := aws.String("Test") + params := &iam.GetUserPolicyInput{UserName: userName, PolicyName: aws.String("S3-read-only-example-bucket")} + req, _ := iam.New(session.New()).GetUserPolicyRequest(params) + _ = req.Build() + out := GetUserPolicyResponse{} + response, err := executeRequest(req.HTTPRequest, out) + assert.Equal(t, nil, err) + assert.Equal(t, http.StatusOK, response.Code) +} + +func TestDeleteUser(t *testing.T) { + userName := aws.String("Test") + params := &iam.DeleteUserInput{UserName: userName} + req, _ := iam.New(session.New()).DeleteUserRequest(params) + _ = req.Build() + out := DeleteUserResponse{} + response, err := executeRequest(req.HTTPRequest, out) + assert.Equal(t, nil, err) + assert.Equal(t, http.StatusOK, response.Code) +} + func executeRequest(req *http.Request, v interface{}) (*httptest.ResponseRecorder, error) { rr := httptest.NewRecorder() apiRouter := mux.NewRouter().SkipClean(true) - a.s3ApiConfig = iamS3ApiConfigureMock{} - apiRouter.Path("/").Methods("POST").HandlerFunc(a.DoActions) + apiRouter.Path("/").Methods("POST").HandlerFunc(ias.DoActions) apiRouter.ServeHTTP(rr, req) return rr, xml.Unmarshal(rr.Body.Bytes(), &v) } From af313dff58bf82a731dbce72535b72f1979d6740 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 10 Apr 2021 23:47:47 -0700 Subject: [PATCH 221/284] add gateway for easier POST and DELETE blobs --- weed/command/command.go | 1 + weed/command/gateway.go | 93 +++++++++++++++++++++++++++++ weed/server/gateway_server.go | 106 ++++++++++++++++++++++++++++++++++ weed/util/http_util.go | 22 +++++++ 4 files changed, 222 insertions(+) create mode 100644 weed/command/gateway.go create mode 100644 weed/server/gateway_server.go diff --git a/weed/command/command.go b/weed/command/command.go index ce754702f..b6efcead2 100644 --- a/weed/command/command.go +++ b/weed/command/command.go @@ -22,6 +22,7 @@ var Commands = []*Command{ cmdFilerReplicate, cmdFilerSynchronize, cmdFix, + cmdGateway, cmdMaster, cmdMount, cmdS3, diff --git a/weed/command/gateway.go b/weed/command/gateway.go new file mode 100644 index 000000000..a2a97889f --- /dev/null +++ b/weed/command/gateway.go @@ -0,0 +1,93 @@ +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/ + 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 new file mode 100644 index 000000000..608217ed7 --- /dev/null +++ b/weed/server/gateway_server.go @@ -0,0 +1,106 @@ +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": + } +} diff --git a/weed/util/http_util.go b/weed/util/http_util.go index 135d10c45..1c1b2b377 100644 --- a/weed/util/http_util.go +++ b/weed/util/http_util.go @@ -124,6 +124,28 @@ func Delete(url string, jwt string) error { return errors.New(string(body)) } +func DeleteProxied(url string, jwt string) (body []byte, httpStatus int, err error) { + req, err := http.NewRequest("DELETE", url, nil) + if jwt != "" { + req.Header.Set("Authorization", "BEARER "+string(jwt)) + } + if err != nil { + return + } + resp, err := client.Do(req) + if err != nil { + return + } + defer resp.Body.Close() + body, err = ioutil.ReadAll(resp.Body) + if err != nil { + return + } + httpStatus = resp.StatusCode + return +} + + func GetBufferStream(url string, values url.Values, allocatedBytes []byte, eachBuffer func([]byte)) error { r, err := client.PostForm(url, values) if err != nil { From f62c1532745c1dca7d81f1f23d39f18f5c8985d5 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 10 Apr 2021 23:48:18 -0700 Subject: [PATCH 222/284] go fmt --- weed/command/gateway.go | 6 +++--- weed/filesys/dir.go | 1 - weed/operation/upload_content.go | 2 +- weed/util/http_util.go | 1 - 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/weed/command/gateway.go b/weed/command/gateway.go index a2a97889f..28ec326cc 100644 --- a/weed/command/gateway.go +++ b/weed/command/gateway.go @@ -68,9 +68,9 @@ 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, + 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) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index 46457f858..7b918e769 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -372,7 +372,6 @@ func (dir *Dir) Remove(ctx context.Context, req *fuse.RemoveRequest) error { return fuse.EPERM } - if !req.Dir { return dir.removeOneFile(req) } diff --git a/weed/operation/upload_content.go b/weed/operation/upload_content.go index 40e96fd8c..7a7f8aa0c 100644 --- a/weed/operation/upload_content.go +++ b/weed/operation/upload_content.go @@ -235,7 +235,7 @@ func upload_content(uploadUrl string, fillBufferFunction func(w io.Writer) error // print("+") resp, post_err := HttpClient.Do(req) if post_err != nil { - if !strings.Contains(post_err.Error(), "connection reset by peer"){ + if !strings.Contains(post_err.Error(), "connection reset by peer") { glog.Errorf("upload %s %d bytes to %v: %v", filename, originalDataSize, uploadUrl, post_err) debug.PrintStack() } diff --git a/weed/util/http_util.go b/weed/util/http_util.go index 1c1b2b377..1630760b1 100644 --- a/weed/util/http_util.go +++ b/weed/util/http_util.go @@ -145,7 +145,6 @@ func DeleteProxied(url string, jwt string) (body []byte, httpStatus int, err err return } - func GetBufferStream(url string, values url.Values, allocatedBytes []byte, eachBuffer func([]byte)) error { r, err := client.PostForm(url, values) if err != nil { From 0df5b53ad8258414350169a923d887c90742a8b2 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 11 Apr 2021 00:26:28 -0700 Subject: [PATCH 223/284] adjust help message --- weed/command/gateway.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/command/gateway.go b/weed/command/gateway.go index 28ec326cc..8a6f852a5 100644 --- a/weed/command/gateway.go +++ b/weed/command/gateway.go @@ -38,7 +38,7 @@ var cmdGateway = &Command{ Long: `start a gateway server which accepts REST operation to write any blobs, files, or topic messages. POST /blobs/ - return a chunk id + upload the blob and return a chunk id DELETE /blobs/ delete a chunk id From 742ab1ec81795d1705bf3be48d56727fddf625df Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 11 Apr 2021 19:47:11 -0700 Subject: [PATCH 224/284] 2.39 --- 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 d8d069032..c296ce0c6 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.38" -version: 2.38 +appVersion: "2.39" +version: 2.39 diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index 19c0c78a1..e615090c1 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.38" - started using {.Chart.appVersion} + # imageTag: "2.39" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index 40f4deae2..fce35379d 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, 38) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 39) COMMIT = "" ) From 519b0e1e4909d875988cee83f8dad5100e3df256 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 12 Apr 2021 11:56:56 -0700 Subject: [PATCH 225/284] filer: upload to a directory without "/" suffix fix https://github.com/chrislusf/seaweedfs/issues/1988 --- weed/server/filer_server_handlers_write_autochunk.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/weed/server/filer_server_handlers_write_autochunk.go b/weed/server/filer_server_handlers_write_autochunk.go index 2808042c7..c4f10d94e 100644 --- a/weed/server/filer_server_handlers_write_autochunk.go +++ b/weed/server/filer_server_handlers_write_autochunk.go @@ -142,6 +142,14 @@ func (fs *FilerServer) saveMetaData(ctx context.Context, r *http.Request, fileNa if fileName != "" { path += fileName } + } else { + if fileName != "" { + if possibleDirEntry, findDirErr := fs.filer.FindEntry(ctx, util.FullPath(path)); findDirErr == nil { + if possibleDirEntry.IsDirectory() { + path += "/" + fileName + } + } + } } var entry *filer.Entry From 1e033d45b80ce12bb4a0fc57cc76e492856c2f95 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 12 Apr 2021 12:04:53 -0700 Subject: [PATCH 226/284] simpler logic related to https://github.com/chrislusf/seaweedfs/pull/1981 --- 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 cdfdf9b49..6bc09e953 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -79,7 +79,7 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, w.Header().Set("Last-Modified", entry.Attr.Mtime.UTC().Format(http.TimeFormat)) if r.Header.Get("If-Modified-Since") != "" { if t, parseError := time.Parse(http.TimeFormat, r.Header.Get("If-Modified-Since")); parseError == nil { - if t.After(entry.Attr.Mtime) || t.Equal(entry.Attr.Mtime) { + if !t.Before(entry.Attr.Mtime) { w.WriteHeader(http.StatusNotModified) return } From 5985a7d38d4823b868117f93dc958dc9635e8950 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 12 Apr 2021 21:15:51 -0700 Subject: [PATCH 227/284] add log level possible values fix https://github.com/chrislusf/seaweedfs/issues/1989 --- weed/glog/glog.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/glog/glog.go b/weed/glog/glog.go index adb6ab5aa..352a7e185 100644 --- a/weed/glog/glog.go +++ b/weed/glog/glog.go @@ -398,7 +398,7 @@ type flushSyncWriter interface { func init() { flag.BoolVar(&logging.toStderr, "logtostderr", false, "log to standard error instead of files") flag.BoolVar(&logging.alsoToStderr, "alsologtostderr", true, "log to standard error as well as files") - flag.Var(&logging.verbosity, "v", "log level for V logs") + flag.Var(&logging.verbosity, "v", "log levels [0|1|2|3|4], default to 0") flag.Var(&logging.stderrThreshold, "stderrthreshold", "logs at or above this threshold go to stderr") flag.Var(&logging.vmodule, "vmodule", "comma-separated list of pattern=N settings for file-filtered logging") flag.Var(&logging.traceLocation, "log_backtrace_at", "when logging hits line file:N, emit a stack trace") From ca0f07a188152ac8ea6b6a54f628a30f61634515 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 14 Apr 2021 00:29:58 -0700 Subject: [PATCH 228/284] move file reader, entryViewCache to file handle reduce file object size --- weed/filesys/dir.go | 3 +-- weed/filesys/file.go | 45 +------------------------------------- weed/filesys/filehandle.go | 25 +++++++++++---------- weed/filesys/wfs.go | 2 +- 4 files changed, 16 insertions(+), 59 deletions(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index 7b918e769..391d28ebb 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -109,7 +109,6 @@ func (dir *Dir) newFile(name string, entry *filer_pb.Entry) fs.Node { dir: dir, wfs: dir.wfs, entry: entry, - entryViewCache: nil, } }) f.(*File).dir = dir // in case dir node was created later @@ -408,7 +407,7 @@ func (dir *Dir) removeOneFile(req *fuse.RemoveRequest) error { dir.wfs.fsNodeCache.DeleteFsNode(filePath) if fsNode != nil { if file, ok := fsNode.(*File); ok { - file.clearEntry() + file.entry = nil } } diff --git a/weed/filesys/file.go b/weed/filesys/file.go index 2433be590..202951082 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -2,10 +2,8 @@ package filesys import ( "context" - "io" "os" "sort" - "sync" "time" "github.com/seaweedfs/fuse" @@ -34,10 +32,7 @@ type File struct { dir *Dir wfs *WFS entry *filer_pb.Entry - entryLock sync.RWMutex - entryViewCache []filer.VisibleInterval isOpen int - reader io.ReaderAt dirtyMetadata bool } @@ -154,8 +149,6 @@ func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *f } } entry.Chunks = chunks - file.entryViewCache, _ = filer.NonOverlappingVisibleIntervals(file.wfs.LookupFn(), chunks) - file.setReader(nil) } entry.Attributes.FileSize = req.Size file.dirtyMetadata = true @@ -274,7 +267,6 @@ func (file *File) Forget() { glog.V(4).Infof("Forget file %s", t) file.wfs.fsNodeCache.DeleteFsNode(t) file.wfs.ReleaseHandle(t, 0) - file.setReader(nil) } func (file *File) maybeLoadEntry(ctx context.Context) (entry *filer_pb.Entry, err error) { @@ -294,7 +286,7 @@ func (file *File) maybeLoadEntry(ctx context.Context) (entry *filer_pb.Entry, er return entry, err } if entry != nil { - file.setEntry(entry) + file.entry = entry } else { glog.Warningf("maybeLoadEntry not found entry %s/%s: %v", file.dir.FullPath(), file.Name, err) } @@ -336,44 +328,11 @@ func (file *File) addChunks(chunks []*filer_pb.FileChunk) { return lessThan(chunks[i], chunks[j]) }) - // add to entry view cache - for _, chunk := range chunks { - file.entryViewCache = filer.MergeIntoVisibles(file.entryViewCache, chunk) - } - - file.setReader(nil) - glog.V(4).Infof("%s existing %d chunks adds %d more", file.fullpath(), len(entry.Chunks), len(chunks)) entry.Chunks = append(entry.Chunks, newChunks...) } -func (file *File) setReader(reader io.ReaderAt) { - r := file.reader - if r != nil { - if closer, ok := r.(io.Closer); ok { - closer.Close() - } - } - file.reader = reader -} - -func (file *File) setEntry(entry *filer_pb.Entry) { - file.entryLock.Lock() - defer file.entryLock.Unlock() - file.entry = entry - file.entryViewCache, _ = filer.NonOverlappingVisibleIntervals(file.wfs.LookupFn(), entry.Chunks) - file.setReader(nil) -} - -func (file *File) clearEntry() { - file.entryLock.Lock() - defer file.entryLock.Unlock() - file.entry = nil - file.entryViewCache = nil - file.setReader(nil) -} - func (file *File) saveEntry(entry *filer_pb.Entry) error { return file.wfs.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { @@ -400,7 +359,5 @@ func (file *File) saveEntry(entry *filer_pb.Entry) error { } func (file *File) getEntry() *filer_pb.Entry { - file.entryLock.RLock() - defer file.entryLock.RUnlock() return file.entry } diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index f04952e96..0236fd1cd 100644 --- a/weed/filesys/filehandle.go +++ b/weed/filesys/filehandle.go @@ -20,9 +20,11 @@ import ( type FileHandle struct { // cache file has been written to - dirtyPages *ContinuousDirtyPages - contentType string - handle uint64 + dirtyPages *ContinuousDirtyPages + entryViewCache []filer.VisibleInterval + reader io.ReaderAt + contentType string + handle uint64 sync.Mutex f *File @@ -125,20 +127,20 @@ func (fh *FileHandle) readFromChunks(buff []byte, offset int64) (int64, error) { } var chunkResolveErr error - if fh.f.entryViewCache == nil { - fh.f.entryViewCache, chunkResolveErr = filer.NonOverlappingVisibleIntervals(fh.f.wfs.LookupFn(), entry.Chunks) + if fh.entryViewCache == nil { + fh.entryViewCache, chunkResolveErr = filer.NonOverlappingVisibleIntervals(fh.f.wfs.LookupFn(), entry.Chunks) if chunkResolveErr != nil { return 0, fmt.Errorf("fail to resolve chunk manifest: %v", chunkResolveErr) } - fh.f.setReader(nil) + fh.reader = nil } - reader := fh.f.reader + reader := fh.reader if reader == nil { - chunkViews := filer.ViewFromVisibleIntervals(fh.f.entryViewCache, 0, math.MaxInt64) + chunkViews := filer.ViewFromVisibleIntervals(fh.entryViewCache, 0, math.MaxInt64) reader = filer.NewChunkReaderAtFromClient(fh.f.wfs.LookupFn(), chunkViews, fh.f.wfs.chunkCache, fileSize) } - fh.f.setReader(reader) + fh.reader = reader totalRead, err := reader.ReadAt(buff, offset) @@ -200,8 +202,6 @@ func (fh *FileHandle) Release(ctx context.Context, req *fuse.ReleaseRequest) err fh.Lock() defer fh.Unlock() - fh.f.entryViewCache = nil - if fh.f.isOpen <= 0 { glog.V(0).Infof("Release reset %s open count %d => %d", fh.f.Name, fh.f.isOpen, 0) fh.f.isOpen = 0 @@ -211,9 +211,10 @@ func (fh *FileHandle) Release(ctx context.Context, req *fuse.ReleaseRequest) err if fh.f.isOpen == 1 { fh.f.isOpen-- + fh.entryViewCache = nil + fh.reader = nil fh.f.wfs.ReleaseHandle(fh.f.fullpath(), fuse.HandleID(fh.handle)) - fh.f.setReader(nil) } return nil diff --git a/weed/filesys/wfs.go b/weed/filesys/wfs.go index ba5eb4b6b..aaff1377b 100644 --- a/weed/filesys/wfs.go +++ b/weed/filesys/wfs.go @@ -111,7 +111,7 @@ func NewSeaweedFileSystem(option *Option) *WFS { if err := wfs.Server.InvalidateNodeData(file); err != nil { glog.V(4).Infof("InvalidateNodeData %s : %v", filePath, err) } - file.clearEntry() + file.entry = nil } } dir, name := filePath.DirAndName() From 3f3268cd1bb8c2824864b9293d419649285f435c Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 14 Apr 2021 00:30:16 -0700 Subject: [PATCH 229/284] go fmt --- weed/filesys/dir.go | 8 ++++---- weed/filesys/file.go | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index 391d28ebb..63631b857 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -105,10 +105,10 @@ func (dir *Dir) Fsync(ctx context.Context, req *fuse.FsyncRequest) error { func (dir *Dir) newFile(name string, entry *filer_pb.Entry) fs.Node { f := dir.wfs.fsNodeCache.EnsureFsNode(util.NewFullPath(dir.FullPath(), name), func() fs.Node { return &File{ - Name: name, - dir: dir, - wfs: dir.wfs, - entry: entry, + Name: name, + dir: dir, + wfs: dir.wfs, + entry: entry, } }) f.(*File).dir = dir // in case dir node was created later diff --git a/weed/filesys/file.go b/weed/filesys/file.go index 202951082..2d1c9a86e 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -28,12 +28,12 @@ var _ = fs.NodeListxattrer(&File{}) var _ = fs.NodeForgetter(&File{}) type File struct { - Name string - dir *Dir - wfs *WFS - entry *filer_pb.Entry - isOpen int - dirtyMetadata bool + Name string + dir *Dir + wfs *WFS + entry *filer_pb.Entry + isOpen int + dirtyMetadata bool } func (file *File) fullpath() util.FullPath { From 90677e1097e18567999d98436d8c1e8eba4cc611 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 14 Apr 2021 01:33:21 -0700 Subject: [PATCH 230/284] ensure to call line.Close() fix https://github.com/chrislusf/seaweedfs/issues/1995 similar to https://github.com/peterh/liner/issues/104 --- weed/shell/shell_liner.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/weed/shell/shell_liner.go b/weed/shell/shell_liner.go index d79f67032..1dd611ca5 100644 --- a/weed/shell/shell_liner.go +++ b/weed/shell/shell_liner.go @@ -2,6 +2,7 @@ package shell import ( "fmt" + "github.com/chrislusf/seaweedfs/weed/util/grace" "io" "os" "path" @@ -25,6 +26,9 @@ func RunShell(options ShellOptions) { line = liner.NewLiner() defer line.Close() + grace.OnInterrupt(func() { + line.Close() + }) line.SetCtrlCAborts(true) From 270645f8d7b706f8eeb7ecb7ecc985efa481ca59 Mon Sep 17 00:00:00 2001 From: qieqieplus Date: Wed, 14 Apr 2021 18:29:28 +0800 Subject: [PATCH 231/284] fix #1996 --- weed/operation/assign_file_id.go | 1 + 1 file changed, 1 insertion(+) diff --git a/weed/operation/assign_file_id.go b/weed/operation/assign_file_id.go index cc1359961..ffd3e4938 100644 --- a/weed/operation/assign_file_id.go +++ b/weed/operation/assign_file_id.go @@ -86,6 +86,7 @@ func Assign(masterFn GetMasterFn, grpcDialOption grpc.DialOption, primaryRequest continue } + break } return ret, lastError From 606c6ae8e8c5a0f11c0b6b577b679e6e74797d2c Mon Sep 17 00:00:00 2001 From: zhanghc Date: Wed, 14 Apr 2021 18:57:49 +0800 Subject: [PATCH 232/284] fix volume-service helm template indentation --- k8s/seaweedfs/templates/volume-service.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/k8s/seaweedfs/templates/volume-service.yaml b/k8s/seaweedfs/templates/volume-service.yaml index a2b0b540e..0a9173fde 100644 --- a/k8s/seaweedfs/templates/volume-service.yaml +++ b/k8s/seaweedfs/templates/volume-service.yaml @@ -23,6 +23,6 @@ spec: targetPort: {{ .Values.volume.metricsPort }} protocol: TCP {{- end }} -selector: + selector: app: {{ template "seaweedfs.name" . }} component: volume \ No newline at end of file From ff4c1d59652953ea2d81ad317ba92f34ab5e3c0c Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 14 Apr 2021 10:04:09 -0700 Subject: [PATCH 233/284] adjust logging fix https://github.com/chrislusf/seaweedfs/issues/1999 --- weed/command/export.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/command/export.go b/weed/command/export.go index f100f3af5..1c32e1050 100644 --- a/weed/command/export.go +++ b/weed/command/export.go @@ -215,7 +215,7 @@ func runExport(cmd *Command, args []string) bool { err = storage.ScanVolumeFile(util.ResolvePath(*export.dir), *export.collection, vid, storage.NeedleMapInMemory, volumeFileScanner) if err != nil && err != io.EOF { - glog.Fatalf("Export Volume File [ERROR] %s\n", err) + glog.Errorf("Export Volume File [ERROR] %s\n", err) } return true } From 9d50867d08557acf389878c6f42bd22d0c2cc709 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 14 Apr 2021 10:26:26 -0700 Subject: [PATCH 234/284] volume.tier.move: avoid data loss when destination volume server already has the volume fix https://github.com/chrislusf/seaweedfs/issues/2001 --- 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 f7fa94031..d6a49d6e1 100644 --- a/weed/shell/command_volume_tier_move.go +++ b/weed/shell/command_volume_tier_move.go @@ -133,7 +133,7 @@ func doVolumeTierMove(commandEnv *CommandEnv, writer io.Writer, collection strin // remove the remaining replicas for _, loc := range locations { - if loc.Url != sourceVolumeServer { + 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) } From e75633c64fd4b93339787933dbbf4d8fb93ccff1 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 14 Apr 2021 12:40:13 -0700 Subject: [PATCH 235/284] volume.check.disk: break loop for read only volumes fix https://github.com/chrislusf/seaweedfs/issues/2002 --- weed/shell/command_volume_check_disk.go | 1 + 1 file changed, 1 insertion(+) diff --git a/weed/shell/command_volume_check_disk.go b/weed/shell/command_volume_check_disk.go index 5a0d46869..0f156ac2f 100644 --- a/weed/shell/command_volume_check_disk.go +++ b/weed/shell/command_volume_check_disk.go @@ -85,6 +85,7 @@ func (c *commandVolumeCheckDisk) Do(args []string, commandEnv *CommandEnv, write } if a.info.ReadOnly || b.info.ReadOnly { fmt.Fprintf(writer, "skipping readonly volume %d on %s and %s\n", a.info.Id, a.location.dataNode.Id, b.location.dataNode.Id) + replicas = replicas[1:] continue } From fc0cbf565f273eebe8483d1d0ecba34f950f28ab Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 14 Apr 2021 15:37:24 -0700 Subject: [PATCH 236/284] add option to obfuscate the file names --- weed/shell/command_fs_meta_save.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/weed/shell/command_fs_meta_save.go b/weed/shell/command_fs_meta_save.go index ed19e3d01..d154fc12b 100644 --- a/weed/shell/command_fs_meta_save.go +++ b/weed/shell/command_fs_meta_save.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "os" + "path/filepath" "sync" "sync/atomic" "time" @@ -46,6 +47,7 @@ func (c *commandFsMetaSave) Do(args []string, commandEnv *CommandEnv, writer io. fsMetaSaveCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) verbose := fsMetaSaveCommand.Bool("v", false, "print out each processed files") outputFileName := fsMetaSaveCommand.String("o", "", "output the meta data to this file") + isObfuscate := fsMetaSaveCommand.Bool("obfuscate", false, "obfuscate the file names") // chunksFileName := fsMetaSaveCommand.String("chunks", "", "output all the chunks to this file") if err = fsMetaSaveCommand.Parse(args); err != nil { return nil @@ -69,6 +71,11 @@ func (c *commandFsMetaSave) Do(args []string, commandEnv *CommandEnv, writer io. } defer dst.Close() + var cipherKey util.CipherKey + if *isObfuscate { + cipherKey = util.GenCipherKey() + } + err = doTraverseBfsAndSaving(commandEnv, writer, path, *verbose, func(outputChan chan interface{}) { sizeBuf := make([]byte, 4) for item := range outputChan { @@ -78,6 +85,12 @@ func (c *commandFsMetaSave) Do(args []string, commandEnv *CommandEnv, writer io. dst.Write(b) } }, func(entry *filer_pb.FullEntry, outputChan chan interface{}) (err error) { + if !entry.Entry.IsDirectory { + ext := filepath.Ext(entry.Entry.Name) + if encrypted, encErr := util.Encrypt([]byte(entry.Entry.Name), cipherKey); encErr == nil { + entry.Entry.Name = util.Base64Encode(encrypted)[:len(entry.Entry.Name)] + ext + } + } bytes, err := proto.Marshal(entry) if err != nil { fmt.Fprintf(writer, "marshall error: %v\n", err) From ffee470cfcc2a76fe11a5903b6ccf23672ba8ba8 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 14 Apr 2021 15:47:09 -0700 Subject: [PATCH 237/284] 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 2a5e66a6e..dba704800 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -60,5 +60,5 @@ jobs: ldflags: -extldflags -static -X github.com/chrislusf/seaweedfs/weed/util.COMMIT=${{github.sha}} # Where to run `go build .` project_path: weed - binary_name: weed- + binary_name: weed asset_name: "weed-${{ env.BUILD_TIME }}-${{ matrix.goos }}-${{ matrix.goarch }}" From c04b7e106f1e83101580d57fa4ea33e0a4416194 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 14 Apr 2021 20:26:13 -0700 Subject: [PATCH 238/284] mount: remove entry from Dir object --- weed/filesys/dir.go | 81 ++++++++++++++++++++++----------------------- weed/filesys/wfs.go | 3 +- 2 files changed, 41 insertions(+), 43 deletions(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index 63631b857..087f31588 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -53,17 +53,18 @@ func (dir *Dir) Attr(ctx context.Context, attr *fuse.Attr) error { return nil } - if err := dir.maybeLoadEntry(); err != nil { + entry, err := dir.maybeLoadEntry() + if err != nil { glog.V(3).Infof("dir Attr %s,err: %+v", dir.FullPath(), err) return err } // attr.Inode = util.FullPath(dir.FullPath()).AsInode() - attr.Mode = os.FileMode(dir.entry.Attributes.FileMode) | os.ModeDir - attr.Mtime = time.Unix(dir.entry.Attributes.Mtime, 0) - attr.Crtime = time.Unix(dir.entry.Attributes.Crtime, 0) - attr.Gid = dir.entry.Attributes.Gid - attr.Uid = dir.entry.Attributes.Uid + attr.Mode = os.FileMode(entry.Attributes.FileMode) | os.ModeDir + attr.Mtime = time.Unix(entry.Attributes.Mtime, 0) + attr.Crtime = time.Unix(entry.Attributes.Crtime, 0) + attr.Gid = entry.Attributes.Gid + attr.Uid = entry.Attributes.Uid glog.V(4).Infof("dir Attr %s, attr: %+v", dir.FullPath(), attr) @@ -74,11 +75,12 @@ func (dir *Dir) Getxattr(ctx context.Context, req *fuse.GetxattrRequest, resp *f glog.V(4).Infof("dir Getxattr %s", dir.FullPath()) - if err := dir.maybeLoadEntry(); err != nil { + entry, err := dir.maybeLoadEntry() + if err != nil { return err } - return getxattr(dir.entry, req, resp) + return getxattr(entry, req, resp) } func (dir *Dir) setRootDirAttributes(attr *fuse.Attr) { @@ -115,10 +117,10 @@ func (dir *Dir) newFile(name string, entry *filer_pb.Entry) fs.Node { return f } -func (dir *Dir) newDirectory(fullpath util.FullPath, entry *filer_pb.Entry) fs.Node { +func (dir *Dir) newDirectory(fullpath util.FullPath) fs.Node { d := dir.wfs.fsNodeCache.EnsureFsNode(fullpath, func() fs.Node { - return &Dir{name: entry.Name, wfs: dir.wfs, entry: entry, parent: dir} + return &Dir{name: fullpath.Name(), wfs: dir.wfs, parent: dir} }) d.(*Dir).parent = dir // in case dir node was created later return d @@ -138,7 +140,7 @@ func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest, } var node fs.Node if request.Entry.IsDirectory { - node = dir.newDirectory(util.NewFullPath(dir.FullPath(), req.Name), request.Entry) + node = dir.newDirectory(util.NewFullPath(dir.FullPath(), req.Name)) return node, nil, nil } @@ -250,7 +252,7 @@ func (dir *Dir) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs.Node, err }) if err == nil { - node := dir.newDirectory(util.NewFullPath(dir.FullPath(), req.Name), newEntry) + node := dir.newDirectory(util.NewFullPath(dir.FullPath(), req.Name)) return node, nil } @@ -290,7 +292,7 @@ func (dir *Dir) Lookup(ctx context.Context, req *fuse.LookupRequest, resp *fuse. if entry != nil { if entry.IsDirectory { - node = dir.newDirectory(fullFilePath, entry) + node = dir.newDirectory(fullFilePath) } else { node = dir.newFile(req.Name, entry) } @@ -450,27 +452,28 @@ func (dir *Dir) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fus glog.V(4).Infof("%v dir setattr %+v", dir.FullPath(), req) - if err := dir.maybeLoadEntry(); err != nil { + entry, err := dir.maybeLoadEntry() + if err != nil { return err } if req.Valid.Mode() { - dir.entry.Attributes.FileMode = uint32(req.Mode) + entry.Attributes.FileMode = uint32(req.Mode) } if req.Valid.Uid() { - dir.entry.Attributes.Uid = req.Uid + entry.Attributes.Uid = req.Uid } if req.Valid.Gid() { - dir.entry.Attributes.Gid = req.Gid + entry.Attributes.Gid = req.Gid } if req.Valid.Mtime() { - dir.entry.Attributes.Mtime = req.Mtime.Unix() + entry.Attributes.Mtime = req.Mtime.Unix() } - return dir.saveEntry() + return dir.saveEntry(entry) } @@ -482,15 +485,16 @@ func (dir *Dir) Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error { glog.V(4).Infof("dir Setxattr %s: %s", dir.FullPath(), req.Name) - if err := dir.maybeLoadEntry(); err != nil { + entry, err := dir.maybeLoadEntry() + if err != nil { return err } - if err := setxattr(dir.entry, req); err != nil { + if err := setxattr(entry, req); err != nil { return err } - return dir.saveEntry() + return dir.saveEntry(entry) } @@ -502,15 +506,16 @@ func (dir *Dir) Removexattr(ctx context.Context, req *fuse.RemovexattrRequest) e glog.V(4).Infof("dir Removexattr %s: %s", dir.FullPath(), req.Name) - if err := dir.maybeLoadEntry(); err != nil { + entry, err := dir.maybeLoadEntry() + if err != nil { return err } - if err := removexattr(dir.entry, req); err != nil { + if err := removexattr(entry, req); err != nil { return err } - return dir.saveEntry() + return dir.saveEntry(entry) } @@ -518,11 +523,12 @@ func (dir *Dir) Listxattr(ctx context.Context, req *fuse.ListxattrRequest, resp glog.V(4).Infof("dir Listxattr %s", dir.FullPath()) - if err := dir.maybeLoadEntry(); err != nil { + entry, err := dir.maybeLoadEntry() + if err != nil { return err } - if err := listxattr(dir.entry, req, resp); err != nil { + if err := listxattr(entry, req, resp); err != nil { return err } @@ -536,30 +542,23 @@ func (dir *Dir) Forget() { dir.wfs.fsNodeCache.DeleteFsNode(util.FullPath(dir.FullPath())) } -func (dir *Dir) maybeLoadEntry() error { - if dir.entry == nil { - parentDirPath, name := util.FullPath(dir.FullPath()).DirAndName() - entry, err := dir.wfs.maybeLoadEntry(parentDirPath, name) - if err != nil { - return err - } - dir.entry = entry - } - return nil +func (dir *Dir) maybeLoadEntry() (*filer_pb.Entry, error) { + parentDirPath, name := util.FullPath(dir.FullPath()).DirAndName() + return dir.wfs.maybeLoadEntry(parentDirPath, name) } -func (dir *Dir) saveEntry() error { +func (dir *Dir) saveEntry(entry *filer_pb.Entry) error { parentDir, name := util.FullPath(dir.FullPath()).DirAndName() return dir.wfs.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { - dir.wfs.mapPbIdFromLocalToFiler(dir.entry) - defer dir.wfs.mapPbIdFromFilerToLocal(dir.entry) + dir.wfs.mapPbIdFromLocalToFiler(entry) + defer dir.wfs.mapPbIdFromFilerToLocal(entry) request := &filer_pb.UpdateEntryRequest{ Directory: parentDir, - Entry: dir.entry, + Entry: entry, Signatures: []int32{dir.wfs.signature}, } diff --git a/weed/filesys/wfs.go b/weed/filesys/wfs.go index aaff1377b..c2937f914 100644 --- a/weed/filesys/wfs.go +++ b/weed/filesys/wfs.go @@ -131,8 +131,7 @@ func NewSeaweedFileSystem(option *Option) *WFS { wfs.metaCache.Shutdown() }) - entry, _ := filer_pb.GetEntry(wfs, util.FullPath(wfs.option.FilerMountRootPath)) - wfs.root = &Dir{name: wfs.option.FilerMountRootPath, wfs: wfs, entry: entry} + wfs.root = &Dir{name: wfs.option.FilerMountRootPath, wfs: wfs} wfs.fsNodeCache = newFsCache(wfs.root) if wfs.option.ConcurrentWriters > 0 { From 6bc09b18c4a6ec75e3febe48393d3b0525bac486 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 14 Apr 2021 20:26:56 -0700 Subject: [PATCH 239/284] truncate is a bit faster to reuse the storage --- weed/util/chunk_cache/chunk_cache_on_disk.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/weed/util/chunk_cache/chunk_cache_on_disk.go b/weed/util/chunk_cache/chunk_cache_on_disk.go index d724e925e..6f87a9a06 100644 --- a/weed/util/chunk_cache/chunk_cache_on_disk.go +++ b/weed/util/chunk_cache/chunk_cache_on_disk.go @@ -88,15 +88,17 @@ func (v *ChunkCacheVolume) Shutdown() { } } -func (v *ChunkCacheVolume) destroy() { +func (v *ChunkCacheVolume) doReset() { v.Shutdown() - os.Remove(v.fileName + ".dat") - os.Remove(v.fileName + ".idx") + os.Truncate(v.fileName + ".dat", 0) + os.Truncate(v.fileName + ".idx", 0) + glog.V(4).Infof("cache removeAll %s ...", v.fileName + ".ldb") os.RemoveAll(v.fileName + ".ldb") + glog.V(4).Infof("cache removed %s", v.fileName + ".ldb") } func (v *ChunkCacheVolume) Reset() (*ChunkCacheVolume, error) { - v.destroy() + v.doReset() return LoadOrCreateChunkCacheVolume(v.fileName, v.sizeLimit) } From 1adc8f86ea66fdc78d148b0a4e848c59a9ce4f86 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 14 Apr 2021 20:49:15 -0700 Subject: [PATCH 240/284] lighten up File object file.entry only exists when file.isOpen --- weed/filesys/dir.go | 11 +++++------ weed/filesys/dir_link.go | 13 +++++-------- weed/filesys/file.go | 2 +- weed/filesys/filehandle.go | 1 + weed/filesys/wfs.go | 3 ++- 5 files changed, 14 insertions(+), 16 deletions(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index 087f31588..f64b4ea80 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -104,13 +104,12 @@ func (dir *Dir) Fsync(ctx context.Context, req *fuse.FsyncRequest) error { return nil } -func (dir *Dir) newFile(name string, entry *filer_pb.Entry) fs.Node { +func (dir *Dir) newFile(name string) fs.Node { f := dir.wfs.fsNodeCache.EnsureFsNode(util.NewFullPath(dir.FullPath(), name), func() fs.Node { return &File{ Name: name, dir: dir, wfs: dir.wfs, - entry: entry, } }) f.(*File).dir = dir // in case dir node was created later @@ -144,7 +143,7 @@ func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest, return node, nil, nil } - node = dir.newFile(req.Name, request.Entry) + node = dir.newFile(req.Name) file := node.(*File) fh := dir.wfs.AcquireHandle(file, req.Uid, req.Gid) return file, fh, nil @@ -157,13 +156,13 @@ func (dir *Dir) Mknod(ctx context.Context, req *fuse.MknodRequest) (fs.Node, err return nil, fuse.EPERM } - request, err := dir.doCreateEntry(req.Name, req.Mode, req.Uid, req.Gid, false) + _, err := dir.doCreateEntry(req.Name, req.Mode, req.Uid, req.Gid, false) if err != nil { return nil, err } var node fs.Node - node = dir.newFile(req.Name, request.Entry) + node = dir.newFile(req.Name) return node, nil } @@ -294,7 +293,7 @@ func (dir *Dir) Lookup(ctx context.Context, req *fuse.LookupRequest, resp *fuse. if entry.IsDirectory { node = dir.newDirectory(fullFilePath) } else { - node = dir.newFile(req.Name, entry) + node = dir.newFile(req.Name) } // resp.EntryValid = time.Second diff --git a/weed/filesys/dir_link.go b/weed/filesys/dir_link.go index 6266e492d..de330e7a4 100644 --- a/weed/filesys/dir_link.go +++ b/weed/filesys/dir_link.go @@ -35,11 +35,11 @@ func (dir *Dir) Link(ctx context.Context, req *fuse.LinkRequest, old fs.Node) (f glog.V(4).Infof("Link: %v/%v -> %v/%v", oldFile.dir.FullPath(), oldFile.Name, dir.FullPath(), req.NewName) - if _, err := oldFile.maybeLoadEntry(ctx); err != nil { + oldEntry, err := oldFile.maybeLoadEntry(ctx) + if err != nil { return nil, err } - oldEntry := oldFile.getEntry() if oldEntry == nil { return nil, fuse.EIO } @@ -72,7 +72,7 @@ func (dir *Dir) Link(ctx context.Context, req *fuse.LinkRequest, old fs.Node) (f } // apply changes to the filer, and also apply to local metaCache - err := dir.wfs.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { + err = dir.wfs.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { dir.wfs.mapPbIdFromLocalToFiler(request.Entry) defer dir.wfs.mapPbIdFromFilerToLocal(request.Entry) @@ -97,11 +97,8 @@ func (dir *Dir) Link(ctx context.Context, req *fuse.LinkRequest, old fs.Node) (f } // create new file node - newNode := dir.newFile(req.NewName, request.Entry) + newNode := dir.newFile(req.NewName) newFile := newNode.(*File) - if _, err := newFile.maybeLoadEntry(ctx); err != nil { - return nil, err - } return newFile, err @@ -147,7 +144,7 @@ func (dir *Dir) Symlink(ctx context.Context, req *fuse.SymlinkRequest) (fs.Node, return nil }) - symlink := dir.newFile(req.NewName, request.Entry) + symlink := dir.newFile(req.NewName) return symlink, err diff --git a/weed/filesys/file.go b/weed/filesys/file.go index 2d1c9a86e..a6bc734f3 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -286,7 +286,7 @@ func (file *File) maybeLoadEntry(ctx context.Context) (entry *filer_pb.Entry, er return entry, err } if entry != nil { - file.entry = entry + // file.entry = entry } else { glog.Warningf("maybeLoadEntry not found entry %s/%s: %v", file.dir.FullPath(), file.Name, err) } diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index 0236fd1cd..240d25a3d 100644 --- a/weed/filesys/filehandle.go +++ b/weed/filesys/filehandle.go @@ -211,6 +211,7 @@ func (fh *FileHandle) Release(ctx context.Context, req *fuse.ReleaseRequest) err if fh.f.isOpen == 1 { fh.f.isOpen-- + fh.f.entry = nil fh.entryViewCache = nil fh.reader = nil diff --git a/weed/filesys/wfs.go b/weed/filesys/wfs.go index c2937f914..4b73aaa05 100644 --- a/weed/filesys/wfs.go +++ b/weed/filesys/wfs.go @@ -162,8 +162,9 @@ func (wfs *WFS) AcquireHandle(file *File, uid, gid uint32) (fileHandle *FileHand } } + entry, _ := file.maybeLoadEntry(context.Background()) + file.entry = entry fileHandle = newFileHandle(file, uid, gid) - file.maybeLoadEntry(context.Background()) file.isOpen++ wfs.handles[inodeId] = fileHandle From e41766feb6ca05090ab3730762c2b6e9093ea4f7 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 14 Apr 2021 22:38:34 -0700 Subject: [PATCH 241/284] fuse mount: dir lookup avoids extra conversion to filer_pb.Entry object --- weed/filesys/dir.go | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index f64b4ea80..e51fbbee5 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -272,25 +272,25 @@ func (dir *Dir) Lookup(ctx context.Context, req *fuse.LookupRequest, resp *fuse. glog.Errorf("dir Lookup %s: %v", dirPath, visitErr) return nil, fuse.EIO } - cachedEntry, cacheErr := dir.wfs.metaCache.FindEntry(context.Background(), fullFilePath) + localEntry, cacheErr := dir.wfs.metaCache.FindEntry(context.Background(), fullFilePath) if cacheErr == filer_pb.ErrNotFound { return nil, fuse.ENOENT } - entry := cachedEntry.ToProtoEntry() - if entry == nil { + if localEntry == nil { // glog.V(3).Infof("dir Lookup cache miss %s", fullFilePath) - entry, err = filer_pb.GetEntry(dir.wfs, fullFilePath) + entry, err := filer_pb.GetEntry(dir.wfs, fullFilePath) if err != nil { glog.V(1).Infof("dir GetEntry %s: %v", fullFilePath, err) return nil, fuse.ENOENT } + localEntry = filer.FromPbEntry(string(dirPath), entry) } else { glog.V(4).Infof("dir Lookup cache hit %s", fullFilePath) } - if entry != nil { - if entry.IsDirectory { + if localEntry != nil { + if localEntry.IsDirectory() { node = dir.newDirectory(fullFilePath) } else { node = dir.newFile(req.Name) @@ -299,13 +299,13 @@ func (dir *Dir) Lookup(ctx context.Context, req *fuse.LookupRequest, resp *fuse. // resp.EntryValid = time.Second // resp.Attr.Inode = fullFilePath.AsInode() resp.Attr.Valid = time.Second - resp.Attr.Mtime = time.Unix(entry.Attributes.Mtime, 0) - resp.Attr.Crtime = time.Unix(entry.Attributes.Crtime, 0) - resp.Attr.Mode = os.FileMode(entry.Attributes.FileMode) - resp.Attr.Gid = entry.Attributes.Gid - resp.Attr.Uid = entry.Attributes.Uid - if entry.HardLinkCounter > 0 { - resp.Attr.Nlink = uint32(entry.HardLinkCounter) + resp.Attr.Mtime = localEntry.Attr.Mtime + resp.Attr.Crtime = localEntry.Attr.Crtime + resp.Attr.Mode = localEntry.Attr.Mode + resp.Attr.Gid = localEntry.Attr.Gid + resp.Attr.Uid = localEntry.Attr.Uid + if localEntry.HardLinkCounter > 0 { + resp.Attr.Nlink = uint32(localEntry.HardLinkCounter) } return node, nil From 36c79de3f4110e52ea83383fc6b8d3780504968b Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 14 Apr 2021 23:21:24 -0700 Subject: [PATCH 242/284] fuse mount: dir ReadDirAll avoid extra conversion to filer_pb.Entry --- weed/filesys/dir.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index e51fbbee5..8880d3506 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -320,12 +320,12 @@ func (dir *Dir) ReadDirAll(ctx context.Context) (ret []fuse.Dirent, err error) { dirPath := util.FullPath(dir.FullPath()) glog.V(4).Infof("dir ReadDirAll %s", dirPath) - processEachEntryFn := func(entry *filer_pb.Entry, isLast bool) error { - if entry.IsDirectory { - dirent := fuse.Dirent{Name: entry.Name, Type: fuse.DT_Dir} + processEachEntryFn := func(entry *filer.Entry, isLast bool) error { + if entry.IsDirectory() { + dirent := fuse.Dirent{Name: entry.Name(), Type: fuse.DT_Dir} ret = append(ret, dirent) } else { - dirent := fuse.Dirent{Name: entry.Name, Type: findFileType(uint16(entry.Attributes.FileMode))} + dirent := fuse.Dirent{Name: entry.Name(), Type: findFileType(uint16(entry.Attr.Mode))} ret = append(ret, dirent) } return nil @@ -336,7 +336,7 @@ func (dir *Dir) ReadDirAll(ctx context.Context) (ret []fuse.Dirent, err error) { return nil, fuse.EIO } listErr := dir.wfs.metaCache.ListDirectoryEntries(context.Background(), dirPath, "", false, int64(math.MaxInt32), func(entry *filer.Entry) bool { - processEachEntryFn(entry.ToProtoEntry(), false) + processEachEntryFn(entry, false) return true }) if listErr != nil { From 07f712c83fa012eeb51b25f5f0b8ce4a86400eaf Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 14 Apr 2021 23:21:38 -0700 Subject: [PATCH 243/284] fix typo --- weed/filesys/dir.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index 8880d3506..2e00708ba 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -166,7 +166,7 @@ func (dir *Dir) Mknod(ctx context.Context, req *fuse.MknodRequest) (fs.Node, err return node, nil } -func (dir *Dir) doCreateEntry(name string, mode os.FileMode, uid, gid uint32, exlusive bool) (*filer_pb.CreateEntryRequest, error) { +func (dir *Dir) doCreateEntry(name string, mode os.FileMode, uid, gid uint32, exclusive bool) (*filer_pb.CreateEntryRequest, error) { request := &filer_pb.CreateEntryRequest{ Directory: dir.FullPath(), Entry: &filer_pb.Entry{ @@ -183,7 +183,7 @@ func (dir *Dir) doCreateEntry(name string, mode os.FileMode, uid, gid uint32, ex TtlSec: dir.wfs.option.TtlSec, }, }, - OExcl: exlusive, + OExcl: exclusive, Signatures: []int32{dir.wfs.signature}, } glog.V(1).Infof("create %s/%s", dir.FullPath(), name) From 3e669e6d7b57387ea3b77ab2af9edc3f80c4dae2 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 14 Apr 2021 23:33:37 -0700 Subject: [PATCH 244/284] mostly refactoring, add some error handling --- weed/filesys/dir.go | 49 +++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index 2e00708ba..bf192f384 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -167,8 +167,9 @@ func (dir *Dir) Mknod(ctx context.Context, req *fuse.MknodRequest) (fs.Node, err } func (dir *Dir) doCreateEntry(name string, mode os.FileMode, uid, gid uint32, exclusive bool) (*filer_pb.CreateEntryRequest, error) { + dirFullPath := dir.FullPath() request := &filer_pb.CreateEntryRequest{ - Directory: dir.FullPath(), + Directory: dirFullPath, Entry: &filer_pb.Entry{ Name: name, IsDirectory: mode&os.ModeDir > 0, @@ -186,7 +187,7 @@ func (dir *Dir) doCreateEntry(name string, mode os.FileMode, uid, gid uint32, ex OExcl: exclusive, Signatures: []int32{dir.wfs.signature}, } - glog.V(1).Infof("create %s/%s", dir.FullPath(), name) + glog.V(1).Infof("create %s/%s", dirFullPath, name) err := dir.wfs.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { @@ -197,11 +198,14 @@ func (dir *Dir) doCreateEntry(name string, mode os.FileMode, uid, gid uint32, ex if strings.Contains(err.Error(), "EEXIST") { return fuse.EEXIST } - glog.V(0).Infof("create %s/%s: %v", dir.FullPath(), name, err) + glog.V(0).Infof("create %s/%s: %v", dirFullPath, name, err) return fuse.EIO } - dir.wfs.metaCache.InsertEntry(context.Background(), filer.FromPbEntry(request.Directory, request.Entry)) + if err := dir.wfs.metaCache.InsertEntry(context.Background(), filer.FromPbEntry(request.Directory, request.Entry)); err != nil { + glog.Errorf("local InsertEntry dir %s/%s: %v", dirFullPath, name, err) + return fuse.EIO + } return nil }) @@ -228,35 +232,40 @@ func (dir *Dir) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs.Node, err }, } + dirFullPath := dir.FullPath() + err := dir.wfs.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { dir.wfs.mapPbIdFromLocalToFiler(newEntry) defer dir.wfs.mapPbIdFromFilerToLocal(newEntry) request := &filer_pb.CreateEntryRequest{ - Directory: dir.FullPath(), + Directory: dirFullPath, Entry: newEntry, Signatures: []int32{dir.wfs.signature}, } glog.V(1).Infof("mkdir: %v", request) if err := filer_pb.CreateEntry(client, request); err != nil { - glog.V(0).Infof("mkdir %s/%s: %v", dir.FullPath(), req.Name, err) + glog.V(0).Infof("mkdir %s/%s: %v", dirFullPath, req.Name, err) return err } - dir.wfs.metaCache.InsertEntry(context.Background(), filer.FromPbEntry(request.Directory, request.Entry)) + if err := dir.wfs.metaCache.InsertEntry(context.Background(), filer.FromPbEntry(request.Directory, request.Entry)); err != nil { + glog.Errorf("local mkdir dir %s/%s: %v", dirFullPath, req.Name, err) + return fuse.EIO + } return nil }) if err == nil { - node := dir.newDirectory(util.NewFullPath(dir.FullPath(), req.Name)) + node := dir.newDirectory(util.NewFullPath(dirFullPath, req.Name)) return node, nil } - glog.V(0).Infof("mkdir %s/%s: %v", dir.FullPath(), req.Name, err) + glog.V(0).Infof("mkdir %s/%s: %v", dirFullPath, req.Name, err) return nil, fuse.EIO } @@ -320,7 +329,7 @@ func (dir *Dir) ReadDirAll(ctx context.Context) (ret []fuse.Dirent, err error) { dirPath := util.FullPath(dir.FullPath()) glog.V(4).Infof("dir ReadDirAll %s", dirPath) - processEachEntryFn := func(entry *filer.Entry, isLast bool) error { + processEachEntryFn := func(entry *filer.Entry, isLast bool) { if entry.IsDirectory() { dirent := fuse.Dirent{Name: entry.Name(), Type: fuse.DT_Dir} ret = append(ret, dirent) @@ -328,7 +337,6 @@ func (dir *Dir) ReadDirAll(ctx context.Context) (ret []fuse.Dirent, err error) { dirent := fuse.Dirent{Name: entry.Name(), Type: findFileType(uint16(entry.Attr.Mode))} ret = append(ret, dirent) } - return nil } if err = meta_cache.EnsureVisited(dir.wfs.metaCache, dir.wfs, dirPath); err != nil { @@ -382,7 +390,8 @@ func (dir *Dir) Remove(ctx context.Context, req *fuse.RemoveRequest) error { func (dir *Dir) removeOneFile(req *fuse.RemoveRequest) error { - filePath := util.NewFullPath(dir.FullPath(), req.Name) + dirFullPath := dir.FullPath() + filePath := util.NewFullPath(dirFullPath, req.Name) entry, err := filer_pb.GetEntry(dir.wfs, filePath) if err != nil { return err @@ -394,14 +403,17 @@ func (dir *Dir) removeOneFile(req *fuse.RemoveRequest) error { // first, ensure the filer store can correctly delete glog.V(3).Infof("remove file: %v", req) isDeleteData := entry.HardLinkCounter <= 1 - err = filer_pb.Remove(dir.wfs, dir.FullPath(), req.Name, isDeleteData, false, false, false, []int32{dir.wfs.signature}) + err = filer_pb.Remove(dir.wfs, dirFullPath, req.Name, isDeleteData, false, false, false, []int32{dir.wfs.signature}) if err != nil { - glog.V(3).Infof("not found remove file %s/%s: %v", dir.FullPath(), req.Name, err) + glog.V(3).Infof("not found remove file %s: %v", filePath, err) return fuse.ENOENT } // then, delete meta cache and fsNode cache - dir.wfs.metaCache.DeleteEntry(context.Background(), filePath) + if err = dir.wfs.metaCache.DeleteEntry(context.Background(), filePath); err != nil { + glog.V(3).Infof("local DeleteEntry %s: %v", filePath, err) + return fuse.ESTALE + } // clear entry inside the file fsNode := dir.wfs.fsNodeCache.GetFsNode(filePath) @@ -415,7 +427,7 @@ func (dir *Dir) removeOneFile(req *fuse.RemoveRequest) error { // remove current file handle if any dir.wfs.handlesLock.Lock() defer dir.wfs.handlesLock.Unlock() - inodeId := util.NewFullPath(dir.FullPath(), req.Name).AsInode() + inodeId := filePath.AsInode() delete(dir.wfs.handles, inodeId) return nil @@ -568,7 +580,10 @@ func (dir *Dir) saveEntry(entry *filer_pb.Entry) error { return fuse.EIO } - dir.wfs.metaCache.UpdateEntry(context.Background(), filer.FromPbEntry(request.Directory, request.Entry)) + if err := dir.wfs.metaCache.UpdateEntry(context.Background(), filer.FromPbEntry(request.Directory, request.Entry)); err != nil { + glog.Errorf("UpdateEntry dir %s/%s: %v", parentDir, name, err) + return fuse.ESTALE + } return nil }) From 217e0f906623a6d2f25f4dce7280d16bf3786a72 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 15 Apr 2021 01:51:10 -0700 Subject: [PATCH 245/284] mount: remove folder recursively --- weed/filesys/dir.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index bf192f384..ed8ffff61 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -436,18 +436,19 @@ func (dir *Dir) removeOneFile(req *fuse.RemoveRequest) error { func (dir *Dir) removeFolder(req *fuse.RemoveRequest) error { + dirFullPath := dir.FullPath() glog.V(3).Infof("remove directory entry: %v", req) ignoreRecursiveErr := true // ignore recursion error since the OS should manage it - err := filer_pb.Remove(dir.wfs, dir.FullPath(), req.Name, true, false, ignoreRecursiveErr, false, []int32{dir.wfs.signature}) + err := filer_pb.Remove(dir.wfs, dirFullPath, req.Name, true, true, ignoreRecursiveErr, false, []int32{dir.wfs.signature}) if err != nil { - glog.V(0).Infof("remove %s/%s: %v", dir.FullPath(), req.Name, err) + glog.V(0).Infof("remove %s/%s: %v", dirFullPath, req.Name, err) if strings.Contains(err.Error(), "non-empty") { return fuse.EEXIST } return fuse.ENOENT } - t := util.NewFullPath(dir.FullPath(), req.Name) + t := util.NewFullPath(dirFullPath, req.Name) dir.wfs.metaCache.DeleteEntry(context.Background(), t) dir.wfs.fsNodeCache.DeleteFsNode(t) From 16c0304416bc0dd9fd56439e39c754c57d604608 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 15 Apr 2021 02:29:04 -0700 Subject: [PATCH 246/284] ensure to delete on filer also --- weed/filesys/dir.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index ed8ffff61..e74c5aaac 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -396,13 +396,10 @@ func (dir *Dir) removeOneFile(req *fuse.RemoveRequest) error { if err != nil { return err } - if entry == nil { - return nil - } // first, ensure the filer store can correctly delete glog.V(3).Infof("remove file: %v", req) - isDeleteData := entry.HardLinkCounter <= 1 + isDeleteData := entry != nil && entry.HardLinkCounter <= 1 err = filer_pb.Remove(dir.wfs, dirFullPath, req.Name, isDeleteData, false, false, false, []int32{dir.wfs.signature}) if err != nil { glog.V(3).Infof("not found remove file %s: %v", filePath, err) From ba92f2e7148108c362379f266a6292401b82b90c Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 15 Apr 2021 03:19:28 -0700 Subject: [PATCH 247/284] add node.selectedVolumes fix https://github.com/chrislusf/seaweedfs/issues/1990 --- weed/shell/command_volume_server_evacuate.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/weed/shell/command_volume_server_evacuate.go b/weed/shell/command_volume_server_evacuate.go index 80c5b1d6b..f21d0334c 100644 --- a/weed/shell/command_volume_server_evacuate.go +++ b/weed/shell/command_volume_server_evacuate.go @@ -176,6 +176,11 @@ func moveAwayOneEcVolume(commandEnv *CommandEnv, ecShardInfo *master_pb.VolumeEc func moveAwayOneNormalVolume(commandEnv *CommandEnv, volumeReplicas map[uint32][]*VolumeReplica, vol *master_pb.VolumeInformationMessage, thisNode *Node, otherNodes []*Node, applyChange bool) (hasMoved bool, err error) { fn := capacityByFreeVolumeCount(types.ToDiskType(vol.DiskType)) + for _, n := range otherNodes { + n.selectVolumes(func(v *master_pb.VolumeInformationMessage) bool { + return v.DiskType == vol.DiskType + }) + } sort.Slice(otherNodes, func(i, j int) bool { return otherNodes[i].localVolumeRatio(fn) > otherNodes[j].localVolumeRatio(fn) }) From 609e228578ff0e678aea7eab3c815dd28bc6e72a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 15 Apr 2021 10:53:04 -0700 Subject: [PATCH 248/284] avoid forward slash in file names --- weed/shell/command_fs_meta_save.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/weed/shell/command_fs_meta_save.go b/weed/shell/command_fs_meta_save.go index d154fc12b..37d94fe42 100644 --- a/weed/shell/command_fs_meta_save.go +++ b/weed/shell/command_fs_meta_save.go @@ -6,6 +6,7 @@ import ( "io" "os" "path/filepath" + "strings" "sync" "sync/atomic" "time" @@ -89,6 +90,7 @@ func (c *commandFsMetaSave) Do(args []string, commandEnv *CommandEnv, writer io. ext := filepath.Ext(entry.Entry.Name) if encrypted, encErr := util.Encrypt([]byte(entry.Entry.Name), cipherKey); encErr == nil { entry.Entry.Name = util.Base64Encode(encrypted)[:len(entry.Entry.Name)] + ext + entry.Entry.Name = strings.ReplaceAll(entry.Entry.Name, "/", "x") } } bytes, err := proto.Marshal(entry) From 283d703d50a3379f84333c5850ea117ba9f6dc30 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 15 Apr 2021 11:29:58 -0700 Subject: [PATCH 249/284] adjust text --- weed/storage/disk_location.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/storage/disk_location.go b/weed/storage/disk_location.go index 6de87c793..ed4e00312 100644 --- a/weed/storage/disk_location.go +++ b/weed/storage/disk_location.go @@ -131,7 +131,7 @@ func (l *DiskLocation) loadExistingVolume(fileInfo os.FileInfo, needleMapKind Ne l.SetVolume(vid, v) size, _, _ := v.FileStat() - glog.V(0).Infof("data file %s, replicaPlacement=%s v=%d size=%d ttl=%s", + glog.V(0).Infof("data file %s, replication=%s v=%d size=%d ttl=%s", l.Directory+"/"+volumeName+".dat", v.ReplicaPlacement, v.Version(), size, v.Ttl.String()) return true } From b971317a167ac806a02947047c65ba6c2a2a7bad Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 15 Apr 2021 11:41:34 -0700 Subject: [PATCH 250/284] avoid possible corrupted file names --- weed/shell/command_fs_meta_load.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/weed/shell/command_fs_meta_load.go b/weed/shell/command_fs_meta_load.go index 69ae9454c..46dc07e9a 100644 --- a/weed/shell/command_fs_meta_load.go +++ b/weed/shell/command_fs_meta_load.go @@ -4,6 +4,7 @@ import ( "fmt" "io" "os" + "strings" "github.com/golang/protobuf/proto" @@ -72,6 +73,7 @@ func (c *commandFsMetaLoad) Do(args []string, commandEnv *CommandEnv, writer io. return err } + fullEntry.Entry.Name = strings.ReplaceAll(fullEntry.Entry.Name, "/", "x") if err := filer_pb.CreateEntry(client, &filer_pb.CreateEntryRequest{ Directory: fullEntry.Dir, Entry: fullEntry.Entry, From 3074e9b42850635b28f1ef90fc51e712210d5d45 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 15 Apr 2021 22:42:24 -0700 Subject: [PATCH 251/284] ensure consistent inode value --- weed/filesys/dir.go | 6 +++--- weed/filesys/file.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index e74c5aaac..f177c940b 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -59,7 +59,7 @@ func (dir *Dir) Attr(ctx context.Context, attr *fuse.Attr) error { return err } - // attr.Inode = util.FullPath(dir.FullPath()).AsInode() + attr.Inode = util.FullPath(dir.FullPath()).AsInode() attr.Mode = os.FileMode(entry.Attributes.FileMode) | os.ModeDir attr.Mtime = time.Unix(entry.Attributes.Mtime, 0) attr.Crtime = time.Unix(entry.Attributes.Crtime, 0) @@ -331,10 +331,10 @@ func (dir *Dir) ReadDirAll(ctx context.Context) (ret []fuse.Dirent, err error) { processEachEntryFn := func(entry *filer.Entry, isLast bool) { if entry.IsDirectory() { - dirent := fuse.Dirent{Name: entry.Name(), Type: fuse.DT_Dir} + dirent := fuse.Dirent{Name: entry.Name(), Type: fuse.DT_Dir, Inode: dirPath.Child(entry.Name()).AsInode()} ret = append(ret, dirent) } else { - dirent := fuse.Dirent{Name: entry.Name(), Type: findFileType(uint16(entry.Attr.Mode))} + dirent := fuse.Dirent{Name: entry.Name(), Type: findFileType(uint16(entry.Attr.Mode)), Inode: dirPath.Child(entry.Name()).AsInode()} ret = append(ret, dirent) } } diff --git a/weed/filesys/file.go b/weed/filesys/file.go index a6bc734f3..00a5ac279 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -55,7 +55,7 @@ func (file *File) Attr(ctx context.Context, attr *fuse.Attr) (err error) { return fuse.ENOENT } - // attr.Inode = file.fullpath().AsInode() + attr.Inode = file.fullpath().AsInode() attr.Valid = time.Second attr.Mode = os.FileMode(entry.Attributes.FileMode) attr.Size = filer.FileSize(entry) From c83ab91e2e9223db2270793658a69a19e3f7e0be Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 16 Apr 2021 10:34:02 -0700 Subject: [PATCH 252/284] remove unused variable --- weed/command/mount_std.go | 1 - weed/filesys/wfs.go | 1 - 2 files changed, 2 deletions(-) diff --git a/weed/command/mount_std.go b/weed/command/mount_std.go index f0c59b331..9df43e40a 100644 --- a/weed/command/mount_std.go +++ b/weed/command/mount_std.go @@ -191,7 +191,6 @@ func RunMount(option *MountOptions, umask os.FileMode) bool { CacheDir: *option.cacheDir, CacheSizeMB: *option.cacheSizeMB, DataCenter: *option.dataCenter, - EntryCacheTtl: 3 * time.Second, MountUid: uid, MountGid: gid, MountMode: mountMode, diff --git a/weed/filesys/wfs.go b/weed/filesys/wfs.go index 4b73aaa05..7bacfb114 100644 --- a/weed/filesys/wfs.go +++ b/weed/filesys/wfs.go @@ -41,7 +41,6 @@ type Option struct { CacheDir string CacheSizeMB int64 DataCenter string - EntryCacheTtl time.Duration Umask os.FileMode ReadOnly bool From 198688c7171b7f6fe61e35a54e34c71a28348144 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev Date: Fri, 16 Apr 2021 23:22:31 +0500 Subject: [PATCH 253/284] revert volume etag --- weed/server/volume_server_handlers_write.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/weed/server/volume_server_handlers_write.go b/weed/server/volume_server_handlers_write.go index 602b147e1..3d752eda6 100644 --- a/weed/server/volume_server_handlers_write.go +++ b/weed/server/volume_server_handlers_write.go @@ -13,7 +13,6 @@ import ( "github.com/chrislusf/seaweedfs/weed/stats" "github.com/chrislusf/seaweedfs/weed/storage/needle" "github.com/chrislusf/seaweedfs/weed/topology" - "github.com/chrislusf/seaweedfs/weed/util" ) func (vs *VolumeServer) PostHandler(w http.ResponseWriter, r *http.Request) { @@ -68,7 +67,7 @@ func (vs *VolumeServer) PostHandler(w http.ResponseWriter, r *http.Request) { ret.Name = string(reqNeedle.Name) } ret.Size = uint32(originalSize) - ret.ETag = fmt.Sprintf("%x", util.Base64Md5ToBytes(contentMd5)) + ret.ETag = reqNeedle.Etag() ret.Mime = string(reqNeedle.Mime) setEtag(w, ret.ETag) w.Header().Set("Content-MD5", contentMd5) From 54410ca955cf4078684bca17b4363dc33ef433ed Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 18 Apr 2021 10:02:02 -0700 Subject: [PATCH 254/284] cleaner way to set readonly --- weed/command/mount_std.go | 4 +++- weed/filesys/dir.go | 28 ---------------------------- weed/filesys/dir_link.go | 8 -------- weed/filesys/dir_rename.go | 4 ---- weed/filesys/file.go | 12 ------------ weed/filesys/filehandle.go | 4 ---- weed/filesys/wfs.go | 1 - 7 files changed, 3 insertions(+), 58 deletions(-) diff --git a/weed/command/mount_std.go b/weed/command/mount_std.go index 9df43e40a..2474cf7dd 100644 --- a/weed/command/mount_std.go +++ b/weed/command/mount_std.go @@ -167,6 +167,9 @@ func RunMount(option *MountOptions, umask os.FileMode) bool { if *option.nonempty { options = append(options, fuse.AllowNonEmptyMount()) } + if *option.readOnly { + options = append(options, fuse.ReadOnly()) + } // find mount point mountRoot := filerMountRootPath @@ -200,7 +203,6 @@ func RunMount(option *MountOptions, umask os.FileMode) bool { VolumeServerAccess: *mountOptions.volumeServerAccess, Cipher: cipher, UidGidMapper: uidGidMapper, - ReadOnly: *option.readOnly, }) // mount diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index f177c940b..9eba4066d 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -128,10 +128,6 @@ func (dir *Dir) newDirectory(fullpath util.FullPath) fs.Node { func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest, resp *fuse.CreateResponse) (fs.Node, fs.Handle, error) { - if dir.wfs.option.ReadOnly { - return nil, nil, fuse.EPERM - } - request, err := dir.doCreateEntry(req.Name, req.Mode, req.Uid, req.Gid, req.Flags&fuse.OpenExclusive != 0) if err != nil { @@ -152,10 +148,6 @@ func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest, func (dir *Dir) Mknod(ctx context.Context, req *fuse.MknodRequest) (fs.Node, error) { - if dir.wfs.option.ReadOnly { - return nil, fuse.EPERM - } - _, err := dir.doCreateEntry(req.Name, req.Mode, req.Uid, req.Gid, false) if err != nil { @@ -214,10 +206,6 @@ func (dir *Dir) doCreateEntry(name string, mode os.FileMode, uid, gid uint32, ex func (dir *Dir) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs.Node, error) { - if dir.wfs.option.ReadOnly { - return nil, fuse.EPERM - } - glog.V(4).Infof("mkdir %s: %s", dir.FullPath(), req.Name) newEntry := &filer_pb.Entry{ @@ -376,10 +364,6 @@ func findFileType(mode uint16) fuse.DirentType { func (dir *Dir) Remove(ctx context.Context, req *fuse.RemoveRequest) error { - if dir.wfs.option.ReadOnly { - return fuse.EPERM - } - if !req.Dir { return dir.removeOneFile(req) } @@ -455,10 +439,6 @@ func (dir *Dir) removeFolder(req *fuse.RemoveRequest) error { func (dir *Dir) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error { - if dir.wfs.option.ReadOnly { - return fuse.EPERM - } - glog.V(4).Infof("%v dir setattr %+v", dir.FullPath(), req) entry, err := dir.maybeLoadEntry() @@ -488,10 +468,6 @@ func (dir *Dir) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fus func (dir *Dir) Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error { - if dir.wfs.option.ReadOnly { - return fuse.EPERM - } - glog.V(4).Infof("dir Setxattr %s: %s", dir.FullPath(), req.Name) entry, err := dir.maybeLoadEntry() @@ -509,10 +485,6 @@ func (dir *Dir) Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error { func (dir *Dir) Removexattr(ctx context.Context, req *fuse.RemovexattrRequest) error { - if dir.wfs.option.ReadOnly { - return fuse.EPERM - } - glog.V(4).Infof("dir Removexattr %s: %s", dir.FullPath(), req.Name) entry, err := dir.maybeLoadEntry() diff --git a/weed/filesys/dir_link.go b/weed/filesys/dir_link.go index de330e7a4..acdcd2de4 100644 --- a/weed/filesys/dir_link.go +++ b/weed/filesys/dir_link.go @@ -24,10 +24,6 @@ const ( func (dir *Dir) Link(ctx context.Context, req *fuse.LinkRequest, old fs.Node) (fs.Node, error) { - if dir.wfs.option.ReadOnly { - return nil, fuse.EPERM - } - oldFile, ok := old.(*File) if !ok { glog.Errorf("old node is not a file: %+v", old) @@ -106,10 +102,6 @@ func (dir *Dir) Link(ctx context.Context, req *fuse.LinkRequest, old fs.Node) (f func (dir *Dir) Symlink(ctx context.Context, req *fuse.SymlinkRequest) (fs.Node, error) { - if dir.wfs.option.ReadOnly { - return nil, fuse.EPERM - } - glog.V(4).Infof("Symlink: %v/%v to %v", dir.FullPath(), req.NewName, req.Target) request := &filer_pb.CreateEntryRequest{ diff --git a/weed/filesys/dir_rename.go b/weed/filesys/dir_rename.go index 28316c3bd..d2acad4b2 100644 --- a/weed/filesys/dir_rename.go +++ b/weed/filesys/dir_rename.go @@ -13,10 +13,6 @@ import ( func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirectory fs.Node) error { - if dir.wfs.option.ReadOnly { - return fuse.EPERM - } - newDir := newDirectory.(*Dir) newPath := util.NewFullPath(newDir.FullPath(), req.NewName) diff --git a/weed/filesys/file.go b/weed/filesys/file.go index 00a5ac279..2a991d7db 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -105,10 +105,6 @@ func (file *File) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.Op func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error { - if file.wfs.option.ReadOnly { - return fuse.EPERM - } - glog.V(4).Infof("%v file setattr %+v", file.fullpath(), req) entry, err := file.maybeLoadEntry(ctx) @@ -197,10 +193,6 @@ func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *f func (file *File) Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error { - if file.wfs.option.ReadOnly { - return fuse.EPERM - } - glog.V(4).Infof("file Setxattr %s: %s", file.fullpath(), req.Name) entry, err := file.maybeLoadEntry(ctx) @@ -218,10 +210,6 @@ func (file *File) Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error func (file *File) Removexattr(ctx context.Context, req *fuse.RemovexattrRequest) error { - if file.wfs.option.ReadOnly { - return fuse.EPERM - } - glog.V(4).Infof("file Removexattr %s: %s", file.fullpath(), req.Name) entry, err := file.maybeLoadEntry(ctx) diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index 240d25a3d..5b9a1748a 100644 --- a/weed/filesys/filehandle.go +++ b/weed/filesys/filehandle.go @@ -156,10 +156,6 @@ func (fh *FileHandle) readFromChunks(buff []byte, offset int64) (int64, error) { // Write to the file handle func (fh *FileHandle) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error { - if fh.f.wfs.option.ReadOnly { - return fuse.EPERM - } - fh.Lock() defer fh.Unlock() diff --git a/weed/filesys/wfs.go b/weed/filesys/wfs.go index 7bacfb114..2034354f5 100644 --- a/weed/filesys/wfs.go +++ b/weed/filesys/wfs.go @@ -42,7 +42,6 @@ type Option struct { CacheSizeMB int64 DataCenter string Umask os.FileMode - ReadOnly bool MountUid uint32 MountGid uint32 From d9a2a7f1c4593c20ec9a92b98b726af7b32baff3 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 16 Apr 2021 02:55:09 -0700 Subject: [PATCH 255/284] WIP no memory issue if some directory is removed, it may have this error $ rm -Rf ~/tmp/m2/s1 rm: fts_read: Device not configured --- go.mod | 2 +- weed/filesys/dir.go | 38 ++++++++++++-------------------------- weed/filesys/dir_rename.go | 8 +++----- weed/filesys/file.go | 6 +++++- weed/filesys/wfs.go | 31 +++++++++++++++---------------- 5 files changed, 36 insertions(+), 49 deletions(-) diff --git a/go.mod b/go.mod index bd07b3312..ed651cfdf 100644 --- a/go.mod +++ b/go.mod @@ -102,7 +102,7 @@ require ( gopkg.in/karlseguin/expect.v1 v1.0.1 // indirect ) -// replace github.com/seaweedfs/fuse => /Users/chris/go/src/github.com/seaweedfs/fuse +replace github.com/seaweedfs/fuse => /Users/chris/go/src/github.com/seaweedfs/fuse // replace github.com/chrislusf/raft => /Users/chris/go/src/github.com/chrislusf/raft replace go.etcd.io/etcd => go.etcd.io/etcd v0.5.0-alpha.5.0.20200425165423-262c93980547 diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index 9eba4066d..b3577dcf0 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -27,6 +27,7 @@ type Dir struct { } var _ = fs.Node(&Dir{}) +var _ = fs.NodeIdentifier(&Dir{}) var _ = fs.NodeCreater(&Dir{}) var _ = fs.NodeMknoder(&Dir{}) var _ = fs.NodeMkdirer(&Dir{}) @@ -42,6 +43,10 @@ var _ = fs.NodeRemovexattrer(&Dir{}) var _ = fs.NodeListxattrer(&Dir{}) var _ = fs.NodeForgetter(&Dir{}) +func (dir *Dir) Id() uint64 { + return util.FullPath(dir.FullPath()).AsInode() +} + func (dir *Dir) Attr(ctx context.Context, attr *fuse.Attr) error { // https://github.com/bazil/fuse/issues/196 @@ -105,24 +110,17 @@ func (dir *Dir) Fsync(ctx context.Context, req *fuse.FsyncRequest) error { } func (dir *Dir) newFile(name string) fs.Node { - f := dir.wfs.fsNodeCache.EnsureFsNode(util.NewFullPath(dir.FullPath(), name), func() fs.Node { - return &File{ - Name: name, - dir: dir, - wfs: dir.wfs, - } - }) - f.(*File).dir = dir // in case dir node was created later - return f + return &File{ + Name: name, + dir: dir, + wfs: dir.wfs, + } } func (dir *Dir) newDirectory(fullpath util.FullPath) fs.Node { - d := dir.wfs.fsNodeCache.EnsureFsNode(fullpath, func() fs.Node { - return &Dir{name: fullpath.Name(), wfs: dir.wfs, parent: dir} - }) - d.(*Dir).parent = dir // in case dir node was created later - return d + return &Dir{name: fullpath.Name(), wfs: dir.wfs, parent: dir} + } func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest, @@ -396,15 +394,6 @@ func (dir *Dir) removeOneFile(req *fuse.RemoveRequest) error { return fuse.ESTALE } - // clear entry inside the file - fsNode := dir.wfs.fsNodeCache.GetFsNode(filePath) - dir.wfs.fsNodeCache.DeleteFsNode(filePath) - if fsNode != nil { - if file, ok := fsNode.(*File); ok { - file.entry = nil - } - } - // remove current file handle if any dir.wfs.handlesLock.Lock() defer dir.wfs.handlesLock.Unlock() @@ -431,7 +420,6 @@ func (dir *Dir) removeFolder(req *fuse.RemoveRequest) error { t := util.NewFullPath(dirFullPath, req.Name) dir.wfs.metaCache.DeleteEntry(context.Background(), t) - dir.wfs.fsNodeCache.DeleteFsNode(t) return nil @@ -519,8 +507,6 @@ func (dir *Dir) Listxattr(ctx context.Context, req *fuse.ListxattrRequest, resp func (dir *Dir) Forget() { glog.V(4).Infof("Forget dir %s", dir.FullPath()) - - dir.wfs.fsNodeCache.DeleteFsNode(util.FullPath(dir.FullPath())) } func (dir *Dir) maybeLoadEntry() (*filer_pb.Entry, error) { diff --git a/weed/filesys/dir_rename.go b/weed/filesys/dir_rename.go index d2acad4b2..7bc705102 100644 --- a/weed/filesys/dir_rename.go +++ b/weed/filesys/dir_rename.go @@ -64,19 +64,17 @@ func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirector return fuse.EIO } - // fmt.Printf("rename path: %v => %v\n", oldPath, newPath) - dir.wfs.fsNodeCache.Move(oldPath, newPath) - // change file handle dir.wfs.handlesLock.Lock() defer dir.wfs.handlesLock.Unlock() inodeId := oldPath.AsInode() existingHandle, found := dir.wfs.handles[inodeId] if !found || existingHandle == nil { - return err + return nil } + glog.V(4).Infof("opened filehandle %s => %s", oldPath, newPath) delete(dir.wfs.handles, inodeId) dir.wfs.handles[newPath.AsInode()] = existingHandle - return err + return nil } diff --git a/weed/filesys/file.go b/weed/filesys/file.go index 2a991d7db..b3e5cc72d 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -18,6 +18,7 @@ import ( const blockSize = 512 var _ = fs.Node(&File{}) +var _ = fs.NodeIdentifier(&File{}) var _ = fs.NodeOpener(&File{}) var _ = fs.NodeFsyncer(&File{}) var _ = fs.NodeSetattrer(&File{}) @@ -40,6 +41,10 @@ func (file *File) fullpath() util.FullPath { return util.NewFullPath(file.dir.FullPath(), file.Name) } +func (file *File) Id() uint64 { + return file.fullpath().AsInode() +} + func (file *File) Attr(ctx context.Context, attr *fuse.Attr) (err error) { glog.V(4).Infof("file Attr %s, open:%v existing:%v", file.fullpath(), file.isOpen, attr) @@ -253,7 +258,6 @@ func (file *File) Fsync(ctx context.Context, req *fuse.FsyncRequest) error { func (file *File) Forget() { t := util.NewFullPath(file.dir.FullPath(), file.Name) glog.V(4).Infof("Forget file %s", t) - file.wfs.fsNodeCache.DeleteFsNode(t) file.wfs.ReleaseHandle(t, 0) } diff --git a/weed/filesys/wfs.go b/weed/filesys/wfs.go index 2034354f5..7019a464b 100644 --- a/weed/filesys/wfs.go +++ b/weed/filesys/wfs.go @@ -103,24 +103,15 @@ func NewSeaweedFileSystem(option *Option) *WFS { } wfs.metaCache = meta_cache.NewMetaCache(path.Join(cacheDir, "meta"), util.FullPath(option.FilerMountRootPath), option.UidGidMapper, func(filePath util.FullPath) { - fsNode := wfs.fsNodeCache.GetFsNode(filePath) - if fsNode != nil { - if file, ok := fsNode.(*File); ok { - if err := wfs.Server.InvalidateNodeData(file); err != nil { - glog.V(4).Infof("InvalidateNodeData %s : %v", filePath, err) - } - file.entry = nil - } + fsNode := NodeWithId(filePath.AsInode()) + if err := wfs.Server.InvalidateNodeData(fsNode); err != nil { + glog.V(4).Infof("InvalidateNodeData %s : %v", filePath, err) } + dir, name := filePath.DirAndName() - parent := wfs.root - if dir != "/" { - parent = wfs.fsNodeCache.GetFsNode(util.FullPath(dir)) - } - if parent != nil { - if err := wfs.Server.InvalidateEntry(parent, name); err != nil { - glog.V(4).Infof("InvalidateEntry %s : %v", filePath, err) - } + parent := NodeWithId(util.FullPath(dir).AsInode()) + if err := wfs.Server.InvalidateEntry(parent, name); err != nil { + glog.V(4).Infof("InvalidateEntry %s : %v", filePath, err) } }) startTime := time.Now() @@ -267,3 +258,11 @@ func (wfs *WFS) LookupFn() wdclient.LookupFileIdFunctionType { return filer.LookupFn(wfs) } + +type NodeWithId uint64 +func (n NodeWithId) Id() uint64 { + return uint64(n) +} +func (n NodeWithId) Attr(ctx context.Context, attr *fuse.Attr) error { + return nil +} From d41e6826d3a0a51750e3f9c14b33a6aa9953bb09 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 17 Apr 2021 03:11:41 -0700 Subject: [PATCH 256/284] adjust logging --- weed/filer/filerstore_wrapper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/filer/filerstore_wrapper.go b/weed/filer/filerstore_wrapper.go index 95848e61b..cd7c0bea3 100644 --- a/weed/filer/filerstore_wrapper.go +++ b/weed/filer/filerstore_wrapper.go @@ -149,8 +149,8 @@ func (fsw *FilerStoreWrapper) FindEntry(ctx context.Context, fp util.FullPath) ( stats.FilerStoreHistogram.WithLabelValues(actualStore.GetName(), "find").Observe(time.Since(start).Seconds()) }() - glog.V(4).Infof("FindEntry %s", fp) entry, err = actualStore.FindEntry(ctx, fp) + glog.V(4).Infof("FindEntry %s: %v", fp, err) if err != nil { return nil, err } From 6cbd786db9b96833248444c42992c239f2424d95 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 17 Apr 2021 10:48:22 -0700 Subject: [PATCH 257/284] correctly runs git clone --- weed/filesys/dir.go | 25 +++++++++++++++++++------ weed/filesys/dir_rename.go | 11 +++++++++++ weed/filesys/file.go | 26 +++++++++++++++----------- weed/filesys/filehandle.go | 10 +++++----- weed/filesys/wfs.go | 25 ++++++++++++++----------- 5 files changed, 64 insertions(+), 33 deletions(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index b3577dcf0..3588a5951 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -24,6 +24,7 @@ type Dir struct { wfs *WFS entry *filer_pb.Entry parent *Dir + id uint64 } var _ = fs.Node(&Dir{}) @@ -44,7 +45,7 @@ var _ = fs.NodeListxattrer(&Dir{}) var _ = fs.NodeForgetter(&Dir{}) func (dir *Dir) Id() uint64 { - return util.FullPath(dir.FullPath()).AsInode() + return dir.id } func (dir *Dir) Attr(ctx context.Context, attr *fuse.Attr) error { @@ -64,7 +65,7 @@ func (dir *Dir) Attr(ctx context.Context, attr *fuse.Attr) error { return err } - attr.Inode = util.FullPath(dir.FullPath()).AsInode() + attr.Inode = dir.Id() attr.Mode = os.FileMode(entry.Attributes.FileMode) | os.ModeDir attr.Mtime = time.Unix(entry.Attributes.Mtime, 0) attr.Crtime = time.Unix(entry.Attributes.Crtime, 0) @@ -110,16 +111,28 @@ func (dir *Dir) Fsync(ctx context.Context, req *fuse.FsyncRequest) error { } func (dir *Dir) newFile(name string) fs.Node { + + fileFullPath := util.NewFullPath(dir.FullPath(), name) + fileId := fileFullPath.AsInode() + dir.wfs.handlesLock.Lock() + existingHandle, found := dir.wfs.handles[fileId] + dir.wfs.handlesLock.Unlock() + + if found { + glog.V(4).Infof("newFile found opened file handle: %+v", fileFullPath) + return existingHandle.f + } return &File{ - Name: name, - dir: dir, - wfs: dir.wfs, + Name: name, + dir: dir, + wfs: dir.wfs, + id: fileId, } } func (dir *Dir) newDirectory(fullpath util.FullPath) fs.Node { - return &Dir{name: fullpath.Name(), wfs: dir.wfs, parent: dir} + return &Dir{name: fullpath.Name(), wfs: dir.wfs, parent: dir, id: fullpath.AsInode()} } diff --git a/weed/filesys/dir_rename.go b/weed/filesys/dir_rename.go index 7bc705102..b07710d17 100644 --- a/weed/filesys/dir_rename.go +++ b/weed/filesys/dir_rename.go @@ -64,11 +64,22 @@ func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirector 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 node %s", file.Name) + file.Name = req.NewName + file.id = uint64(newFsNode) + } + }) + // 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 } diff --git a/weed/filesys/file.go b/weed/filesys/file.go index b3e5cc72d..2e37c6e0e 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -35,6 +35,7 @@ type File struct { entry *filer_pb.Entry isOpen int dirtyMetadata bool + id uint64 } func (file *File) fullpath() util.FullPath { @@ -42,25 +43,23 @@ func (file *File) fullpath() util.FullPath { } func (file *File) Id() uint64 { - return file.fullpath().AsInode() + return file.id } func (file *File) Attr(ctx context.Context, attr *fuse.Attr) (err error) { glog.V(4).Infof("file Attr %s, open:%v existing:%v", file.fullpath(), file.isOpen, attr) - entry := file.getEntry() - if file.isOpen <= 0 || entry == nil { - if entry, err = file.maybeLoadEntry(ctx); err != nil { - return err - } + entry, err := file.maybeLoadEntry(ctx) + if err != nil { + return err } if entry == nil { return fuse.ENOENT } - attr.Inode = file.fullpath().AsInode() + attr.Inode = file.Id() attr.Valid = time.Second attr.Mode = os.FileMode(entry.Attributes.FileMode) attr.Size = filer.FileSize(entry) @@ -118,7 +117,7 @@ func (file *File) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *f } if file.isOpen > 0 { file.wfs.handlesLock.Lock() - fileHandle := file.wfs.handles[file.fullpath().AsInode()] + fileHandle := file.wfs.handles[file.Id()] file.wfs.handlesLock.Unlock() if fileHandle != nil { @@ -262,10 +261,15 @@ func (file *File) Forget() { } func (file *File) maybeLoadEntry(ctx context.Context) (entry *filer_pb.Entry, err error) { - entry = file.getEntry() - if file.isOpen > 0 { - return entry, nil + + file.wfs.handlesLock.Lock() + handle, found := file.wfs.handles[file.Id()] + file.wfs.handlesLock.Unlock() + if found { + glog.V(4).Infof("maybeLoadEntry found opened file %s/%s: %v %v", file.dir.FullPath(), file.Name, handle.f.entry, entry) + entry = handle.f.entry } + if entry != nil { if len(entry.HardLinkId) == 0 { // only always reload hard link diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index 5b9a1748a..3f4ee69f4 100644 --- a/weed/filesys/filehandle.go +++ b/weed/filesys/filehandle.go @@ -193,20 +193,20 @@ func (fh *FileHandle) Write(ctx context.Context, req *fuse.WriteRequest, resp *f func (fh *FileHandle) Release(ctx context.Context, req *fuse.ReleaseRequest) error { - glog.V(4).Infof("Release %v fh %d", fh.f.fullpath(), fh.handle) + glog.V(4).Infof("Release %v fh %d open=%d", fh.f.fullpath(), fh.handle, fh.f.isOpen) fh.Lock() defer fh.Unlock() - if fh.f.isOpen <= 0 { + fh.f.isOpen-- + + if fh.f.isOpen < 0 { glog.V(0).Infof("Release reset %s open count %d => %d", fh.f.Name, fh.f.isOpen, 0) fh.f.isOpen = 0 return nil } - if fh.f.isOpen == 1 { - - fh.f.isOpen-- + if fh.f.isOpen == 0 { fh.f.entry = nil fh.entryViewCache = nil fh.reader = nil diff --git a/weed/filesys/wfs.go b/weed/filesys/wfs.go index 7019a464b..42816d23d 100644 --- a/weed/filesys/wfs.go +++ b/weed/filesys/wfs.go @@ -103,6 +103,7 @@ func NewSeaweedFileSystem(option *Option) *WFS { } wfs.metaCache = meta_cache.NewMetaCache(path.Join(cacheDir, "meta"), util.FullPath(option.FilerMountRootPath), option.UidGidMapper, func(filePath util.FullPath) { + fsNode := NodeWithId(filePath.AsInode()) if err := wfs.Server.InvalidateNodeData(fsNode); err != nil { glog.V(4).Infof("InvalidateNodeData %s : %v", filePath, err) @@ -139,16 +140,15 @@ func (wfs *WFS) AcquireHandle(file *File, uid, gid uint32) (fileHandle *FileHand fullpath := file.fullpath() glog.V(4).Infof("AcquireHandle %s uid=%d gid=%d", fullpath, uid, gid) - wfs.handlesLock.Lock() - defer wfs.handlesLock.Unlock() + inodeId := file.Id() - inodeId := file.fullpath().AsInode() - if file.isOpen > 0 { - existingHandle, found := wfs.handles[inodeId] - if found && existingHandle != nil { - file.isOpen++ - return existingHandle - } + wfs.handlesLock.Lock() + existingHandle, found := wfs.handles[inodeId] + wfs.handlesLock.Unlock() + if found && existingHandle != nil { + existingHandle.f.isOpen++ + glog.V(4).Infof("Acquired Handle %s open %d", fullpath, existingHandle.f.isOpen) + return existingHandle } entry, _ := file.maybeLoadEntry(context.Background()) @@ -156,9 +156,12 @@ func (wfs *WFS) AcquireHandle(file *File, uid, gid uint32) (fileHandle *FileHand fileHandle = newFileHandle(file, uid, gid) file.isOpen++ + wfs.handlesLock.Lock() wfs.handles[inodeId] = fileHandle + wfs.handlesLock.Unlock() fileHandle.handle = inodeId + glog.V(4).Infof("Acquired new Handle %s open %d", fullpath, file.isOpen) return } @@ -166,9 +169,9 @@ func (wfs *WFS) ReleaseHandle(fullpath util.FullPath, handleId fuse.HandleID) { wfs.handlesLock.Lock() defer wfs.handlesLock.Unlock() - glog.V(4).Infof("%s ReleaseHandle id %d current handles length %d", fullpath, handleId, len(wfs.handles)) + glog.V(4).Infof("ReleaseHandle %s id %d current handles length %d", fullpath, handleId, len(wfs.handles)) - delete(wfs.handles, fullpath.AsInode()) + delete(wfs.handles, uint64(handleId)) return } From 2acf6be24e168c4cd6bdeb64244333de17654251 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 17 Apr 2021 14:32:24 -0700 Subject: [PATCH 258/284] resend the http request if connection is stale --- weed/operation/upload_content.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/weed/operation/upload_content.go b/weed/operation/upload_content.go index 7a7f8aa0c..944186eeb 100644 --- a/weed/operation/upload_content.go +++ b/weed/operation/upload_content.go @@ -11,7 +11,6 @@ import ( "net/http" "net/textproto" "path/filepath" - "runtime/debug" "strings" "time" @@ -235,10 +234,12 @@ func upload_content(uploadUrl string, fillBufferFunction func(w io.Writer) error // print("+") resp, post_err := HttpClient.Do(req) if post_err != nil { - if !strings.Contains(post_err.Error(), "connection reset by peer") { - glog.Errorf("upload %s %d bytes to %v: %v", filename, originalDataSize, uploadUrl, post_err) - debug.PrintStack() + if strings.Contains(post_err.Error(), "connection reset by peer") || + strings.Contains(post_err.Error(), "use of closed network connection") { + resp, post_err = HttpClient.Do(req) } + } + if post_err != nil { return nil, fmt.Errorf("upload %s %d bytes to %v: %v", filename, originalDataSize, uploadUrl, post_err) } // print("-") From e332da48371f28d42f71a0b33d48adb49f1f83db Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 17 Apr 2021 14:32:49 -0700 Subject: [PATCH 259/284] set inode value --- 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 3588a5951..f6f1c2562 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -305,7 +305,7 @@ func (dir *Dir) Lookup(ctx context.Context, req *fuse.LookupRequest, resp *fuse. } // resp.EntryValid = time.Second - // resp.Attr.Inode = fullFilePath.AsInode() + resp.Attr.Inode = fullFilePath.AsInode() resp.Attr.Valid = time.Second resp.Attr.Mtime = localEntry.Attr.Mtime resp.Attr.Crtime = localEntry.Attr.Crtime From 372872ebbfa360e25ff63071166e9eaef6255df8 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 18 Apr 2021 09:43:56 -0700 Subject: [PATCH 260/284] set root node inode number --- weed/filesys/dir.go | 1 + 1 file changed, 1 insertion(+) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index f6f1c2562..77e6724e1 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -92,6 +92,7 @@ func (dir *Dir) Getxattr(ctx context.Context, req *fuse.GetxattrRequest, resp *f func (dir *Dir) setRootDirAttributes(attr *fuse.Attr) { // attr.Inode = 1 // filer2.FullPath(dir.Path).AsInode() attr.Valid = time.Second + attr.Inode = dir.Id() attr.Uid = dir.wfs.option.MountUid attr.Gid = dir.wfs.option.MountGid attr.Mode = dir.wfs.option.MountMode From d1c813c4707f988bc0688c2e780bf8075c5571af Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 18 Apr 2021 11:19:33 -0700 Subject: [PATCH 261/284] let the fuse library manage directory id otherwise, on mac, during large directory deletion, if some ReaDirAll happens, the lib seems confused about the directories, and some child directories are not deleted. --- weed/filesys/dir.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index 77e6724e1..1dc2ab939 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -28,7 +28,7 @@ type Dir struct { } var _ = fs.Node(&Dir{}) -var _ = fs.NodeIdentifier(&Dir{}) +//var _ = fs.NodeIdentifier(&Dir{}) var _ = fs.NodeCreater(&Dir{}) var _ = fs.NodeMknoder(&Dir{}) var _ = fs.NodeMkdirer(&Dir{}) @@ -44,7 +44,7 @@ var _ = fs.NodeRemovexattrer(&Dir{}) var _ = fs.NodeListxattrer(&Dir{}) var _ = fs.NodeForgetter(&Dir{}) -func (dir *Dir) Id() uint64 { +func (dir *Dir) xId() uint64 { return dir.id } @@ -65,7 +65,7 @@ func (dir *Dir) Attr(ctx context.Context, attr *fuse.Attr) error { return err } - attr.Inode = dir.Id() + // attr.Inode = dir.Id() attr.Mode = os.FileMode(entry.Attributes.FileMode) | os.ModeDir attr.Mtime = time.Unix(entry.Attributes.Mtime, 0) attr.Crtime = time.Unix(entry.Attributes.Crtime, 0) @@ -92,7 +92,7 @@ func (dir *Dir) Getxattr(ctx context.Context, req *fuse.GetxattrRequest, resp *f func (dir *Dir) setRootDirAttributes(attr *fuse.Attr) { // attr.Inode = 1 // filer2.FullPath(dir.Path).AsInode() attr.Valid = time.Second - attr.Inode = dir.Id() + attr.Inode = 1 // dir.Id() attr.Uid = dir.wfs.option.MountUid attr.Gid = dir.wfs.option.MountGid attr.Mode = dir.wfs.option.MountMode From 4b3cc28cab54c5cc24228cbc5f63b3aa283b0ab0 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 18 Apr 2021 13:29:37 -0700 Subject: [PATCH 262/284] fuse 1.1.4 --- go.mod | 4 ++-- go.sum | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index ed651cfdf..70bc33070 100644 --- a/go.mod +++ b/go.mod @@ -62,7 +62,7 @@ require ( github.com/prometheus/client_golang v1.3.0 github.com/rakyll/statik v0.1.7 github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563 // indirect - github.com/seaweedfs/fuse v1.1.3 + github.com/seaweedfs/fuse v1.1.4 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 @@ -102,7 +102,7 @@ require ( gopkg.in/karlseguin/expect.v1 v1.0.1 // indirect ) -replace github.com/seaweedfs/fuse => /Users/chris/go/src/github.com/seaweedfs/fuse +// replace github.com/seaweedfs/fuse => /Users/chris/go/src/github.com/seaweedfs/fuse // replace github.com/chrislusf/raft => /Users/chris/go/src/github.com/chrislusf/raft replace go.etcd.io/etcd => go.etcd.io/etcd v0.5.0-alpha.5.0.20200425165423-262c93980547 diff --git a/go.sum b/go.sum index 4899bd7b8..0409b1ae1 100644 --- a/go.sum +++ b/go.sum @@ -693,6 +693,8 @@ 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/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= From e983f91b03b6ce356a7dc9381120d941d33c9e21 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 18 Apr 2021 13:58:01 -0700 Subject: [PATCH 263/284] 2.40 --- 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 c296ce0c6..8eddb2ca2 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.39" -version: 2.39 +appVersion: "2.40" +version: 2.40 diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index e615090c1..058170bbe 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.39" - started using {.Chart.appVersion} + # imageTag: "2.40" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index fce35379d..d81138d86 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, 39) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 40) COMMIT = "" ) From 1faafce832d2df8742f183584f9054d22606add3 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 18 Apr 2021 21:46:03 -0700 Subject: [PATCH 264/284] fix docker image release --- docker/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 6309e7e2e..2165466ca 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,6 +1,7 @@ FROM alpine -ARG RELEASE=latest # 'latest' or 'dev' +# 'latest' or 'dev' +ARG RELEASE=latest RUN \ ARCH=$(if [ $(uname -m) == "x86_64" ] && [ $(getconf LONG_BIT) == "64" ]; then echo "amd64"; \ From 83cf94ad2dea74e5f9a881a617d06c42cbb7ba49 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 19 Apr 2021 10:58:25 -0700 Subject: [PATCH 265/284] delay new file creation unless file is opened exclusively --- weed/filesys/dir.go | 28 ++++++++++++++++++++++++---- weed/filesys/file.go | 1 + 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index 1dc2ab939..6ee20974b 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -28,6 +28,7 @@ type Dir struct { } var _ = fs.Node(&Dir{}) + //var _ = fs.NodeIdentifier(&Dir{}) var _ = fs.NodeCreater(&Dir{}) var _ = fs.NodeMknoder(&Dir{}) @@ -140,19 +141,38 @@ func (dir *Dir) newDirectory(fullpath util.FullPath) fs.Node { func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest, resp *fuse.CreateResponse) (fs.Node, fs.Handle, error) { - request, err := dir.doCreateEntry(req.Name, req.Mode, req.Uid, req.Gid, req.Flags&fuse.OpenExclusive != 0) + exclusive := req.Flags&fuse.OpenExclusive != 0 + isDirectory := req.Mode&os.ModeDir > 0 - if err != nil { - return nil, nil, err + if exclusive || isDirectory { + _, err := dir.doCreateEntry(req.Name, req.Mode, req.Uid, req.Gid, exclusive) + if err != nil { + return nil, nil, err + } } var node fs.Node - if request.Entry.IsDirectory { + if isDirectory { node = dir.newDirectory(util.NewFullPath(dir.FullPath(), req.Name)) return node, nil, nil } node = dir.newFile(req.Name) file := node.(*File) + file.entry = &filer_pb.Entry{ + Name: req.Name, + IsDirectory: req.Mode&os.ModeDir > 0, + Attributes: &filer_pb.FuseAttributes{ + Mtime: time.Now().Unix(), + Crtime: time.Now().Unix(), + FileMode: uint32(req.Mode &^ dir.wfs.option.Umask), + Uid: req.Uid, + Gid: req.Gid, + Collection: dir.wfs.option.Collection, + Replication: dir.wfs.option.Replication, + TtlSec: dir.wfs.option.TtlSec, + }, + } + file.dirtyMetadata = true fh := dir.wfs.AcquireHandle(file, req.Uid, req.Gid) return file, fh, nil diff --git a/weed/filesys/file.go b/weed/filesys/file.go index 2e37c6e0e..5fb4d8d11 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -265,6 +265,7 @@ func (file *File) maybeLoadEntry(ctx context.Context) (entry *filer_pb.Entry, er file.wfs.handlesLock.Lock() handle, found := file.wfs.handles[file.Id()] file.wfs.handlesLock.Unlock() + entry = file.entry if found { glog.V(4).Infof("maybeLoadEntry found opened file %s/%s: %v %v", file.dir.FullPath(), file.Name, handle.f.entry, entry) entry = handle.f.entry From c31c5e829c224a73a89f7ce7a8e11d7ce0b9689a Mon Sep 17 00:00:00 2001 From: liuxiaobo <6914585+sryio@users.noreply.github.com> Date: Tue, 20 Apr 2021 10:08:58 +0800 Subject: [PATCH 266/284] fix path-specific filer store comment error --- weed/command/scaffold.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/command/scaffold.go b/weed/command/scaffold.go index 4794da18e..88dc94df1 100644 --- a/weed/command/scaffold.go +++ b/weed/command/scaffold.go @@ -281,7 +281,7 @@ index.max_result_window = 10000 # Make sure they are not the same if using the same store type! # 4. Set enabled to true # -# The following is just using cassandra as an example +# The following is just using redis as an example ########################## [redis2.tmp] enabled = false From 11c405fc854d17db98929771c1270300a5293929 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 20 Apr 2021 19:56:51 -0700 Subject: [PATCH 267/284] ensure file handles are released --- weed/filesys/file.go | 2 +- weed/filesys/filehandle.go | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/weed/filesys/file.go b/weed/filesys/file.go index 5fb4d8d11..bb57988cd 100644 --- a/weed/filesys/file.go +++ b/weed/filesys/file.go @@ -257,7 +257,7 @@ func (file *File) Fsync(ctx context.Context, req *fuse.FsyncRequest) error { func (file *File) Forget() { t := util.NewFullPath(file.dir.FullPath(), file.Name) glog.V(4).Infof("Forget file %s", t) - file.wfs.ReleaseHandle(t, 0) + file.wfs.ReleaseHandle(t, fuse.HandleID(t.AsInode())) } func (file *File) maybeLoadEntry(ctx context.Context) (entry *filer_pb.Entry, err error) { diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go index 3f4ee69f4..27ffab6e1 100644 --- a/weed/filesys/filehandle.go +++ b/weed/filesys/filehandle.go @@ -200,13 +200,7 @@ func (fh *FileHandle) Release(ctx context.Context, req *fuse.ReleaseRequest) err fh.f.isOpen-- - if fh.f.isOpen < 0 { - glog.V(0).Infof("Release reset %s open count %d => %d", fh.f.Name, fh.f.isOpen, 0) - fh.f.isOpen = 0 - return nil - } - - if fh.f.isOpen == 0 { + if fh.f.isOpen <= 0 { fh.f.entry = nil fh.entryViewCache = nil fh.reader = nil @@ -214,6 +208,12 @@ func (fh *FileHandle) Release(ctx context.Context, req *fuse.ReleaseRequest) err fh.f.wfs.ReleaseHandle(fh.f.fullpath(), fuse.HandleID(fh.handle)) } + if fh.f.isOpen < 0 { + glog.V(0).Infof("Release reset %s open count %d => %d", fh.f.Name, fh.f.isOpen, 0) + fh.f.isOpen = 0 + return nil + } + return nil } From ecb60d5f035eed09eb7744016e0563941ba535bb Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 20 Apr 2021 20:08:42 -0700 Subject: [PATCH 268/284] Update cleanup.yml --- .github/workflows/cleanup.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml index 47a677e6d..64241512f 100644 --- a/.github/workflows/cleanup.yml +++ b/.github/workflows/cleanup.yml @@ -16,7 +16,6 @@ jobs: uses: mknejp/delete-release-assets@v1 with: token: ${{ github.token }} - tag: dev fail-if-no-assets: false assets: | weed-* From bcd400995aacca41a704248af7196586449a365d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 20 Apr 2021 20:11:52 -0700 Subject: [PATCH 269/284] Revert "Update cleanup.yml" This reverts commit ecb60d5f035eed09eb7744016e0563941ba535bb. --- .github/workflows/cleanup.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml index 64241512f..47a677e6d 100644 --- a/.github/workflows/cleanup.yml +++ b/.github/workflows/cleanup.yml @@ -16,6 +16,7 @@ jobs: uses: mknejp/delete-release-assets@v1 with: token: ${{ github.token }} + tag: dev fail-if-no-assets: false assets: | weed-* From ae74d8f02a1eefad220bb9649db5b2c5ed032d3b Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 21 Apr 2021 01:40:16 -0700 Subject: [PATCH 270/284] fix error message related to https://github.com/chrislusf/seaweedfs/issues/2012 --- weed/storage/store_ec.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/storage/store_ec.go b/weed/storage/store_ec.go index a9b6a8ff3..f4587ba01 100644 --- a/weed/storage/store_ec.go +++ b/weed/storage/store_ec.go @@ -303,7 +303,7 @@ func (s *Store) doReadRemoteEcShardInterval(sourceDataNode string, needleId type break } if receiveErr != nil { - return fmt.Errorf("receiving ec shard %d.%d from %s: %v", vid, shardId, sourceDataNode, err) + return fmt.Errorf("receiving ec shard %d.%d from %s: %v", vid, shardId, sourceDataNode, receiveErr) } if resp.IsDeleted { is_deleted = true From a8114da02dddd65b0371e7a9e6a5125d085c55d4 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 21 Apr 2021 10:17:12 -0700 Subject: [PATCH 271/284] avoid thundering herd effect transient errors may cause thundering herd effect to all trying to recover from remove ec shards --- weed/storage/store_ec.go | 1 - 1 file changed, 1 deletion(-) diff --git a/weed/storage/store_ec.go b/weed/storage/store_ec.go index f4587ba01..9702fdd50 100644 --- a/weed/storage/store_ec.go +++ b/weed/storage/store_ec.go @@ -200,7 +200,6 @@ func (s *Store) readOneEcShardInterval(needleId types.NeedleId, ecVolume *erasur return } glog.V(0).Infof("clearing ec shard %d.%d locations: %v", ecVolume.VolumeId, shardId, err) - forgetShardId(ecVolume, shardId) } // try reading by recovering from other shards From cd7bf1a72a9a1bba24b9d15460782d21cb706504 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 21 Apr 2021 11:17:43 -0700 Subject: [PATCH 272/284] filer.copy copy empty folders fix https://github.com/chrislusf/seaweedfs/issues/2016 --- weed/command/filer_copy.go | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/weed/command/filer_copy.go b/weed/command/filer_copy.go index a36bb8cea..e7a9b107f 100644 --- a/weed/command/filer_copy.go +++ b/weed/command/filer_copy.go @@ -207,16 +207,6 @@ func genFileCopyTask(fileOrDir string, destPath string, fileCopyTaskChan chan Fi } mode := fi.Mode() - if mode.IsDir() { - files, _ := ioutil.ReadDir(fileOrDir) - for _, subFileOrDir := range files { - if err = genFileCopyTask(fileOrDir+"/"+subFileOrDir.Name(), destPath+fi.Name()+"/", fileCopyTaskChan); err != nil { - return err - } - } - return nil - } - uid, gid := util.GetFileUidGid(fi) fileCopyTaskChan <- FileCopyTask{ @@ -228,6 +218,16 @@ func genFileCopyTask(fileOrDir string, destPath string, fileCopyTaskChan chan Fi gid: gid, } + if mode.IsDir() { + files, _ := ioutil.ReadDir(fileOrDir) + println("checking directory", fileOrDir) + for _, subFileOrDir := range files { + if err = genFileCopyTask(fileOrDir+"/"+subFileOrDir.Name(), destPath+fi.Name()+"/", fileCopyTaskChan); err != nil { + return err + } + } + } + return nil } @@ -293,20 +293,22 @@ func (worker *FileCopyWorker) uploadFileAsOne(task FileCopyTask, f *os.File) err // upload the file content fileName := filepath.Base(f.Name()) - mimeType := detectMimeType(f) - data, err := ioutil.ReadAll(f) - if err != nil { - return err - } + var mimeType string var chunks []*filer_pb.FileChunk var assignResult *filer_pb.AssignVolumeResponse var assignError error - if task.fileSize > 0 { + if task.fileMode & os.ModeDir == 0 && task.fileSize > 0 { + + mimeType = detectMimeType(f) + data, err := ioutil.ReadAll(f) + if err != nil { + return err + } // assign a volume - err := pb.WithGrpcFilerClient(worker.filerGrpcAddress, worker.options.grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { + err = pb.WithGrpcFilerClient(worker.filerGrpcAddress, worker.options.grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { request := &filer_pb.AssignVolumeRequest{ Count: 1, From f4d77e527d90baf6059c63c51c8362baf941c613 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 21 Apr 2021 12:02:22 -0700 Subject: [PATCH 273/284] Update cleanup.yml --- .github/workflows/cleanup.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml index 47a677e6d..9fbd7dfa8 100644 --- a/.github/workflows/cleanup.yml +++ b/.github/workflows/cleanup.yml @@ -16,7 +16,7 @@ jobs: uses: mknejp/delete-release-assets@v1 with: token: ${{ github.token }} - tag: dev + tag: refs/tags/dev fail-if-no-assets: false assets: | weed-* From 7deb4b20cd08662085f5f2ac92a26a541501b847 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 21 Apr 2021 12:09:24 -0700 Subject: [PATCH 274/284] Update cleanup.yml --- .github/workflows/cleanup.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml index 9fbd7dfa8..d8a2cdc4f 100644 --- a/.github/workflows/cleanup.yml +++ b/.github/workflows/cleanup.yml @@ -16,7 +16,7 @@ jobs: uses: mknejp/delete-release-assets@v1 with: token: ${{ github.token }} - tag: refs/tags/dev + tag: master fail-if-no-assets: false assets: | weed-* From ca998328c2916fdba751fa9add6f8eec626ff0be Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 21 Apr 2021 23:11:09 -0700 Subject: [PATCH 275/284] do not add new volumes when below minFreeSpacePercent fix https://github.com/chrislusf/seaweedfs/issues/2017 --- weed/storage/store.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/weed/storage/store.go b/weed/storage/store.go index c3507c0e2..6be15a4c9 100644 --- a/weed/storage/store.go +++ b/weed/storage/store.go @@ -106,6 +106,9 @@ func (s *Store) FindFreeLocation(diskType DiskType) (ret *DiskLocation) { if diskType != location.DiskType { continue } + if location.isDiskSpaceLow { + continue + } currentFreeCount := location.MaxVolumeCount - location.VolumesLen() currentFreeCount *= erasure_coding.DataShardsCount currentFreeCount -= location.EcVolumesLen() From c60f2d333eeee7faa6fc0f0055ce43ef3a911099 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 22 Apr 2021 00:31:33 -0700 Subject: [PATCH 276/284] Update cleanup.yml --- .github/workflows/cleanup.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml index d8a2cdc4f..47a677e6d 100644 --- a/.github/workflows/cleanup.yml +++ b/.github/workflows/cleanup.yml @@ -16,7 +16,7 @@ jobs: uses: mknejp/delete-release-assets@v1 with: token: ${{ github.token }} - tag: master + tag: dev fail-if-no-assets: false assets: | weed-* From 6e5df901e478c9effd94bae2fa1de53138380d8b Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 22 Apr 2021 14:21:11 -0700 Subject: [PATCH 277/284] adjust package names --- weed/server/filer_ui/breadcrumb.go | 2 +- weed/server/filer_ui/templates.go | 2 +- weed/server/volume_server_ui/templates.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/weed/server/filer_ui/breadcrumb.go b/weed/server/filer_ui/breadcrumb.go index f21cce7d1..5016117a8 100644 --- a/weed/server/filer_ui/breadcrumb.go +++ b/weed/server/filer_ui/breadcrumb.go @@ -1,4 +1,4 @@ -package master_ui +package filer_ui import ( "strings" diff --git a/weed/server/filer_ui/templates.go b/weed/server/filer_ui/templates.go index 3f0647119..648b97f22 100644 --- a/weed/server/filer_ui/templates.go +++ b/weed/server/filer_ui/templates.go @@ -1,4 +1,4 @@ -package master_ui +package filer_ui import ( "github.com/dustin/go-humanize" diff --git a/weed/server/volume_server_ui/templates.go b/weed/server/volume_server_ui/templates.go index 6a8bb6f55..ee4c2e31d 100644 --- a/weed/server/volume_server_ui/templates.go +++ b/weed/server/volume_server_ui/templates.go @@ -1,4 +1,4 @@ -package master_ui +package volume_server_ui import ( "fmt" From 11c120c040c82a2eecc6f7f5d23b83266e22eb5e Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 22 Apr 2021 14:22:46 -0700 Subject: [PATCH 278/284] master UI adds volume size limit --- weed/server/master_server_handlers_ui.go | 12 +++++++----- weed/server/master_ui/templates.go | 10 +++++++--- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/weed/server/master_server_handlers_ui.go b/weed/server/master_server_handlers_ui.go index 9cd58158b..3822c6113 100644 --- a/weed/server/master_server_handlers_ui.go +++ b/weed/server/master_server_handlers_ui.go @@ -14,17 +14,19 @@ func (ms *MasterServer) uiStatusHandler(w http.ResponseWriter, r *http.Request) infos := make(map[string]interface{}) infos["Up Time"] = time.Now().Sub(startTime).String() args := struct { - Version string - Topology interface{} - RaftServer raft.Server - Stats map[string]interface{} - Counters *stats.ServerStats + Version string + Topology interface{} + RaftServer raft.Server + Stats map[string]interface{} + Counters *stats.ServerStats + VolumeSizeLimitMB uint }{ util.Version(), ms.Topo.ToMap(), ms.Topo.RaftServer, infos, serverStats, + ms.option.VolumeSizeLimitMB, } ui.StatusTpl.Execute(w, args) } diff --git a/weed/server/master_ui/templates.go b/weed/server/master_ui/templates.go index 60873f6aa..31b6353e9 100644 --- a/weed/server/master_ui/templates.go +++ b/weed/server/master_ui/templates.go @@ -22,8 +22,12 @@ var StatusTpl = template.Must(template.New("status").Parse(`

      Cluster status

      - +
      + + + + @@ -38,8 +42,8 @@ var StatusTpl = template.Must(template.New("status").Parse(` - - +
      Volume Size Limit{{ .VolumeSizeLimitMB }}MB
      Free {{ .Topology.Free }} {{ .Leader }}
        +
      Other Masters
        {{ range $k, $p := .Peers }}
      • {{ $p.Name }}
      • {{ end }} From 46ef1811a18e4a6e704be801b55884fd1d40c9a8 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 22 Apr 2021 22:26:38 -0700 Subject: [PATCH 279/284] correct help message --- weed/shell/command_s3_clean_uploads.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/shell/command_s3_clean_uploads.go b/weed/shell/command_s3_clean_uploads.go index 5f674d7b6..1ba31292c 100644 --- a/weed/shell/command_s3_clean_uploads.go +++ b/weed/shell/command_s3_clean_uploads.go @@ -26,7 +26,7 @@ func (c *commandS3CleanUploads) Help() string { return `clean up stale multipart uploads Example: - s3.clean.uploads -replication 001 + s3.clean.uploads -timeAgo 1.5h ` } From 89eb9f6e7073460838699b9c3a42f2cb830f8224 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 22 Apr 2021 23:23:23 -0700 Subject: [PATCH 280/284] clean up .uploads directory in mysql and postgres tables fix https://github.com/chrislusf/seaweedfs/issues/1957 When no uploads are running, you can run this SQL to clean up. delete from where directory like '/.uploads/%' --- weed/filer/abstract_sql/abstract_sql_store.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/weed/filer/abstract_sql/abstract_sql_store.go b/weed/filer/abstract_sql/abstract_sql_store.go index 120a1d139..ab8f6bcbd 100644 --- a/weed/filer/abstract_sql/abstract_sql_store.go +++ b/weed/filer/abstract_sql/abstract_sql_store.go @@ -276,7 +276,9 @@ func (store *AbstractSqlStore) DeleteFolderChildren(ctx context.Context, fullpat } } - res, err := db.ExecContext(ctx, store.GetSqlDeleteFolderChildren(bucket), util.HashStringToLong(string(shortPath)), fullpath) + 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) } From f0ad172e80e00222bb0ea9a31cb83fdd7e7844a8 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 22 Apr 2021 23:56:35 -0700 Subject: [PATCH 281/284] shell: show which server holds the lock fix https://github.com/chrislusf/seaweedfs/issues/1983 --- weed/pb/master.proto | 1 + weed/pb/master_pb/master.pb.go | 206 +++++++++--------- weed/server/master_grpc_server_admin.go | 21 +- weed/shell/command_fs_lock_unlock.go | 3 +- .../exclusive_locks/exclusive_locker.go | 6 +- 5 files changed, 128 insertions(+), 109 deletions(-) diff --git a/weed/pb/master.proto b/weed/pb/master.proto index 6a1758ccc..cdb49d1e3 100644 --- a/weed/pb/master.proto +++ b/weed/pb/master.proto @@ -288,6 +288,7 @@ message LeaseAdminTokenRequest { int64 previous_token = 1; int64 previous_lock_time = 2; string lock_name = 3; + string client_name = 4; } message LeaseAdminTokenResponse { int64 token = 1; diff --git a/weed/pb/master_pb/master.pb.go b/weed/pb/master_pb/master.pb.go index 7e1f282dd..29d8499f8 100644 --- a/weed/pb/master_pb/master.pb.go +++ b/weed/pb/master_pb/master.pb.go @@ -2468,6 +2468,7 @@ type LeaseAdminTokenRequest struct { PreviousToken int64 `protobuf:"varint,1,opt,name=previous_token,json=previousToken,proto3" json:"previous_token,omitempty"` PreviousLockTime int64 `protobuf:"varint,2,opt,name=previous_lock_time,json=previousLockTime,proto3" json:"previous_lock_time,omitempty"` LockName string `protobuf:"bytes,3,opt,name=lock_name,json=lockName,proto3" json:"lock_name,omitempty"` + ClientName string `protobuf:"bytes,4,opt,name=client_name,json=clientName,proto3" json:"client_name,omitempty"` } func (x *LeaseAdminTokenRequest) Reset() { @@ -2523,6 +2524,13 @@ func (x *LeaseAdminTokenRequest) GetLockName() string { return "" } +func (x *LeaseAdminTokenRequest) GetClientName() string { + if x != nil { + return x.ClientName + } + return "" +} + type LeaseAdminTokenResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3268,7 +3276,7 @@ var file_master_proto_rawDesc = []byte{ 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, 0x8a, + 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, @@ -3277,103 +3285,105 @@ 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, 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, + 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, } var ( diff --git a/weed/server/master_grpc_server_admin.go b/weed/server/master_grpc_server_admin.go index 7e7dcb36b..93c9e4e4e 100644 --- a/weed/server/master_grpc_server_admin.go +++ b/weed/server/master_grpc_server_admin.go @@ -3,6 +3,7 @@ package weed_server import ( "context" "fmt" + "github.com/chrislusf/seaweedfs/weed/glog" "math/rand" "sync" "time" @@ -60,6 +61,7 @@ const ( type AdminLock struct { accessSecret int64 accessLockTime time.Time + lastClient string } type AdminLocks struct { @@ -73,14 +75,15 @@ func NewAdminLocks() *AdminLocks { } } -func (locks *AdminLocks) isLocked(lockName string) bool { +func (locks *AdminLocks) isLocked(lockName string) (clientName string, isLocked bool) { locks.RLock() defer locks.RUnlock() adminLock, found := locks.locks[lockName] if !found { - return false + return "", false } - return adminLock.accessLockTime.Add(LockDuration).After(time.Now()) + glog.V(4).Infof("isLocked %v", adminLock.lastClient) + return adminLock.lastClient, adminLock.accessLockTime.Add(LockDuration).After(time.Now()) } func (locks *AdminLocks) isValidToken(lockName string, ts time.Time, token int64) bool { @@ -93,12 +96,13 @@ func (locks *AdminLocks) isValidToken(lockName string, ts time.Time, token int64 return adminLock.accessLockTime.Equal(ts) && adminLock.accessSecret == token } -func (locks *AdminLocks) generateToken(lockName string) (ts time.Time, token int64) { +func (locks *AdminLocks) generateToken(lockName string, clientName string) (ts time.Time, token int64) { locks.Lock() defer locks.Unlock() lock := &AdminLock{ accessSecret: rand.Int63(), accessLockTime: time.Now(), + lastClient: clientName, } locks.locks[lockName] = lock return lock.accessLockTime, lock.accessSecret @@ -113,18 +117,19 @@ func (locks *AdminLocks) deleteLock(lockName string) { func (ms *MasterServer) LeaseAdminToken(ctx context.Context, req *master_pb.LeaseAdminTokenRequest) (*master_pb.LeaseAdminTokenResponse, error) { resp := &master_pb.LeaseAdminTokenResponse{} - if ms.adminLocks.isLocked(req.LockName) { + if lastClient, isLocked := ms.adminLocks.isLocked(req.LockName); isLocked { + glog.V(4).Infof("LeaseAdminToken %v", lastClient) if req.PreviousToken != 0 && ms.adminLocks.isValidToken(req.LockName, time.Unix(0, req.PreviousLockTime), req.PreviousToken) { // for renew - ts, token := ms.adminLocks.generateToken(req.LockName) + ts, token := ms.adminLocks.generateToken(req.LockName, req.ClientName) resp.Token, resp.LockTsNs = token, ts.UnixNano() return resp, nil } // refuse since still locked - return resp, fmt.Errorf("already locked") + return resp, fmt.Errorf("already locked by " + lastClient) } // for fresh lease request - ts, token := ms.adminLocks.generateToken(req.LockName) + ts, token := ms.adminLocks.generateToken(req.LockName, req.ClientName) resp.Token, resp.LockTsNs = token, ts.UnixNano() return resp, nil } diff --git a/weed/shell/command_fs_lock_unlock.go b/weed/shell/command_fs_lock_unlock.go index 8a6e8f71b..33458bb6f 100644 --- a/weed/shell/command_fs_lock_unlock.go +++ b/weed/shell/command_fs_lock_unlock.go @@ -1,6 +1,7 @@ package shell import ( + "github.com/chrislusf/seaweedfs/weed/util" "io" ) @@ -26,7 +27,7 @@ func (c *commandLock) Help() string { func (c *commandLock) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { - commandEnv.locker.RequestLock() + commandEnv.locker.RequestLock(util.DetectedHostAddress()) return nil } diff --git a/weed/wdclient/exclusive_locks/exclusive_locker.go b/weed/wdclient/exclusive_locks/exclusive_locker.go index d477a6b2d..5b5fa2704 100644 --- a/weed/wdclient/exclusive_locks/exclusive_locker.go +++ b/weed/wdclient/exclusive_locks/exclusive_locker.go @@ -41,7 +41,7 @@ func (l *ExclusiveLocker) GetToken() (token int64, lockTsNs int64) { return atomic.LoadInt64(&l.token), atomic.LoadInt64(&l.lockTsNs) } -func (l *ExclusiveLocker) RequestLock() { +func (l *ExclusiveLocker) RequestLock(clientName string) { if l.isLocking { return } @@ -56,6 +56,7 @@ func (l *ExclusiveLocker) RequestLock() { PreviousToken: atomic.LoadInt64(&l.token), PreviousLockTime: atomic.LoadInt64(&l.lockTsNs), LockName: AdminLockName, + ClientName: clientName, }) if err == nil { atomic.StoreInt64(&l.token, resp.Token) @@ -63,7 +64,7 @@ func (l *ExclusiveLocker) RequestLock() { } return err }); err != nil { - // println("leasing problem", err.Error()) + println("lock:", err.Error()) time.Sleep(InitLockInteval) } else { break @@ -83,6 +84,7 @@ func (l *ExclusiveLocker) RequestLock() { PreviousToken: atomic.LoadInt64(&l.token), PreviousLockTime: atomic.LoadInt64(&l.lockTsNs), LockName: AdminLockName, + ClientName: clientName, }) if err == nil { atomic.StoreInt64(&l.token, resp.Token) From ddc8643ee0a4bb48ba4628461a69c556d2011622 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 24 Apr 2021 11:49:03 -0700 Subject: [PATCH 282/284] filer: directory listing adds namePatternExclude fix https://github.com/chrislusf/seaweedfs/issues/2023 --- weed/filer/filer_buckets.go | 2 +- weed/filer/filer_delete_entry.go | 2 +- weed/filer/filer_notify.go | 4 +-- weed/filer/filer_search.go | 32 ++++++++++++------- weed/filer/leveldb/leveldb_store_test.go | 6 ++-- weed/filer/leveldb2/leveldb2_store_test.go | 6 ++-- weed/filer/leveldb3/leveldb3_store_test.go | 6 ++-- weed/filer/rocksdb/rocksdb_store_test.go | 6 ++-- weed/server/filer_grpc_server.go | 2 +- weed/server/filer_grpc_server_rename.go | 2 +- weed/server/filer_server_handlers_read_dir.go | 3 +- 11 files changed, 40 insertions(+), 31 deletions(-) diff --git a/weed/filer/filer_buckets.go b/weed/filer/filer_buckets.go index ba170f02e..43fb000c9 100644 --- a/weed/filer/filer_buckets.go +++ b/weed/filer/filer_buckets.go @@ -29,7 +29,7 @@ func (f *Filer) LoadBuckets() { limit := int64(math.MaxInt32) - entries, _, err := f.ListDirectoryEntries(context.Background(), util.FullPath(f.DirBucketsPath), "", false, limit, "", "") + entries, _, err := f.ListDirectoryEntries(context.Background(), util.FullPath(f.DirBucketsPath), "", false, limit, "", "", "") if err != nil { glog.V(1).Infof("no buckets found: %v", err) diff --git a/weed/filer/filer_delete_entry.go b/weed/filer/filer_delete_entry.go index bedf2f4d1..3ef3cfff9 100644 --- a/weed/filer/filer_delete_entry.go +++ b/weed/filer/filer_delete_entry.go @@ -73,7 +73,7 @@ func (f *Filer) doBatchDeleteFolderMetaAndData(ctx context.Context, entry *Entry includeLastFile := false if !isDeletingBucket { for { - entries, _, err := f.ListDirectoryEntries(ctx, entry.FullPath, lastFileName, includeLastFile, PaginationSize, "", "") + entries, _, err := f.ListDirectoryEntries(ctx, entry.FullPath, lastFileName, includeLastFile, PaginationSize, "", "", "") if err != nil { glog.Errorf("list folder %s: %v", entry.FullPath, err) return nil, nil, fmt.Errorf("list folder %s: %v", entry.FullPath, err) diff --git a/weed/filer/filer_notify.go b/weed/filer/filer_notify.go index c461a82b8..7ab101102 100644 --- a/weed/filer/filer_notify.go +++ b/weed/filer/filer_notify.go @@ -116,13 +116,13 @@ func (f *Filer) ReadPersistedLogBuffer(startTime time.Time, eachLogEntryFn func( sizeBuf := make([]byte, 4) startTsNs := startTime.UnixNano() - dayEntries, _, listDayErr := f.ListDirectoryEntries(context.Background(), SystemLogDir, startDate, true, 366, "", "") + dayEntries, _, listDayErr := f.ListDirectoryEntries(context.Background(), SystemLogDir, startDate, true, 366, "", "", "") if listDayErr != nil { return lastTsNs, fmt.Errorf("fail to list log by day: %v", listDayErr) } for _, dayEntry := range dayEntries { // println("checking day", dayEntry.FullPath) - hourMinuteEntries, _, listHourMinuteErr := f.ListDirectoryEntries(context.Background(), util.NewFullPath(SystemLogDir, dayEntry.Name()), "", false, 24*60, "", "") + hourMinuteEntries, _, listHourMinuteErr := f.ListDirectoryEntries(context.Background(), util.NewFullPath(SystemLogDir, dayEntry.Name()), "", false, 24*60, "", "", "") if listHourMinuteErr != nil { return lastTsNs, fmt.Errorf("fail to list log %s by day: %v", dayEntry.Name(), listHourMinuteErr) } diff --git a/weed/filer/filer_search.go b/weed/filer/filer_search.go index 0a14d3756..dd1f8c1ab 100644 --- a/weed/filer/filer_search.go +++ b/weed/filer/filer_search.go @@ -20,9 +20,9 @@ func splitPattern(pattern string) (prefix string, restPattern string) { } // For now, prefix and namePattern are mutually exclusive -func (f *Filer) ListDirectoryEntries(ctx context.Context, p util.FullPath, startFileName string, inclusive bool, limit int64, prefix string, namePattern string) (entries []*Entry, hasMore bool, err error) { +func (f *Filer) ListDirectoryEntries(ctx context.Context, p util.FullPath, startFileName string, inclusive bool, limit int64, prefix string, namePattern string, namePatternExclude string) (entries []*Entry, hasMore bool, err error) { - _, err = f.StreamListDirectoryEntries(ctx, p, startFileName, inclusive, limit+1, prefix, namePattern, func(entry *Entry) bool { + _, err = f.StreamListDirectoryEntries(ctx, p, startFileName, inclusive, limit+1, prefix, namePattern, namePatternExclude, func(entry *Entry) bool { entries = append(entries, entry) return true }) @@ -36,7 +36,7 @@ func (f *Filer) ListDirectoryEntries(ctx context.Context, p util.FullPath, start } // For now, prefix and namePattern are mutually exclusive -func (f *Filer) StreamListDirectoryEntries(ctx context.Context, p util.FullPath, startFileName string, inclusive bool, limit int64, prefix string, namePattern string, eachEntryFunc ListEachEntryFunc) (lastFileName string, err error) { +func (f *Filer) StreamListDirectoryEntries(ctx context.Context, p util.FullPath, startFileName string, inclusive bool, limit int64, prefix string, namePattern string, namePatternExclude string, eachEntryFunc ListEachEntryFunc) (lastFileName string, err error) { if strings.HasSuffix(string(p), "/") && len(p) > 1 { p = p[0 : len(p)-1] } @@ -47,30 +47,38 @@ func (f *Filer) StreamListDirectoryEntries(ctx context.Context, p util.FullPath, } var missedCount int64 - missedCount, lastFileName, err = f.doListPatternMatchedEntries(ctx, p, startFileName, inclusive, limit, prefix, restNamePattern, eachEntryFunc) + missedCount, lastFileName, err = f.doListPatternMatchedEntries(ctx, p, startFileName, inclusive, limit, prefix, restNamePattern, namePatternExclude, eachEntryFunc) for missedCount > 0 && err == nil { - missedCount, lastFileName, err = f.doListPatternMatchedEntries(ctx, p, lastFileName, false, missedCount, prefix, restNamePattern, eachEntryFunc) + missedCount, lastFileName, err = f.doListPatternMatchedEntries(ctx, p, lastFileName, false, missedCount, prefix, restNamePattern, namePatternExclude, eachEntryFunc) } return } -func (f *Filer) doListPatternMatchedEntries(ctx context.Context, p util.FullPath, startFileName string, inclusive bool, limit int64, prefix, restNamePattern string, eachEntryFunc ListEachEntryFunc) (missedCount int64, lastFileName string, err error) { +func (f *Filer) doListPatternMatchedEntries(ctx context.Context, p util.FullPath, startFileName string, inclusive bool, limit int64, prefix, restNamePattern string, namePatternExclude string, eachEntryFunc ListEachEntryFunc) (missedCount int64, lastFileName string, err error) { - if len(restNamePattern) == 0 { + if len(restNamePattern) == 0 && len(namePatternExclude) == 0{ lastFileName, err = f.doListValidEntries(ctx, p, startFileName, inclusive, limit, prefix, eachEntryFunc) return 0, lastFileName, err } lastFileName, err = f.doListValidEntries(ctx, p, startFileName, inclusive, limit, prefix, func(entry *Entry) bool { nameToTest := strings.ToLower(entry.Name()) - if matched, matchErr := filepath.Match(restNamePattern, nameToTest[len(prefix):]); matchErr == nil && matched { - if !eachEntryFunc(entry) { - return false + if len(namePatternExclude) > 0 { + if matched, matchErr := filepath.Match(namePatternExclude, nameToTest); matchErr == nil && matched { + missedCount++ + return true } - } else { - missedCount++ + } + if len(restNamePattern) > 0 { + if matched, matchErr := filepath.Match(restNamePattern, nameToTest[len(prefix):]); matchErr == nil && !matched { + missedCount++ + return true + } + } + if !eachEntryFunc(entry) { + return false } return true }) diff --git a/weed/filer/leveldb/leveldb_store_test.go b/weed/filer/leveldb/leveldb_store_test.go index 9c342605e..d437895f5 100644 --- a/weed/filer/leveldb/leveldb_store_test.go +++ b/weed/filer/leveldb/leveldb_store_test.go @@ -51,14 +51,14 @@ func TestCreateAndFind(t *testing.T) { } // checking one upper directory - entries, _, _ := testFiler.ListDirectoryEntries(ctx, util.FullPath("/home/chris/this/is/one"), "", false, 100, "", "") + entries, _, _ := testFiler.ListDirectoryEntries(ctx, util.FullPath("/home/chris/this/is/one"), "", false, 100, "", "", "") if len(entries) != 1 { t.Errorf("list entries count: %v", len(entries)) return } // checking one upper directory - entries, _, _ = testFiler.ListDirectoryEntries(ctx, util.FullPath("/"), "", false, 100, "", "") + entries, _, _ = testFiler.ListDirectoryEntries(ctx, util.FullPath("/"), "", false, 100, "", "", "") if len(entries) != 1 { t.Errorf("list entries count: %v", len(entries)) return @@ -77,7 +77,7 @@ func TestEmptyRoot(t *testing.T) { ctx := context.Background() // checking one upper directory - entries, _, err := testFiler.ListDirectoryEntries(ctx, util.FullPath("/"), "", false, 100, "", "") + entries, _, err := testFiler.ListDirectoryEntries(ctx, util.FullPath("/"), "", false, 100, "", "", "") if err != nil { t.Errorf("list entries: %v", err) return diff --git a/weed/filer/leveldb2/leveldb2_store_test.go b/weed/filer/leveldb2/leveldb2_store_test.go index 495c73fdd..fd0ad18a3 100644 --- a/weed/filer/leveldb2/leveldb2_store_test.go +++ b/weed/filer/leveldb2/leveldb2_store_test.go @@ -49,14 +49,14 @@ func TestCreateAndFind(t *testing.T) { } // checking one upper directory - entries, _, _ := testFiler.ListDirectoryEntries(ctx, util.FullPath("/home/chris/this/is/one"), "", false, 100, "", "") + entries, _, _ := testFiler.ListDirectoryEntries(ctx, util.FullPath("/home/chris/this/is/one"), "", false, 100, "", "", "") if len(entries) != 1 { t.Errorf("list entries count: %v", len(entries)) return } // checking one upper directory - entries, _, _ = testFiler.ListDirectoryEntries(ctx, util.FullPath("/"), "", false, 100, "", "") + entries, _, _ = testFiler.ListDirectoryEntries(ctx, util.FullPath("/"), "", false, 100, "", "", "") if len(entries) != 1 { t.Errorf("list entries count: %v", len(entries)) return @@ -75,7 +75,7 @@ func TestEmptyRoot(t *testing.T) { ctx := context.Background() // checking one upper directory - entries, _, err := testFiler.ListDirectoryEntries(ctx, util.FullPath("/"), "", false, 100, "", "") + entries, _, err := testFiler.ListDirectoryEntries(ctx, util.FullPath("/"), "", false, 100, "", "", "") if err != nil { t.Errorf("list entries: %v", err) return diff --git a/weed/filer/leveldb3/leveldb3_store_test.go b/weed/filer/leveldb3/leveldb3_store_test.go index 53b0e927f..0b970a539 100644 --- a/weed/filer/leveldb3/leveldb3_store_test.go +++ b/weed/filer/leveldb3/leveldb3_store_test.go @@ -49,14 +49,14 @@ func TestCreateAndFind(t *testing.T) { } // checking one upper directory - entries, _, _ := testFiler.ListDirectoryEntries(ctx, util.FullPath("/home/chris/this/is/one"), "", false, 100, "", "") + entries, _, _ := testFiler.ListDirectoryEntries(ctx, util.FullPath("/home/chris/this/is/one"), "", false, 100, "", "", "") if len(entries) != 1 { t.Errorf("list entries count: %v", len(entries)) return } // checking one upper directory - entries, _, _ = testFiler.ListDirectoryEntries(ctx, util.FullPath("/"), "", false, 100, "", "") + entries, _, _ = testFiler.ListDirectoryEntries(ctx, util.FullPath("/"), "", false, 100, "", "", "") if len(entries) != 1 { t.Errorf("list entries count: %v", len(entries)) return @@ -75,7 +75,7 @@ func TestEmptyRoot(t *testing.T) { ctx := context.Background() // checking one upper directory - entries, _, err := testFiler.ListDirectoryEntries(ctx, util.FullPath("/"), "", false, 100, "", "") + entries, _, err := testFiler.ListDirectoryEntries(ctx, util.FullPath("/"), "", false, 100, "", "", "") if err != nil { t.Errorf("list entries: %v", err) return diff --git a/weed/filer/rocksdb/rocksdb_store_test.go b/weed/filer/rocksdb/rocksdb_store_test.go index 439663524..f6e755b4b 100644 --- a/weed/filer/rocksdb/rocksdb_store_test.go +++ b/weed/filer/rocksdb/rocksdb_store_test.go @@ -53,14 +53,14 @@ func TestCreateAndFind(t *testing.T) { } // checking one upper directory - entries, _, _ := testFiler.ListDirectoryEntries(ctx, util.FullPath("/home/chris/this/is/one"), "", false, 100, "", "") + entries, _, _ := testFiler.ListDirectoryEntries(ctx, util.FullPath("/home/chris/this/is/one"), "", false, 100, "", "", "") if len(entries) != 1 { t.Errorf("list entries count: %v", len(entries)) return } // checking one upper directory - entries, _, _ = testFiler.ListDirectoryEntries(ctx, util.FullPath("/"), "", false, 100, "", "") + entries, _, _ = testFiler.ListDirectoryEntries(ctx, util.FullPath("/"), "", false, 100, "", "", "") if len(entries) != 1 { t.Errorf("list entries count: %v", len(entries)) return @@ -79,7 +79,7 @@ func TestEmptyRoot(t *testing.T) { ctx := context.Background() // checking one upper directory - entries, _, err := testFiler.ListDirectoryEntries(ctx, util.FullPath("/"), "", false, 100, "", "") + entries, _, err := testFiler.ListDirectoryEntries(ctx, util.FullPath("/"), "", false, 100, "", "", "") if err != nil { t.Errorf("list entries: %v", err) return diff --git a/weed/server/filer_grpc_server.go b/weed/server/filer_grpc_server.go index a4bb721ef..3821de6a9 100644 --- a/weed/server/filer_grpc_server.go +++ b/weed/server/filer_grpc_server.go @@ -63,7 +63,7 @@ func (fs *FilerServer) ListEntries(req *filer_pb.ListEntriesRequest, stream file var listErr error for limit > 0 { var hasEntries bool - lastFileName, listErr = fs.filer.StreamListDirectoryEntries(stream.Context(), util.FullPath(req.Directory), lastFileName, includeLastFile, int64(paginationLimit), req.Prefix, "", func(entry *filer.Entry) bool { + 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{ diff --git a/weed/server/filer_grpc_server_rename.go b/weed/server/filer_grpc_server_rename.go index c1e5bc789..eadb970d5 100644 --- a/weed/server/filer_grpc_server_rename.go +++ b/weed/server/filer_grpc_server_rename.go @@ -74,7 +74,7 @@ func (fs *FilerServer) moveFolderSubEntries(ctx context.Context, oldParent util. includeLastFile := false for { - entries, hasMore, err := fs.filer.ListDirectoryEntries(ctx, currentDirPath, lastFileName, includeLastFile, 1024, "", "") + entries, hasMore, err := fs.filer.ListDirectoryEntries(ctx, currentDirPath, lastFileName, includeLastFile, 1024, "", "", "") if err != nil { return err } diff --git a/weed/server/filer_server_handlers_read_dir.go b/weed/server/filer_server_handlers_read_dir.go index 9cf79ab41..307c411b6 100644 --- a/weed/server/filer_server_handlers_read_dir.go +++ b/weed/server/filer_server_handlers_read_dir.go @@ -35,8 +35,9 @@ func (fs *FilerServer) listDirectoryHandler(w http.ResponseWriter, r *http.Reque lastFileName := r.FormValue("lastFileName") namePattern := r.FormValue("namePattern") + namePatternExclude := r.FormValue("namePatternExclude") - entries, shouldDisplayLoadMore, err := fs.filer.ListDirectoryEntries(context.Background(), util.FullPath(path), lastFileName, false, int64(limit), "", namePattern) + entries, shouldDisplayLoadMore, err := fs.filer.ListDirectoryEntries(context.Background(), util.FullPath(path), lastFileName, false, int64(limit), "", namePattern, namePatternExclude) if err != nil { glog.V(0).Infof("listDirectory %s %s %d: %s", path, lastFileName, limit, err) From 79f2e780c18052b3e9bb1fa5fd28a1c04f425863 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 24 Apr 2021 11:51:23 -0700 Subject: [PATCH 283/284] ensure name pattern checking is case sensitive --- weed/filer/filer_search.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weed/filer/filer_search.go b/weed/filer/filer_search.go index dd1f8c1ab..f43312cfa 100644 --- a/weed/filer/filer_search.go +++ b/weed/filer/filer_search.go @@ -64,7 +64,7 @@ func (f *Filer) doListPatternMatchedEntries(ctx context.Context, p util.FullPath } lastFileName, err = f.doListValidEntries(ctx, p, startFileName, inclusive, limit, prefix, func(entry *Entry) bool { - nameToTest := strings.ToLower(entry.Name()) + nameToTest := entry.Name() if len(namePatternExclude) > 0 { if matched, matchErr := filepath.Match(namePatternExclude, nameToTest); matchErr == nil && matched { missedCount++ From 86185262bb86e31f9a2f71e85d02df2502c7ad40 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 24 Apr 2021 16:54:36 -0700 Subject: [PATCH 284/284] 2.41 --- 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 8eddb2ca2..0025c9760 100644 --- a/k8s/seaweedfs/Chart.yaml +++ b/k8s/seaweedfs/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: SeaweedFS name: seaweedfs -appVersion: "2.40" -version: 2.40 +appVersion: "2.41" +version: 2.41 diff --git a/k8s/seaweedfs/values.yaml b/k8s/seaweedfs/values.yaml index 058170bbe..a4abaccf3 100644 --- a/k8s/seaweedfs/values.yaml +++ b/k8s/seaweedfs/values.yaml @@ -4,7 +4,7 @@ global: registry: "" repository: "" imageName: chrislusf/seaweedfs - # imageTag: "2.40" - started using {.Chart.appVersion} + # imageTag: "2.41" - started using {.Chart.appVersion} imagePullPolicy: IfNotPresent imagePullSecrets: imagepullsecret restartPolicy: Always diff --git a/weed/util/constants.go b/weed/util/constants.go index d81138d86..c595f0c53 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, 40) + VERSION = fmt.Sprintf("%s %d.%02d", sizeLimit, 2, 41) COMMIT = "" )

    Nr$v}H2}%K#%}JX7lSQGL&w<3I7HOY?Af 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 z�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 pNCL~CJ@zU7IsfxpQIU Date: Mon, 8 Mar 2021 00:59:08 -0800 Subject: [PATCH 055/284] Update SeaweedFS_Architecture.png --- note/SeaweedFS_Architecture.png | Bin 72954 -> 75867 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/note/SeaweedFS_Architecture.png b/note/SeaweedFS_Architecture.png index 2c6de5ef6dd8eed14c96cbda6de3f878b0c8aa0d..6d8ea5f84a1d63630374c4cc15235afac69b7a5e 100644 GIT binary patch literal 75867 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