From 183a9d59d486a86b88823cc28735d5ebd9aa980c Mon Sep 17 00:00:00 2001 From: tianpingan Date: Wed, 22 Nov 2023 15:06:39 +0000 Subject: [PATCH 1/8] add PutObjectOptions to S3Adapter::PutObject Signed-off-by: tianpingan --- src/common/s3_adapter.cpp | 11 ++++++++--- src/common/s3_adapter.h | 10 ++++++++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/common/s3_adapter.cpp b/src/common/s3_adapter.cpp index e3b3d917a0..3589b98b6d 100644 --- a/src/common/s3_adapter.cpp +++ b/src/common/s3_adapter.cpp @@ -280,11 +280,13 @@ bool S3Adapter::BucketExist() { } int S3Adapter::PutObject(const Aws::String &key, const char *buffer, - const size_t bufferSize) { + const size_t bufferSize, const PutObjectOptions &options) { Aws::S3::Model::PutObjectRequest request; request.SetBucket(bucketName_); request.SetKey(key); - + if (options.storageClass != Aws::S3::Model::StorageClass::NOT_SET) { + request.SetStorageClass(options.storageClass); + } request.SetBody(Aws::MakeShared(AWS_ALLOCATE_TAG, buffer, bufferSize)); @@ -337,7 +339,10 @@ void S3Adapter::PutObjectAsync(std::shared_ptr context) { Aws::S3::Model::PutObjectRequest request; request.SetBucket(bucketName_); request.SetKey(Aws::String{context->key.c_str(), context->key.size()}); - + PutObjectOptions options = context->putObjectOptions; + if (options.storageClass != Aws::S3::Model::StorageClass::NOT_SET) { + request.SetStorageClass(options.storageClass); + } request.SetBody(Aws::MakeShared( AWS_ALLOCATE_TAG, context->buffer, context->bufferSize)); diff --git a/src/common/s3_adapter.h b/src/common/s3_adapter.h index 2adbbfb3bc..ffa29ed6b8 100644 --- a/src/common/s3_adapter.h +++ b/src/common/s3_adapter.h @@ -105,6 +105,10 @@ struct S3InfoOption { uint32_t objectPrefix; }; +struct PutObjectOptions { + Aws::S3::Model::StorageClass storageClass; +}; + void InitS3AdaptorOptionExceptS3InfoOption(Configuration *conf, S3AdapterOption *s3Opt); @@ -158,6 +162,7 @@ struct PutObjectAsyncContext : public Aws::Client::AsyncCallerContext { std::string key; const char* buffer; size_t bufferSize; + PutObjectOptions putObjectOptions; PutObjectAsyncCallBack cb; butil::Timer timer; int retCode; // >= 0 success, < 0 fail @@ -251,7 +256,7 @@ class S3Adapter { * @return:0 上传成功/ -1 上传失败 */ virtual int PutObject(const Aws::String &key, const char *buffer, - const size_t bufferSize); + const size_t bufferSize, const PutObjectOptions& options = PutObjectOptions{}); // Get object to buffer[bufferSize] // int GetObject(const Aws::String &key, void *buffer, // const int bufferSize); @@ -398,10 +403,11 @@ class FakeS3Adapter : public S3Adapter { bool BucketExist() override { return true; } int PutObject(const Aws::String &key, const char *buffer, - const size_t bufferSize) override { + const size_t bufferSize, const curve::common::PutObjectOptions& options) override { (void)key; (void)buffer; (void)bufferSize; + (void)options; return 0; } From ab04941e4cba268c6a6a6c677c6bddd3cf2c979f Mon Sep 17 00:00:00 2001 From: tianpingan Date: Thu, 23 Nov 2023 06:07:01 +0000 Subject: [PATCH 2/8] polish disk_cache_write to fit PutObject Signed-off-by: tianpingan --- curvefs/proto/common.proto | 11 +++++++++++ curvefs/src/client/common/config.cpp | 2 ++ curvefs/src/client/common/config.h | 1 + curvefs/src/client/s3/client_s3_adaptor.cpp | 1 + curvefs/src/client/s3/client_s3_adaptor.h | 5 +++++ curvefs/src/client/s3/client_s3_cache_manager.cpp | 1 + curvefs/src/client/s3/disk_cache_manager.cpp | 4 ++-- curvefs/src/client/s3/disk_cache_manager_impl.h | 1 + curvefs/src/client/s3/disk_cache_write.cpp | 6 +++++- curvefs/src/client/s3/disk_cache_write.h | 4 +++- src/common/s3_adapter.cpp | 4 ++-- src/common/s3_adapter.h | 6 ++++-- 12 files changed, 38 insertions(+), 8 deletions(-) diff --git a/curvefs/proto/common.proto b/curvefs/proto/common.proto index a56402c744..84d351dd09 100644 --- a/curvefs/proto/common.proto +++ b/curvefs/proto/common.proto @@ -64,6 +64,7 @@ message S3Info { required uint64 blockSize = 5; required uint64 chunkSize = 6; optional uint32 objectPrefix = 7; + optional StorageClass storageClass = 8; } enum PartitionStatus { @@ -109,3 +110,13 @@ message CopysetInfo { required uint32 poolId = 1; required uint32 copysetId = 2; } + +enum StorageClass { + STANDARD = 1; + REDUCED_REDUNDANCY = 2; + STANDARD_IA = 3; + ONEZONE_IA = 4; + INTELLIGENT_TIERING = 5; + GLACIER = 6; + DEEP_ARCHIVE = 7; +} \ No newline at end of file diff --git a/curvefs/src/client/common/config.cpp b/curvefs/src/client/common/config.cpp index dc80177ab3..bb0e7fda4a 100644 --- a/curvefs/src/client/common/config.cpp +++ b/curvefs/src/client/common/config.cpp @@ -472,6 +472,7 @@ void SetFuseClientS3Option(FuseClientOption *clientOption, clientOption->s3Opt.s3ClientAdaptorOpt.blockSize = fsS3Opt.blockSize; clientOption->s3Opt.s3ClientAdaptorOpt.chunkSize = fsS3Opt.chunkSize; clientOption->s3Opt.s3ClientAdaptorOpt.objectPrefix = fsS3Opt.objectPrefix; + clientOption->s3Opt.s3ClientAdaptorOpt.storageClass = fsS3Opt.storageClass; clientOption->s3Opt.s3AdaptrOpt.s3Address = fsS3Opt.s3Address; clientOption->s3Opt.s3AdaptrOpt.ak = fsS3Opt.ak; clientOption->s3Opt.s3AdaptrOpt.sk = fsS3Opt.sk; @@ -487,6 +488,7 @@ void S3Info2FsS3Option(const curvefs::common::S3Info& s3, fsS3Opt->blockSize = s3.blocksize(); fsS3Opt->chunkSize = s3.chunksize(); fsS3Opt->objectPrefix = s3.has_objectprefix() ? s3.objectprefix() : 0; + fsS3Opt->storageClass = s3.has_storageclass() ? Aws::S3::Model::StorageClass(s3.storageclass()) : Aws::S3::Model::StorageClass::NOT_SET; } } // namespace common diff --git a/curvefs/src/client/common/config.h b/curvefs/src/client/common/config.h index 464b1550c4..0a10fbbaf9 100644 --- a/curvefs/src/client/common/config.h +++ b/curvefs/src/client/common/config.h @@ -140,6 +140,7 @@ struct S3ClientAdaptorOption { uint32_t readRetryIntervalMs; uint32_t objectPrefix; DiskCacheOption diskCacheOpt; + Aws::S3::Model::StorageClass storageClass; }; struct S3Option { diff --git a/curvefs/src/client/s3/client_s3_adaptor.cpp b/curvefs/src/client/s3/client_s3_adaptor.cpp index cf3fa56796..cc56cea91f 100644 --- a/curvefs/src/client/s3/client_s3_adaptor.cpp +++ b/curvefs/src/client/s3/client_s3_adaptor.cpp @@ -91,6 +91,7 @@ S3ClientAdaptorImpl::Init( maxReadRetryIntervalMs_ = option.maxReadRetryIntervalMs; readRetryIntervalMs_ = option.readRetryIntervalMs; objectPrefix_ = option.objectPrefix; + storageClass_ = option.storageClass; client_ = client; inodeManager_ = inodeManager; mdsClient_ = mdsClient; diff --git a/curvefs/src/client/s3/client_s3_adaptor.h b/curvefs/src/client/s3/client_s3_adaptor.h index dcc25c3795..273cca1763 100644 --- a/curvefs/src/client/s3/client_s3_adaptor.h +++ b/curvefs/src/client/s3/client_s3_adaptor.h @@ -156,6 +156,10 @@ class S3ClientAdaptorImpl : public S3ClientAdaptor { return objectPrefix_; } + Aws::S3::Model::StorageClass GetStorageClass() { + return storageClass_; + } + std::shared_ptr GetFsCacheManager() { return fsCacheManager_; } @@ -281,6 +285,7 @@ class S3ClientAdaptorImpl : public S3ClientAdaptor { uint32_t maxReadRetryIntervalMs_; uint32_t readRetryIntervalMs_; uint32_t objectPrefix_; + Aws::S3::Model::StorageClass storageClass_; Thread bgFlushThread_; std::atomic toStop_; std::mutex mtx_; diff --git a/curvefs/src/client/s3/client_s3_cache_manager.cpp b/curvefs/src/client/s3/client_s3_cache_manager.cpp index 1bd098eb71..c2784def57 100644 --- a/curvefs/src/client/s3/client_s3_cache_manager.cpp +++ b/curvefs/src/client/s3/client_s3_cache_manager.cpp @@ -2544,6 +2544,7 @@ void DataCache::FlushTaskExecute( s3Tasks.begin(), s3Tasks.end(), [&](const std::shared_ptr &context) { context->cb = s3cb; + context->putObjectOptions = curve::common::PutObjectOptions{storageClass: s3ClientAdaptor_->GetStorageClass()}; if (CachePolicy::WRCache == cachePolicy) { context->type = curve::common::ContextType::Disk; s3ClientAdaptor_->GetDiskCacheManager()->Enqueue(context); diff --git a/curvefs/src/client/s3/disk_cache_manager.cpp b/curvefs/src/client/s3/disk_cache_manager.cpp index 33a09e307d..4254af6d5e 100644 --- a/curvefs/src/client/s3/disk_cache_manager.cpp +++ b/curvefs/src/client/s3/disk_cache_manager.cpp @@ -96,7 +96,7 @@ int DiskCacheManager::Init(std::shared_ptr client, const S3ClientAdaptorOption option) { LOG(INFO) << "DiskCacheManager init start."; client_ = client; - + option_ = option; FLAGS_diskTrimCheckIntervalSec = option.diskCacheOpt.trimCheckIntervalSec; FLAGS_diskFullRatio = option.diskCacheOpt.fullRatio; @@ -108,7 +108,7 @@ int DiskCacheManager::Init(std::shared_ptr client, cmdTimeoutSec_ = option.diskCacheOpt.cmdTimeoutSec; objectPrefix_ = option.objectPrefix; cacheWrite_->Init(client_, posixWrapper_, cacheDir_, objectPrefix_, - option.diskCacheOpt.asyncLoadPeriodMs, cachedObjName_); + option.diskCacheOpt.asyncLoadPeriodMs, cachedObjName_, option.storageClass); cacheRead_->Init(posixWrapper_, cacheDir_, objectPrefix_); int ret; ret = CreateDir(); diff --git a/curvefs/src/client/s3/disk_cache_manager_impl.h b/curvefs/src/client/s3/disk_cache_manager_impl.h index f6e02deeb1..7be9539062 100644 --- a/curvefs/src/client/s3/disk_cache_manager_impl.h +++ b/curvefs/src/client/s3/disk_cache_manager_impl.h @@ -128,6 +128,7 @@ class DiskCacheManagerImpl { std::shared_ptr diskCacheManager_; bool forceFlush_; + Aws::S3::Model::StorageClass storageClass_; std::shared_ptr client_; int WriteClosure(std::shared_ptr context); diff --git a/curvefs/src/client/s3/disk_cache_write.cpp b/curvefs/src/client/s3/disk_cache_write.cpp index 640c6bca0a..ee48971984 100644 --- a/curvefs/src/client/s3/disk_cache_write.cpp +++ b/curvefs/src/client/s3/disk_cache_write.cpp @@ -43,11 +43,13 @@ void DiskCacheWrite::Init(std::shared_ptr client, uint32_t objectPrefix, uint64_t asyncLoadPeriodMs, std::shared_ptr> cachedObjName) { + std::string>> cachedObjName, + Aws::S3::Model::StorageClass storageClass) { client_ = client; posixWrapper_ = posixWrapper; asyncLoadPeriodMs_ = asyncLoadPeriodMs; cachedObjName_ = cachedObjName; + storageClass_ = storageClass; DiskCacheBase::Init(posixWrapper, cacheDir, objectPrefix); } @@ -168,6 +170,7 @@ int DiskCacheWrite::UploadFile(const std::string &name, }; auto context = std::make_shared( name, buffer, fileSize, cb, curve::common::ContextType::S3); + context->putObjectOptions = curve::common::PutObjectOptions{storageClass: storageClass_}; client_->UploadAsync(context); VLOG(9) << "async upload end, file = " << name; return 0; @@ -424,6 +427,7 @@ int DiskCacheWrite::UploadAllCacheWriteFile() { auto context = std::make_shared( curvefs::common::s3util::GenPathByObjName(*iter, objectPrefix_), buffer, fileSize, cb, curve::common::ContextType::S3); + context->putObjectOptions = curve::common::PutObjectOptions{storageClass: storageClass_}; client_->UploadAsync(context); } if (pendingReq.load(std::memory_order_seq_cst)) { diff --git a/curvefs/src/client/s3/disk_cache_write.h b/curvefs/src/client/s3/disk_cache_write.h index 8fb425118f..b87017601a 100644 --- a/curvefs/src/client/s3/disk_cache_write.h +++ b/curvefs/src/client/s3/disk_cache_write.h @@ -85,7 +85,8 @@ class DiskCacheWrite : public DiskCacheBase { std::shared_ptr posixWrapper, const std::string cacheDir, uint32_t objectPrefix, uint64_t asyncLoadPeriodMs, - std::shared_ptr> cachedObjName); + std::shared_ptr> cachedObjName, + Aws::S3::Model::StorageClass storageClass = Aws::S3::Model::StorageClass::NOT_SET); /** * @brief write obj to write cache disk * @param[in] client S3Client @@ -166,6 +167,7 @@ class DiskCacheWrite : public DiskCacheBase { std::shared_ptr s3Metric_; std::shared_ptr> cachedObjName_; + Aws::S3::Model::StorageClass storageClass_; }; } // namespace client diff --git a/src/common/s3_adapter.cpp b/src/common/s3_adapter.cpp index 3589b98b6d..0308be6fd6 100644 --- a/src/common/s3_adapter.cpp +++ b/src/common/s3_adapter.cpp @@ -305,8 +305,8 @@ int S3Adapter::PutObject(const Aws::String &key, const char *buffer, } } -int S3Adapter::PutObject(const Aws::String &key, const std::string &data) { - return PutObject(key, data.data(), data.size()); +int S3Adapter::PutObject(const Aws::String &key, const std::string &data, const PutObjectOptions &options) { + return PutObject(key, data.data(), data.size(), options); } /* int S3Adapter::GetObject(const Aws::String &key, diff --git a/src/common/s3_adapter.h b/src/common/s3_adapter.h index ffa29ed6b8..5262b218dd 100644 --- a/src/common/s3_adapter.h +++ b/src/common/s3_adapter.h @@ -103,6 +103,7 @@ struct S3InfoOption { uint64_t blockSize; uint64_t chunkSize; uint32_t objectPrefix; + Aws::S3::Model::StorageClass storageClass; }; struct PutObjectOptions { @@ -266,7 +267,7 @@ class S3Adapter { * @param 数据内容 * @return:0 上传成功/ -1 上传失败 */ - virtual int PutObject(const Aws::String &key, const std::string &data); + virtual int PutObject(const Aws::String &key, const std::string &data, const PutObjectOptions& options = PutObjectOptions{}); virtual void PutObjectAsync(std::shared_ptr context); /** * Get object from s3, @@ -411,9 +412,10 @@ class FakeS3Adapter : public S3Adapter { return 0; } - int PutObject(const Aws::String &key, const std::string &data) override { + int PutObject(const Aws::String &key, const std::string &data, const curve::common::PutObjectOptions& options) override { (void)key; (void)data; + (void)options; return 0; } From bfabdea1bd2ad0c5ff8b5261ccd77dc75a53b8b6 Mon Sep 17 00:00:00 2001 From: tianpingan Date: Thu, 23 Nov 2023 06:14:23 +0000 Subject: [PATCH 3/8] polish s3compact_inode to fit PutObject Signed-off-by: tianpingan --- curvefs/src/metaserver/s3compact_inode.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/curvefs/src/metaserver/s3compact_inode.cpp b/curvefs/src/metaserver/s3compact_inode.cpp index b50e61ad59..5f5c1fa1ca 100644 --- a/curvefs/src/metaserver/s3compact_inode.cpp +++ b/curvefs/src/metaserver/s3compact_inode.cpp @@ -36,6 +36,7 @@ #include "curvefs/src/common/s3util.h" #include "curvefs/src/metaserver/copyset/copyset_node_manager.h" #include "curvefs/src/metaserver/copyset/meta_operator.h" +#include "curvefs/src/metaserver/mds/fsinfo_manager.h" using curve::common::Configuration; using curve::common::InitS3AdaptorOptionExceptS3InfoOption; @@ -344,6 +345,16 @@ int CompactInodeJob::WriteFullChunk( const auto& blockSize = ctx.blockSize; const auto& chunkSize = ctx.chunkSize; const auto& newOff = newChunkInfo.newOff; + FsInfo fsInfo; + auto ok = FsInfoManager::GetInstance().GetFsInfo(ctx.fsId, &fsInfo); + if (!ok) { + LOG(ERROR) << "WriteFullChunk failed, fsId " + << ctx.fsId << " not exist"; + return ok; + } + const auto& s3Info = fsInfo.detail().s3info(); + curve::common::PutObjectOptions putObjectOption; + putObjectOption.storageClass = s3Info.has_storageclass() ? Aws::S3::Model::StorageClass(s3Info.storageclass()) : Aws::S3::Model::StorageClass::NOT_SET; uint64_t offRoundDown = newOff / chunkSize * chunkSize; uint64_t startIndex = (newOff - newOff / chunkSize * chunkSize) / blockSize; for (uint64_t index = startIndex; @@ -361,7 +372,8 @@ int CompactInodeJob::WriteFullChunk( << s3objEnd << "]"; ret = ctx.s3adapter->PutObject( aws_key, - fullChunk.substr(s3objBegin - newOff, s3objEnd - s3objBegin + 1)); + fullChunk.substr(s3objBegin - newOff, s3objEnd - s3objBegin + 1), + putObjectOption); if (ret != 0) { LOG(WARNING) << "s3compact: put s3 object " << objName << " failed"; return ret; From e0eb79fe72afffdaa422468f885f7eddb1f5aad7 Mon Sep 17 00:00:00 2001 From: tianpingan Date: Fri, 22 Dec 2023 02:38:15 +0000 Subject: [PATCH 4/8] update tools to support storage class Signed-off-by: tianpingan --- curvefs/proto/common.proto | 1 + .../src/tools/create/curvefs_create_fs.cpp | 11 ++++++ curvefs/src/tools/curvefs_tool_define.cpp | 7 ++++ curvefs/src/tools/curvefs_tool_define.h | 4 +++ tools-v2/internal/error/error.go | 4 ++- tools-v2/internal/utils/proto.go | 10 ++++++ .../pkg/cli/command/curvefs/create/fs/fs.go | 24 ++++++++----- tools-v2/pkg/config/fs.go | 34 ++++++++++++------- 8 files changed, 73 insertions(+), 22 deletions(-) diff --git a/curvefs/proto/common.proto b/curvefs/proto/common.proto index 84d351dd09..e9b6359a35 100644 --- a/curvefs/proto/common.proto +++ b/curvefs/proto/common.proto @@ -112,6 +112,7 @@ message CopysetInfo { } enum StorageClass { + NOT_SET = 0; STANDARD = 1; REDUCED_REDUNDANCY = 2; STANDARD_IA = 3; diff --git a/curvefs/src/tools/create/curvefs_create_fs.cpp b/curvefs/src/tools/create/curvefs_create_fs.cpp index d8fd0641fd..1a562810a4 100644 --- a/curvefs/src/tools/create/curvefs_create_fs.cpp +++ b/curvefs/src/tools/create/curvefs_create_fs.cpp @@ -58,6 +58,7 @@ DECLARE_string(s3_bucket_name); DECLARE_uint64(s3_blocksize); DECLARE_uint64(s3_chunksize); DECLARE_uint32(s3_objectPrefix); +DECLARE_string(s3_storageClass); DECLARE_uint32(rpcTimeoutMs); DECLARE_uint32(rpcRetryTimes); DECLARE_bool(enableSumInDir); @@ -100,6 +101,7 @@ void CreateFsTool::PrintHelp() { << " -s3_blocksize=" << FLAGS_s3_blocksize << " -s3_chunksize=" << FLAGS_s3_chunksize << " -s3_objectPrefix=" << FLAGS_s3_objectPrefix + << " -s3_storageClass=NOT_SET|STANDARD|REDUCED_REDUNDANCY|STANDARD_IA|ONEZONE_IA|INTELLIGENT_TIERING|GLACIER|DEEP_ARCHIVE" << "]\n[-fsType=hybrid -volumeBlockGroupSize=" << FLAGS_volumeBlockGroupSize << " -volumeBlockSize=" << FLAGS_volumeBlockSize @@ -113,6 +115,7 @@ void CreateFsTool::PrintHelp() { << " -s3_blocksize=" << FLAGS_s3_blocksize << " -s3_chunksize=" << FLAGS_s3_chunksize << " -s3_objectPrefix=" << FLAGS_s3_objectPrefix + << " -s3_storageClass=NOT_SET|STANDARD|REDUCED_REDUNDANCY|STANDARD_IA|ONEZONE_IA|INTELLIGENT_TIERING|GLACIER|DEEP_ARCHIVE" << "]" << std::endl; } @@ -134,6 +137,7 @@ void CreateFsTool::AddUpdateFlags() { AddUpdateFlagsFunc(curvefs::tools::SetS3_blocksize); AddUpdateFlagsFunc(curvefs::tools::SetS3_chunksize); AddUpdateFlagsFunc(curvefs::tools::SetS3_objectPrefix); + AddUpdateFlagsFunc(curvefs::tools::SetS3_storageClass); AddUpdateFlagsFunc(curvefs::tools::SetRpcTimeoutMs); AddUpdateFlagsFunc(curvefs::tools::SetRpcRetryTimes); AddUpdateFlagsFunc(curvefs::tools::SetEnableSumInDir); @@ -179,6 +183,13 @@ int CreateFsTool::Init() { s3->set_blocksize(FLAGS_s3_blocksize); s3->set_chunksize(FLAGS_s3_chunksize); s3->set_objectprefix(FLAGS_s3_objectPrefix); + curvefs::common::StorageClass storageClass; + if (!StorageClass_Parse(FLAGS_s3_storageClass, &storageClass)) { + std::cerr << "Parse storageClass error, only support " + "NOT_SET|STANDARD|REDUCED_REDUNDANCY|STANDARD_IA|ONEZONE_IA|INTELLIGENT_TIERING|GLACIER|DEEP_ARCHIVE"; + return -1; + } + s3->set_storageclass(storageClass); request.mutable_fsdetail()->set_allocated_s3info(s3); return 0; }; diff --git a/curvefs/src/tools/curvefs_tool_define.cpp b/curvefs/src/tools/curvefs_tool_define.cpp index 383479fba5..3512b6151f 100644 --- a/curvefs/src/tools/curvefs_tool_define.cpp +++ b/curvefs/src/tools/curvefs_tool_define.cpp @@ -75,6 +75,7 @@ DEFINE_string(s3_bucket_name, "bucketname", "s3 bucket name"); DEFINE_uint64(s3_blocksize, 1048576, "s3 block size"); DEFINE_uint64(s3_chunksize, 4194304, "s3 chunk size"); DEFINE_uint32(s3_objectPrefix, 0, "object prefix"); +DEFINE_string(s3_storageClass, "NOT_SET", "s3 storage classes"); DEFINE_bool(enableSumInDir, false, "statistic info in xattr"); DEFINE_uint64(capacity, (uint64_t)0, "capacity of fs, unit is bytes, default 0 to disable quota"); @@ -256,6 +257,12 @@ std::function std::placeholders::_2, "s3_objectPrefix", "s3.objectPrefix", &FLAGS_s3_objectPrefix); +std::function + SetS3_storageClass = + std::bind(&SetDiffFlagInfo, std::placeholders::_1, + std::placeholders::_2, "s3_storageClass", "s3.storageClass", + &FLAGS_s3_storageClass); + std::function SetEnableSumInDir = std::bind(&SetFlagInfo, std::placeholders::_1, std::placeholders::_2, "enableSumInDir", diff --git a/curvefs/src/tools/curvefs_tool_define.h b/curvefs/src/tools/curvefs_tool_define.h index 819588a539..9a5d234e5b 100644 --- a/curvefs/src/tools/curvefs_tool_define.h +++ b/curvefs/src/tools/curvefs_tool_define.h @@ -274,6 +274,10 @@ extern std::function SetS3_objectPrefix; +extern std::function + SetS3_storageClass; + extern std::function SetEnableSumInDir; diff --git a/tools-v2/internal/error/error.go b/tools-v2/internal/error/error.go index aea8ad92d3..9a34f80d66 100644 --- a/tools-v2/internal/error/error.go +++ b/tools-v2/internal/error/error.go @@ -500,7 +500,9 @@ var ( ErrInvalidMetaServerAddr = func() *CmdError { return NewInternalCmdError(80, "invalid metaserver external addr: %s") } - + ErrUnknownStorageClass = func() *CmdError { + return NewInternalCmdError(81, "unknown storage class: %s") + } // http error ErrHttpUnreadableResult = func() *CmdError { return NewHttpResultCmdError(1, "http response is unreadable, the uri is: %s, the error is: %s") diff --git a/tools-v2/internal/utils/proto.go b/tools-v2/internal/utils/proto.go index fc53053a9e..1ea6529561 100644 --- a/tools-v2/internal/utils/proto.go +++ b/tools-v2/internal/utils/proto.go @@ -223,3 +223,13 @@ func ParseThrottleType(typeStr string) (nameserver2.ThrottleType, *cmderror.CmdE } return nameserver2.ThrottleType(throttleType), retErr } + +func TranslateStorageClass(storageclass string) (common.StorageClass, *cmderror.CmdError) { + value, found := common.StorageClass_value[storageclass] + var retErr cmderror.CmdError + if !found { + retErr = *cmderror.ErrUnknownStorageClass() + retErr.Format(storageclass) + } + return common.StorageClass(value), &retErr +} diff --git a/tools-v2/pkg/cli/command/curvefs/create/fs/fs.go b/tools-v2/pkg/cli/command/curvefs/create/fs/fs.go index 9c28858133..d6aab1079a 100644 --- a/tools-v2/pkg/cli/command/curvefs/create/fs/fs.go +++ b/tools-v2/pkg/cli/command/curvefs/create/fs/fs.go @@ -41,9 +41,9 @@ import ( const ( fsExample = `$ curve fs create fs --fsname test1 -$ curve fs create fs --fsname test1 --fstype s3 --s3.ak AK --s3.sk SK --s3.endpoint http://localhost:9000 --s3.bucketname test1 --s3.blocksize 4MiB --s3.chunksize 4MiB +$ curve fs create fs --fsname test1 --fstype s3 --s3.ak AK --s3.sk SK --s3.endpoint http://localhost:9000 --s3.bucketname test1 --s3.blocksize 4MiB --s3.chunksize 4MiB --s3.storageclass STANDARD $ curve fs create fs --fsname test1 --fstype volume --volume.bitmaplocation AtStart --volume.blockgroupsize 128MiB --volume.blocksize 4KiB --volume.name volume --volume.password password --volume.size 1MiB --volume.slicesize 1MiB --volume.user user -$ curve fs create fs --fsname test1 --fstype hybrid --s3.ak AK --s3.sk SK --s3.endpoint http://localhost:9000 --s3.bucketname test1 --s3.blocksize 4MiB --s3.chunksize 4MiB --volume.bitmaplocation AtStart --volume.blockgroupsize 128MiB --volume.blocksize 4KiB --volume.name volume --volume.password password --volume.size 1MiB --volume.slicesize 1MiB --volume.user user` +$ curve fs create fs --fsname test1 --fstype hybrid --s3.ak AK --s3.sk SK --s3.endpoint http://localhost:9000 --s3.bucketname test1 --s3.blocksize 4MiB --s3.chunksize 4MiB --s3.storageclass STANDARD --volume.bitmaplocation AtStart --volume.blockgroupsize 128MiB --volume.blocksize 4KiB --volume.name volume --volume.password password --volume.size 1MiB --volume.slicesize 1MiB --volume.user user` ) type CreateFsRpc struct { @@ -98,6 +98,7 @@ func (fCmd *FsCommand) AddFlags() { config.AddS3BucknameOptionFlag(fCmd.Cmd) config.AddS3BlocksizeOptionFlag(fCmd.Cmd) config.AddS3ChunksizeOptionFlag(fCmd.Cmd) + config.AddS3StorageclassOptionFlag(fCmd.Cmd) // volume config.AddVolumeSizeOptionFlag(fCmd.Cmd) config.AddVolumeBlockgroupsizeOptionFlag(fCmd.Cmd) @@ -209,14 +210,19 @@ func setS3Info(detail *mds.FsDetail, cmd *cobra.Command) *cmderror.CmdError { errParse.Format(config.CURVEFS_S3_CHUNKSIZE, chunksizeStr) return errParse } - + storageclassStr := config.GetFlagString(cmd, config.CURVEFS_S3_STORAGECLASS) + storageclass, errStorageclass := cobrautil.TranslateStorageClass(storageclassStr) + if errStorageclass.TypeCode() != cmderror.CODE_SUCCESS { + return errStorageclass + } info := &common.S3Info{ - Ak: &ak, - Sk: &sk, - Endpoint: &endpoint, - Bucketname: &bucketname, - BlockSize: &blocksize, - ChunkSize: &chunksize, + Ak: &ak, + Sk: &sk, + Endpoint: &endpoint, + Bucketname: &bucketname, + BlockSize: &blocksize, + ChunkSize: &chunksize, + StorageClass: &storageclass, } detail.S3Info = info return cmderror.ErrSuccess() diff --git a/tools-v2/pkg/config/fs.go b/tools-v2/pkg/config/fs.go index 304400db1c..b76d8f0cc0 100644 --- a/tools-v2/pkg/config/fs.go +++ b/tools-v2/pkg/config/fs.go @@ -115,6 +115,9 @@ const ( CURVEFS_S3_CHUNKSIZE = "s3.chunksize" VIPER_CURVEFS_S3CHUNKSIZE = "curvefs.s3.chunksize" CURVEFS_DEFAULT_S3_CHUNKSIZE = "64 MiB" + CURVEFS_S3_STORAGECLASS = "s3.storageclass" + VIPER_CURVEFS_S3_STORAGECLASS = "curvefs.s3.storageclass" + CURVEFS_DEFAULT_STORAGECLASS = "NOT_SET" // Volume CURVEFS_VOLUME_SIZE = "volume.size" VIPER_CURVEFS_VOLUME_SIZE = "curvefs.volume.size" @@ -174,12 +177,13 @@ var ( CURVEFS_STORAGE: VIPER_CURVEFS_STORAGE, // S3 - CURVEFS_S3_AK: VIPER_CURVEFS_S3_AK, - CURVEFS_S3_SK: VIPER_CURVEFS_S3_SK, - CURVEFS_S3_ENDPOINT: VIPER_CURVEFS_S3_ENDPOINT, - CURVEFS_S3_BUCKETNAME: VIPER_CURVEFS_S3_BUCKETNAME, - CURVEFS_S3_BLOCKSIZE: VIPER_CURVEFS_S3_BLOCKSIZE, - CURVEFS_S3_CHUNKSIZE: VIPER_CURVEFS_S3CHUNKSIZE, + CURVEFS_S3_AK: VIPER_CURVEFS_S3_AK, + CURVEFS_S3_SK: VIPER_CURVEFS_S3_SK, + CURVEFS_S3_ENDPOINT: VIPER_CURVEFS_S3_ENDPOINT, + CURVEFS_S3_BUCKETNAME: VIPER_CURVEFS_S3_BUCKETNAME, + CURVEFS_S3_BLOCKSIZE: VIPER_CURVEFS_S3_BLOCKSIZE, + CURVEFS_S3_CHUNKSIZE: VIPER_CURVEFS_S3CHUNKSIZE, + CURVEFS_S3_STORAGECLASS: VIPER_CURVEFS_S3_STORAGECLASS, // Volume CURVEFS_VOLUME_SIZE: VIPER_CURVEFS_VOLUME_SIZE, @@ -204,12 +208,13 @@ var ( CURVEFS_STORAGE: CURVEFS_DEFAULT_STORAGE, // S3 - CURVEFS_S3_AK: CURVEFS_DEFAULT_S3_AK, - CURVEFS_S3_SK: CURVEFS_DEFAULT_S3_SK, - CURVEFS_S3_ENDPOINT: CURVEFS_DEFAULT_ENDPOINT, - CURVEFS_S3_BUCKETNAME: CURVEFS_DEFAULT_S3_BUCKETNAME, - CURVEFS_S3_BLOCKSIZE: CURVEFS_DEFAULT_S3_BLOCKSIZE, - CURVEFS_S3_CHUNKSIZE: CURVEFS_DEFAULT_S3_CHUNKSIZE, + CURVEFS_S3_AK: CURVEFS_DEFAULT_S3_AK, + CURVEFS_S3_SK: CURVEFS_DEFAULT_S3_SK, + CURVEFS_S3_ENDPOINT: CURVEFS_DEFAULT_ENDPOINT, + CURVEFS_S3_BUCKETNAME: CURVEFS_DEFAULT_S3_BUCKETNAME, + CURVEFS_S3_BLOCKSIZE: CURVEFS_DEFAULT_S3_BLOCKSIZE, + CURVEFS_S3_CHUNKSIZE: CURVEFS_DEFAULT_S3_CHUNKSIZE, + CURVEFS_S3_STORAGECLASS: CURVEFS_DEFAULT_STORAGECLASS, // Volume CURVEFS_VOLUME_SIZE: CURVEFS_DEFAULT_VOLUME_SIZE, @@ -676,6 +681,11 @@ func AddS3ChunksizeOptionFlag(cmd *cobra.Command) { AddStringOptionFlag(cmd, CURVEFS_S3_CHUNKSIZE, "s3 chunksize") } +// S3.StorageClass [option] +func AddS3StorageclassOptionFlag(cmd *cobra.Command) { + AddStringOptionFlag(cmd, CURVEFS_S3_STORAGECLASS, "s3 storageclass") +} + // volume.size [option] func AddVolumeSizeOptionFlag(cmd *cobra.Command) { AddStringOptionFlag(cmd, CURVEFS_VOLUME_SIZE, "volume size") From 156c508f03d15c21fd11dd1a7a49fcbc9aa0d50a Mon Sep 17 00:00:00 2001 From: tianpingan Date: Mon, 25 Dec 2023 09:24:51 +0000 Subject: [PATCH 5/8] fix cpp check Signed-off-by: tianpingan --- curvefs/src/client/s3/client_s3_cache_manager.cpp | 2 +- curvefs/src/client/s3/disk_cache_write.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/curvefs/src/client/s3/client_s3_cache_manager.cpp b/curvefs/src/client/s3/client_s3_cache_manager.cpp index c2784def57..0520a14fde 100644 --- a/curvefs/src/client/s3/client_s3_cache_manager.cpp +++ b/curvefs/src/client/s3/client_s3_cache_manager.cpp @@ -2544,7 +2544,7 @@ void DataCache::FlushTaskExecute( s3Tasks.begin(), s3Tasks.end(), [&](const std::shared_ptr &context) { context->cb = s3cb; - context->putObjectOptions = curve::common::PutObjectOptions{storageClass: s3ClientAdaptor_->GetStorageClass()}; + context->putObjectOptions = curve::common::PutObjectOptions{s3ClientAdaptor_->GetStorageClass()}; if (CachePolicy::WRCache == cachePolicy) { context->type = curve::common::ContextType::Disk; s3ClientAdaptor_->GetDiskCacheManager()->Enqueue(context); diff --git a/curvefs/src/client/s3/disk_cache_write.cpp b/curvefs/src/client/s3/disk_cache_write.cpp index ee48971984..7c2b702136 100644 --- a/curvefs/src/client/s3/disk_cache_write.cpp +++ b/curvefs/src/client/s3/disk_cache_write.cpp @@ -170,7 +170,7 @@ int DiskCacheWrite::UploadFile(const std::string &name, }; auto context = std::make_shared( name, buffer, fileSize, cb, curve::common::ContextType::S3); - context->putObjectOptions = curve::common::PutObjectOptions{storageClass: storageClass_}; + context->putObjectOptions = curve::common::PutObjectOptions{storageClass_}; client_->UploadAsync(context); VLOG(9) << "async upload end, file = " << name; return 0; @@ -427,7 +427,7 @@ int DiskCacheWrite::UploadAllCacheWriteFile() { auto context = std::make_shared( curvefs::common::s3util::GenPathByObjName(*iter, objectPrefix_), buffer, fileSize, cb, curve::common::ContextType::S3); - context->putObjectOptions = curve::common::PutObjectOptions{storageClass: storageClass_}; + context->putObjectOptions = curve::common::PutObjectOptions{storageClass_}; client_->UploadAsync(context); } if (pendingReq.load(std::memory_order_seq_cst)) { From 8508c60de9cdf41150a4cb19655c801355e30678 Mon Sep 17 00:00:00 2001 From: tianpingan Date: Tue, 26 Dec 2023 02:42:30 +0000 Subject: [PATCH 6/8] fix cpp lint Signed-off-by: tianpingan --- curvefs/src/client/common/config.cpp | 4 +- .../src/client/s3/client_s3_cache_manager.cpp | 3 +- curvefs/src/client/s3/disk_cache_manager.cpp | 4 +- curvefs/src/client/s3/disk_cache_write.cpp | 3 +- curvefs/src/client/s3/disk_cache_write.h | 3 +- curvefs/src/metaserver/s3compact_inode.cpp | 5 +- .../src/tools/create/curvefs_create_fs.cpp | 85 ++++++++++--------- 7 files changed, 59 insertions(+), 48 deletions(-) diff --git a/curvefs/src/client/common/config.cpp b/curvefs/src/client/common/config.cpp index bb0e7fda4a..d1911b40e0 100644 --- a/curvefs/src/client/common/config.cpp +++ b/curvefs/src/client/common/config.cpp @@ -488,7 +488,9 @@ void S3Info2FsS3Option(const curvefs::common::S3Info& s3, fsS3Opt->blockSize = s3.blocksize(); fsS3Opt->chunkSize = s3.chunksize(); fsS3Opt->objectPrefix = s3.has_objectprefix() ? s3.objectprefix() : 0; - fsS3Opt->storageClass = s3.has_storageclass() ? Aws::S3::Model::StorageClass(s3.storageclass()) : Aws::S3::Model::StorageClass::NOT_SET; + fsS3Opt->storageClass = + s3.has_storageclass() ? Aws::S3::Model::StorageClass(s3.storageclass()) + : Aws::S3::Model::StorageClass::NOT_SET; } } // namespace common diff --git a/curvefs/src/client/s3/client_s3_cache_manager.cpp b/curvefs/src/client/s3/client_s3_cache_manager.cpp index 0520a14fde..88a041cc2f 100644 --- a/curvefs/src/client/s3/client_s3_cache_manager.cpp +++ b/curvefs/src/client/s3/client_s3_cache_manager.cpp @@ -2544,7 +2544,8 @@ void DataCache::FlushTaskExecute( s3Tasks.begin(), s3Tasks.end(), [&](const std::shared_ptr &context) { context->cb = s3cb; - context->putObjectOptions = curve::common::PutObjectOptions{s3ClientAdaptor_->GetStorageClass()}; + context->putObjectOptions = curve::common::PutObjectOptions{ + s3ClientAdaptor_->GetStorageClass()}; if (CachePolicy::WRCache == cachePolicy) { context->type = curve::common::ContextType::Disk; s3ClientAdaptor_->GetDiskCacheManager()->Enqueue(context); diff --git a/curvefs/src/client/s3/disk_cache_manager.cpp b/curvefs/src/client/s3/disk_cache_manager.cpp index 4254af6d5e..9a89cd3d72 100644 --- a/curvefs/src/client/s3/disk_cache_manager.cpp +++ b/curvefs/src/client/s3/disk_cache_manager.cpp @@ -96,7 +96,6 @@ int DiskCacheManager::Init(std::shared_ptr client, const S3ClientAdaptorOption option) { LOG(INFO) << "DiskCacheManager init start."; client_ = client; - option_ = option; FLAGS_diskTrimCheckIntervalSec = option.diskCacheOpt.trimCheckIntervalSec; FLAGS_diskFullRatio = option.diskCacheOpt.fullRatio; @@ -108,7 +107,8 @@ int DiskCacheManager::Init(std::shared_ptr client, cmdTimeoutSec_ = option.diskCacheOpt.cmdTimeoutSec; objectPrefix_ = option.objectPrefix; cacheWrite_->Init(client_, posixWrapper_, cacheDir_, objectPrefix_, - option.diskCacheOpt.asyncLoadPeriodMs, cachedObjName_, option.storageClass); + option.diskCacheOpt.asyncLoadPeriodMs, cachedObjName_, + option.storageClass); cacheRead_->Init(posixWrapper_, cacheDir_, objectPrefix_); int ret; ret = CreateDir(); diff --git a/curvefs/src/client/s3/disk_cache_write.cpp b/curvefs/src/client/s3/disk_cache_write.cpp index 7c2b702136..4d9b7b2cc5 100644 --- a/curvefs/src/client/s3/disk_cache_write.cpp +++ b/curvefs/src/client/s3/disk_cache_write.cpp @@ -427,7 +427,8 @@ int DiskCacheWrite::UploadAllCacheWriteFile() { auto context = std::make_shared( curvefs::common::s3util::GenPathByObjName(*iter, objectPrefix_), buffer, fileSize, cb, curve::common::ContextType::S3); - context->putObjectOptions = curve::common::PutObjectOptions{storageClass_}; + context->putObjectOptions = + curve::common::PutObjectOptions{storageClass_}; client_->UploadAsync(context); } if (pendingReq.load(std::memory_order_seq_cst)) { diff --git a/curvefs/src/client/s3/disk_cache_write.h b/curvefs/src/client/s3/disk_cache_write.h index b87017601a..7dec354846 100644 --- a/curvefs/src/client/s3/disk_cache_write.h +++ b/curvefs/src/client/s3/disk_cache_write.h @@ -86,7 +86,8 @@ class DiskCacheWrite : public DiskCacheBase { const std::string cacheDir, uint32_t objectPrefix, uint64_t asyncLoadPeriodMs, std::shared_ptr> cachedObjName, - Aws::S3::Model::StorageClass storageClass = Aws::S3::Model::StorageClass::NOT_SET); + Aws::S3::Model::StorageClass storageClass = + Aws::S3::Model::StorageClass::NOT_SET); /** * @brief write obj to write cache disk * @param[in] client S3Client diff --git a/curvefs/src/metaserver/s3compact_inode.cpp b/curvefs/src/metaserver/s3compact_inode.cpp index 5f5c1fa1ca..791f06b021 100644 --- a/curvefs/src/metaserver/s3compact_inode.cpp +++ b/curvefs/src/metaserver/s3compact_inode.cpp @@ -354,7 +354,10 @@ int CompactInodeJob::WriteFullChunk( } const auto& s3Info = fsInfo.detail().s3info(); curve::common::PutObjectOptions putObjectOption; - putObjectOption.storageClass = s3Info.has_storageclass() ? Aws::S3::Model::StorageClass(s3Info.storageclass()) : Aws::S3::Model::StorageClass::NOT_SET; + putObjectOption.storageClass = + s3Info.has_storageclass() + ? Aws::S3::Model::StorageClass(s3Info.storageclass()) + : Aws::S3::Model::StorageClass::NOT_SET; uint64_t offRoundDown = newOff / chunkSize * chunkSize; uint64_t startIndex = (newOff - newOff / chunkSize * chunkSize) / blockSize; for (uint64_t index = startIndex; diff --git a/curvefs/src/tools/create/curvefs_create_fs.cpp b/curvefs/src/tools/create/curvefs_create_fs.cpp index 1a562810a4..b6cb0d338d 100644 --- a/curvefs/src/tools/create/curvefs_create_fs.cpp +++ b/curvefs/src/tools/create/curvefs_create_fs.cpp @@ -77,46 +77,48 @@ using ::curvefs::common::BitmapLocation_Parse; void CreateFsTool::PrintHelp() { CurvefsToolRpc::PrintHelp(); std::cout << " -fsName=" << FLAGS_fsName << " [-user=" << FLAGS_user - << "] [-capacity=" << FLAGS_capacity - << "] [-blockSize=" << FLAGS_blockSize - << "] [-enableSumInDir=" << FLAGS_enableSumInDir - << "] [-mdsAddr=" << FLAGS_mdsAddr - << "] [-rpcTimeoutMs=" << FLAGS_rpcTimeoutMs - << " -rpcRetryTimes=" << FLAGS_rpcRetryTimes << "]" - << "] [recycleTimeHour=" << FLAGS_recycleTimeHour - << "] \n[-fsType=volume -volumeBlockGroupSize=" - << FLAGS_volumeBlockGroupSize - << " -volumeBlockSize=" << FLAGS_volumeBlockSize - << " -volumeName=" << FLAGS_volumeName - << " -volumeUser=" << FLAGS_volumeUser - << " -volumePassword=" << FLAGS_volumePassword - << " -volumeBitmapLocation=AtStart|AtEnd" - << " -volumeAutoExtend=false|true" - << " -volumeExtendFactor=" << FLAGS_volumeExtendFactor - << " -volumeCluster=" << FLAGS_volumeCluster - << "]\n[-fsType=s3 -s3_ak=" << FLAGS_s3_ak - << " -s3_sk=" << FLAGS_s3_sk - << " -s3_endpoint=" << FLAGS_s3_endpoint - << " -s3_bucket_name=" << FLAGS_s3_bucket_name - << " -s3_blocksize=" << FLAGS_s3_blocksize - << " -s3_chunksize=" << FLAGS_s3_chunksize - << " -s3_objectPrefix=" << FLAGS_s3_objectPrefix - << " -s3_storageClass=NOT_SET|STANDARD|REDUCED_REDUNDANCY|STANDARD_IA|ONEZONE_IA|INTELLIGENT_TIERING|GLACIER|DEEP_ARCHIVE" - << "]\n[-fsType=hybrid -volumeBlockGroupSize=" - << FLAGS_volumeBlockGroupSize - << " -volumeBlockSize=" << FLAGS_volumeBlockSize - << " -volumeName=" << FLAGS_volumeName - << " -volumeUser=" << FLAGS_volumeUser - << " -volumePassword=" << FLAGS_volumePassword - << " -volumeBitmapLocation=AtStart|AtEnd" - << " -s3_ak=" << FLAGS_s3_ak << " -s3_sk=" << FLAGS_s3_sk - << " -s3_endpoint=" << FLAGS_s3_endpoint - << " -s3_bucket_name=" << FLAGS_s3_bucket_name - << " -s3_blocksize=" << FLAGS_s3_blocksize - << " -s3_chunksize=" << FLAGS_s3_chunksize - << " -s3_objectPrefix=" << FLAGS_s3_objectPrefix - << " -s3_storageClass=NOT_SET|STANDARD|REDUCED_REDUNDANCY|STANDARD_IA|ONEZONE_IA|INTELLIGENT_TIERING|GLACIER|DEEP_ARCHIVE" - << "]" << std::endl; + << "] [-capacity=" << FLAGS_capacity + << "] [-blockSize=" << FLAGS_blockSize + << "] [-enableSumInDir=" << FLAGS_enableSumInDir + << "] [-mdsAddr=" << FLAGS_mdsAddr + << "] [-rpcTimeoutMs=" << FLAGS_rpcTimeoutMs + << " -rpcRetryTimes=" << FLAGS_rpcRetryTimes << "]" + << "] [recycleTimeHour=" << FLAGS_recycleTimeHour + << "] \n[-fsType=volume -volumeBlockGroupSize=" + << FLAGS_volumeBlockGroupSize + << " -volumeBlockSize=" << FLAGS_volumeBlockSize + << " -volumeName=" << FLAGS_volumeName + << " -volumeUser=" << FLAGS_volumeUser + << " -volumePassword=" << FLAGS_volumePassword + << " -volumeBitmapLocation=AtStart|AtEnd" + << " -volumeAutoExtend=false|true" + << " -volumeExtendFactor=" << FLAGS_volumeExtendFactor + << " -volumeCluster=" << FLAGS_volumeCluster + << "]\n[-fsType=s3 -s3_ak=" << FLAGS_s3_ak + << " -s3_sk=" << FLAGS_s3_sk + << " -s3_endpoint=" << FLAGS_s3_endpoint + << " -s3_bucket_name=" << FLAGS_s3_bucket_name + << " -s3_blocksize=" << FLAGS_s3_blocksize + << " -s3_chunksize=" << FLAGS_s3_chunksize + << " -s3_objectPrefix=" << FLAGS_s3_objectPrefix + << " -s3_storageClass=NOT_SET|STANDARD|REDUCED_REDUNDANCY|STANDARD_IA|" + "ONEZONE_IA|INTELLIGENT_TIERING|GLACIER|DEEP_ARCHIVE" + << "]\n[-fsType=hybrid -volumeBlockGroupSize=" + << FLAGS_volumeBlockGroupSize + << " -volumeBlockSize=" << FLAGS_volumeBlockSize + << " -volumeName=" << FLAGS_volumeName + << " -volumeUser=" << FLAGS_volumeUser + << " -volumePassword=" << FLAGS_volumePassword + << " -volumeBitmapLocation=AtStart|AtEnd" + << " -s3_ak=" << FLAGS_s3_ak << " -s3_sk=" << FLAGS_s3_sk + << " -s3_endpoint=" << FLAGS_s3_endpoint + << " -s3_bucket_name=" << FLAGS_s3_bucket_name + << " -s3_blocksize=" << FLAGS_s3_blocksize + << " -s3_chunksize=" << FLAGS_s3_chunksize + << " -s3_objectPrefix=" << FLAGS_s3_objectPrefix + << " -s3_storageClass=NOT_SET|STANDARD|REDUCED_REDUNDANCY|STANDARD_IA|" + "ONEZONE_IA|INTELLIGENT_TIERING|GLACIER|DEEP_ARCHIVE" + << "]" << std::endl; } void CreateFsTool::AddUpdateFlags() { @@ -186,7 +188,8 @@ int CreateFsTool::Init() { curvefs::common::StorageClass storageClass; if (!StorageClass_Parse(FLAGS_s3_storageClass, &storageClass)) { std::cerr << "Parse storageClass error, only support " - "NOT_SET|STANDARD|REDUCED_REDUNDANCY|STANDARD_IA|ONEZONE_IA|INTELLIGENT_TIERING|GLACIER|DEEP_ARCHIVE"; + "NOT_SET|STANDARD|REDUCED_REDUNDANCY|STANDARD_IA|" + "ONEZONE_IA|INTELLIGENT_TIERING|GLACIER|DEEP_ARCHIVE"; return -1; } s3->set_storageclass(storageClass); From 7f1cf5881d79e62477bd4793fc1f1bbcc9ede1c9 Mon Sep 17 00:00:00 2001 From: tianpingan Date: Tue, 26 Dec 2023 06:43:08 +0000 Subject: [PATCH 7/8] add storageClass in tools.conf Signed-off-by: tianpingan --- curvefs/conf/tools.conf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/curvefs/conf/tools.conf b/curvefs/conf/tools.conf index e795a8c934..73c552d8ce 100644 --- a/curvefs/conf/tools.conf +++ b/curvefs/conf/tools.conf @@ -38,6 +38,10 @@ s3.useVirtualAddressing=false # s3 objectPrefix, if set 0, means no prefix, if set 1, means inode prefix # if set 2 and other values mean hash prefix s3.objectPrefix=0 +# s3 storage class +# support NOT_SET|STANDARD|REDUCED_REDUNDANCY|STANDARD_IA|ONEZONE_IA|INTELLIGENT_TIERING|GLACIER|DEEP_ARCHIVE +s3.storageClass=NOT_SET + # statistic info in xattr, hardlink will not be supported when enable enableSumInDir=false From cc0e7730d97635e70ee87a66c5b935e622d01004 Mon Sep 17 00:00:00 2001 From: tianpingan Date: Tue, 26 Dec 2023 07:56:31 +0000 Subject: [PATCH 8/8] fix cpp lint Signed-off-by: tianpingan --- src/common/s3_adapter.cpp | 6 ++++-- src/common/s3_adapter.h | 12 ++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/common/s3_adapter.cpp b/src/common/s3_adapter.cpp index 0308be6fd6..d5547618c0 100644 --- a/src/common/s3_adapter.cpp +++ b/src/common/s3_adapter.cpp @@ -280,7 +280,8 @@ bool S3Adapter::BucketExist() { } int S3Adapter::PutObject(const Aws::String &key, const char *buffer, - const size_t bufferSize, const PutObjectOptions &options) { + const size_t bufferSize, + const PutObjectOptions &options) { Aws::S3::Model::PutObjectRequest request; request.SetBucket(bucketName_); request.SetKey(key); @@ -305,7 +306,8 @@ int S3Adapter::PutObject(const Aws::String &key, const char *buffer, } } -int S3Adapter::PutObject(const Aws::String &key, const std::string &data, const PutObjectOptions &options) { +int S3Adapter::PutObject(const Aws::String &key, const std::string &data, + const PutObjectOptions &options) { return PutObject(key, data.data(), data.size(), options); } /* diff --git a/src/common/s3_adapter.h b/src/common/s3_adapter.h index 5262b218dd..53d6a99ff4 100644 --- a/src/common/s3_adapter.h +++ b/src/common/s3_adapter.h @@ -257,7 +257,8 @@ class S3Adapter { * @return:0 上传成功/ -1 上传失败 */ virtual int PutObject(const Aws::String &key, const char *buffer, - const size_t bufferSize, const PutObjectOptions& options = PutObjectOptions{}); + const size_t bufferSize, + const PutObjectOptions &options = PutObjectOptions{}); // Get object to buffer[bufferSize] // int GetObject(const Aws::String &key, void *buffer, // const int bufferSize); @@ -267,7 +268,8 @@ class S3Adapter { * @param 数据内容 * @return:0 上传成功/ -1 上传失败 */ - virtual int PutObject(const Aws::String &key, const std::string &data, const PutObjectOptions& options = PutObjectOptions{}); + virtual int PutObject(const Aws::String &key, const std::string &data, + const PutObjectOptions &options = PutObjectOptions{}); virtual void PutObjectAsync(std::shared_ptr context); /** * Get object from s3, @@ -404,7 +406,8 @@ class FakeS3Adapter : public S3Adapter { bool BucketExist() override { return true; } int PutObject(const Aws::String &key, const char *buffer, - const size_t bufferSize, const curve::common::PutObjectOptions& options) override { + const size_t bufferSize, + const curve::common::PutObjectOptions &options) override { (void)key; (void)buffer; (void)bufferSize; @@ -412,7 +415,8 @@ class FakeS3Adapter : public S3Adapter { return 0; } - int PutObject(const Aws::String &key, const std::string &data, const curve::common::PutObjectOptions& options) override { + int PutObject(const Aws::String &key, const std::string &data, + const curve::common::PutObjectOptions &options) override { (void)key; (void)data; (void)options;