-
Notifications
You must be signed in to change notification settings - Fork 18
Expand file tree
/
Copy pathdata_storage_backend.h
More file actions
93 lines (80 loc) · 4 KB
/
data_storage_backend.h
File metadata and controls
93 lines (80 loc) · 4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#pragma once
#include <atomic>
#include <cstdint>
#include <functional>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "kv_cache_manager/common/error_code.h"
#include "kv_cache_manager/data_storage/common_define.h"
#include "kv_cache_manager/metrics/metrics_collector.h"
#include "kv_cache_manager/metrics/metrics_registry.h"
namespace kv_cache_manager {
// Block keys for a single spec
struct SpecBlockKeys {
std::string spec_name; // e.g., "tp0", "Linear_TP0"
int64_t spec_size; // Size per key for this spec
std::vector<int64_t> block_keys; // Raw key values
std::vector<size_t> original_key_indices; // Mapping to caller's keys array indices
};
// Request object for creating blocks, extensible for future features (e.g., lifecycle groups)
struct CreateBlocksRequest {
std::string instance_id;
std::vector<SpecBlockKeys> spec_block_keys;
};
// Per-spec create result, aligned 1:1 with CreateBlocksRequest::spec_block_keys
using SpecCreateResult = std::vector<std::pair<ErrorCode, DataStorageUri>>;
class DataStorageBackend {
public:
DataStorageBackend() = delete;
explicit DataStorageBackend(std::shared_ptr<MetricsRegistry> metrics_registry)
: metrics_registry_(std::move(metrics_registry)) {}
virtual ~DataStorageBackend() = default;
virtual DataStorageType GetType() = 0;
virtual bool Available() = 0;
virtual double GetStorageUsageRatio(const std::string &trace_id) const = 0;
inline bool IsOpen() const { return is_open_.load(std::memory_order_relaxed); }
inline void SetOpen(bool open) { is_open_.store(open, std::memory_order_relaxed); }
inline void SetAvailable(bool available) { is_available_.store(available, std::memory_order_relaxed); }
std::shared_ptr<DataStorageMetricsCollector> GetMetricsCollector() { return metrics_collector_; }
virtual const StorageConfig &GetStorageConfig() { return config_; }
public:
virtual ErrorCode Open(const StorageConfig &config, const std::string &trace_id) {
config_ = config;
metrics_collector_ = std::make_shared<DataStorageMetricsCollector>(
metrics_registry_, MetricsTags{{ToString(config.type()), config.global_unique_name()}});
if (!metrics_collector_->Init()) {
metrics_collector_ = nullptr;
}
// TODO (rui): handle metrics collector unregistration during Close()
return DoOpen(config, trace_id);
}
virtual ErrorCode DoOpen(const StorageConfig &config, const std::string &trace_id) = 0;
virtual ErrorCode Close() = 0;
virtual std::vector<SpecCreateResult> Create(const CreateBlocksRequest &request,
const std::string &trace_id,
std::function<void()> cb) = 0;
virtual std::vector<ErrorCode>
Delete(const std::vector<DataStorageUri> &storage_uris, const std::string &trace_id, std::function<void()> cb) = 0;
virtual std::vector<bool> Exist(const std::vector<DataStorageUri> &storage_uris) = 0;
virtual std::vector<bool> MightExist(const std::vector<DataStorageUri> &storage_uris) {
// a low-latency version of Exist()
// implementation is required to return ASAP;
// or it should rather return false-positive result, e.g.,
// all true if low-latency can not be guaranteed
return std::vector<bool>(storage_uris.size(), true);
}
virtual std::vector<ErrorCode> Lock(const std::vector<DataStorageUri> &storage_uris) = 0;
virtual std::vector<ErrorCode> UnLock(const std::vector<DataStorageUri> &storage_uris) = 0;
protected:
inline bool IsAvailable() const { return is_available_.load(std::memory_order_relaxed); }
protected:
StorageConfig config_;
std::shared_ptr<MetricsRegistry> metrics_registry_;
std::shared_ptr<DataStorageMetricsCollector> metrics_collector_;
private:
std::atomic_bool is_open_ = false;
std::atomic_bool is_available_ = false;
};
} // namespace kv_cache_manager