Skip to content

Commit ba7914f

Browse files
rock-gitchuandew
authored andcommitted
[fix][mdsv2] Fixup setattr issues.
1 parent 8365ba5 commit ba7914f

File tree

9 files changed

+51
-12
lines changed

9 files changed

+51
-12
lines changed

proto

src/client/vfs/meta/v2/mds_client.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,8 @@ Status MDSClient::SetAttr(Ino ino, const Attr& attr, int to_set,
619619

620620
out_attr = ToAttr(response.inode());
621621

622+
parent_memo_->UpsertVersion(ino, response.inode().version());
623+
622624
return Status::OK();
623625
}
624626

@@ -669,6 +671,8 @@ Status MDSClient::SetXAttr(Ino ino, const std::string& name,
669671
return status;
670672
}
671673

674+
parent_memo_->UpsertVersion(ino, response.inode_version());
675+
672676
return Status::OK();
673677
}
674678

src/mdsv2/filesystem/filesystem.cc

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include "mdsv2/common/logging.h"
3737
#include "mdsv2/common/status.h"
3838
#include "mdsv2/common/tracing.h"
39+
#include "mdsv2/common/type.h"
3940
#include "mdsv2/filesystem/dentry.h"
4041
#include "mdsv2/filesystem/file_session.h"
4142
#include "mdsv2/filesystem/fs_info.h"
@@ -1309,10 +1310,15 @@ Status FileSystem::SetAttr(Context& ctx, Ino ino, const SetAttrParam& param, Ent
13091310
auto& result = operation.GetResult();
13101311
auto& attr = result.attr;
13111312

1312-
// update cache
1313-
inode->UpdateIf(attr);
1313+
entry_out.attr = attr;
13141314

1315-
entry_out.attr = std::move(attr);
1315+
// update cache
1316+
if (IsDir(ino) && IsParentHashPartition()) {
1317+
inode->UpdateIf(attr);
1318+
NotifyBuddyRefreshInode(std::move(attr));
1319+
} else {
1320+
inode->UpdateIf(std::move(attr));
1321+
}
13161322

13171323
return Status::OK();
13181324
}
@@ -1353,7 +1359,7 @@ Status FileSystem::GetXAttr(Context& ctx, Ino ino, const std::string& name, std:
13531359
return Status::OK();
13541360
}
13551361

1356-
Status FileSystem::SetXAttr(Context& ctx, Ino ino, const Inode::XAttrMap& xattrs) {
1362+
Status FileSystem::SetXAttr(Context& ctx, Ino ino, const Inode::XAttrMap& xattrs, uint64_t& version) {
13571363
DINGO_LOG(DEBUG) << fmt::format("[fs.{}] setxattr ino({}).", fs_id_, ino);
13581364

13591365
if (!CanServe()) {
@@ -1385,8 +1391,15 @@ Status FileSystem::SetXAttr(Context& ctx, Ino ino, const Inode::XAttrMap& xattrs
13851391
auto& result = operation.GetResult();
13861392
auto& attr = result.attr;
13871393

1394+
version = attr.version();
1395+
13881396
// update cache
1389-
inode->UpdateIf(std::move(attr));
1397+
if (IsDir(ino) && IsParentHashPartition()) {
1398+
inode->UpdateIf(attr);
1399+
NotifyBuddyRefreshInode(std::move(attr));
1400+
} else {
1401+
inode->UpdateIf(std::move(attr));
1402+
}
13901403

13911404
return Status::OK();
13921405
}

src/mdsv2/filesystem/filesystem.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ class FileSystem : public std::enable_shared_from_this<FileSystem> {
160160
// xattr
161161
Status GetXAttr(Context& ctx, Ino ino, Inode::XAttrMap& xattr);
162162
Status GetXAttr(Context& ctx, Ino ino, const std::string& name, std::string& value);
163-
Status SetXAttr(Context& ctx, Ino ino, const Inode::XAttrMap& xattrs);
163+
Status SetXAttr(Context& ctx, Ino ino, const Inode::XAttrMap& xattrs, uint64_t& version);
164164

165165
// rename
166166
struct RenameParam {

src/mdsv2/filesystem/store_operation.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1292,6 +1292,11 @@ Status OperationProcessor::RunAlone(Operation* operation) {
12921292
break;
12931293
}
12941294

1295+
DINGO_LOG(WARNING) << fmt::format("[operation.{}.{}][{}][{}us] alone run {} fail, onepc({}) retry({}) status({}).",
1296+
operation->GetFsId(), operation->GetIno(), txn_id,
1297+
Helper::TimestampUs() - time_us, operation->OpName(), is_one_pc, retry,
1298+
status.error_str());
1299+
12951300
} while (++retry < FLAGS_txn_max_retry_times);
12961301

12971302
trace.RecordElapsedTime("store_operate");
@@ -1459,6 +1464,10 @@ void OperationProcessor::ExecuteBatchOperation(BatchOperation& batch_operation)
14591464
break;
14601465
}
14611466

1467+
DINGO_LOG(WARNING) << fmt::format(
1468+
"[operation.{}.{}][{}][{}us] batch run ({}) fail, count({}) onepc({}) retry({}) status({}).", fs_id, ino,
1469+
txn_id, Helper::TimestampUs() - time_us, op_names, count, is_one_pc, retry, status.error_str());
1470+
14621471
} while (++retry < FLAGS_txn_max_retry_times);
14631472

14641473
SetElapsedTime(batch_operation, "store_operate");

src/mdsv2/quota/quota.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,13 +390,19 @@ Status QuotaManager::FlushDirUsage() {
390390
std::map<uint64_t, UsageEntry> usages;
391391
for (auto& quota : quotas) {
392392
auto usage = quota->GetUsage();
393+
DINGO_LOG(INFO) << fmt::format("[quota] flush dir usage, ino({}), bytes({}), inodes({}).", quota->GetIno(),
394+
usage.bytes(), usage.inodes());
393395
if (usage.bytes() == 0 && usage.inodes() == 0) {
394396
continue;
395397
}
396398

397399
usages[quota->GetIno()] = usage;
398400
}
399401

402+
if (usages.empty()) {
403+
return Status::OK();
404+
}
405+
400406
Trace trace;
401407
FlushDirUsagesOperation operation(trace, fs_id_, usages);
402408

src/mdsv2/service/mds_service.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1426,12 +1426,14 @@ void MDSServiceImpl::DoSetXAttr(google::protobuf::RpcController* controller, con
14261426
const auto& req_ctx = request->context();
14271427
Context ctx(req_ctx.is_bypass_cache(), req_ctx.inode_version());
14281428

1429-
std::string value;
1430-
status = file_system->SetXAttr(ctx, request->ino(), request->xattrs());
1429+
uint64_t version;
1430+
status = file_system->SetXAttr(ctx, request->ino(), request->xattrs(), version);
14311431
ServiceHelper::SetResponseInfo(ctx.GetTrace(), response->mutable_info());
14321432
if (BAIDU_UNLIKELY(!status.ok())) {
14331433
ServiceHelper::SetError(response->mutable_error(), status.error_code(), status.error_str());
14341434
}
1435+
1436+
response->set_inode_version(version);
14351437
}
14361438

14371439
void MDSServiceImpl::SetXAttr(google::protobuf::RpcController* controller, const pb::mdsv2::SetXAttrRequest* request,

src/mdsv2/storage/dingodb_storage.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,10 @@ Status DingodbTxn::Commit() {
450450
return Status::OK();
451451
}
452452

453-
Trace::Txn DingodbTxn::GetTrace() { return txn_trace_; }
453+
Trace::Txn DingodbTxn::GetTrace() {
454+
txn_trace_.txn_id = ID();
455+
return txn_trace_;
456+
}
454457

455458
} // namespace mdsv2
456459
} // namespace dingofs

test/mdsv2/filesystem/test_filesystem.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -665,7 +665,8 @@ TEST_F(FileSystemTest, SetXAttr) {
665665
Inode::XAttrMap xattr;
666666
xattr.insert({"key3", "value3"});
667667
xattr.insert({"key4", "value4"});
668-
status = fs->SetXAttr(ctx, inode->Ino(), xattr);
668+
uint64_t version;
669+
status = fs->SetXAttr(ctx, inode->Ino(), xattr, version);
669670
ASSERT_TRUE(status.ok()) << "set xattr fail, error: " << status.error_str();
670671
}
671672

@@ -695,7 +696,8 @@ TEST_F(FileSystemTest, GetXAttr) {
695696
Inode::XAttrMap xattr;
696697
xattr.insert({"key3", "value3"});
697698
xattr.insert({"key4", "value4"});
698-
status = fs->SetXAttr(ctx, inode->Ino(), xattr);
699+
uint64_t version;
700+
status = fs->SetXAttr(ctx, inode->Ino(), xattr, version);
699701
ASSERT_TRUE(status.ok()) << "set xattr fail, error: " << status.error_str();
700702

701703
Inode::XAttrMap actual_xattr;

0 commit comments

Comments
 (0)