Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 147109e

Browse files
committedOct 25, 2023
[feat]: curvefs: merge two rpc into one when delete dentry
Signed-off-by: swj <1186093704@qq.com>
1 parent d616bd3 commit 147109e

13 files changed

+55
-103
lines changed
 

‎curvefs/proto/metaserver.proto

+1
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ message DeleteDentryRequest {
131131
required uint64 parentInodeId = 6;
132132
required string name = 7;
133133
optional FsFileType type = 8;
134+
optional Time create = 9;
134135
}
135136

136137
message DeleteDentryResponse {

‎curvefs/src/client/fuse_client.cpp

-38
Original file line numberDiff line numberDiff line change
@@ -363,35 +363,6 @@ CURVEFS_ERROR FuseClient::FuseOpOpen(fuse_req_t req,
363363
return HandleOpenFlags(req, ino, fi, fileOut);
364364
}
365365

366-
CURVEFS_ERROR FuseClient::UpdateParentMCTimeAndNlink(
367-
fuse_ino_t parent, FsFileType type, NlinkChange nlink) {
368-
369-
std::shared_ptr<InodeWrapper> parentInodeWrapper;
370-
auto ret = inodeManager_->GetInode(parent, parentInodeWrapper);
371-
if (ret != CURVEFS_ERROR::OK) {
372-
LOG(ERROR) << "inodeManager get inode fail, ret = " << ret
373-
<< ", inodeid = " << parent;
374-
return ret;
375-
}
376-
377-
{
378-
curve::common::UniqueLock lk = parentInodeWrapper->GetUniqueLock();
379-
parentInodeWrapper->UpdateTimestampLocked(kModifyTime | kChangeTime);
380-
381-
if (FsFileType::TYPE_DIRECTORY == type) {
382-
parentInodeWrapper->UpdateNlinkLocked(nlink);
383-
}
384-
385-
if (option_.fileSystemOption.deferSyncOption.deferDirMtime) {
386-
inodeManager_->ShipToFlush(parentInodeWrapper);
387-
} else {
388-
return parentInodeWrapper->SyncAttr();
389-
}
390-
}
391-
392-
return CURVEFS_ERROR::OK;
393-
}
394-
395366
CURVEFS_ERROR FuseClient::MakeNode(
396367
fuse_req_t req,
397368
fuse_ino_t parent,
@@ -530,15 +501,6 @@ CURVEFS_ERROR FuseClient::DeleteNode(uint64_t ino, fuse_ino_t parent,
530501
return ret;
531502
}
532503

533-
ret = UpdateParentMCTimeAndNlink(parent, type, NlinkChange::kSubOne);
534-
if (ret != CURVEFS_ERROR::OK) {
535-
LOG(ERROR) << "UpdateParentMCTimeAndNlink failed"
536-
<< ", parent: " << parent
537-
<< ", name: " << name
538-
<< ", type: " << type;
539-
return ret;
540-
}
541-
542504
std::shared_ptr<InodeWrapper> inodeWrapper;
543505
ret = inodeManager_->GetInode(ino, inodeWrapper);
544506
if (ret != CURVEFS_ERROR::OK) {

‎curvefs/src/client/fuse_client.h

-3
Original file line numberDiff line numberDiff line change
@@ -415,9 +415,6 @@ class FuseClient {
415415
private:
416416
virtual void FlushData() = 0;
417417

418-
CURVEFS_ERROR UpdateParentMCTimeAndNlink(
419-
fuse_ino_t parent, FsFileType type, NlinkChange nlink);
420-
421418
std::string GenerateNewRecycleName(fuse_ino_t ino,
422419
fuse_ino_t parent, const char* name) {
423420
std::string newName(name);

‎curvefs/src/client/rpcclient/metaserver_client.cpp

+12-13
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,15 @@ class MetaServerClientRpcDoneBase : public google::protobuf::Closure {
107107
MetaServerClientMetric *metric_;
108108
};
109109

110+
Time* MetaServerClientImpl::CreateTime() {
111+
struct timespec now;
112+
clock_gettime(CLOCK_REALTIME, &now);
113+
Time* tm = new Time();
114+
tm->set_sec(now.tv_sec);
115+
tm->set_nsec(now.tv_nsec);
116+
return tm;
117+
}
118+
110119
MetaStatusCode MetaServerClientImpl::GetTxId(uint32_t fsId, uint64_t inodeId,
111120
uint32_t *partitionId,
112121
uint64_t *txId) {
@@ -255,12 +264,7 @@ MetaStatusCode MetaServerClientImpl::CreateDentry(const Dentry &dentry) {
255264
d->set_txid(txId);
256265
d->set_type(dentry.type());
257266
request.set_allocated_dentry(d);
258-
struct timespec now;
259-
clock_gettime(CLOCK_REALTIME, &now);
260-
Time *tm = new Time();
261-
tm->set_sec(now.tv_sec);
262-
tm->set_nsec(now.tv_nsec);
263-
request.set_allocated_create(tm);
267+
request.set_allocated_create(CreateTime());
264268
curvefs::metaserver::MetaServerService_Stub stub(channel);
265269
stub.CreateDentry(cntl, &request, &response, nullptr);
266270

@@ -321,7 +325,7 @@ MetaStatusCode MetaServerClientImpl::DeleteDentry(uint32_t fsId,
321325
request.set_name(name);
322326
request.set_txid(txId);
323327
request.set_type(type);
324-
328+
request.set_allocated_create(CreateTime());
325329
curvefs::metaserver::MetaServerService_Stub stub(channel);
326330
stub.DeleteDentry(cntl, &request, &response, nullptr);
327331

@@ -1147,12 +1151,7 @@ MetaStatusCode MetaServerClientImpl::CreateInode(const InodeParam &param,
11471151
request.set_rdev(param.rdev);
11481152
request.set_symlink(param.symlink);
11491153
request.set_parent(param.parent);
1150-
struct timespec now;
1151-
clock_gettime(CLOCK_REALTIME, &now);
1152-
Time *tm = new Time();
1153-
tm->set_sec(now.tv_sec);
1154-
tm->set_nsec(now.tv_nsec);
1155-
request.set_allocated_create(tm);
1154+
request.set_allocated_create(CreateTime());
11561155
curvefs::metaserver::MetaServerService_Stub stub(channel);
11571156
stub.CreateInode(cntl, &request, &response, nullptr);
11581157

‎curvefs/src/client/rpcclient/metaserver_client.h

+2
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,8 @@ class MetaServerClientImpl : public MetaServerClient {
298298

299299
bool HandleS3MetaStreamBuffer(butil::IOBuf* buffer, S3ChunkInfoMap* out);
300300

301+
Time* CreateTime();
302+
301303
private:
302304
ExcutorOpt opt_;
303305
ExcutorOpt optInternal_;

‎curvefs/src/metaserver/inode_manager.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -541,10 +541,11 @@ MetaStatusCode InodeManager::PaddingInodeS3ChunkInfo(int32_t fsId,
541541
}
542542

543543
MetaStatusCode InodeManager::UpdateInodeWhenCreateOrRemoveSubNode(
544-
const Dentry& dentry, uint64_t now, uint32_t now_ns, bool isCreate,
545-
int64_t logIndex) {
544+
const Dentry& dentry, const Time& tm, bool isCreate, int64_t logIndex) {
546545
uint64_t fsId = dentry.fsid();
547546
uint64_t parentInodeId = dentry.parentinodeid();
547+
uint64_t now = tm.sec();
548+
uint32_t now_ns = tm.nsec();
548549
FsFileType type = dentry.type();
549550
MetaStatusCode ret = MetaStatusCode::OK;
550551

‎curvefs/src/metaserver/inode_manager.h

+2-5
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,8 @@ class InodeManager {
105105
S3ChunkInfoMap* m,
106106
uint64_t limit = 0);
107107

108-
MetaStatusCode UpdateInodeWhenCreateOrRemoveSubNode(const Dentry& dentry,
109-
uint64_t now,
110-
uint32_t now_ns,
111-
bool isCreate,
112-
int64_t logIndex);
108+
MetaStatusCode UpdateInodeWhenCreateOrRemoveSubNode(
109+
const Dentry& dentry, const Time& tm, bool isCreate, int64_t logIndex);
113110

114111
MetaStatusCode InsertInode(const Inode& inode, int64_t logIndex);
115112

‎curvefs/src/metaserver/metastore.cpp

+13-9
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,15 @@ std::shared_ptr<StreamServer> MetaStoreImpl::GetStreamServer() {
358358
return status; \
359359
}
360360

361+
#define GET_TIME_FROM_REQUEST(TIME) \
362+
uint64_t now = 0; \
363+
uint32_t now_ns = 0; \
364+
if (request->has_create()) { \
365+
now = request->create().sec(); \
366+
now_ns = request->create().nsec(); \
367+
} \
368+
TIME.set_sec(now); \
369+
TIME.set_nsec(now_ns);
361370

362371
// dentry
363372
MetaStatusCode MetaStoreImpl::CreateDentry(const CreateDentryRequest* request,
@@ -366,15 +375,8 @@ MetaStatusCode MetaStoreImpl::CreateDentry(const CreateDentryRequest* request,
366375
ReadLockGuard readLockGuard(rwLock_);
367376
std::shared_ptr<Partition> partition;
368377
GET_PARTITION_OR_RETURN(partition);
369-
uint64_t now = 0;
370-
uint32_t now_ns = 0;
371-
if (request->has_create()) {
372-
now = request->create().sec();
373-
now_ns = request->create().nsec();
374-
}
375378
Time tm;
376-
tm.set_sec(now);
377-
tm.set_nsec(now_ns);
379+
GET_TIME_FROM_REQUEST(tm);
378380
MetaStatusCode status =
379381
partition->CreateDentry(request->dentry(), tm, logIndex);
380382
response->set_statuscode(status);
@@ -428,7 +430,9 @@ MetaStatusCode MetaStoreImpl::DeleteDentry(const DeleteDentryRequest* request,
428430
dentry.set_txid(txId);
429431
dentry.set_type(request->type());
430432

431-
auto rc = partition->DeleteDentry(dentry, logIndex);
433+
Time tm;
434+
GET_TIME_FROM_REQUEST(tm);
435+
auto rc = partition->DeleteDentry(dentry, tm, logIndex);
432436
response->set_statuscode(rc);
433437
return rc;
434438
}

‎curvefs/src/metaserver/partition.cpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ MetaStatusCode Partition::CreateDentry(const Dentry& dentry, const Time& tm,
117117
if (MetaStatusCode::OK == ret) {
118118
if (dentry.has_type()) {
119119
return inodeManager_->UpdateInodeWhenCreateOrRemoveSubNode(
120-
dentry, tm.sec(), tm.nsec(), true, logIndex);
120+
dentry, tm, true, logIndex);
121121
} else {
122122
LOG(ERROR) << "CreateDentry does not have type, "
123123
<< dentry.ShortDebugString();
@@ -128,7 +128,7 @@ MetaStatusCode Partition::CreateDentry(const Dentry& dentry, const Time& tm,
128128
// NOTE: we enter here means that
129129
// this log maybe is "half apply"
130130
ret = inodeManager_->UpdateInodeWhenCreateOrRemoveSubNode(
131-
dentry, tm.sec(), tm.nsec(), true, logIndex);
131+
dentry, tm, true, logIndex);
132132
if (ret == MetaStatusCode::IDEMPOTENCE_OK) {
133133
ret = MetaStatusCode::OK;
134134
}
@@ -155,14 +155,15 @@ MetaStatusCode Partition::LoadDentry(const DentryVec& vec, bool merge,
155155
return rc;
156156
}
157157

158-
MetaStatusCode Partition::DeleteDentry(const Dentry& dentry, int64_t logIndex) {
158+
MetaStatusCode Partition::DeleteDentry(
159+
const Dentry& dentry, const Time& tm, int64_t logIndex) {
159160
PRECHECK(dentry.fsid(), dentry.parentinodeid());
160161

161162
MetaStatusCode ret = dentryManager_->DeleteDentry(dentry, logIndex);
162163
if (MetaStatusCode::OK == ret) {
163164
if (dentry.has_type()) {
164165
return inodeManager_->UpdateInodeWhenCreateOrRemoveSubNode(
165-
dentry, 0, 0, false, logIndex);
166+
dentry, tm, false, logIndex);
166167
} else {
167168
LOG(ERROR) << "DeleteDentry does not have type, "
168169
<< dentry.ShortDebugString();
@@ -173,7 +174,7 @@ MetaStatusCode Partition::DeleteDentry(const Dentry& dentry, int64_t logIndex) {
173174
// NOTE: we enter here means that
174175
// this log maybe is "half apply"
175176
ret = inodeManager_->UpdateInodeWhenCreateOrRemoveSubNode(
176-
dentry, 0, 0, false, logIndex);
177+
dentry, tm, false, logIndex);
177178
}
178179
if (ret == MetaStatusCode::IDEMPOTENCE_OK) {
179180
ret = MetaStatusCode::OK;

‎curvefs/src/metaserver/partition.h

+6-5
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,14 @@ class Partition {
5858
Partition() = default;
5959

6060
// dentry
61-
MetaStatusCode CreateDentry(const Dentry& dentry, const Time& tm,
62-
int64_t logIndex);
61+
MetaStatusCode CreateDentry(
62+
const Dentry& dentry, const Time& tm, int64_t logIndex);
6363

64-
MetaStatusCode LoadDentry(const DentryVec& vec, bool merge,
65-
int64_t logIndex);
64+
MetaStatusCode LoadDentry(
65+
const DentryVec& vec, bool merge, int64_t logIndex);
6666

67-
MetaStatusCode DeleteDentry(const Dentry& dentry, int64_t logIndex);
67+
MetaStatusCode DeleteDentry(
68+
const Dentry& dentry, const Time& tm, int64_t logIndex);
6869

6970
MetaStatusCode GetDentry(Dentry* dentry);
7071

‎curvefs/test/client/test_fuse_s3_client.cpp

+2-8
Original file line numberDiff line numberDiff line change
@@ -3939,23 +3939,17 @@ TEST_F(TestFuseS3Client, FuseOpUnlink_EnableSummary) {
39393939
std::make_shared<InodeWrapper>(parentInode, metaClient_);
39403940

39413941
EXPECT_CALL(*inodeManager_, GetInode(_, _))
3942-
.WillOnce(DoAll(SetArgReferee<1>(parentInodeWrapper),
3943-
Return(CURVEFS_ERROR::OK)))
39443942
.WillOnce(
39453943
DoAll(SetArgReferee<1>(inodeWrapper), Return(CURVEFS_ERROR::OK)))
3946-
.WillOnce(DoAll(SetArgReferee<1>(parentInodeWrapper),
3947-
Return(CURVEFS_ERROR::OK)));
3944+
.WillOnce(DoAll(
3945+
SetArgReferee<1>(parentInodeWrapper), Return(CURVEFS_ERROR::OK)));
39483946
EXPECT_CALL(*metaClient_, GetInodeAttr(_, _, _))
39493947
.WillOnce(DoAll(SetArgPointee<2>(attr), Return(MetaStatusCode::OK)));
39503948
EXPECT_CALL(*metaClient_, UpdateInodeAttr(_, _, _))
39513949
.WillRepeatedly(Return(MetaStatusCode::OK));
39523950

3953-
EXPECT_CALL(*inodeManager_, ShipToFlush(_)).Times(1);
3954-
39553951
CURVEFS_ERROR ret = client_->FuseOpUnlink(req, parent, name.c_str());
39563952
ASSERT_EQ(CURVEFS_ERROR::OK, ret);
3957-
Inode inode2 = inodeWrapper->GetInode();
3958-
ASSERT_EQ(nlink - 1, inode2.nlink());
39593953

39603954
auto p = parentInodeWrapper->GetInode();
39613955
ASSERT_EQ(3, p.nlink());

‎curvefs/test/client/test_fuse_volume_client.cpp

-8
Original file line numberDiff line numberDiff line change
@@ -569,8 +569,6 @@ TEST_F(TestFuseVolumeClient, FuseOpUnlink) {
569569
std::make_shared<InodeWrapper>(parentInode, metaClient_);
570570

571571
EXPECT_CALL(*inodeManager_, GetInode(_, _))
572-
.WillOnce(DoAll(SetArgReferee<1>(parentInodeWrapper),
573-
Return(CURVEFS_ERROR::OK)))
574572
.WillOnce(
575573
DoAll(SetArgReferee<1>(inodeWrapper), Return(CURVEFS_ERROR::OK)));
576574
EXPECT_CALL(*metaClient_, GetInodeAttr(_, _, _))
@@ -630,8 +628,6 @@ TEST_F(TestFuseVolumeClient, FuseOpRmDir) {
630628
std::make_shared<InodeWrapper>(parentInode, metaClient_);
631629

632630
EXPECT_CALL(*inodeManager_, GetInode(_, _))
633-
.WillOnce(DoAll(SetArgReferee<1>(parentInodeWrapper),
634-
Return(CURVEFS_ERROR::OK)))
635631
.WillOnce(
636632
DoAll(SetArgReferee<1>(inodeWrapper), Return(CURVEFS_ERROR::OK)));
637633
EXPECT_CALL(*metaClient_, GetInodeAttr(_, _, _))
@@ -695,11 +691,7 @@ TEST_F(TestFuseVolumeClient, FuseOpUnlinkFailed) {
695691
std::make_shared<InodeWrapper>(parentInode, metaClient_);
696692

697693
EXPECT_CALL(*inodeManager_, GetInode(_, _))
698-
.WillOnce(DoAll(SetArgReferee<1>(parentInodeWrapper),
699-
Return(CURVEFS_ERROR::OK)))
700694
.WillOnce(Return(CURVEFS_ERROR::INTERNAL))
701-
.WillOnce(DoAll(SetArgReferee<1>(parentInodeWrapper),
702-
Return(CURVEFS_ERROR::OK)))
703695
.WillOnce(
704696
DoAll(SetArgReferee<1>(inodeWrapper), Return(CURVEFS_ERROR::OK)));
705697
EXPECT_CALL(*metaClient_, GetInodeAttr(_, _, _))

‎curvefs/test/metaserver/partition_test.cpp

+8-7
Original file line numberDiff line numberDiff line change
@@ -292,11 +292,12 @@ TEST_F(PartitionTest, dentrynum) {
292292
Time tm;
293293
tm.set_sec(0);
294294
tm.set_nsec(0);
295-
ASSERT_EQ(partition1.CreateDentry(dentry, tm, logIndex_++),
296-
MetaStatusCode::OK);
295+
ASSERT_EQ(
296+
partition1.CreateDentry(dentry, tm, logIndex_++), MetaStatusCode::OK);
297297
ASSERT_EQ(partition1.GetDentryNum(), 1);
298298

299-
ASSERT_EQ(partition1.DeleteDentry(dentry, logIndex_++), MetaStatusCode::OK);
299+
ASSERT_EQ(
300+
partition1.DeleteDentry(dentry, tm, logIndex_++), MetaStatusCode::OK);
300301
ASSERT_EQ(partition1.GetDentryNum(), 0);
301302
}
302303

@@ -331,10 +332,10 @@ TEST_F(PartitionTest, PARTITION_ID_MISSMATCH_ERROR) {
331332
MetaStatusCode::PARTITION_ID_MISSMATCH);
332333

333334
// test DeleteDentry
334-
ASSERT_EQ(partition1.DeleteDentry(dentry1, logIndex_++),
335-
MetaStatusCode::PARTITION_ID_MISSMATCH);
336-
ASSERT_EQ(partition1.DeleteDentry(dentry2, logIndex_++),
337-
MetaStatusCode::PARTITION_ID_MISSMATCH);
335+
ASSERT_EQ(partition1.DeleteDentry(dentry1, tm, logIndex_++),
336+
MetaStatusCode::PARTITION_ID_MISSMATCH);
337+
ASSERT_EQ(partition1.DeleteDentry(dentry2, tm, logIndex_++),
338+
MetaStatusCode::PARTITION_ID_MISSMATCH);
338339

339340
// test GetDentry
340341
ASSERT_EQ(partition1.GetDentry(&dentry1),

0 commit comments

Comments
 (0)
Please sign in to comment.