Skip to content

Commit 095006a

Browse files
201341SeanHai
authored andcommitted
[feat] curvefs: merge two rpc into one when delete dentry
Signed-off-by: swj <[email protected]>
1 parent fc949cd commit 095006a

13 files changed

+51
-102
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
@@ -368,35 +368,6 @@ CURVEFS_ERROR FuseClient::FuseOpOpen(fuse_req_t req,
368368
return HandleOpenFlags(req, ino, fi, fileOut);
369369
}
370370

371-
CURVEFS_ERROR FuseClient::UpdateParentMCTimeAndNlink(
372-
fuse_ino_t parent, FsFileType type, NlinkChange nlink) {
373-
374-
std::shared_ptr<InodeWrapper> parentInodeWrapper;
375-
auto ret = inodeManager_->GetInode(parent, parentInodeWrapper);
376-
if (ret != CURVEFS_ERROR::OK) {
377-
LOG(ERROR) << "inodeManager get inode fail, ret = " << ret
378-
<< ", inodeid = " << parent;
379-
return ret;
380-
}
381-
382-
{
383-
curve::common::UniqueLock lk = parentInodeWrapper->GetUniqueLock();
384-
parentInodeWrapper->UpdateTimestampLocked(kModifyTime | kChangeTime);
385-
386-
if (FsFileType::TYPE_DIRECTORY == type) {
387-
parentInodeWrapper->UpdateNlinkLocked(nlink);
388-
}
389-
390-
if (option_.fileSystemOption.deferSyncOption.deferDirMtime) {
391-
inodeManager_->ShipToFlush(parentInodeWrapper);
392-
} else {
393-
return parentInodeWrapper->SyncAttr();
394-
}
395-
}
396-
397-
return CURVEFS_ERROR::OK;
398-
}
399-
400371
CURVEFS_ERROR FuseClient::MakeNode(
401372
fuse_req_t req,
402373
fuse_ino_t parent,
@@ -535,15 +506,6 @@ CURVEFS_ERROR FuseClient::DeleteNode(uint64_t ino, fuse_ino_t parent,
535506
return ret;
536507
}
537508

538-
ret = UpdateParentMCTimeAndNlink(parent, type, NlinkChange::kSubOne);
539-
if (ret != CURVEFS_ERROR::OK) {
540-
LOG(ERROR) << "UpdateParentMCTimeAndNlink failed"
541-
<< ", parent: " << parent
542-
<< ", name: " << name
543-
<< ", type: " << type;
544-
return ret;
545-
}
546-
547509
std::shared_ptr<InodeWrapper> inodeWrapper;
548510
ret = inodeManager_->GetInode(ino, inodeWrapper);
549511
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

+3-14
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
#include <brpc/closure_guard.h>
2525
#include <butil/iobuf.h>
2626
#include <glog/logging.h>
27-
#include <time.h>
2827

2928
#include <cstddef>
3029
#include <memory>
@@ -255,12 +254,7 @@ MetaStatusCode MetaServerClientImpl::CreateDentry(const Dentry &dentry) {
255254
d->set_txid(txId);
256255
d->set_type(dentry.type());
257256
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);
257+
SetCreateTime(request.mutable_create());
264258
curvefs::metaserver::MetaServerService_Stub stub(channel);
265259
stub.CreateDentry(cntl, &request, &response, nullptr);
266260

@@ -321,7 +315,7 @@ MetaStatusCode MetaServerClientImpl::DeleteDentry(uint32_t fsId,
321315
request.set_name(name);
322316
request.set_txid(txId);
323317
request.set_type(type);
324-
318+
SetCreateTime(request.mutable_create());
325319
curvefs::metaserver::MetaServerService_Stub stub(channel);
326320
stub.DeleteDentry(cntl, &request, &response, nullptr);
327321

@@ -1147,12 +1141,7 @@ MetaStatusCode MetaServerClientImpl::CreateInode(const InodeParam &param,
11471141
request.set_rdev(param.rdev);
11481142
request.set_symlink(param.symlink);
11491143
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);
1144+
SetCreateTime(request.mutable_create());
11561145
curvefs::metaserver::MetaServerService_Stub stub(channel);
11571146
stub.CreateInode(cntl, &request, &response, nullptr);
11581147

curvefs/src/client/rpcclient/metaserver_client.h

+9
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#ifndef CURVEFS_SRC_CLIENT_RPCCLIENT_METASERVER_CLIENT_H_
2424
#define CURVEFS_SRC_CLIENT_RPCCLIENT_METASERVER_CLIENT_H_
2525

26+
#include <time.h>
27+
2628
#include <list>
2729
#include <memory>
2830
#include <string>
@@ -70,6 +72,13 @@ struct DataIndices {
7072
absl::optional<VolumeExtentSliceList> volumeExtents;
7173
};
7274

75+
inline void SetCreateTime(Time* tm) {
76+
struct timespec now;
77+
clock_gettime(CLOCK_REALTIME, &now);
78+
tm->set_sec(now.tv_sec);
79+
tm->set_nsec(now.tv_nsec);
80+
}
81+
7382
class MetaServerClient {
7483
public:
7584
virtual ~MetaServerClient() = default;

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
@@ -118,7 +118,7 @@ MetaStatusCode Partition::CreateDentry(const Dentry& dentry, const Time& tm,
118118
if (MetaStatusCode::OK == ret) {
119119
if (dentry.has_type()) {
120120
return inodeManager_->UpdateInodeWhenCreateOrRemoveSubNode(
121-
dentry, tm.sec(), tm.nsec(), true, logIndex);
121+
dentry, tm, true, logIndex);
122122
} else {
123123
LOG(ERROR) << "CreateDentry does not have type, "
124124
<< dentry.ShortDebugString();
@@ -129,7 +129,7 @@ MetaStatusCode Partition::CreateDentry(const Dentry& dentry, const Time& tm,
129129
// NOTE: we enter here means that
130130
// this log maybe is "half apply"
131131
ret = inodeManager_->UpdateInodeWhenCreateOrRemoveSubNode(
132-
dentry, tm.sec(), tm.nsec(), true, logIndex);
132+
dentry, tm, true, logIndex);
133133
if (ret == MetaStatusCode::IDEMPOTENCE_OK) {
134134
ret = MetaStatusCode::OK;
135135
}
@@ -156,14 +156,15 @@ MetaStatusCode Partition::LoadDentry(const DentryVec& vec, bool merge,
156156
return rc;
157157
}
158158

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

162163
MetaStatusCode ret = dentryManager_->DeleteDentry(dentry, logIndex);
163164
if (MetaStatusCode::OK == ret) {
164165
if (dentry.has_type()) {
165166
return inodeManager_->UpdateInodeWhenCreateOrRemoveSubNode(
166-
dentry, 0, 0, false, logIndex);
167+
dentry, tm, false, logIndex);
167168
} else {
168169
LOG(ERROR) << "DeleteDentry does not have type, "
169170
<< dentry.ShortDebugString();
@@ -174,7 +175,7 @@ MetaStatusCode Partition::DeleteDentry(const Dentry& dentry, int64_t logIndex) {
174175
// NOTE: we enter here means that
175176
// this log maybe is "half apply"
176177
ret = inodeManager_->UpdateInodeWhenCreateOrRemoveSubNode(
177-
dentry, 0, 0, false, logIndex);
178+
dentry, tm, false, logIndex);
178179
}
179180
if (ret == MetaStatusCode::IDEMPOTENCE_OK) {
180181
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

-6
Original file line numberDiff line numberDiff line change
@@ -3941,8 +3941,6 @@ TEST_F(TestFuseS3Client, FuseOpUnlink_EnableSummary) {
39413941
EXPECT_CALL(*inodeManager_, GetInode(_, _))
39423942
.WillOnce(
39433943
DoAll(SetArgReferee<1>(inodeWrapper), Return(CURVEFS_ERROR::OK)))
3944-
.WillOnce(DoAll(
3945-
SetArgReferee<1>(parentInodeWrapper), Return(CURVEFS_ERROR::OK)))
39463944
.WillOnce(
39473945
DoAll(SetArgReferee<1>(inodeWrapper), Return(CURVEFS_ERROR::OK)))
39483946
.WillOnce(DoAll(
@@ -3952,12 +3950,8 @@ TEST_F(TestFuseS3Client, FuseOpUnlink_EnableSummary) {
39523950
EXPECT_CALL(*metaClient_, UpdateInodeAttr(_, _, _))
39533951
.WillRepeatedly(Return(MetaStatusCode::OK));
39543952

3955-
EXPECT_CALL(*inodeManager_, ShipToFlush(_)).Times(1);
3956-
39573953
CURVEFS_ERROR ret = client_->FuseOpUnlink(req, parent, name.c_str());
39583954
ASSERT_EQ(CURVEFS_ERROR::OK, ret);
3959-
Inode inode2 = inodeWrapper->GetInode();
3960-
ASSERT_EQ(nlink - 1, inode2.nlink());
39613955

39623956
auto p = parentInodeWrapper->GetInode();
39633957
ASSERT_EQ(3, p.nlink());

curvefs/test/client/test_fuse_volume_client.cpp

-8
Original file line numberDiff line numberDiff line change
@@ -571,8 +571,6 @@ TEST_F(TestFuseVolumeClient, FuseOpUnlink) {
571571
EXPECT_CALL(*inodeManager_, GetInode(_, _))
572572
.WillOnce(
573573
DoAll(SetArgReferee<1>(inodeWrapper), Return(CURVEFS_ERROR::OK)))
574-
.WillOnce(DoAll(
575-
SetArgReferee<1>(parentInodeWrapper), Return(CURVEFS_ERROR::OK)))
576574
.WillOnce(
577575
DoAll(SetArgReferee<1>(inodeWrapper), Return(CURVEFS_ERROR::OK)));
578576
EXPECT_CALL(*metaClient_, GetInodeAttr(_, _, _))
@@ -634,8 +632,6 @@ TEST_F(TestFuseVolumeClient, FuseOpRmDir) {
634632
EXPECT_CALL(*inodeManager_, GetInode(_, _))
635633
.WillOnce(
636634
DoAll(SetArgReferee<1>(inodeWrapper), Return(CURVEFS_ERROR::OK)))
637-
.WillOnce(DoAll(
638-
SetArgReferee<1>(parentInodeWrapper), Return(CURVEFS_ERROR::OK)))
639635
.WillOnce(
640636
DoAll(SetArgReferee<1>(inodeWrapper), Return(CURVEFS_ERROR::OK)));
641637
EXPECT_CALL(*metaClient_, GetInodeAttr(_, _, _))
@@ -701,13 +697,9 @@ TEST_F(TestFuseVolumeClient, FuseOpUnlinkFailed) {
701697
EXPECT_CALL(*inodeManager_, GetInode(_, _))
702698
.WillOnce(
703699
DoAll(SetArgReferee<1>(inodeWrapper), Return(CURVEFS_ERROR::OK)))
704-
.WillOnce(DoAll(
705-
SetArgReferee<1>(parentInodeWrapper), Return(CURVEFS_ERROR::OK)))
706700
.WillOnce(Return(CURVEFS_ERROR::INTERNAL))
707701
.WillOnce(
708702
DoAll(SetArgReferee<1>(inodeWrapper), Return(CURVEFS_ERROR::OK)))
709-
.WillOnce(DoAll(
710-
SetArgReferee<1>(parentInodeWrapper), Return(CURVEFS_ERROR::OK)))
711703
.WillOnce(
712704
DoAll(SetArgReferee<1>(inodeWrapper), Return(CURVEFS_ERROR::OK)));
713705
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)