Skip to content

Commit

Permalink
curvefs/metaserver: fix inode create time inconsistently
Browse files Browse the repository at this point in the history
Signed-off-by: fan <[email protected]>
  • Loading branch information
fansehep authored and ilixiaocui committed Sep 7, 2022
1 parent 89b3fff commit deb4e6d
Show file tree
Hide file tree
Showing 10 changed files with 84 additions and 10 deletions.
7 changes: 7 additions & 0 deletions curvefs/proto/metaserver.proto
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,12 @@ message CreateInodeRequest {
required uint64 parent = 10;
optional uint64 rdev = 11;
optional string symlink = 12; // TYPE_SYM_LINK only
optional Time create = 13;
}

message Time {
required uint64 sec = 1;
required int64 nsec = 2;
}

message CreateInodeResponse {
Expand All @@ -258,6 +264,7 @@ message CreateRootInodeRequest {
required uint32 uid = 5;
required uint32 gid = 6;
required uint32 mode = 7;
optional Time create = 8;
}

message CreateRootInodeResponse {
Expand Down
7 changes: 7 additions & 0 deletions curvefs/src/client/rpcclient/metaserver_client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <brpc/closure_guard.h>
#include <butil/iobuf.h>
#include <glog/logging.h>
#include <time.h>

#include <cstddef>
#include <memory>
Expand Down Expand Up @@ -1239,6 +1240,12 @@ MetaStatusCode MetaServerClientImpl::CreateInode(const InodeParam &param,
request.set_rdev(param.rdev);
request.set_symlink(param.symlink);
request.set_parent(param.parent);
struct timespec now;
clock_gettime(CLOCK_REALTIME, &now);
Time* tm = new Time();
tm->set_sec(now.tv_sec);
tm->set_nsec(now.tv_nsec);
request.set_allocated_create(tm);
curvefs::metaserver::MetaServerService_Stub stub(channel);
stub.CreateInode(cntl, &request, &response, nullptr);

Expand Down
1 change: 1 addition & 0 deletions curvefs/src/client/rpcclient/metaserver_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ using ::curvefs::metaserver::S3ChunkInfoList;
using ::curvefs::common::StreamStatus;
using ::curvefs::common::StreamClient;
using S3ChunkInfoMap = google::protobuf::Map<uint64_t, S3ChunkInfoList>;
using ::curvefs::metaserver::Time;

namespace curvefs {
namespace client {
Expand Down
10 changes: 9 additions & 1 deletion curvefs/src/mds/metaserverclient/metaserver_client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,12 @@
#include "curvefs/src/mds/metaserverclient/metaserver_client.h"
#include <bthread/bthread.h>

#include <ctime>

namespace curvefs {
namespace mds {

using curvefs::metaserver::Time;
using curvefs::metaserver::CreateRootInodeRequest;
using curvefs::metaserver::CreateRootInodeResponse;
using curvefs::metaserver::DeleteInodeRequest;
Expand Down Expand Up @@ -162,7 +165,12 @@ FSStatusCode MetaserverClient::CreateRootInode(
request.set_uid(uid);
request.set_gid(gid);
request.set_mode(mode);

struct timespec now;
clock_gettime(CLOCK_REALTIME, &now);
Time* tm = new Time();
tm->set_sec(now.tv_sec);
tm->set_nsec(now.tv_nsec);
request.set_allocated_create(tm);
auto fp = &MetaServerService_Stub::CreateRootInode;
LeaderCtx ctx;
ctx.addrs = addrs;
Expand Down
26 changes: 18 additions & 8 deletions curvefs/src/metaserver/inode_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include <list>
#include <unordered_set>
#include <utility>
#include <ctime>

#include "curvefs/proto/metaserver.pb.h"
#include "curvefs/src/common/define.h"
Expand Down Expand Up @@ -112,14 +113,23 @@ void InodeManager::GenerateInodeInternal(uint64_t inodeId,
inode->set_rdev(param.rdev);
inode->add_parent(param.parent);

struct timespec now;
clock_gettime(CLOCK_REALTIME, &now);
inode->set_mtime(now.tv_sec);
inode->set_mtime_ns(now.tv_nsec);
inode->set_atime(now.tv_sec);
inode->set_atime_ns(now.tv_nsec);
inode->set_ctime(now.tv_sec);
inode->set_ctime_ns(now.tv_nsec);
if (param.timestamp.has_value()) {
inode->set_mtime(param.timestamp->tv_sec);
inode->set_mtime_ns(param.timestamp->tv_nsec);
inode->set_atime(param.timestamp->tv_sec);
inode->set_atime_ns(param.timestamp->tv_nsec);
inode->set_ctime(param.timestamp->tv_sec);
inode->set_ctime_ns(param.timestamp->tv_nsec);
} else {
struct timespec now;
clock_gettime(CLOCK_REALTIME, &now);
inode->set_mtime(now.tv_sec);
inode->set_mtime_ns(now.tv_nsec);
inode->set_atime(now.tv_sec);
inode->set_atime_ns(now.tv_nsec);
inode->set_ctime(now.tv_sec);
inode->set_ctime_ns(now.tv_nsec);
}

if (FsFileType::TYPE_DIRECTORY == param.type) {
inode->set_nlink(2);
Expand Down
4 changes: 4 additions & 0 deletions curvefs/src/metaserver/inode_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
#ifndef CURVEFS_SRC_METASERVER_INODE_MANAGER_H_
#define CURVEFS_SRC_METASERVER_INODE_MANAGER_H_

#include <time.h>

#include <atomic>
#include <memory>
#include <string>
Expand All @@ -33,6 +35,7 @@
#include "curvefs/src/metaserver/trash.h"
#include "src/common/concurrent/name_lock.h"


using ::curve::common::NameLock;
using ::curvefs::metaserver::S3ChunkInfoList;

Expand All @@ -53,6 +56,7 @@ struct InodeParam {
std::string symlink;
uint64_t rdev;
uint64_t parent;
absl::optional<struct timespec> timestamp;
};

class InodeManager {
Expand Down
10 changes: 10 additions & 0 deletions curvefs/src/metaserver/metastore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include "rocksdb/utilities/options_util.h"

#include "absl/cleanup/cleanup.h"
#include "absl/types/optional.h"
#include "curvefs/proto/metaserver.pb.h"
#include "curvefs/src/metaserver/partition_clean_manager.h"
#include "curvefs/src/metaserver/copyset/copyset_node.h"
Expand Down Expand Up @@ -453,7 +454,12 @@ MetaStatusCode MetaStoreImpl::CreateInode(const CreateInodeRequest* request,
param.type = request->type();
param.parent = request->parent();
param.rdev = request->rdev();
if (request->has_create()) {
param.timestamp = absl::make_optional<struct timespec>(
{request->create().sec(), request->create().nsec()});
}
param.symlink = "";

if (param.type == FsFileType::TYPE_SYM_LINK) {
if (!request->has_symlink()) {
response->set_statuscode(MetaStatusCode::SYM_LINK_EMPTY);
Expand Down Expand Up @@ -494,6 +500,10 @@ MetaStatusCode MetaStoreImpl::CreateRootInode(
param.type = FsFileType::TYPE_DIRECTORY;
param.rdev = 0;
param.parent = 0;
if (request->has_create()) {
param.timestamp = absl::make_optional<struct timespec>(
{request->create().sec(), request->create().nsec()});
}

ReadLockGuard readLockGuard(rwLock_);
std::shared_ptr<Partition> partition = GetPartition(request->partitionid());
Expand Down
1 change: 1 addition & 0 deletions curvefs/test/metaserver/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ cc_test(
"//curvefs/src/metaserver:metaserver_s3_lib",
"//curvefs/test/metaserver/storage:metaserver_storage_test_utils",
"//curvefs/test/metaserver/mock:metaserver_test_mock",
"@com_google_absl//absl/types:optional",
],
)

Expand Down
15 changes: 15 additions & 0 deletions curvefs/test/metaserver/inode_manager_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
* @Author: chenwei
*/

#include <time.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <google/protobuf/util/message_differencer.h>
Expand All @@ -33,6 +34,7 @@
#include "curvefs/src/metaserver/storage/rocksdb_storage.h"
#include "curvefs/test/metaserver/storage/utils.h"
#include "src/fs/ext4_filesystem_impl.h"
#include "absl/types/optional.h"

using ::google::protobuf::util::MessageDifferencer;
using ::testing::_;
Expand Down Expand Up @@ -219,6 +221,14 @@ TEST_F(InodeManagerTest, test1) {
ASSERT_EQ(inode4.inodeid(), 5);
ASSERT_EQ(inode4.type(), FsFileType::TYPE_S3);

// test struct timespec
Inode inode5;
struct timespec now;
clock_gettime(CLOCK_REALTIME, &now);
param_.timestamp = absl::make_optional<struct timespec>(now);
ASSERT_EQ(manager->CreateInode(6, param_, &inode5),
MetaStatusCode::OK);

// GET
Inode temp1;
ASSERT_EQ(manager->GetInode(fsId, inode1.inodeid(), &temp1),
Expand Down Expand Up @@ -258,6 +268,11 @@ TEST_F(InodeManagerTest, test1) {
MetaStatusCode::OK);
ASSERT_TRUE(CompareInode(temp5, temp2));
ASSERT_FALSE(CompareInode(inode2, temp2));

Inode temp6;
ASSERT_EQ(manager->GetInode(fsId, inode5.inodeid(), &temp6),
MetaStatusCode::OK);
ASSERT_TRUE(CompareInode(inode5, temp6));
}

TEST_F(InodeManagerTest, GetOrModifyS3ChunkInfo) {
Expand Down
13 changes: 12 additions & 1 deletion curvefs/test/metaserver/metastore_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -410,6 +410,11 @@ TEST_F(MetastoreTest, test_inode) {
uint32_t gid = 200;
uint32_t mode = 777;
FsFileType type = FsFileType::TYPE_DIRECTORY;
struct timespec now;
clock_gettime(CLOCK_REALTIME, &now);
Time* tm = new Time();
tm->set_sec(now.tv_sec);
tm->set_nsec(now.tv_nsec);

createRequest.set_poolid(poolId);
createRequest.set_copysetid(copysetId);
Expand All @@ -420,7 +425,7 @@ TEST_F(MetastoreTest, test_inode) {
createRequest.set_gid(gid);
createRequest.set_mode(mode);
createRequest.set_type(type);

createRequest.set_allocated_create(tm);
// CreateInde wrong partitionid
ret = metastore.CreateInode(&createRequest, &createResponse);
ASSERT_EQ(createResponse.statuscode(), ret);
Expand Down Expand Up @@ -450,6 +455,12 @@ TEST_F(MetastoreTest, test_inode) {
ASSERT_EQ(createResponse2.inode().gid(), gid);
ASSERT_EQ(createResponse2.inode().mode(), mode);
ASSERT_EQ(createResponse2.inode().type(), FsFileType::TYPE_S3);
ASSERT_EQ(createResponse2.inode().ctime(), now.tv_sec);
ASSERT_EQ(createResponse2.inode().ctime_ns(), now.tv_nsec);
ASSERT_EQ(createResponse2.inode().mtime(), now.tv_sec);
ASSERT_EQ(createResponse2.inode().mtime_ns(), now.tv_nsec);
ASSERT_EQ(createResponse2.inode().atime(), now.tv_sec);
ASSERT_EQ(createResponse2.inode().atime_ns(), now.tv_nsec);

// type symlink
createRequest.set_type(FsFileType::TYPE_SYM_LINK);
Expand Down

0 comments on commit deb4e6d

Please sign in to comment.