Skip to content

Commit b8f0487

Browse files
rock-gitchuandew
authored andcommitted
[feat][mdsv2] Add truncate for open/setattr.
1 parent dd2276c commit b8f0487

File tree

13 files changed

+428
-190
lines changed

13 files changed

+428
-190
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
#include "client/vfs/meta/v2/filesystem.h"
1616

17+
#include <fcntl.h>
18+
1719
#include <cstdint>
1820
#include <string>
1921
#include <utility>
@@ -336,6 +338,10 @@ Status MDSV2FileSystem::MkNod(Ino parent, const std::string& name, uint32_t uid,
336338
Status MDSV2FileSystem::Open(Ino ino, int flags, uint64_t fh) {
337339
LOG(INFO) << fmt::format("[meta.{}] open ino({}).", name_, ino);
338340

341+
if ((flags & O_TRUNC) && !(flags & O_WRONLY || flags & O_RDWR)) {
342+
return Status::NoPermission("O_TRUNC without O_WRONLY or O_RDWR");
343+
}
344+
339345
std::string session_id;
340346
auto status = mds_client_->Open(ino, flags, session_id);
341347
if (!status.ok()) {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,8 @@ Status MDSClient::Open(Ino ino, int flags, std::string& session_id) {
384384

385385
session_id = response.session_id();
386386

387+
parent_memo_->UpsertVersion(ino, response.version());
388+
387389
return Status::OK();
388390
}
389391

src/mdsv2/common/type.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,15 @@ namespace mdsv2 {
2929
using Ino = uint64_t;
3030
using AttrType = pb::mdsv2::Inode;
3131
using DentryType = pb::mdsv2::Dentry;
32+
using SliceType = pb::mdsv2::Slice;
3233
using ChunkType = pb::mdsv2::Chunk;
3334
using FsInfoType = pb::mdsv2::FsInfo;
3435
using TrashSliceList = pb::mdsv2::TrashSliceList;
3536
using QuotaEntry = pb::mdsv2::Quota;
3637
using UsageEntry = pb::mdsv2::Usage;
3738
using MdsEntry = pb::mdsv2::MDS;
3839
using ClientEntry = pb::mdsv2::Client;
40+
using FileSessionEntry = pb::mdsv2::FileSession;
3941

4042
inline bool IsDir(Ino ino) { return (ino & 1) == 1; }
4143
inline bool IsFile(Ino ino) { return (ino & 1) == 0; }

src/mdsv2/filesystem/file_session.cc

Lines changed: 44 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,18 @@
1414

1515
#include "mdsv2/filesystem/file_session.h"
1616

17-
#include <fmt/format.h>
18-
#include <glog/logging.h>
19-
2017
#include <cstdint>
2118
#include <string>
2219
#include <utility>
2320

2421
#include "dingofs/error.pb.h"
25-
#include "mdsv2/common/codec.h"
22+
#include "fmt/format.h"
2623
#include "mdsv2/common/logging.h"
2724
#include "mdsv2/common/status.h"
28-
#include "mdsv2/storage/storage.h"
25+
#include "mdsv2/common/type.h"
26+
#include "mdsv2/filesystem/store_operation.h"
2927
#include "utils/concurrent/concurrent.h"
28+
#include "utils/uuid.h"
3029

3130
namespace dingofs {
3231
namespace mdsv2 {
@@ -39,26 +38,20 @@ static const std::string kFileSessionCacheCountMetricsName = "dingofs_file_sessi
3938
static const std::string kFileSessionTatalCountMetricsName = "dingofs_file_session_total_count";
4039
static const std::string kFileSessionCountMetricsName = "dingofs_file_session_count";
4140

42-
std::string FileSession::EncodeKey(uint32_t fs_id, uint64_t ino, const std::string& session_id) {
43-
return MetaCodec::EncodeFileSessionKey(fs_id, ino, session_id);
44-
}
45-
46-
std::string FileSession::EncodeKey() const { return MetaCodec::EncodeFileSessionKey(fs_id_, ino_, session_id_); }
41+
static FileSessionPtr NewFileSession(uint64_t ino, const std::string& client_id) {
42+
auto file_session = std::make_shared<FileSessionEntry>();
43+
file_session->set_session_id(utils::UUIDGenerator::GenerateUUID());
44+
file_session->set_ino(ino);
45+
file_session->set_client_id(client_id);
4746

48-
std::string FileSession::EncodeValue() const {
49-
pb::mdsv2::FileSession file_session;
50-
file_session.set_session_id(session_id_);
51-
file_session.set_ino(ino_);
52-
file_session.set_client_id(client_id_);
53-
54-
return MetaCodec::EncodeFileSessionValue(file_session);
47+
return file_session;
5548
}
5649

5750
FileSessionCache::FileSessionCache() : count_metrics_(kFileSessionCacheCountMetricsName) {}
5851

5952
bool FileSessionCache::Put(FileSessionPtr file_session) {
6053
utils::WriteLockGuard guard(lock_);
61-
auto key = Key{.ino = file_session->Ino(), .session_id = file_session->SessionId()};
54+
auto key = Key{.ino = file_session->ino(), .session_id = file_session->session_id()};
6255
auto it = file_session_map_.find(key);
6356
if (it != file_session_map_.end()) {
6457
return false;
@@ -74,7 +67,7 @@ bool FileSessionCache::Put(FileSessionPtr file_session) {
7467
void FileSessionCache::Upsert(FileSessionPtr file_session) {
7568
utils::WriteLockGuard guard(lock_);
7669

77-
auto key = Key{.ino = file_session->Ino(), .session_id = file_session->SessionId()};
70+
auto key = Key{.ino = file_session->ino(), .session_id = file_session->session_id()};
7871

7972
auto it = file_session_map_.find(key);
8073
if (it == file_session_map_.end()) {
@@ -150,21 +143,14 @@ bool FileSessionCache::IsExist(uint64_t ino, const std::string& session_id) {
150143
return file_session_map_.find(key) != file_session_map_.end();
151144
}
152145

153-
FileSessionManager::FileSessionManager(uint32_t fs_id, KVStorageSPtr kv_storage)
146+
FileSessionManager::FileSessionManager(uint32_t fs_id, OperationProcessorSPtr operation_processor)
154147
: fs_id_(fs_id),
155-
kv_storage_(kv_storage),
148+
operation_processor_(operation_processor),
156149
total_count_metrics_(kFileSessionTatalCountMetricsName),
157150
count_metrics_(kFileSessionCountMetricsName) {}
158151

159152
Status FileSessionManager::Create(uint64_t ino, const std::string& client_id, FileSessionPtr& file_session) {
160-
file_session = FileSession::New(fs_id_, ino, client_id);
161-
162-
KVStorage::WriteOption write_option;
163-
auto status = kv_storage_->Put(write_option, file_session->EncodeKey(), file_session->EncodeValue());
164-
if (!status.ok()) {
165-
DINGO_LOG(ERROR) << fmt::format("[filesession] create fail, {}/{} {}", ino, client_id, status.error_str());
166-
return status;
167-
}
153+
file_session = NewFileSession(ino, client_id);
168154

169155
// add to cache
170156
CHECK(file_session_cache_.Put(file_session))
@@ -230,12 +216,6 @@ Status FileSessionManager::IsExist(uint64_t ino, bool just_cache, bool& is_exist
230216
}
231217

232218
Status FileSessionManager::Delete(uint64_t ino, const std::string& session_id) {
233-
auto status = kv_storage_->Delete(FileSession::EncodeKey(fs_id_, ino, session_id));
234-
if (!status.ok()) {
235-
DINGO_LOG(ERROR) << fmt::format("[filesession] delete fail, {}/{} {}", ino, session_id, status.error_str());
236-
return status;
237-
}
238-
239219
// delete cache
240220
file_session_cache_.Delete(ino, session_id);
241221

@@ -245,95 +225,64 @@ Status FileSessionManager::Delete(uint64_t ino, const std::string& session_id) {
245225
}
246226

247227
Status FileSessionManager::Delete(uint64_t ino) {
248-
std::vector<FileSessionPtr> file_sessions;
249-
auto status = GetFileSessionsFromStore(ino, file_sessions);
250-
if (!status.ok()) {
251-
return status;
252-
}
253-
254-
if (file_sessions.empty()) {
255-
return Status::OK();
256-
}
257-
258-
int retry = 0;
259-
do {
260-
auto txn = kv_storage_->NewTxn();
261-
262-
for (auto& file_session : file_sessions) {
263-
txn->Delete(file_session->EncodeKey());
264-
}
265-
266-
status = txn->Commit();
267-
if (status.error_code() != pb::error::ESTORE_MAYBE_RETRY) {
268-
break;
269-
}
270-
271-
++retry;
272-
} while (retry < FLAGS_txn_max_retry_times);
228+
// delete cache
229+
file_session_cache_.Delete(ino);
273230

274-
if (status.ok()) {
275-
// delete cache
276-
file_session_cache_.Delete(ino);
231+
// count_metrics_ << (0 - static_cast<int64_t>(file_sessions.size()));
277232

278-
count_metrics_ << (0 - static_cast<int64_t>(file_sessions.size()));
279-
}
280-
281-
return status;
233+
return Status::OK();
282234
}
283235

284236
Status FileSessionManager::GetFileSessionsFromStore(uint64_t ino, std::vector<FileSessionPtr>& file_sessions) {
285-
Range range;
286-
MetaCodec::GetFileSessionRange(fs_id_, ino, range.start_key, range.end_key);
237+
Trace trace;
238+
ScanFileSessionOperation operation(trace, fs_id_, ino);
287239

288-
auto txn = kv_storage_->NewTxn();
289-
std::vector<KeyValue> kvs;
290-
do {
291-
kvs.clear();
292-
293-
auto status = txn->Scan(range, FLAGS_fs_scan_batch_size, kvs);
294-
if (!status.ok()) {
295-
DINGO_LOG(ERROR) << fmt::format("[filesession] scan fail, {} {}", ino, status.error_str());
296-
break;
297-
}
240+
auto status = operation_processor_->RunAlone(&operation);
241+
if (!status.ok()) {
242+
DINGO_LOG(ERROR) << fmt::format("[filesession] scan file session fail, status({}).", status.error_str());
243+
return status;
244+
}
298245

299-
for (auto& kv : kvs) {
300-
file_sessions.push_back(FileSession::New(fs_id_, MetaCodec::DecodeFileSessionValue(kv.value)));
301-
}
246+
auto& result = operation.GetResult();
302247

303-
} while (kvs.size() >= FLAGS_fs_scan_batch_size);
248+
for (const auto& file_session : result.file_sessions) {
249+
file_sessions.push_back(std::make_shared<FileSessionEntry>(file_session));
250+
}
304251

305252
return Status::OK();
306253
}
307254

308255
Status FileSessionManager::GetFileSessionFromStore(uint64_t ino, const std::string& session_id,
309256
FileSessionPtr& file_session) {
310-
std::string key = FileSession::EncodeKey(fs_id_, ino, session_id);
257+
Trace trace;
258+
GetFileSessionOperation operation(trace, fs_id_, ino, session_id);
311259

312-
std::string value;
313-
auto status = kv_storage_->Get(key, value);
260+
auto status = operation_processor_->RunAlone(&operation);
314261
if (!status.ok()) {
315-
DINGO_LOG(ERROR) << fmt::format("[filesession] get fail, {}/{} {}", ino, session_id, status.error_str());
262+
DINGO_LOG(ERROR) << fmt::format("[filesession] get file session fail, status({}).", status.error_str());
316263
return status;
317264
}
318265

319-
file_session = FileSession::New(fs_id_, MetaCodec::DecodeFileSessionValue(value));
266+
auto& result = operation.GetResult();
267+
268+
file_session = std::make_shared<FileSessionEntry>(result.file_session);
320269

321270
return Status::OK();
322271
}
323272

324273
Status FileSessionManager::IsExistFromStore(uint64_t ino, bool& is_exist) {
325-
Range range;
326-
MetaCodec::GetFileSessionRange(fs_id_, ino, range.start_key, range.end_key);
274+
Trace trace;
275+
ScanFileSessionOperation operation(trace, fs_id_, ino);
327276

328-
std::vector<KeyValue> kvs;
329-
auto txn = kv_storage_->NewTxn();
330-
auto status = txn->Scan(range, 1, kvs);
277+
auto status = operation_processor_->RunAlone(&operation);
331278
if (!status.ok()) {
332-
DINGO_LOG(ERROR) << fmt::format("[filesession] scan fail, {} {}", ino, status.error_str());
279+
DINGO_LOG(ERROR) << fmt::format("[filesession] scan file session fail, status({}).", status.error_str());
333280
return status;
334281
}
335282

336-
is_exist = !kvs.empty();
283+
auto& result = operation.GetResult();
284+
285+
is_exist = !result.file_sessions.empty();
337286

338287
return Status::OK();
339288
}

src/mdsv2/filesystem/file_session.h

Lines changed: 10 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -20,48 +20,15 @@
2020
#include <string>
2121
#include <vector>
2222

23-
#include "dingofs/mdsv2.pb.h"
2423
#include "mdsv2/common/status.h"
25-
#include "mdsv2/storage/storage.h"
24+
#include "mdsv2/common/type.h"
25+
#include "mdsv2/filesystem/store_operation.h"
2626
#include "utils/concurrent/concurrent.h"
27-
#include "utils/uuid.h"
2827

2928
namespace dingofs {
3029
namespace mdsv2 {
3130

32-
class FileSession;
33-
using FileSessionPtr = std::shared_ptr<FileSession>;
34-
35-
// represent file session for client open file
36-
class FileSession {
37-
public:
38-
FileSession() = default;
39-
FileSession(uint32_t fs_id, const std::string& session_id, uint64_t ino, const std::string& client_id)
40-
: fs_id_(fs_id), session_id_(session_id), ino_(ino), client_id_(client_id) {}
41-
42-
static FileSessionPtr New(uint32_t fs_id, uint64_t ino, const std::string& client_id) {
43-
return std::make_shared<FileSession>(fs_id, utils::UUIDGenerator::GenerateUUID(), ino, client_id);
44-
}
45-
46-
static FileSessionPtr New(uint32_t fs_id, const pb::mdsv2::FileSession& file_session) {
47-
return std::make_shared<FileSession>(fs_id, file_session.session_id(), file_session.ino(),
48-
file_session.client_id());
49-
}
50-
51-
const std::string& SessionId() const { return session_id_; }
52-
uint64_t Ino() const { return ino_; }
53-
const std::string& ClientId() const { return client_id_; }
54-
55-
static std::string EncodeKey(uint32_t fs_id, uint64_t ino, const std::string& session_id);
56-
std::string EncodeKey() const;
57-
std::string EncodeValue() const;
58-
59-
private:
60-
uint32_t fs_id_;
61-
uint64_t ino_;
62-
std::string session_id_;
63-
std::string client_id_;
64-
};
31+
using FileSessionPtr = std::shared_ptr<FileSessionEntry>;
6532

6633
// cache file session
6734
class FileSessionCache {
@@ -85,6 +52,7 @@ class FileSessionCache {
8552
void Upsert(FileSessionPtr file_session);
8653
void Delete(uint64_t ino, const std::string& session_id);
8754
void Delete(uint64_t ino);
55+
8856
FileSessionPtr Get(uint64_t ino, const std::string& session_id);
8957
std::vector<FileSessionPtr> Get(uint64_t ino);
9058
bool IsExist(uint64_t ino);
@@ -106,22 +74,23 @@ using FileSessionManagerUPtr = std::unique_ptr<FileSessionManager>;
10674
// persist store file session and cache file session
10775
class FileSessionManager {
10876
public:
109-
FileSessionManager(uint32_t fs_id, KVStorageSPtr kv_storage);
77+
FileSessionManager(uint32_t fs_id, OperationProcessorSPtr operation_processor);
11078
~FileSessionManager() = default;
11179

11280
FileSessionManager(const FileSessionManager&) = delete;
11381
FileSessionManager& operator=(const FileSessionManager&) = delete;
11482
FileSessionManager(FileSessionManager&&) = delete;
11583
FileSessionManager& operator=(FileSessionManager&&) = delete;
11684

117-
static FileSessionManagerUPtr New(uint32_t fs_id, KVStorageSPtr kv_storage) {
118-
return std::make_unique<FileSessionManager>(fs_id, kv_storage);
85+
static FileSessionManagerUPtr New(uint32_t fs_id, OperationProcessorSPtr operation_processor) {
86+
return std::make_unique<FileSessionManager>(fs_id, operation_processor);
11987
}
12088

12189
Status Create(uint64_t ino, const std::string& client_id, FileSessionPtr& file_session);
12290
Status IsExist(uint64_t ino, bool just_cache, bool& is_exist);
12391
Status Delete(uint64_t ino, const std::string& session_id);
12492
Status Delete(uint64_t ino);
93+
12594
FileSessionPtr Get(uint64_t ino, const std::string& session_id, bool just_cache = false);
12695
std::vector<FileSessionPtr> Get(uint64_t ino, bool just_cache = false);
12796

@@ -134,12 +103,11 @@ class FileSessionManager {
134103

135104
uint32_t fs_id_;
136105

137-
// store file session
138-
KVStorageSPtr kv_storage_;
139-
140106
// cache file session
141107
FileSessionCache file_session_cache_;
142108

109+
OperationProcessorSPtr operation_processor_;
110+
143111
// statistics
144112
bvar::Adder<uint64_t> total_count_metrics_;
145113
bvar::Adder<int64_t> count_metrics_;

0 commit comments

Comments
 (0)